存储加密

更新时间:
复制 MD 格式

轻量消息队列(原 MNS)支持服务端存储加密(Server-Side Encryption),对队列和主题中的消息体进行自动加密存储和解密读取,满足数据安全合规要求。加解密过程对消息的发送方和接收方完全透明,无需修改客户端代码。

工作原理

轻量消息队列使用信封加密(Envelope Encryption)机制。服务端使用数据加密密钥(DEK)加密消息体,再使用主密钥保护 DEK。发送消息时,服务端自动完成加密后写入存储;接收、订阅推送或消费消息时,服务端自动解密后返回明文消息体。

SSE-SMQ(服务托管密钥加密)和 SSE-KMS(用户自管密钥加密)的区别在于主密钥的管理方不同:SSE-SMQ 的密钥由轻量消息队列服务托管;SSE-KMS 使用在密钥管理服务 KMS 中管理的密钥。

支持的加密算法

算法

说明

AES-256-GCM(默认)

国际标准认证加密

加密范围

存储加密仅加密消息体(MessageBody)。消息属性、系统属性(MessageId、EnqueueTime 等)和队列/主题元数据不加密。

加密方案

加密方案

密钥管理方

适用场景

费用

SSE-SMQ(服务托管密钥)

轻量消息队列服务

快速启用加密,无需管理密钥

免费

SSE-KMS(用户自管密钥)

用户通过 KMS 管理

对密钥有自主管控需求的场景

KMS 侧计费,MNS 无额外收费。详情请参见KMS 计费方式

说明

使用 SSE-KMS 时,MNS 使用信封加密并缓存数据加密密钥(DEK),KMS API 调用频率远低于消息收发频率。详细计费请参见 KMS 计费说明。

前提条件

存储加密功能当前需申请开通。请提交工单申请开放,提交工单时需提供主账号 UID、资源名称及所在地域。

使用 SSE-KMS 时,还需满足以下条件:

  • KMS 密钥需与队列或主题属于同一账号、同一地域。

  • KMS 密钥需为 AES-256 对称密钥(KMS KeySpec 为 Aliyun_AES_256)。

  • 需确保服务关联角色 AliyunMNSAccessingKMSRole 具有访问指定 KMS 密钥的权限,包括 kms:GenerateDataKeykms:Decrypt。如控制台出现授权提示,请按页面指引完成服务关联角色授权。

配置存储加密

通过控制台配置

  1. 登录轻量消息队列(原 MNS)控制台

  2. 在左侧导航栏,选择队列模型 > 队列列表

  3. 在顶部菜单栏,选择地域。

  4. 创建队列或编辑已有队列,在存储加密参数选项开启加密开关,选择加密方案(SSE-SMQ 或 SSE-KMS),然后单击确定。其他参数的设置,请参见队列操作

说明

主题(Topic)的操作方式与队列一致:在左侧导航栏选择主题模型 > 主题列表,然后单击创建主题编辑主题进行配置。

通过 API 配置

您可以在创建队列或修改队列属性时配置存储加密。主题的 CreateTopicSetTopicAttributesGetTopicAttributes 使用相同的加密参数。

参数

说明

EnableSSE

是否开启存储加密。取值:truefalse

SSEType

加密方式。取值:SMQKMS

SSEAlgorithm

加密算法。当前支持 AES-256-GCM。不填写时使用默认算法。

KMSKeyId

KMS 密钥 ID。仅 SSETypeKMS 时填写。

创建 SSE-SMQ 加密队列示例:

PUT /queues/{queueName} HTTP/1.1

<Queue>
  <EnableSSE>true</EnableSSE>
  <SSEType>SMQ</SSEType>
  <SSEAlgorithm>AES-256-GCM</SSEAlgorithm>
</Queue>

创建 SSE-KMS 加密队列示例:

PUT /queues/{queueName} HTTP/1.1

<Queue>
  <EnableSSE>true</EnableSSE>
  <SSEType>KMS</SSEType>
  <SSEAlgorithm>AES-256-GCM</SSEAlgorithm>
  <KMSKeyId>key-xxx</KMSKeyId>
</Queue>

修改队列加密配置示例:

PUT /queues/{queueName}?metaoverride=true HTTP/1.1

<Queue>
  <EnableSSE>true</EnableSSE>
  <SSEType>KMS</SSEType>
  <SSEAlgorithm>AES-256-GCM</SSEAlgorithm>
  <KMSKeyId>key-xxx</KMSKeyId>
</Queue>

关闭队列加密示例:

PUT /queues/{queueName}?metaoverride=true HTTP/1.1

<Queue>
  <EnableSSE>false</EnableSSE>
</Queue>

查看加密状态

您可以通过控制台查看队列或主题的存储加密状态,也可以调用 GetQueueAttributesGetTopicAttributes 查看加密字段。

HTTP/1.1 200 OK

<Queue>
  <EnableSSE>true</EnableSSE>
  <SSEType>KMS</SSEType>
  <SSEAlgorithm>AES-256-GCM</SSEAlgorithm>
  <KMSKeyId>key-xxx</KMSKeyId>
</Queue>

