私の Amazon S3 バケットにはカスタムの AWS KMS キーを使用したデフォルト暗号化が設定されています。ユーザーがそのバケットでダウンロードやアップロードを行えるようにするにはどうすればいいですか?

最終更新日: 2020 年 12 月 2 日

Amazon Simple Storage Service (Amazon S3) バケットをセットアップして、カスタムの AWS Key Management Service (AWS KMS) キーを使用し、デフォルト暗号化を実行しています。AWS Identity and Access Management (IAM) ユーザーがバケットでダウンロードとアップロードを実行できるようにしたいと思います。どうすればそれができますか?

解決方法

IAM ユーザーと AWS KMS キーが同一の AWS アカウントに属している場合

1.    AWS KMS コンソールを開き、ポリシービューを使用してキーのポリシードキュメントを表示します。少なくとも、kms:GenerateDataKey および kms:Decrypt アクションに対する IAM ユーザーアクセス許可を付与するようにキーのポリシーを変更します。次のようなステートメントを追加できます。

{
  "Sid": "ExampleStmt",
  "Action": [
    "kms:Decrypt",
    "kms:GenerateDataKey"
  ],
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:user/Jane"
  },
  "Resource": "*"
}

注: このポリシーの例には、個々の IAM ユーザーが暗号化された S3 バケットをダウンロードしてアップロードするために必要な最小限のアクセス許可のみが含まれます。ユースケースに基づいて、アクセス許可を変更または拡張できます。

2.     IAM コンソールを開きます。バケットにアップロードおよびバケットからダウンロードするためのアクセス許可を付与する ポリシーを IAM ユーザーに追加します。次のようなポリシーを使用できます。

注: Resource 値には、バケット内のオブジェクトを示すワイルドカード文字と共にバケットの Amazon リソースネーム (ARN) を入力します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ExampleStmt",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
    }
  ]
}

重要: IAM ユーザーポリシーによって付与された S3 アクセス許可は、バケットポリシーの明示的な拒否ステートメントによってブロックされる場合があります。IAM ユーザーポリシーと競合する明示的な拒否ステートメントがないことを確認するために、バケットポリシーを確認してください

IAM ユーザーが AWS KMS キーおよび S3 バケットと異なるアカウントに存在する場合

重要: お客様が管理する AWS KMS キーにはクロスアカウントアクセスを付与できますが、AWS が管理する AWS KMS キーには付与できません。AWS が管理する AWS KMS キーのキーポリシーは変更できません。

1.    AWS KMS コンソールを開き、ポリシービューを使用してキーのポリシードキュメントを表示します。少なくとも、kms:GenerateDataKey および kms:Decrypt アクションに対する IAM ユーザーアクセス許可を付与するようにキーのポリシーを変更します。次のようなステートメントを追加できます。

{
  "Sid": "ExampleStmt",
  "Action": [
    "kms:Decrypt",
    "kms:GenerateDataKey"
  ],
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:user/Jane"
  },
  "Resource": "*"
}

注: このポリシーの例には、個々の IAM ユーザーが暗号化された S3 バケットをダウンロードしてアップロードするために必要な最小限のアクセス許可のみが含まれます。ユースケースに基づいて、アクセス許可を変更または拡張できます。

2.    IAM ユーザーが属しているアカウントから IAM コンソールを開きます。バケットにアップロードおよびバケットからダウンロードするためのアクセス許可、およびバケットに関連付けられている AWS KMS キーを使用するアクセス許可を付与するポリシーを IAM ユーザーに追加します。

クロスアカウントのシナリオでは、IAM ユーザーがオブジェクトをアップロードできるように s3:PutObjectacl アクセス許可を付与することを検討してください。次に、バケットのアカウントにオブジェクトのフルコントロール (bucket-owner-full-control) を付与します。また、同期オペレーション再帰的なコピーオペレーションの実行に必要な s3:ListBucket アクセス許可を付与することも検討してください。次のようなポリシーを使用できます。

注: 最初の Resource 値には、バケット内のオブジェクトを示すワイルドカード文字と共にバケットの ARN を入力します。2 番目の Resource 値には、バケットの ARN を入力します。3 番目の Resource 値には、AWS KMS キーの ARN を入力します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DownloadandUpload",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion",
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
    },
    {
      "Sid": "ListBucket",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
    },
    {
      "Sid": "KMSAccess",
      "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:kms:example-region-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd"
    }
  ]
}

3.    S3 バケットを所有するアカウントから Amazon S3 コンソールを開きます。バケットポリシーを更新して、IAM ユーザーにバケットへのアクセス権を付与します。次のようなポリシーを使用できます。

注: Principal 値には、IAM ユーザーの ARN を入力します。最初の Resource 値には、バケット内のオブジェクトを示すワイルドカード文字と共にバケットの ARN を入力します。2 番目の Resource 値には、バケットの ARN を入力します。

{
  "Id": "Policy1584399307003",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DownloadandUpload",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion",
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Principal": {
        "AWS": [
          "arn:aws:iam::111122223333:user/Jane"
        ]
      }
    },
    {
      "Sid": "ListBucket",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
      "Principal": {
        "AWS": [
          "arn:aws:iam::111122223333:user/Jane"
        ]
      }
    }
  ]
}