はじめに
最近、Amazon Bedrockで生成AIアプリを開発したり、Bedrock経由でClaudeCodeを動かすという機会が増えてきました。
その中でAmazon Bedrockの「モデル呼び出しのログ記録」の設定をとりあえず有効化して開発を行っていたのですが、
実際のログを見ると、個人情報等サーバに保管してたらまずい情報も色々保存されてしまう状態になってしまってました。
それを受けて「モデル呼び出しのログ記録」のセキュリティ設定を検討しました。
Amazon Bedrockの「モデル呼び出しのログ記録」とは?
Amazon Bedrockが提供する機能で、Bedrockで実行したAIモデルへのリクエスト・レスポンスを記録・監視するための仕組みです。
Amazon Bedrockの推論データは、デフォルトではAWS側で保存されないようになってます。
「モデル呼び出しのログ記録」の設定を有効化すると
記録できる内容としては下記の情報を取得することができます。
入力データ:モデルに送ったプロンプトやパラメータ
出力データ:モデルが返したレスポンス
メタデータ:タイムスタンプ、モデルID、トークン数、レイテンシなど
設定はAmazon Bedrockの画面から設定ができます。
S3とCloudWatch Logsに出力させることができます。
設定はリージョン単位で行う必要があります。複数リージョンで利用したい場合は各リージョンで設定を行う必要があります。

出力はこのような形で出力されます。

アプリ開発時にLLMの挙動を確認したり、監査のために、誰がどんな利用をしたかを保管するのに必要な情報を取得できる反面、
ユーザが入力したプロンプト情報、出力結果などがAWSコンソールから丸見えになってしまいます。
また、S3にも機密情報を含むデータが保管されてしまいます。
※今回はClaudeCodeからAmazon BedrockのClaudeを呼び出した時のログです。
サンプルで入れた個人情報(氏名、メールアドレス、電話番号)、IPアドレス名がログから丸見えになってます。
★サンプルで敢えて機密情報を入力してますが、実際に入力していい情報はシステムのセキュリティ要件に併せて検討が必要です。
機密情報を取り扱うシステムでこの状況はセキュリティ的に大分まずい状態のため、いくつか実装案を検討しました。
「モデル呼び出しのログ記録」のセキュリティ対策
それでは本題に入ります。いくつかの対策案を検討しました。
①「モデル呼び出しのログ記録」の取得要否を判断して必要なAWSアカウントでのみ有効化する
まずは「モデル呼び出しのログ記録」をむやみに使わないというのが一つの選択肢になると思います。
これから紹介する他の案を実装したとしても、精度は100%と限らなかったり、ヒューマンエラーがきっかけで情報漏洩が発生する可能性はあります。
システム要件を確認し、「モデル呼び出しのログ記録」の取得が必須じゃないAWSアカウントでは設定を無効化することが必要です。
また、有効化する場合も取得する情報のセキュリティリスクをお客様に説明したうえで、有効化の設定を行う必要があります。
例として下記のような判断基準で設定の有効化/無効化を判断します。
・監査の証跡取得・コンプライアンスで必要な場合:有効化
・お客様の機密情報を扱うかつ、クラウド上に機密情報の保管が不可の場合:無効化
・お客様情報を扱わない開発用の環境でアプリの動作確認を行う場合:無効化
また、Amazon Bedrockの「モデル呼び出しのログ記録」はAWSアカウント内のAmazon Bedrockの処理全部を問答無用でログ記録するという仕組みになってますが、
Amazon Bedrock AgentCoreのトレースでは、特定のAIエージェントのみトレースログを採取することも可能です。
設定はAmazon Bedrock AgentCoreのランタイムでトレースログを出力したいエージェントを選択して、
「ログの配信とトレース」を有効化することで設定できます。(デフォルトでは無効化)

設定すると下記のようにトレースを取得することができます。

普段はAmazon Bedrockの「モデル呼び出しのログ記録」やAmazon Bedrock AgentCoreのトレースの設定は無効化しておき、
トレースログを見たい時だけ、設定を一時的に有効化するという運用も可能です。
■Amazon Bedrockの「モデル呼び出しのログ記録」とAmazon Bedrock AgentCoreのトレースの比較
| Amazon Bedrock「モデル呼び出しのログ記録」 | Amazon Bedrock AgentCoreのトレース | |
|---|---|---|
| 設定できる範囲 | AWSアカウント内のリージョン全体 | AIエージェント(ランタイム)単位で取得要否を設定可能 |
②Amazon Bedrock(LLM)に機密情報を入力させない。
Amazon Bedrock(LLM)に機密情報を入力させないようにする対策も重要です。
ユーザ側に機密情報を入力させないように周知する。どうしても機密情報を入力する必要がある場合は、
入力しても問題ないAWSアカウントで作業をやってもらう等、ユーザ側でできる対策もあります。
また、システム側でできる対策としてはAmazon Bedrock(LLM)で処理を行う前に入力プロンプトから個人情報を削除、マスキングするシステムの導入検討も必要です。
具体的にはAWSサービスのAmazon Comprehendを使った個人情報(PII)のマスキングやサードパーティ製の動的データマスキング製品等があります。
構成イメージ/処理フローとしては下記になります。

※簡易AWS構成図です、実際にはネットワークサービス(Gateway等)やセキュリティサービス(Network Firewall)などがあります。

