我想将一个大文件上传到我的 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:GenerateDataKey 和 kms: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:Decrypt 和 kms: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:Decrypt 和 kms:GenerateDataKey。
有关如何更新 IAM 权限的说明,请参阅更改 IAM 用户的权限。
相关信息
AWS 策略生成器