我尝试上传经过 AWS KMS 密钥加密的大型文件到 Amazon S3。为什么上传会失败?

上次更新时间:2021 年 4 月 5 日

我尝试将大型文件上传到我的 Amazon Simple Storage Service (Amazon S3) 存储桶。在我的上传请求中,我使用 AWS Key Management Service (AWS KMS) 密钥进行加密。但遇到拒绝访问错误。但上传带有加密信息的较小文件时,却上传成功。如何解决此问题?

简短描述

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

当文件很大时,AWS CLI(aws s3 命令)、AWS 开发工具包和许多第三方程序会自动执行分段上传。要执行使用 AWS KMS 密钥加密的分段上载,请求者必须具有 kms:GenerateDataKeykms:Decrypt 权限。kms:GenerateDataKey 权限允许请求者启动上传。借助 kms:Decrypt 权限,可使用之前的相同对象的分段所用的相同密钥对新上传的分段进行加密。

注意:成功上传所有分段后,必须组合已上传的分段才能完成分段上传操作。由于已上传的分段是使用 KMS 密钥进行服务器端加密的,因此必须先解密对象分段,然后才能组合它们。为此,请求者必须具有 kms:Decrypt 权限,才能使用通过 KMS CMKs (SSE-KMS) 实施的服务器端加密来完成分段上传请求。

解决方法

如果您的 AWS Identity and Access Management (IAM) 角色和密钥位于同一账户中,则必须在密钥策略中指定 kms:Decrypt 权限。如果您的 IAM 角色属于与密钥不同的账户,则必须在密钥和 IAM 策略中同时指定 kms:Decrypt 权限。

密钥策略

使用 AWS 管理控制台策略视图查看 AWS KMS 密钥策略。

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

然后,检查与您的 IAM 用户或角色关联的语句所允许的操作列表。允许的操作列表必须包括 kms:Decrypt(使用 SSE-KMS)才能顺利进行分段上传。

例如,密钥策略中的此语句允许用户 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 用户访问权限以对密钥执行 kms:Decryptkms:GenerateDataKey (arn:aws:kms:example-region-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd)。

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


这篇文章对您有帮助吗?


您是否需要账单或技术支持?