c# - 使用 KMS 加密的 S3 PutObject 失败并出现 403 "Access Denied"错误

标签 c# amazon-web-services encryption amazon-s3 amazon-kms

我一直在尝试对 AWS S3 进行 PutObject 调用,同时利用带有 KMS key 的服务器端加密,但调用始终失败,并显示 403 代码,并且消息显示“访问被拒绝”。

这是我用来进行调用的 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 key 是否有效。

aws s3 cp SourceFile s3://mybucket/DestinationFile --sse aws:kms --sse-kms-key-id <ReplaceWithYourKeyId>

如果 CLI 工作,那么您的代码有问题(我没有看到)。如果 CLI 也报告错误,则您可能存在 KMS key 用户问题。

创建 KMS key 时,您可以设置该 key 的使用权限。转到 AWS IAM 控制台。仔细检查运行代码的 IAM 用户是否有权使用 KMS key 。查看“关键用户”下的内容。

如果您已正确定义关键用户,请转至 S3 控制台并使用相同的 KMS key 测试上传文件并确保其正常工作。

关于c# - 使用 KMS 加密的 S3 PutObject 失败并出现 403 "Access Denied"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48163519/

相关文章:

c# - 我如何模拟私有(private)领域?

c# - LINQ 查询带有绑定(bind)到列的子句

c# - 将时间值向下舍入到最接近的刻钟

angular - 在 AWS EC2 实例上部署 Angular 应用程序的流程

python - 如何使用RSA方案加密字符串?

android - 椭圆曲线加密 - iOS 和 Android 上的 ECDSA

C# 语言 : why WeakReference or Weak Event Pattern?

amazon-web-services - 在 S3 上重命名文件是否需要花钱?

linux - 在基于 amazon linux AMI 的 ec2 实例上安装 sshpass

ios - 如何在 iOS 中创建受密码保护的 zip 文件