クロスアカウントユーザーがカスタム AWS KMS キーで暗号化された S3 オブジェクトにアクセスしようとするときに Access Denied エラーが発生するのはなぜですか?

所要時間2分
0

Amazon Simple Storage Service (Amazon S3) バケットは、カスタム AWS Key Management Service (AWS KMS) キーで暗号化されています。他の AWS アカウントのユーザーがバケットのオブジェクトにアクセスしようとすると、アクセス拒否エラーが発生します。どうすれば解決できますか?

簡単な説明

アカウント A の AWS KMS 暗号化バケットへのアクセスをアカウント B のユーザーに許可するには、次のアクセス許可を設定している必要があります。

  • アカウント A のバケットポリシーは、アカウント B へのアクセスを許可する必要があります。
  • アカウント A の AWS KMS キーポリシーは、アカウント B のユーザーにアクセスを許可する必要があります。
  • アカウント B の AWS Identity and Access Management (IAM) ポリシーは、アカウント A のバケットと AWS KMS キーの両方へのアクセスをユーザーに許可する必要があります。

Access Denied エラーのトラブルシューティングを行うには、これらの許可が正しく設定されていることを確認してください。

警告: AWS が管理する AWS KMS キーポリシーは、読み取り専用であることから変更できません。ただし、AWS マネージド KMS キーポリシーとカスタマーマネージド KMS キーポリシーは、どちらも常に表示可能です。AWS マネージド KMS キーポリシーは更新できないため、これらのキーポリシーについてクロスアカウント許可を付与することもできません。さらに、AWS マネージド KMS キーを使用して暗号化されたオブジェクトに、他の AWS アカウントからアクセスすることはできません。カスタマーマネージド KMS キーポリシーについては、ポリシーを作成した AWS アカウントからのみキーポリシーを変更できます。

独自の AWS KMS キー (カスタマーマネージド KMS キー) を指定する場合、バケット暗号化設定には完全修飾の AWS KMS キー ARN を使用する必要があります。AWS KMS キーエイリアスを使用する場合、AWS KMS はバケット所有アカウント (アカウント A) 内でのみキーを解決します。

これを使ってください:

"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"

これは使用しないでください:

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" というステートメントが表示されない場合は、コンソールのデフォルトビューを使用して、キーポリシーを表示するように切り替えます。次に、アカウント B のアカウント ID を、キーにアクセスできる外部アカウントとして追加します。

アカウント B の IAM ユーザーポリシーは、アカウント A のバケットと AWS KMS キーの両方へのアクセスをユーザーに許可する必要があります

アカウント B から、次の手順を実行します。

1.    IAM コンソールを開きます。

2.    アカウント B で、そのユーザーに関連付けられた IAM ユーザーまたはロールを開きます。

3.    IAM ユーザーまたはロールに適用されている許可ポリシーのリストを確認します。

4.    次に、バケットと AWS KMS キーの両方へのアクセスを許可するポリシーが適用されていることを確認します。

注意: アカウント B の IAM ユーザーまたはロールに既に管理者アクセス権がある場合は、キーへのアクセスを付与する必要はありません。

次のポリシー例では、アカウント B の IAM ユーザーに、オブジェクトおよび (バケットのオブジェクトを復号化するための) AWS 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"
    }
  ]
}

注意:

  • アカウント A のバケットポリシーは、アカウント B へのアクセスを許可する必要があります。
  • アカウント A の AWS KMS キーは、アカウント A のバケットと同じリージョンに存在する必要があります。
  • アカウント A の AWS KMS キーポリシーは、アカウント B のユーザーにアクセスを許可する必要があります。
  • アカウント B の IAM ポリシーは、アカウント A のバケットと AWS KMS キーの両方へのアクセスをユーザーに許可する必要があります。

IAM ユーザーのアクセス権限を追加または修正する方法については、IAM ユーザーのアクセス権限の変更をご参照ください。


関連情報

AWS Policy Generator

AWS公式
AWS公式更新しました 2年前
コメントはありません

関連するコンテンツ