跳至内容

如何允许用户从使用客户管理型 AWS KMS 密钥加密的 Amazon S3 存储桶进行下载和上传操作?

2 分钟阅读
0

我将我的 Amazon Simple Storage Service (Amazon S3) 存储桶设置为使用客户管理型 AWS Key Management Service (AWS KMS) 密钥进行默认加密。我想允许 AWS Identity and Access Management (IAM) 用户从存储桶下载对象并将对象上传到存储桶。

解决方法

首先,修改 AWS KMS 密钥策略。然后,修改 IAM 用户的基于身份的策略。如果 IAM 用户与 S3 存储桶位于不同的账户,则您还必须修改存储桶策略。

修改密钥策略

完成以下步骤:

  1. 打开 AWS KMS 控制台

  2. 在导航窗格中,选择 Customer managed keys(客户管理型密钥),然后在密钥列表中选择您的密钥。

  3. 选择 Key policy(密钥策略)选项卡以查看策略文档。
    **注意:**如果您使用 AWS KMS 控制台创建客户管理型密钥,则必须在 Key policy(密钥策略)选项卡上选择 Switch to policy view(切换到策略视图)才能查看策略文档。

  4. 选择 Edit(编辑),然后在密钥策略中添加以下语句,以授予 kms:GenerateDataKeykms:Decrypt 权限:

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

    **注意:**上述策略语句示例仅包含向加密的 S3 存储桶下载和上传对象所需的最低权限。您可以根据自己的使用案例添加更多权限。

修改基于身份的策略以允许同一账户访问

完成以下步骤:

  1. 打开 IAM 控制台

  2. 将以下策略附加到 IAM 用户,以便该用户能够从存储桶上传和下载对象:

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

    注意:请将 Resource 值替换为存储桶的 Amazon 资源名称 (ARN)。通配符 (*) 代表存储桶中的对象。

重要事项:存储桶策略中的显式拒绝语句会阻止基于身份的策略所授予的权限。查看存储桶策略,确认不存在与基于身份的策略产生冲突的显式拒绝语句。

修改基于身份的策略和存储桶策略以允许跨账户访问

**重要事项:**您可以为客户管理型密钥授予跨账户访问权限,但不能为 AWS 托管式密钥授予该权限。您无法修改 AWS 托管式密钥的密钥策略。

完成以下步骤:

  1. 在 IAM 用户账户中打开 IAM 控制台

  2. 将以下策略附加到 IAM 用户,以便该用户能够上传和下载对象并使用 AWS KMS 密钥:

    {
      "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"
        }
      ]
    }

    注意:请将 Resource 值替换为存储桶的 ARN 和 AWS KMS 密钥。通配符 (*) 代表存储桶中的对象。

  3. 在拥有 S3 存储桶的账户中打开 Amazon S3 控制台

  4. 在存储桶策略中添加以下语句以授予 IAM 用户对存储桶的访问权限:

    {
      "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"
            ]
          }
        }
      ]
    }

    **注意:**请将 Id 替换为存储桶策略的 ID,将 Principal 值替换为 IAM 用户的 ARN,并将 Resource 值替换为存储桶的 ARN。

除了跨账户访问所需的最低权限外,您还可以授予 s3:PutObjectAcl 权限,这样 IAM 用户就可以为对象设置访问控制列表 (ACL)。然后,向存储桶账户授予 bucket-owner-full-control 标准 ACL。您还可以授予同步 S3 目录或前缀以及在存储桶之间复制对象所需的 s3:ListBucke 权限。

相关信息

启用和禁用密钥

将 IAM 策略与 AWS KMS 配合使用

授予对 Amazon S3 存储桶对象的读写权限

禁用所有新存储桶的 ACL 并强制执行对象所有权

AWS 官方已更新 6 个月前