私の Amazon Simple Storage Service (Amazon S3) バケットは AWS Key Management Service (AWS KMS) のカスタマー管理キーで暗号化されているのですが、別の AWS アカウントのユーザーがバケット内のオブジェクトにアクセスしようとすると、アクセス拒否エラーが表示されます。
簡単な説明
アカウント A の AWS KMS 暗号化バケットへのアクセス許可をアカウント B のユーザーに付与するには、次の権限を適用します。
- アカウント A の Amazon S3 バケットポリシーは、アカウント B にアクセス許可を付与する必要があります。
- アカウント A の AWS マネージドキーは、アカウント A の S3 バケットと同じ AWS リージョンにある必要があります。
- アカウント A の AWS KMS キーポリシーは、アカウント B のユーザーにアクセス許可を付与する必要があります。
- アカウント B の AWS Identity and Access Management (IAM) ポリシーでは、アカウント A のバケットとキーの両方へのアクセス許可をユーザーに付与する必要があります。
アクセス拒否エラーのトラブルシューティングを行うには、これらの権限が正しく設定されていることを確認してください。
**重要:**カスタマー管理キーポリシーの場合、キーポリシーを変更できるのはポリシーを作成したアカウントのみです。
バケット暗号化の設定には、完全修飾された KMS キー ARN を使用する必要があります。KMS キーエイリアスを使用する場合、AWS KMS はバケットを所有するアカウント (アカウント A) でのみキーを解決します。
以下は、バケット暗号化に使用する完全修飾済み AWS KMS キー ARN の例です。
"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
以下は、バケットの暗号化には使用しない AWS KMS キーエイリアスの例です。
arn:aws:kms:us-west-2:111122223333:alias/alias-name
解決策
アカウント A のバケットポリシーは、アカウント B のユーザーにアクセス許可を付与する必要がある
アカウント A のバケットポリシーをチェックして、アカウント B のアカウント ID からのアクセスを許可するステートメントがあることを確認します。
例えば、次のバケットポリシーでは s3:GetObject によるアカウント ID 111122223333 へのアクセスを許可しています。
{
"Id": "ExamplePolicy1",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ExampleStmt1",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
"Principal": {
"AWS": [
"111122223333"
]
}
}
]
}
アカウント A の AWS KMS キーポリシーは、アカウント B のユーザーにアクセス許可を付与する必要がある
AWS KMS キーポリシーでは、アカウント B のユーザーに kms:Decrypt アクションに対する権限を付与する必要があります。例えば、1 人の IAM ユーザーまたはロールにのみキーアクセスを付与するには、次のようなキーポリシーを使用します。
{
"Sid": "Allow use of the key",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::111122223333:role/role_name"
]
},
"Action": [
"kms:Decrypt"
],
"Resource": "*"
}
アカウント A から、AWS マネジメントコンソールのポリシービューを使用してキーポリシーを確認します。キーポリシーで "Sid": "Allow use of the key" を見つけ、アカウント B のユーザーがそのステートメントにプリンシパルとしてリストされていることを確認します。
**"Sid": "Allow use of the key"**というステートメントが表示されない場合は、AWS マネジメントコンソールのデフォルトビューを使用してキーポリシーを確認します。次に、キーにアクセスできる外部アカウントとして、アカウント B のアカウント ID を追加します。
アカウント B の IAM ユーザーポリシーでは、アカウント A のバケットとキーの両方へのアクセス許可をユーザーに付与する必要があります。
アカウント B から、次の手順を実行します。
- IAM コンソールを開きます。
- アカウント B のユーザーに関連付けられている IAM ユーザーまたはロールを開きます。
- IAM ユーザーまたはロールに適用される権限ポリシーのリストを確認します。
- バケットとキーの両方へのアクセスを許可するポリシーが適用されていることを確認します。
**注:**アカウント B の IAM ユーザーまたはロールに既に administrator access がある場合は、キーへのアクセス許可を付与する必要はありません。次のポリシーの例では、バケット内のオブジェクトを復号できるよう、アカウント B の IAM ユーザーにオブジェクトと KMS キーへのアクセス許可を付与します。
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "ExampleStmt1",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
},
{
"Sid": "ExampleStmt2",
"Action": [
"kms:Decrypt"
],
"Effect": "Allow",
"Resource": "arn:aws:kms:us-west-2:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab"
}
]
}
IAM ユーザーの権限を追加または修正する方法の詳細については、「IAM ユーザーのアクセス許可の変更」を参照してください。
関連情報
AWS ポリシージェネレーター