为什么我无法通过 AWS KMS 密钥加密将大文件上传到 Amazon S3?

1 分钟阅读
0

我想将一个大文件上传到我的 Amazon Simple Storage Service (Amazon S3)桶。在上传请求中,我附上了 AWS Key Management Service(AWS KMS)密钥的加密信息。但是,我收到“Access Denied”错误。

简短描述

确认您有权对用于加密对象的 AWS KMS 密钥执行 kms:Decrypt 操作。

对于大型文件,使用 AWS 命令行界面(AWS CLI)、AWS SDK 和许多第三方程序的高级别 AWS S3 命令会自动执行分段上传。要使用 AWS KMS 密钥加密分段上传,您必须拥有 kms:GenerateDataKeykms:Decrypt 权限。kms:GenerateDataKey 权限允许您启动上传。kms:Decrypt 权限让您可以使用用于同一对象前几部分的密钥对新上传的段进行加密。

**注意:**要使用 AWS KMS 密钥执行加密分段上传,您必须具备以下条件:

  • 允许对密钥执行 kms:Decryptkms:GenerateDataKey 操作。
  • CreateMultipartUpload API 上执行 kms:GenerateDataKey 操作的权限。
  • UploadPartUploadPartCopy API 上执行 kms:Decrypt 操作的权限。这些权限是必需的,因为 Amazon S3 必须在完成分段上传之前解密和读取加密文件段中的数据。

如果您的 AWS Identity and Access Management(IAM)用户或角色与 KMS 密钥位于同一 AWS 账户中,则在密钥政策中您必须拥有这些权限。如果您的 IAM 用户或角色所属的账户与 KMS 密钥不同,则您必须同时拥有密钥政策和 IAM 用户或角色的权限。

解决方法

密钥政策

在 AWS 管理控制台策略视图中查看 AWS KMS 密钥政策

在密钥政策中,搜索将您的 IAM 用户或角色的亚马逊资源名称(ARN)列为 AWS 主体的语句。ARN 采用以下格式:arn:aws:iam::111122223333:user/john

然后,查看您的 IAM 用户或角色语句允许的操作列表。对于分段上传,允许的操作列表必须包括带有 SSE-KMS 的 kms:Decrypt

例如,密钥策略中的以下语句允许用户 John 执行 kms:Decryptkms:GenerateDataKey 操作:

{
  "Sid": "Allow use of the key",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:user/john"
  },
  "Action": [
    "kms:Decrypt",
    "kms:GenerateDataKey"
  ],
  "Resource": "*"
}

IAM 权限

要查看您的 IAM 权限,请打开 IAM 控制台,然后选择您的 IAM 用户或角色。

查看适用于您的 IAM 用户或角色的权限策略列表。确保应用的策略允许您对用于加密对象的密钥执行 kms:Decrypt 操作:

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:Decrypt",
      "kms:GenerateDataKey"
    ],
    "Resource": [
      "arn:aws:kms:example-region-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd"
    ]
  }
}

此示例语句授予 IAM 用户访问权限,以对密钥 arn:aws:kms:example-region-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd 执行 kms:Decryptkms:GenerateDataKey

有关如何更新 IAM 权限的说明,请参阅更改 IAM 用户的权限

相关信息

AWS 策略生成器

Data encryption in Amazon S3

AWS 官方
AWS 官方已更新 6 个月前