

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用加密的 Amazon SQS 队列订阅设置 Amazon SNS 主题加密
<a name="sns-enable-encryption-for-topic-sqs-queue-subscriptions"></a>

您可以为主题启用服务器端加密（SSE）以保护其数据。要允许 Amazon SNS 将消息发送到加密的 Amazon SQS 队列，与 Amazon SQS 队列关联的客户自主管理型密钥必须具有一个策略语句，该语句向 Amazon SNS 服务主体授予对 AWS KMS API 操作 `GenerateDataKey` 和 `Decrypt` 的访问权限。有关使用 SSE 的更多信息，请参阅[使用服务器端加密保护 Amazon SNS 数据安全](sns-server-side-encryption.md)。

本主题介绍如何使用 AWS 管理控制台为具有加密 Amazon SQS 队列订阅的 Amazon SNS 主题启用 SSE。

## 步骤 1：创建自定义 KMS 密钥
<a name="create-custom-cmk"></a>

1. 使用至少具有 `AWSKeyManagementServicePowerUser` 策略的用户账户登录 [AWS KMS 控制台](https://console.aws.amazon.com/kms/)。

1. 选择**创建密钥**。

1. 要创建对称加密 KMS 密钥，对于**密钥类型**，请选择**对称**。

   有关如何在 AWS KMS 控制台中创建非对称 KMS 密钥的信息，请参阅[创建非对称 KMS 密钥（控制台）](https://docs.aws.amazon.com/kms/latest/developerguide/asymm-create-key.html#create-asymmetric-keys-console)。

1. 在**密钥用法**中，系统已为您选择**加密和解密**选项。

   有关如何创建用于生成和验证 MAC 代码的 KMS 密钥的信息，请参阅[创建 HMAC KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/hmac-create-key.html)。

   有关**高级选项**的更多信息，请参阅[专用密钥](https://docs.aws.amazon.com/kms/latest/developerguide/key-types.html)。

1. 选择**下一步**。

1. 键入 KMS 密钥的别名。别名名称不能以 **aws/** 开头。该**aws/**前缀由 Amazon Web Services 保留，用于 AWS 托管式密钥 在您的账户中表示。
**注意**  
添加、删除或更新别名可以允许或拒绝对 KMS 密钥的权限。有关详细信息，请参阅[适用于 AWS KMS的 ABAC](https://docs.aws.amazon.com/kms/latest/developerguide/abac.html) 和[使用别名控制 KMS 密钥的访问权限](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#hmac-key-concept)。

   别名是一个显示名称，您可以使用它来标识 KMS 密钥。我们建议您选择一个别名，用来指示您计划保护的数据类型或计划与 KMS 密钥搭配使用的应用程序。

   在 AWS 管理控制台中创建 KMS 密钥时需要别名。当您使用[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作时，它们是可选的。

1. （可选）为 KMS 密钥键入描述。

   现在，除非[密钥状态](https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html)为 `Pending Deletion` 或 `Pending Replica Deletion`，否则您可以随时添加描述或更新描述。要添加、更改或删除现有客户托管密钥的[描述，请在中编辑](https://docs.aws.amazon.com/kms/latest/developerguide/editing-keys.html)描述 AWS 管理控制台 或使用[UpdateKeyDescription](https://docs.aws.amazon.com/kms/latest/APIReference/API_UpdateKeyDescription.html)操作。

1. （可选）键入标签键和一个可选标签值。要向 KMS 密钥添加多个标签，请选择 **Add tag**（添加标签）。
**注意**  
为 KMS 密钥添加标签或取消其标签可以允许或拒绝对 KMS 密钥的权限。有关详细信息，请参阅[适用于 AWS KMS的 ABAC](https://docs.aws.amazon.com/kms/latest/developerguide/abac.html) 和[使用标签控制 KMS 密钥的访问权限](https://docs.aws.amazon.com/kms/latest/developerguide/tag-authorization.html)。

   向 AWS 资源添加标签时， AWS 会生成一份成本分配报告，其中包含按标签汇总的使用量和成本。标签还可以用来控制对 KMS 密钥的访问。有关标记 KMS 密钥的信息，请参阅[标记密钥](https://docs.aws.amazon.com/kms/latest/developerguide/tagging-keys.html)和[适用于 AWS KMS的 ABAC](https://docs.aws.amazon.com/kms/latest/developerguide/abac.html)。

1. 选择**下一步**。

1. 选择可管理 KMS 密钥的 IAM 用户和角色。
**注意**  
此密钥策略赋予了对此 KMS 密钥的 AWS 账户 完全控制权。借助此控制权，账户管理员可以使用 IAM 策略授予其他主体管理 KMS 密钥的权限。有关详细信息，请参阅[原定设置密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html)。  
   
IAM 最佳实践不鼓励使用具有长期凭证的 IAM 用户。而应尽可能使用提供临时凭证的 IAM 角色。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 中的安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

1. （可选）要阻止选定 IAM 用户和角色删除此 KMS 密钥，请在页面底部的**密钥删除**部分中，清除**允许密钥管理员删除此密钥**复选框。

1. 选择**下一步**。

1. 选择可在[加密操作](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#cryptographic-operations)中使用密钥的 IAM 用户和角色。选择**下一步**。

1. 在 **Review and edit key policy (审核和编辑密钥策略)** 页面上，向密钥策略添加以下语句，然后选择 **Finish (完成)**。

   ```
   {
       "Sid": "Allow Amazon SNS to use this key",
       "Effect": "Allow",
       "Principal": {
           "Service": "sns.amazonaws.com"
       },
       "Action": [
           "kms:Decrypt",
           "kms:GenerateDataKey*"
       ],
       "Resource": "*"
   }
   ```

新的客户自主管理型密钥将显示在密钥列表中。

## 步骤 2：创建加密的 Amazon SNS 主题
<a name="create-encrypted-topic"></a>

1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/home)。

1. 在导航面板上，选择**主题**。

1. 选择**创建主题**。

1. 在 **Create new topic (创建新主题)** 页面上，对于 **Name (名称)**，输入主题名称（例如，`MyEncryptedTopic`），然后选择 **Create topic (创建主题)**。

1. 展开**加密**部分并执行以下操作：

   1. 选择 **Enable server-side encryption (启用服务器端加密)**。

   1. 指定客户自主管理型密钥。有关更多信息，请参阅 [关键术语](sns-server-side-encryption.md#sse-key-terms)。

      对于每种客户自主管理型密钥类型，将显示**描述**、**账户**和客户自主管理型密钥 **ARN**。
**重要**  
如果您不是客户自主管理型密钥的拥有者，或者您登录的账户没有 `kms:ListAliases` 和 `kms:DescribeKey` 权限，则无法在 Amazon SNS 控制台上查看有关客户自主管理型密钥的信息。  
要求客户自主管理型密钥的拥有者授予您这些权限。有关更多信息，请参阅《AWS Key Management Service Developer Guide》**中的 [AWS KMS API Permissions: Actions and Resources Reference](https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html)。

   1. 对于**客户托管密钥 **MyCustomKey****[，请选择您之前创建](#create-custom-cmk)的密钥，然后选择**启用服务器端加密**。

1. 选择**保存更改**。

   您的主题已启用 SSE 并显示**MyTopic**页面。

   主题的**加密**状态、 AWS **账户**、**客户自主管理型密钥**、客户自主管理型密钥 **ARN** 和**描述**将显示在**加密**选项卡上。

您的新的加密主题将显示在主题列表中。

## 步骤 3：创建并订阅加密的 Amazon SQS 队列
<a name="create-encrypted-queue"></a>

1. 登录 [Amazon SQS 控制台](https://console.aws.amazon.com/sqs/)。

1. 选择 **Create New Queue**（创建队列）。

1. 在 **Create New Queue (创建新队列)** 页面上，执行以下操作：

   1. 输入 **Queue Name (队列名称)**（例如，`MyEncryptedQueue1`）。

   1. 选择 **Standard Queue (标准队列)**，然后选择 **Configure Queue (配置队列)**。

   1. 选择 **Use SSE (使用 SSE)**。

   1. 对于 **AWS KMS key**MyCustomKey****[，选择您之前创建](#create-custom-cmk)的队列，然后选择**创建队列**。

1. 重复该过程以创建第二个队列（例如，名为 `MyEncryptedQueue2`）。

   您的新的加密队列将显示在队列列表中。

1. 在 Amazon SQS 控制台上，选择 `MyEncryptedQueue1` 和 `MyEncryptedQueue2`，然后选择 **Queue Actions**（队列操作）、**Subscribe Queues to SNS Topic**（订阅队列至 SNS 主题）。

1. 在 “**订阅主题**” 对话框中，选择 “**选择主题**” **MyEncryptedTopic**，然后选择 “**订阅**”。

   您的加密队列对加密主题的订阅将显示在 **Topic Subscription Result (主题订阅结果)** 对话框中。

1. 选择**确定**。

## 步骤 4：向加密的主题发布消息
<a name="publish-to-encrypted-topic"></a>

1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/home)。

1. 在导航面板上，选择**主题**。

1. 从主题列表中选择，**MyEncryptedTopic**然后选择**发布消息**。

1. 在 **Publish a message (发布消息)** 页面上，执行以下操作：

   1. （可选）在 **Message details (消息详细信息)** 部分中，输入 **Subject (主题)**（例如：`Testing message publishing`）。

   1. 在 **Message body (消息正文)** 部分中，输入消息正文（例如，`My message body is encrypted at rest.`）。

   1. 选择**发布消息**。

您的消息将发布到订阅的加密队列。

## 步骤 5：验证消息传输
<a name="verify-message-delivery"></a>

1. 登录 [Amazon SQS 控制台](https://console.aws.amazon.com/sqs/)。

1. 从队列列表中选择 **MyEncryptedQueue1**，然后选择**发送和接收消息**。

1. 在 “在 ** MyEncryptedQueue1 页中发送和接收消息**” 上，选择 “**轮询留言**”。

   此时将显示[您之前发送的](#publish-to-encrypted-topic)消息。

1. 选择 **More Details (更多详细信息)** 以查看您的消息。

1. 完成后，选择 **Close (关闭)**。

1. 对 **MyEncryptedQueue2** 重复该过程。