使用说明

  • 您可以随时开启或关闭加密开关,也可以切换加密方式。配置变更后实时生效,新发送的消息将按照更新后的加密策略处理。

  • 加密仅对新写入的消息生效,存量消息不会被回溯加密;关闭加密后,已加密的消息在密钥可用时仍可正常解密读取。

  • 同一队列中可同时存在明文消息和加密消息,例如开启、关闭或切换加密方式后。

  • 消息体大小限制基于加密前的原始大小计算。加密会引入约 30 字节的额外开销,但不影响用户可用的消息体大小上限。

  • 开启存储加密后,消息收发会有一定性能开销,具体影响与消息大小、并发量和密钥缓存命中情况有关。

  • 使用 SSE-KMS 时,KMS 密钥轮转后,新消息将使用新版本密钥加密,旧消息仍可通过 KMS 自动使用旧版本密钥解密。

  • 如果将资源配置切换为另一个 KMSKeyId,仅新写入的消息使用新密钥;历史消息仍依赖写入时记录的旧 KMSKeyId 和加密元数据。请保留旧密钥及 kms:Decrypt 权限,直到旧消息全部过期、删除或确认无需读取。

  • Topic 消息订阅推送到 Queue 时,MNS 会先解密源 Topic 消息,再按照目标队列当前的存储加密配置写入;如果目标队列开启 SSE,会使用目标队列的加密配置重新加密。HTTP 等非队列推送场景返回解密后的明文消息体。

  • 死信队列(DLQ)是普通队列。Topic 订阅消息转入 DLQ 时,会按照目标 DLQ 队列的存储加密配置处理;Queue 自身消息转入 DLQ 时会保留原消息的加密状态和加密元数据,不会因目标 DLQ 队列开启 SSE 而重新加密。消费 DLQ 中的加密消息时,仍需原消息对应的 KMS 密钥可用。

重要注意事项

警告:使用 SSE-KMS 时,KMS 密钥被禁用、计划删除或删除将影响消息收发和已加密消息读取。

  • 密钥被禁用:新消息发送失败,已加密的存量消息也无法解密读取;重新启用密钥后可恢复。

  • 密钥处于计划删除(PendingDeletion)状态:行为同禁用;如删除流程完成,使用该密钥加密的数据将永久不可解密。

  • 密钥已删除:使用该密钥加密的数据永久不可解密。

  • 服务关联角色 AliyunMNSAccessingKMSRole 被删除或权限被收回:SSE-KMS 加密、解密请求将因无权限而失败。

  • 更换 KMSKeyId 后,请勿立即禁用或删除旧密钥;旧消息、旧 DLQ 消息或仍在投递链路中的消息可能仍依赖旧密钥解密。

常见错误码及处理建议如下:

错误码

常见原因

处理建议

InvalidKMSKeyId

开启 SSE-KMS 但未配置 KMSKeyId

配置同账号、同地域的 AES-256 对称 KMS 密钥后重试。

KMSKeyDisabled

KMS 密钥被禁用,或处于不可用于加解密的状态。

在 KMS 控制台启用密钥;如密钥处于计划删除状态,请先取消删除。

KMSKeyNotFound

KMSKeyId 不存在、填写错误,或密钥已删除。

校验 KMSKeyId、账号和地域;如果密钥已删除,使用该密钥加密的历史消息无法恢复。

KMSAccessDenied

服务关联角色缺少 kms:GenerateDataKeykms:Decrypt 权限。

按控制台授权提示修复 AliyunMNSAccessingKMSRole 权限,或在 KMS/RAM 中补齐授权。

KMSServiceUnavailable

KMS 临时不可用、限流、网络异常或内部错误。

稍后重试;如果持续出现,请记录 RequestId 并联系技术支持。

DecryptionFailed / EncryptionFailed

加解密过程失败,可能与密钥状态、权限或消息加密元数据异常有关。

先检查密钥状态和角色权限;仍无法恢复时,请携带 RequestId、队列/主题名称和时间范围联系技术支持。

常见问题

开启加密后需要改代码吗?
不需要,加解密在服务端透明完成。

能切换加密方式吗?
可以,新消息使用新的加密方式处理,旧消息在对应密钥可用时仍可正常解密。

如何确认加密已生效?
可以在控制台查看队列或主题的存储加密状态,也可以调用 GetQueueAttributesGetTopicAttributes 查看 EnableSSESSETypeSSEAlgorithmKMSKeyId 等字段。

开启加密后对性能有影响吗?
有一定性能开销,延迟可能略有增加。具体影响与消息大小、并发量和密钥缓存命中情况有关。

SSE-KMS 的 KMS 调用费用怎么估算?
SSE-KMS 涉及 KMS 侧计费。MNS 使用信封加密并缓存 DEK,KMS API 调用频率远低于消息收发频率。具体费用请参见 KMS 计费说明。

KMS 密钥支持轮转吗?
支持。KMS 密钥轮转后,新消息使用新版本密钥加密,旧消息仍可通过 KMS 自动使用旧版本密钥解密。

能否禁用 KMS 密钥?
强烈不建议。禁用或删除 KMS 密钥后,关联队列或主题的消息收发将立即失败;密钥删除后,使用该密钥加密的数据将永久不可解密。

相关文档