S3到SQS的加密存储桶通知

6
如何将S3桶通知设置为SQS队列,其中桶和队列都使用KMS?
  • 我有一个S3桶,其中内容使用AWS托管密钥(aws/s3默认密钥)加密。
  • 我有一个启用了SSE(服务器端加密)的SQS队列,但是使用的是客户管理密钥CMK。

当我进入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": "*"
        },

如何才能允许存储桶通知发送到加密队列中?


桶和队列在同一地区吗? - Marcin
1个回答

7
根据文档,第二个操作应该是kms:Decrypt而不是kms:Encrypt
这有点让人感到违反直觉,你可能会认为由于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权限来解密密文并确保输出与GenerateDataKey API响应中返回的明文数据密钥完全相同

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接