繁体   English   中英

从 S3 到 SQS 的加密存储桶通知

[英]Encrypted bucket notifications from S3 to SQS

如何将 S3 存储桶通知设置到 SQS 中的队列,其中在存储桶和队列上都使用了 KMS?

  • 我在 S3 中有一个存储桶,其中的内容使用 AWS 托管密钥( aws/s3默认密钥)进行加密。
  • 我在 SQS 中有一个启用 SSE(服务器端加密)但使用 CMK(客户管理密钥)的队列。

当我 go 进入 S3 web 控制台并尝试在我的存储桶上添加一个通知事件以发送到我在 SQS 中的队列时,我会看到以下错误消息:

无法验证以下目标配置。 无法使用 KMS 加密发送到 SSE 队列的消息。 (arn:aws:sqs:ca-central-1: ... : ...)

我已经尝试配置我的 KMS 密钥策略,为 S3 服务帐户提供所需的权限。

        {
            "Sid": "Let S3 encrypt messages so that bucket notifications can be encrypted",
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Encrypt"
            ],
            "Resource": "*"
        },

为了允许存储桶通知进入加密队列,我需要做什么?

根据文档,第二个动作应该是kms:Decrypt而不是kms:Encrypt

为什么需要kms:Decrypt有点违反直觉。 你可能会想,既然 SQS 队列是加密的,那么 S3 服务调用SendMessage API时,它需要kms:Encrypt权限来保证消息可以被 KMS 服务加密,对吧? 不完全是,原因如下:

  1. 消息直接由主密钥 (CMK) 加密。 相反,它使用信封加密,数据由数据密钥加密。 为什么? 因为对称 CMK 可以使用Encrypt API加密的最大数据大小为 4096 字节,而 SQS 服务支持的消息大小可以远大于 4KB。 因此,不需要kms:Encrypt而是需要kms:GenerateDataKey来生成用于加密 SQS 消息的数据密钥。

  2. 此 AWS 文档的“为生产者配置 KMS 权限”部分中,它解释了为什么需要kms:Decrypt

kms:Decrypt的调用是在使用新数据密钥之前验证它的完整性。

更清楚地说, GenerateDataKey API返回明文数据密钥数据密钥的加密副本。 明文数据密钥用于对 SQS 消息进行加密,加密后的数据密钥将与消息一起存储在队列中。 验证加密的数据密钥确实是明文数据密钥的密文的唯一方法是该服务需要具有kms:Decrypt权限才能解密密文并确保 output 与返回的明文数据密钥完全相同在 GenerateDataKey API 响应中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM