[英]S3 PutObject with KMS encryption fails with 403 “Access Denied” error
我一直在尝试通过KMS密钥使用服务器端加密时对AWS S3进行PutObject调用,但是该调用始终失败,并显示403代码,并且消息显示“ Access Denied”。
这是我正在使用的C#代码:
const string fileName = "test.txt";
using (var stream = new MemoryStream())
{
using (var sw = new StreamWriter(stream))
{
sw.AutoFlush = true;
sw.Write("letsseeifthisworks");
var por = new PutObjectRequest
{
BucketName = _bucketname,
Key = fileName,
InputStream = stream,
ServerSideEncryptionMethod = ServerSideEncryptionMethod.AWSKMS,
ServerSideEncryptionKeyManagementServiceKeyId = _kmsKeyId
};
var response = _s3Client.PutObject(por);
}
}
这是HTTP请求的样子:
PUT https://notarealcorp.s3.us-west-1.amazonaws.com/test.txt HTTP/1.1
Content-Type: text/plain
x-amz-server-side-encryption: aws:kms
x-amz-server-side-encryption-aws-kms-key-id: arn:aws:kms:us-west-1:<account>:key/<kms-key-guid>
User-Agent: aws-sdk-dotnet-45/3.3.16.2 aws-sdk-dotnet-core/3.3.21.6 .NET_Runtime/4.0 .NET_Framework/4.0 OS/Microsoft_Windows_NT_6.1.7601_Service_Pack_1 ClientSync
host: notarealcorp.s3.us-west-1.amazonaws.com
X-Amz-Date: 20180109T072431Z
X-Amz-Decoded-Content-Length: 18
X-Amz-Content-SHA256: STREAMING-AWS4-HMAC-SHA256-PAYLOAD
Authorization: AWS4-HMAC-SHA256 Credential=<access-key>/20180109/us-west-1/s3/aws4_request, SignedHeaders=content-length;content-type;host;user-agent;x-
amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-server-side-encryption;x-amz-server-side-encryption-aws-kms-key-id, Signature=<signature>
Content-Length: 191
Expect: 100-continue
12;chunk-signature=<another-signature>
letsseeifthisworks
0;chunk-signature=<yet-another-signature>
这是响应:
HTTP/1.1 403 Forbidden
x-amz-request-id: <request-id>
x-amz-id-2: <host-id>
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Tue, 09 Jan 2018 07:24:31 GMT
Connection: close
Server: AmazonS3
f3
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message>
<RequestId>request-id</RequestId><HostId>host-id</HostId></Error>
0
这些是我设置的IAM权限。 首先,S3:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
然后是KMS:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "kms:*",
"Resource": "*"
}
]
}
当我注释掉加密时,呼叫将继续进行,我可以看到正在创建的文件。
我不确定“拒绝访问”是什么意思。 我被拒绝访问什么资源? 任何帮助将不胜感激。
AWS不提供“拒绝访问”的详细信息。 在出于安全目的精心设计的系统中,这是正常现象,但这对开发人员没有帮助。
使用AWS CLI验证您的KMS密钥是否有效。
aws s3 cp SourceFile s3://mybucket/DestinationFile --sse aws:kms --sse-kms-key-id <ReplaceWithYourKeyId>
如果CLI有效,则您的代码有问题(我看不到)。 如果CLI也报告错误,则可能是KMS密钥用户问题。
创建KMS密钥时,请设置密钥的“使用权限”。 转到AWS IAM控制台。 仔细检查运行代码的IAM用户是否具有使用KMS密钥的权限。 在“关键用户”下查看。
如果您正确定义了关键用户,请转至S3控制台并使用相同的KMS密钥测试上传文件,并确保该文件有效。
原来,我缺少密钥策略的“授予”权限,该策略使您可以将密钥权限委派给支持KMS服务器端加密的AWS服务。 一旦我添加了它,它就起作用了。
{
"Sid": "Allow attachment of persistent resources",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<account>:user/<user>"
},
"Action": [
"kms:CreateGrant",
"kms:ListGrants",
"kms:RevokeGrant"
],
"Resource": "*",
"Condition": {
"Bool": {
"kms:GrantIsForAWSResource": "true"
}
}
}
此处提供更多信息: https : //docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-users
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.