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

1 分钟阅读
0

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

简短描述

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

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

**注意:**上传所有分段后,必须组装上传的段才能完成分段上传操作。由于上传的段是使用 AWS KMS 密钥在服务器端加密的,因此您必须先解密对象分段,然后才能组装这些段。因此,对于使用具有 AWS KMS 密钥的服务器端加密(SSE-KMS)分段上传请求,您必须拥有 kms:Decrypt 权限。

解决方法

您的 AWS Identity and Access Management(AWS IAM)角色和密钥可能存在于同一 AWS 账户或不同账户中。如果您的 IAM 角色和密钥位于同一个账户中,则可以从 IAM 策略或 AWS KMS 密钥策略中指定 kms:Decrypt 权限。如果您的 IAM 角色和密钥位于不同的账户中,则必须在密钥和 IAM 策略中指定 kms:Decrypt权限。

密钥策略

在 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 策略生成器

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