Amazon S3 バケットで、カスタム AWS KMS キーによるデフォルトの暗号化を使用しています。ユーザーにバケットからのダウンロードとバケットへのアップロードを許可するにはどうすればよいですか?

最終更新日: 2020 年 3 月 27 日

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

解決方法

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

始めに AWS KMS コンソールを開き、以下の手順に従います。

  1. ナビゲーションペインから [カスタマー管理キー] を選択します。
  2. キーのリストから、バケットに関連付けられているキーを開きます。
  3. [キーユーザー] で [追加] を選択します。
  4. IAM ユーザーとロールのリストから、当該の IAM ユーザーを選択します。
  5. [追加] を選択します。

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

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

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

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

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

まず、AWS KMS キーおよび S3 バケットを所有するアカウントから AWS KMS コンソールを開きます。次の手順を実行します。

  1. ナビゲーションペインから [カスタマー管理キー] を選択します。
  2. キーのリストから、バケットに関連付けられているキーを開きます。
  3. [他の AWS アカウント] で [他の AWS アカウントを追加] を選択します。
  4. テキストボックスに、当該の IAM ユーザーの AWS アカウント ID を入力します。
  5. [変更を保存] を選択します。

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

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

注意: 1 番目の 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:::awsexamplebucket/*"
    },
    {
      "Sid": "ListBucket",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::awsexamplebucket"
    },
    {
      "Sid": "KMSAccess",
      "Action": [
        "kms:Decrypt",
        "kms:DescribeKey",
        "kms:Encrypt",
        "kms:GenerateDataKey*",
        "kms:ReEncrypt*"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:kms:example-region-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd"
    }
  ]
}

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

注意: Principal 値には、IAM ユーザーの ARN を入力します。1 番目の 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:::awsexamplebucket/*",
      "Principal": {
        "AWS": [
          "arn:aws:iam::123exampleaccountID:user/Jane"
        ]
      }
    },
    {
      "Sid": "ListBucket",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::awsexamplebucket",
      "Principal": {
        "AWS": [
          "arn:aws:iam::123exampleaccountID:user/Jane"
        ]
      }
    }
  ]
}