我的 Amazon S3 存储桶默认使用自定义 AWS KMS 密钥进行加密。如何允许用户在该存储桶上执行下载和上传?

上次更新时间:2020 年 3 月 27 日

我的 Amazon Simple Storage Service (Amazon S3) 存储桶使用自定义 AWS Key Management Service (AWS KMS) 密钥进行加密。我希望某个 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 控制台向该 IAM 用户添加一个策略,以授予在该存储桶上执行上传和下载操作以及使用与该存储桶关联的 AWS KMS 密钥的权限。

对于跨账户情景,请考虑授予 s3:PutObjectAcl 权限,以确保该 IAM 用户可以上传对象,然后向该存储桶的账户授予对该对象的完全控制权限 (bucket-owner-full-control)。此外还应考虑授予授予 s3:ListBucket 权限,因为运行 同步操作递归复制操作将需要此权限。您可以使用与以下类似的策略:

注意:对于第一个 Resource 的值,请输入存储桶的 ARN,用通配符来表示存储桶中的对象。对于第二个 Resource 值,请输入存储桶的 ARN。对于第三个 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。对于第一个 Resource 值,请输入存储桶的 ARN,用通配符来表示存储桶中的对象。对于第二个 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"
        ]
      }
    }
  ]
}