Amazon Bedrock APIキーが漏洩した時のリスクと対応策をまとめてみた
こんにちは。テクニカルサポートチームのShiinaです。
はじめに
Amazon Bedrock の API キーが登場し、生成 AI の活用がますます身近になりました。
Claude Code などでも利用できるため、今後ますます利用シーンが広がることが期待されています。
しかし、その便利さの裏にはAPI キー漏洩という見過ごせないリスクも潜んでいます!
Amazon Bedrock API キーの概要から実際の作成・利用方法、監査のポイント、そして万が一 API キーが漏洩した場合の対応策や、不正利用を防ぐための運用上の注意点をまとめてみました。
Amazon Bedrock API キーとは
Amazon Bedrock API を呼び出しに用いることのできる認証情報です。
API キーを利用してモデルに推論リクエストを実行することが可能です。
API キーの種類
Amazon Bedrock には2種類の API キーが存在します。
短期 API キー
権限範囲はキーを作成した IAM ユーザーやロールが保持している権限と同一となります。
有効期間は12時間です。
SigV4 を利用した署名付き URL を生成し、その署名付き URL を Base64 エンコードしたトークンを API リクエスト時の認証に利用します。
なお、このトークンはリージョンごとに異なるものが発行されます。
長期 API キー
権限範囲は基本的な API リクエストを実行するための AWS マネージドポリシーAmazonBedrockLimitedAccess
となります。
オプションでキー作成時に AWS マネージドポリシーAmazonBedrockMarketplaceAccess
もアタッチ可能です。
有効期間は1日から無期限まで設定可能です。
Amazon Bedrock サービス固有の認証情報を利用します。
具体的には、AWS マネージドポリシーがアタッチされた API キーが関連付けられた IAM ユーザーによって管理されます。
API キー作成に必要な権限
短期 API キー
短期 API キーは、AWS 認証情報があれば追加の権限なしで作成できます。
ただし、作成した API キーを利用して推論リクエストを実行する際には、以下のアクション権限が必要です。
bedrock:InvokeModel
bedrock:CallWithBearerToken
この権限が付与されていない場合、推論リクエストは失敗します。
{"Message":"User: arn:aws:iam::XXXXXXXXXXXX:user/bedrockapicreateuser is not authorized to perform: bedrock:InvokeModel on resource: arn:aws:bedrock:ap-northeast-1:XXXXXXXXXXXX:inference-profile/apac.anthropic.claude-sonnet-4-20250514-v1:0 because no identity-based policy allows the bedrock:InvokeModel action"}
長期 API キー
長期 API キーを作成するには、以下のアクション権限を持つ AWS 認証情報が必要です。
iam:CreateServiceSpecificCredential
iam:AttachUserPolicy
iam:CreateUser
API キーの作成方法
短期 API キーの作成手順
AWS マネジメントコンソールや各種 SDK を利用して作成できます。
コンソール
Amazon Bedrock ナビゲーションペインの API Keys から Short-term API Keys を選択します。
SDK
Amazon Bedrock トークン ジェネレータを利用して作成できます。
Python を利用する場合は次の通りです。
- ジェネレータをインストールします。
python3 -m pip install aws-bedrock-token-generator
- ジェネレータコードサンプルを保存します。
from aws_bedrock_token_generator import BedrockTokenGenerator
import boto3
# Create token generator
token_generator = BedrockTokenGenerator()
# Generate token using default credentials
session = boto3.Session()
credentials = session.get_credentials()
bearer_token = token_generator.get_token(credentials, "ap-northeast-1")
# Use the token for API calls (valid for 12 hours)
print(f"Bearer Token: {bearer_token}")
- ジェネレータを実行し、API キーを作成します。
python3 bedrock_token_generator.py
出力される Bearer Token が API キーとして利用できます。
Bearer Token: bedrock-api-key-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
長期 API キーの作成手順
AWS マネジメントコンソールや AWS CLI、各種 SDK を利用して作成できます。
Amazon Bedrock のマネジメントコンソール、または IAM のマネジメントコンソールのいずれからでも実施可能です。
コンソール(Bedrock)
Amazon Bedrock ナビゲーションペインの API Keys から Long-term API Keys を選択します。
コンソール(IAM)
IAM ナビゲーションペインのユーザから API キーを作成するユーザを選択します。
セキュリティ認証情報の Amazon Bedrock の API キーより API キーを生成 を選択します。
AWS CLI
- ユーザを作成します。
aws iam create-user --user-name bedrock-api-user
- ユーザにポリシーをアタッチします。
aws iam attach-user-policy --user-name bedrock-api-user --policy-arn arn:aws:iam::aws:policy/AmazonBedrockLimitedAccess
- API キーを作成します。
credential-age-days
にキーの有効期限を指定します。
aws iam create-service-specific-credential \
--user-name bedrock-api-user \
--service-name bedrock.amazonaws.com \
--credential-age-days 30
出力される ServiceCredentialSecret が API キーの値となります。
{
"ServiceSpecificCredential": {
"CreateDate": "2025-07-14T02:37:27+00:00",
"ExpirationDate": "2025-07-21T02:37:27+00:00",
"ServiceName": "bedrock.amazonaws.com",
"ServiceCredentialAlias": "bedrock-api-user-at-XXXXXXXXXXX",
"ServiceCredentialSecret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"ServiceSpecificCredentialId": "XXXXXXXXXXXX",
"UserName": "bedrock-api-user",
"Status": "Active"
}
}
主な推論 API
Amazon Bedrock の推論には主に2つの API が用意されています。
-
InvokeModel
会話履歴を持たず、1回限りのリクエストに適しています。
要約、分類、翻訳など、単発の処理を行いたい場合に便利です。
Amazon Bedrock リリース当初から提供されているため、利用例や実績も豊富です。 -
Converse
会話履歴を保持できるため、チャットボットや対話型AIなど、会話の流れや文脈を理解する必要がある用途に適しています。
Converse は InvokeModel より新しい API で、より自然な対話体験を実現できます。
API キーの利用方法
API キーを利用した推論実行は、SDK や HTTP クライアントを使ってリクエストできます。
環境変数設定
AWS_BEARER_TOKEN_BEDROCK
環境変数に API キーを設定して利用します。
export AWS_BEARER_TOKEN_BEDROCK=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
推論 API(InvokeModel)の利用
APAC Claude Sonnet4 の推論プロファイルを使い、HTTP クライアント(curl)から InvokeModel API を呼び出してみます。
curl を使って Amazon Bedrock のエンドポイントにリクエストを送信します。
リクエスト例
curl -X POST "https://bedrock-runtime.ap-northeast-1.amazonaws.com/model/apac.anthropic.claude-sonnet-4-20250514-v1:0/invoke" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${AWS_BEARER_TOKEN_BEDROCK}" \
-d '{
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{"type": "text","text": "こんばんは}
]
}
]
}'
応答例
上記リクエストを実行すると、以下のような応答が返ってきます。
content に、AI アシスタントからの返答テキストが含まれています。
{
"id": "msg_bdrk_XXXXXXXXXXXX",
"type": "message",
"role": "assistant",
"model": "claude-sonnet-4-20250514",
"content": [
{
"type": "text",
"text": "こんばんは!今日はいかがでしたか?何かお手伝いできることがあれば、お気軽にお声かけください。"
}
],
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 13,
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 0,
"output_tokens": 45
}
}
推論 API(Converse)の利用
同じく APAC Claude Sonnet4 の推論プロファイルを使い、HTTP クライアント(curl)から Converse API を呼び出してみます。
curl を使って Amazon Bedrock のエンドポイントにリクエストを送信します。
リクエスト例
curl -X POST "https://bedrock-runtime.ap-northeast-1.amazonaws.com/model/apac.anthropic.claude-sonnet-4-20250514-v1:0/converse" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${AWS_BEARER_TOKEN_BEDROCK}" \
-d '{
"messages": [
{
"role": "user",
"content": [
{"text": "こんにちは"}
]
}
]
}'
応答例
上記リクエストを実行すると、以下のような応答が返ってきます。
output.message.content に、AI アシスタントからの返答テキストが含まれています。
{
"metrics": {
"latencyMs": 1894
},
"output": {
"message": {
"content": [
{
"text": "こんにちは!いかがお過ごしでしょうか?何かお手伝いできることがありましたら、お気軽にお声かけください。"
}
],
"role": "assistant"
}
},
"stopReason": "end_turn",
"usage": {
"cacheReadInputTokenCount": 0,
"cacheReadInputTokens": 0,
"cacheWriteInputTokenCount": 0,
"cacheWriteInputTokens": 0,
"inputTokens": 12,
"outputTokens": 49,
"totalTokens": 61
}
}
API キーの監査
API キーの作成や、API キーを利用した推論リクエストなどの操作は、CloudTrail に記録されます。
不正な API キーの作成や意図しない推論リクエストが実行されていないかを調査することが可能です。
監査ログを活用することで、セキュリティインシデントの早期発見に役立ちます。
API キー作成イベント
API キーの種類によって CloudTrail に記録される内容が異なります。
短期 API キー
短期 API キーは、SigV4 を利用して署名付き URL を生成する仕組みです。
この署名付き URL の生成はクライアントサイドで行われるため、CloudTrail のイベントログには記録されません。
長期 API キー
長期 API キーは IAM ユーザーによって管理されます。
API キーの作成に関連する操作は、バージニア北部リージョン(us-east-1)の CloudTrail イベントログに記録されます。
主に以下のイベントが該当します。
CreateUser
AttachUserPolicy
CreateServiceSpecificCredential
CloudTrail のレコード内には、操作を実行したユーザー名やロール名が「User」フィールドに表示されます。
さらに、「sourceIPAddress」フィールドにはリクエスト元の IP アドレスが記録されます。
もし海外など普段利用しない IP アドレスからのアクセスが確認された場合、不正に長期 API キーが作成された可能性があるため、注意が必要です。
長期 API キー作成イベント調査方法
AWS CloudShell など、AWS CLI と jq コマンドが利用可能な環境で、以下のサンプルコマンドを実行します。
CreateUser
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=CreateUser \
--region us-east-1 \
--output json | jq -r '
.Events[] |
{Time: .EventTime, Event: .EventName, User: .Username, IP: (.CloudTrailEvent | fromjson | .sourceIPAddress)}
'
出力結果例
{
"Time": "2025-07-14T04:43:29+00:00",
"Event": "CreateUser",
"User": "bedrockapicreateuser",
"IP": "XXX.XXX.XXX.XXX2"
}
AttachUserPolicy
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=AttachUserPolicy \
--region us-east-1 \
--output json | jq -r '
.Events[] |
{Time: .EventTime, Event: .EventName, User: .Username, IP: (.CloudTrailEvent | fromjson | .sourceIPAddress)}
'
出力結果例
{
"Time": "2025-07-14T04:43:30+00:00",
"Event": "AttachUserPolicy",
"User": "bedrockapicreateuser",
"IP": "XXX.XXX.XXX.XXX"
}
CreateServiceSpecificCredential
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=CreateServiceSpecificCredential \
--region us-east-1 \
--output json | jq -r '
.Events[] |
{Time: .EventTime, Event: .EventName, User: .Username, IP: (.CloudTrailEvent | fromjson | .sourceIPAddress)}
'
出力結果例
{
"Time": "2025-07-14T02:37:27+00:00",
"Event": "CreateServiceSpecificCredential",
"User": "bedrockapicreateuser",
"IP": "XXX.XXX.XXX.XXX"
}
推論リクエストイベント
API キーを利用した推論リクエストは各リージョンの CloudTrail イベントログに記録されます。
主に以下のイベントが該当します。
InvokeModel
Converse
CloudTrail のレコードには、リクエストを実行したユーザー名やロール名が「User」フィールドに記録されます。
短期 API キー(署名付き URL)を利用した場合
その署名付き URL を発行した IAM ユーザーやロール名が記録されます。
長期 API キーを利用した場合
API キーに紐づく IAM ユーザー名が記録されます。
また、CloudTrail のログを確認することで、どのユーザーがどのタイミングで推論リクエストを実行したかを把握できます。
大量のリクエストが記録されている場合、API キーが第三者によって不正に利用されている可能性があるため、注意が必要です。
推論リクエストイベントの調査方法
AWS CloudShell など、AWS CLI と jq コマンドが利用可能な環境で、以下のサンプルコマンドを実行します。
InvokeModel
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=InvokeModel \
--region ap-northeast-1 \
--output json | jq -r '
.Events[] |
{Time: .EventTime, Event: .EventName, User: .Username, IP: (.CloudTrailEvent | fromjson | .sourceIPAddress)}
'
出力結果例
{
"Time": "2025-07-14T05:13:31+00:00",
"Event": "InvokeModel",
"User": "Short-term-API-user",
"IP": "XXX.XXX.XXX.XXX"
}
Converse
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=Converse \
--region ap-northeast-1 \
--output json | jq -r '
.Events[] |
{Time: .EventTime, Event: .EventName, User: .Username, IP: (.CloudTrailEvent | fromjson | .sourceIPAddress)}
'
出力結果例
{
"Time": "2025-07-14T04:45:30+00:00",
"Event": "Converse",
"User": "Short-term-API-user",
"IP": "XXX.XXX.XXX.XXX"
}
モデル呼び出しログ
モデル呼び出しログを活用することで、推論リクエストのインプットやアウトプットなど、詳細な情報を調査することが可能です。
ただし、この機能を利用するためには、事前にログ記録の設定を行っておく必要があります。
モデル呼び出しログを有効化しておくことで、どのようなリクエストが送信され、どのようなレスポンスが返されたのか後から調査することができます。
モデル呼び出しログ調査方法
S3 に配信している呼び出しログは Athena を利用してクエリすることができます。
- データベースを作成します。
CREATE DATABASE IF NOT EXISTS bedrock;
- テーブルを作成します。
LOCATION は S3 バケットのパスを指定してください。
CREATE EXTERNAL TABLE IF NOT EXISTS bedrock.bedrock_invoke_logs (
`timestamp` string,
`accountId` string,
`identity` struct<
arn:string
>,
`region` string,
`requestId` string,
`operation` string,
`modelId` string,
`input` struct<
inputContentType:string,
inputBodyJson:struct<
anthropic_version:string,
max_tokens:int,
messages:array<
struct<
role:string,
content:array<
struct<
type:string,
text:string
>
>
>
>
>,
inputTokenCount:int
>,
`output` struct<
outputContentType:string,
outputBodyJson:struct<
id:string,
type:string,
role:string,
model:string,
content:array<
struct<
type:string,
text:string
>
>,
stop_reason:string,
stop_sequence:string,
usage:struct<
input_tokens:int,
cache_creation_input_tokens:int,
cache_read_input_tokens:int,
output_tokens:int
>
>,
outputTokenCount:int
>,
`inferenceRegion` string,
`schemaType` string,
`schemaVersion` string
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'ignore.malformed.json' = 'true'
)
LOCATION 's3://xxxxxxxxxxx'
TBLPROPERTIES ('has_encrypted_data'='false');
- クエリを行います。
ユーザ名「bedrock-api-use」が推論リクエストしたログを抽出するクエリ例
SELECT *
FROM bedrock.bedrock_invoke_logs
WHERE identity.arn LIKE '%bedrock-api-user%';
API キー漏洩時のリスク
Amazon Bedrock では、Anthropic Claude や Amazon Titan など、さまざまな生成 AI モデルに対してテキスト生成や画像生成などのリクエストを送信することができます。
これらのサービスは「推論リクエストごと」に課金される仕組みとなっており、推論リクエスト数や生成されたトークン数が多いほど、利用料金も高額になる傾向があります。
そのため、API キーが漏洩して第三者に不正利用された場合、大量の推論リクエストが実行され、想定外の高額な料金が発生するリスクがあります。
また、API キーを悪用して本来意図しないデータやプロンプトを送信・取得されることで、機密情報や個人情報などの情報漏洩につながる可能性もあります。
API キーの管理には十分注意し、万が一漏洩が疑われる場合は、速やかに該当する API キーを削除するなどの対応が必要です。
API キー漏洩時の対応
対応は API キーの種類によって異なります。
短期 API キー
短期 API キーが漏洩して不正利用が疑われる場合は、その使用権限を速やかに取り消す必要があります。
短期 API キーは12時間有効ですが、AWS マネジメントコンソール上で直接管理(無効化や削除)することができません。
そのため、短期 API キーの作成を行った IAM ユーザーやロールに対して、API 呼び出しを許可するアクションであるbedrock:CallWithBearerToken
を明示的に Deny するポリシーをアタッチすることで、利用を無効化します。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Deny",
"Action": "bedrock:CallWithBearerToken",
"Resource": "*"
}
}
このポリシーをアタッチすることで、短期 API キーを用いたリクエストはすべて失敗するようになります。
{"Message":"User: arn:aws:iam::XXXXXXXXXXXX:user/Short-term-API-user is not authorized to perform: bedrock:CallWithBearerToken on resource: * with an explicit deny in an identity-based policy"}
長期 API キー
長期 API キーが漏洩して不正利用が疑われる場合は、IAM コンソールから該当する API キーをリセットまたは削除する対応が必要です。
単に API キーを無効化するだけでは不十分な場合があるため、漏洩が確認された場合は速やかに API キー自体を削除し、新しい API キーを発行してください。
また、長期 API キーの作成自体が意図しないものであった場合は、該当する IAM ユーザーごと削除することも検討しましょう。
これにより、さらなる不正利用のリスクを根本的に排除することができます。
不正利用に対する対応策
次のような対応策を実施することで、不正利用のリスクを最小限に抑えることができます。
短期 API キーの活用する
セキュリティ強化の観点から、可能な限り短期 API キーを利用が推奨されます。
短期 API キーは有効期限が短く、万が一漏洩しても被害を最小限に抑えられます。
アプリケーション側で短期 API キーの自動更新を設定することで、運用負荷を軽減しつつセキュリティを維持できます。
長期 API キーの利用は最小限にする
長期 API キーは、検証や一時的な利用など、やむを得ない場合のみ、なるべく短い有効期間で利用し、不要になったら速やかに削除してください。
利用状況は定期的に監査し、不要なキーが残っていないか確認しましょう。
IAM ロールや一時的な認証情報を活用する
本番環境アプリケーションでは可能な限り IAM ロールや一時的なセキュリティ認証情報を利用し、API キーの利用は避けてください。
AWS Identity Center や IAM Roles Anywhere などの仕組みを活用することで、より安全なアクセス制御が可能です。
推論を制限する
Resource 句で特定の推論プロファイルに限定したり、Condition 句で IP アドレスを条件とした制限ポリシーを利用することで第三者からの不正利用を防ぐことができます。
特定のプロファイルに限定
AWS マネージドポリシーAmazonBedrockLimitedAccess
の代わりにbedrock:InvokeModel
、bedrock:CallWithBearerToken
をアクションを許可する最小限ポリシーを利用できます。
bedrock:InvokeModel
アクションに対して Resouce 句で推論プロファイルやモデル ARN を指定します。
クロスリージョン推論プロファイルを利用する場合は Resouce 句には以下を指定する必要があります。
- 送信元リージョンの推論プロファイル ARN
- 送信先リージョンのモデル ARN
APAC Claude Sonnet4 の推論プロファイルに限定するポリシー例
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "bedrock:InvokeModel",
"Resource": [
"arn:aws:bedrock:ap-northeast-1:XXXXXXXXXXXX:inference-profile/apac.anthropic.claude-sonnet-4-20250514-v1:0",
"arn:aws:bedrock:ap-northeast-1::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0",
"arn:aws:bedrock:ap-northeast-2::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0",
"arn:aws:bedrock:ap-northeast-3::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0",
"arn:aws:bedrock:ap-south-1::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0",
"arn:aws:bedrock:ap-south-2::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0",
"arn:aws:bedrock:ap-southeast-1::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0",
"arn:aws:bedrock:ap-southeast-2::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0",
"arn:aws:bedrock:ap-southeast-4::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0"
]
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "bedrock:CallWithBearerToken",
"Resource": "*"
}
]
}
許可されていない推論プロファイルの呼び出しは失敗します。
{"Message":"User: arn:aws:iam::XXXXXXXXXXXX:user/BedrockAPIKey-gmxf is not authorized to perform: bedrock:InvokeModel on resource: arn:aws:bedrock:us-east-1:XXXXXXXXXXXX:inference-profile/us.anthropic.claude-sonnet-4-20250514-v1:0 because no identity-based policy allows the bedrock:InvokeModel action"}
推論プロファイルでサポートされているリージョンとモデルは以下ドキュメントを参照ください。
IP アドレス制限
特定の IP アドレス以外からのすべての操作を拒否する明示的な Deny インラインポリシーを利用できます。
ポリシー例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "XXX.XX.XXX.XX/XX"
}
}
}
]
}
特定の IP アドレス範囲外からの推論プロファイルの呼び出しは失敗します。
{"Message":"User: arn:aws:iam::XXXXXXXXXXXX:user/BedrockAPIKey-gmxf is not authorized to perform: bedrock:InvokeModel on resource: arn:aws:bedrock:ap-northeast-1:XXXXXXXXXXXX:inference-profile/apac.anthropic.claude-sonnet-4-20250514-v1:0 with an explicit deny in an identity-based policy"}
監査やモニタリングを徹底する
API キーの作成・利用状況は CloudTrail で監査できます。
定期的にログを確認し、不審なリクエストや海外 IP からのアクセスがないか監視しましょう。
モデル呼び出しログを設定しておくことで、推論リクエストの詳細(インプット・アウトプット)も調査できます。
まとめ
Amazon Bedrock API キーは、生成 AI サービスを手軽に活用できる便利な認証情報ですが、その管理を誤ると高額な請求や情報漏洩など、重大なリスクにつながる可能性があります。
AWS アクセスキーと同じレベルで厳格に管理し、不要なキーは速やかに削除する、定期的に監査や利用状況を確認するなど、日頃からセキュリティ意識を高く持つことが重要です。
もし API キーが漏洩した場合には、迅速な対応が被害拡大を防ぐ鍵となります。
安全な生成 AI 活用のためにも、API キーは適切に管理しましょう。
本記事が参考になれば幸いです。
参考