この実装を行うとLLMには機密情報を入力をすることがなくなります。
③「モデル呼び出しのログ記録」の適切なアクセス管理を行う
監査の証跡取得・コンプライアンス要件達成のために「モデル呼び出しのログ記録」の設定が必要だが、一般ユーザが他のユーザが入力したプロンプトを見れないようにしたいという要件を満たしたい場合、
一般ユーザのIAMポリシーに「モデル呼び出しのログ記録」用のCloudWatch logs,S3の閲覧権限を明示的に拒否するポリシーを追加することで実現可能です。
但し、一般ユーザによる情報の閲覧をすることは防ぐことができますが、システム管理者はすべての情報を閲覧することが可能であり、クラウド内にもデータは保管されてしまいます。
クラウド内に機密情報を保管したくないという要件がある場合は、②で解説したように、そもそもAmazon Bedrock(LLM)に機密情報を入力しないためのソリューションの導入が必要になります。
クラウドに機密データを保管する場合は、データ保管期間も要件に併せて変更が必要です。
この設定を入れてもAmazon Bedrock AgentCoreのトレースを行うことは可能であるため、
必要に応じてLLMのトレースを見たいときは、Amazon Bedrock AgentCore側で取得することをお勧めします。
付与する権限
| システム管理者 | 一般ユーザ | |
|---|---|---|
| Amazon Bedrockの「モデル呼び出しのログ記録」 | 閲覧可能 | 閲覧不可 (※IAMポリシーを設定) |
| Amazon Bedrock AgentCoreのトレース (AIエージェント(ランタイム)毎に設定が必要) |
閲覧可能 | 閲覧可能 |
実際の設定方法は下記になります。
■「モデル呼び出しのログ記録」用のCloudWatch logsを閲覧拒否するIAMポリシー
※「モデル呼び出しのログ記録」を複数のリージョンで有効化してる場合は、すべてのリージョンの情報を入力してください。
例では東京リージョンのみ設定をしています。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyBedrockModelInvocationLogs",
"Effect": "Deny",
"Action": [
"logs:GetLogEvents",
"logs:FilterLogEvents",
"logs:StartQuery",
"logs:GetQueryResults",
"logs:DescribeLogStreams",
"logs:StartLiveTail"
],
"Resource": [
"arn:aws:logs:ap-northeast-1:[AWSアカウントID]:[CloudWatchロググループのARN]", ★自環境用の設定を入れること
"arn:aws:logs:ap-northeast-1:[AWSアカウントID]:[CloudWatchロググループのARN]:*" ★自環境用の設定を入れること
]
}
]
}
Resource部分は自環境の「モデル呼び出しのログ記録」用のCloudWatch logsのARNの情報を入力してください。
この設定を入れると、CloudWatchの画面から、「モデル呼び出しのログ記録」に関する情報のみ閲覧を不可にすることができます。
生成 AI オブザーバビリティ: モデル呼び出しの画面


ログ管理の画面

CloudWatch logs上のデータ保持期間は「ログ管理」ー「アクション」ー「保持期間の設定」から変更することができます。
システム要件に併せて期間を設定してください。

■「モデル呼び出しのログ記録」用のS3を閲覧拒否するIAMポリシー
※「モデル呼び出しのログ記録」を複数のリージョンで有効化してる場合は、すべてのリージョンの情報を入力してください。
例では東京リージョンのみ設定をしています。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyS3BucketAllRead",
"Effect": "Deny",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:GetObjectAcl",
"s3:GetObjectTagging",
"s3:ListBucket",
"s3:ListBucketVersions",
"s3:GetBucketLocation",
"s3:GetBucketPolicy",
"s3:GetBucketAcl",
"s3:GetBucketTagging",
"s3:GetBucketVersioning",
"s3:GetBucketLogging",
"s3:GetEncryptionConfiguration"
],
"Resource": [
"arn:aws:s3:::[S3バケットのARN]", ★自環境用の設定を入れること
"arn:aws:s3:::[S3バケットのARN]/*" ★自環境用の設定を入れること
]
}
]
}
この設定を入れると下記のように、一般ユーザは「モデル呼び出しのログ記録」用のS3の情報を閲覧することができなくなります。

S3上のデータ保持期間はS3バケットポリシーで設定できます。
こちらもシステム要件に併せて設定してください。
まとめ
①「モデル呼び出しのログ記録」の取得要否を判断して必要なAWSアカウントでのみ有効化する
機密情報を扱うシステムでは不用意に有効化しない。
Amazon Bedrock AgentCore側でAIエージェント個別で有効化を適宜できるので、それで代替できないかを検討する。
②Amazon Bedrock(LLM)に機密情報を入力させない。
機密情報を入力しないようにユーザ側に周知する。
必要に応じて機密情報のマスキングを行うソリューションを導入する。
③「モデル呼び出しのログ記録」の適切なアクセス管理を行う
システム管理者以外の一般ユーザは閲覧不可にする。
必要に応じてAmazon Bedrock AgentCore側でのログ採取を検討する。
## 最後に
今回はAmazon Bedrockの「モデル呼び出しのログ記録」のセキュリティ対策について、解説しました。
Amazon Bedrockのログはとても機密性の高い情報を保持しており取り扱いに注意が必要な情報であるため、
システムで有効化する際は十分注意して導入をする必要があります。

