从 Amazon S3 下载已使用 KMS 加密的对象时是否需要指定 AWS KMS 密钥?

上次更新时间:2020 年 11 月 10 日

我希望下载存储在 Amazon Simple Storage Service (Amazon S3) 上的对象并使用 AWS Key Management Service 托管密钥 (SSE-KMS) 进行服务器端加密。我是否需要指定 AWS KMS 密钥以从存储桶下载这些对象?

解决方案

从 S3 存储桶下载使用 SSE-KMS 加密的对象时,您不需要指定 AWS KMS 密钥 ID。但您需要拥有解密 AWS KMS 密钥的权限。

当用户发出 GET 请求时,Amazon S3 将检查发送请求的 AWS Identity and Access Management (IAM) 用户或角色是否已获得解密对象所关联密钥的权限。如果 IAM 用户或角色与密钥属于同一 AWS 账户,则必须在 AWS KMS 密钥策略中授予解密权限。

注意:如果 IAM 用户或角色和 KMS 密钥在同一账户中,则您还可以使用 IAM 策略控制对密钥的访问。但是,您必须修改密钥策略才能明确启用 IAM 策略以允许访问密钥。有关更多信息,请参阅在 AWS KMS 中使用 IAM 策略

如果 IAM 用户或角色与密钥分属于不同的账户,则必须在 IAM 用户策略和密钥策略中都属于解密权限。

以下示例 IAM 策略允许用户解密 AWS KMS 密钥并从 S3 存储桶下载:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:kms:example-region-1:123456789012:key/example-key-id",
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
      ]
    }
  ]
}
以下示例密钥策略语句允许用户对密钥解密:
{
  "Sid": "Allow decryption of the key",
  "Effect": "Allow",
  "Principal": {
    "AWS": [
      "arn:aws:iam::123456789012:user/Bob"
    ]
  },
  "Action": [
    "kms:Decrypt"
  ],
  "Resource": "*"
}

重要提示:如果 IAM 用户或角色与存储桶分属于不同的账户,请务必确保存储桶策略也向用户授予了对象的访问权限。例如,如果用户需要从存储桶下载,则存储桶策略必须授予用户执行 s3:GetObject 操作的权限。

在您获得对密钥进行解密的权限后,您可以使用与以下类似的 AWS 命令行界面 (AWS CLI) 命令,下载已使用密钥加密的 S3 对象:

aws s3api get-object --bucket DOC-EXAMPLE-BUCKET --key dir/example-object-name example-object-name

注意:如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI