

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon SNS 資料加密
<a name="sns-data-encryption"></a>

資料保護是指保護往返 Amazon SNS 的傳輸中資料，以及存放在 Amazon SNS 資料中心內磁碟的靜態資料。您可以透過 Secure Sockets Layer (SSL) 或用戶端加密來保護傳輸中的資料。根據預設，Amazon SNS 會使用磁碟加密來存放訊息和檔案。您可以要求 Amazon SNS 先加密訊息，再將訊息儲存至其資料中心的加密檔案系統，以保護靜態資料。Amazon SNS 建議使用 SSE 來最佳化資料加密。

# 使用伺服器端加密保護 Amazon SNS 資料
<a name="sns-server-side-encryption"></a>

伺服器端加密 (SSE) 可讓您使用 AWS Key Management Service () 中管理的金鑰來保護 Amazon SNS 主題中的訊息內容，以將敏感資料儲存在加密的主題中AWS KMS。

Amazon SNS 一收到訊息，SSE 就會將其加密。訊息會以加密形式儲存，且只在傳送時才會解密。
+ 如需有關使用 AWS 管理主控台 或 管理 SSE 的資訊 適用於 Java 的 AWS SDK （透過使用 `[CreateTopic](https://docs.aws.amazon.com/sns/latest/api/API_CreateTopic.html)`和 `[SetTopicAttributes](https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html)` API 動作設定 `KmsMasterKeyId` 屬性），請參閱 [使用伺服器端加密設定 Amazon SNS 主題加密](sns-enable-encryption-for-topic.md)。
+ 如需有關使用 CloudFormation （透過使用 `[AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html)` 資源設定 `KmsMasterKeyId` 屬性） 建立加密主題的資訊，請參閱 *AWS CloudFormation 使用者指南*。

**重要**  
所有對啟用 SSE 之主題的請求都必須使用 HTTPS 和[簽章版本 4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)。  
如需有關其他服務與加密主題之間相容性的資訊，請參閱您的服務說明文件。  
Amazon SNS 只支援對稱加密 KMS 金鑰。您無法使用任何其他類型的 KMS 金鑰來加密服務資源。如需判斷 KMS 金鑰是否為對稱加密金鑰的說明，請參閱[識別非對稱 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/find-symm-asymm.html)。

AWS KMS 結合了安全、高可用性的硬體和軟體，以提供針對雲端擴展的金鑰管理系統。當您搭配 使用 Amazon SNS 時 AWS KMS，加密訊息資料[的資料金鑰](#sse-key-terms)也會加密，並使用其保護的資料存放。

以下為使用 AWS KMS的優點：
+ 您可以自行建立和管理 [AWS KMS key](#sse-key-terms) 金鑰。
+ 您也可以使用 AWS Amazon SNS 的受管 KMS 金鑰，這些金鑰對於每個帳戶和區域都是唯一的。
+  AWS KMS 安全標準可協助您符合加密相關的合規要求。

如需詳細資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[什麼是 AWS Key Management Service？](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)。

## 加密範圍
<a name="what-does-sse-encrypt"></a>

SSE 會加密 Amazon SNS 主題中的訊息內文。

SSE 不會加密下列項目：
+ 主題中繼資料 (主題名稱和屬性)
+ 訊息中繼資料 (主旨、訊息 ID、時間戳記和屬性)
+ 資料保護政策 
+ 每個主題指標

**注意**  
只有在啟用加密主題後傳送的訊息，才會對訊息進行加密。Amazon SNS 不會加密待處理訊息。
即使已停用其主題的加密，已加密訊息仍會維持加密。

## 重要用語
<a name="sse-key-terms"></a>

以下重要術語有助於您更加了解 SSE 的功能。如需描述的詳細資訊，請參閱 *[Amazon Simple Notification Service API 參考](https://docs.aws.amazon.com/sns/latest/api/)*。

**資料金鑰**  
資料加密金鑰 (DEK) 負責加密 Amazon SNS 訊息的內容。  
如需詳細資訊，請參閱 *AWS Key Management Service 開發人員指南*中的[資料金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys)，以及 *AWS Encryption SDK 開發人員指南*中的[信封加密](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/how-it-works.html#envelope-encryption)。

**AWS KMS key ID**  
別名、別名 ARN、金鑰 ID 或 的金鑰 ARN AWS KMS key，或自訂 AWS KMS- 在您的 帳戶或其他帳戶中。雖然 AWS KMS Amazon SNS AWS 受管 的別名一律為 `alias/aws/sns`，但自訂的別名 AWS KMS 可以是 `alias/MyAlias`。您可以使用這些 AWS KMS 金鑰來保護 Amazon SNS 主題中的訊息。  
請謹記以下幾點：  
+ 第一次使用 AWS 管理主控台 來指定主題的 Amazon SNS AWS 受管 KMS 時， 會 AWS KMS 建立 Amazon SNS 的 AWS 受管 KMS。
+ 或者，當您第一次在已啟用 SSE 的主題上使用 `Publish`動作時， 會 AWS KMS 建立 Amazon SNS 的 AWS 受管 KMS。
您可以建立 AWS KMS 金鑰、定義控制如何使用 AWS KMS 金鑰的政策，以及使用 AWS KMS 主控台的 **AWS KMS keys**區段或 `[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)` AWS KMS 動作來稽核 AWS KMS 用量。如需詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**中的 [AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys) 和[建立金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。如需識別 AWS KMS 符的更多範例，請參閱 *AWS Key Management Service API 參考*中的 [KeyId](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html#API_DescribeKey_RequestParameters)。如需尋找 AWS KMS 識別符的資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[尋找金鑰 ID 和 ARN](https://docs.aws.amazon.com/kms/latest/developerguide/viewing-keys.html#find-cmk-id-arn)。  
使用 需支付額外費用 AWS KMS。如需詳細資訊，請參閱 [估算 AWS KMS 成本](sns-key-management.md#sse-estimate-kms-usage-costs) 和 [AWS Key Management Service 定價](https://aws.amazon.com/kms/pricing)。

# 管理 Amazon SNS 加密金鑰和成本
<a name="sns-key-management"></a>

以下各節提供有關使用 AWS Key Management Service (AWS KMS) 中所管理金鑰的資訊。

**注意**  
Amazon SNS 只支援對稱加密 KMS 金鑰。您無法使用任何其他類型的 KMS 金鑰來加密服務資源。如需判斷 KMS 金鑰是否為對稱加密金鑰的說明，請參閱[識別非對稱 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/find-symm-asymm.html)。

## 估算 AWS KMS 成本
<a name="sse-estimate-kms-usage-costs"></a>

為了預測成本並更好地了解您的 AWS 帳單，您可能想知道 Amazon SNS 使用您的 的頻率 AWS KMS key。

**注意**  
下列公式可以提供預期成本的良好概念，但由於 Amazon SNS 的分佈特性，實際成本可能會比較高。

若要計算*每個主題*的 API 請求數量 (`R`)，請使用下列公式：

```
R = B / D * (2 * P)
```

`B` 是帳單週期 (以秒為單位)。

`D` 是資料金鑰重複使用期間 (以秒為單位，Amazon SNS 重複使用資料金鑰最多 5 分鐘)。

`P` 是發布的[委託人](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Principal)數量，傳送至 Amazon SNS 主題。

以下為計算範例。如需確切的定價資訊，請參閱 [AWS Key Management Service 定價](https://aws.amazon.com/kms/pricing/)。

### 範例 1：計算 1 個發佈者和 1 個主題的 AWS KMS API 呼叫數量
<a name="example-1-topic-1-publisher"></a>

此範例假設如下：
+ 帳單週期是 1 月 1-31 日 (2,678,400 秒)。
+ 資料金鑰重複使用期間為 5 分鐘 (300 秒)。
+ 有 1 個主題。
+ 有 1 個發布委託人。

```
2,678,400 / 300 * (2 * 1) = 17,856
```

### 範例 2：計算多個發佈者和 2 個主題的 AWS KMS API 呼叫數量
<a name="example-2-topics-multiple-publishers"></a>

此範例假設如下：
+ 帳單週期是 2 月 1-28 日 (2,419,200 秒)。
+ 資料金鑰重複使用期間為 5 分鐘 (300 秒)。
+ 有 2 個主題。
+ 第一個主題有 3 個發布委託人。
+ 第二個主題有 5 個發布委託人。

```
(2,419,200 / 300 * (2 * 3)) + (2,419,200 / 300 * (2 * 5)) = 129,024
```

## 設定 AWS KMS 許可
<a name="sns-what-permissions-for-sse"></a>

在使用 SSE 之前，您必須設定 AWS KMS key 政策以允許主題加密，以及訊息的加密和解密。如需範例和有關 AWS KMS 權限的詳細資訊，請參閱 *AWS Key Management Service 開發人員指南*中的 [AWS KMS API 許可：動作和資源參考](https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html)。如需如何設定使用伺服器端加密的 Amazon SNS 主題的詳細資訊，請參閱 [其他資訊](sns-enable-encryption-for-topic.md#set-up-topic-with-sse)。

**注意**  
您也可以使用 IAM 政策管理對稱加密 KMS 金鑰的許可。如需詳細資訊，請參閱[搭配 使用 IAM 政策 AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html)。  
雖然您可以設定全域許可來向 Amazon SNS 進行傳送和接收，但 AWS KMS 需要您替 IAM 政策 `Resource` 區段中特定區域裡的 KMS 完整 ARN 明確命名。

您也必須確保 的金鑰政策 AWS KMS key 允許必要的許可。若要這樣做，請將在 Amazon SNS 中產生和消費加密訊息的委託人命名為 KMS 金鑰政策中的使用者。

或者，您可以在指派給發佈和訂閱以接收 Amazon SNS 中加密訊息之主體的 IAM 政策中指定必要的 AWS KMS 動作和 KMS ARN。如需詳細資訊，請參閱 *AWS Key Management Service 開發人員指南*中的[管理 AWS KMS的存取權](https://docs.aws.amazon.com/kms/latest/developerguide/control-access-overview.html#managing-access)。

如果您為 Amazon SNS 主題選取客戶管理金鑰，且您使用別名來透過 IAM 政策或具有條件金鑰 `kms:ResourceAliases` 的 KMS 金鑰政策來控制 KMS 金鑰的存取權，請確保所選客戶管理的金鑰也具有關聯的別名。如需有關使用別名來控制 KMS 金鑰存取權的詳細資訊，請參閱*AWS Key Management Service 開發人員指南*中的[使用別名控制 KMS 金鑰的存取權](https://docs.aws.amazon.com/kms/latest/developerguide/alias-authorization.html)。

### 允許使用者透過 SSE 傳送訊息至主題
<a name="send-to-encrypted-topic"></a>

發布者對於 AWS KMS key必須擁有 `kms:GenerateDataKey*` 和 `kms:Decrypt` 許可。

```
{
  "Statement": [{
    "Effect": "Allow",
    "Action": [
      "kms:GenerateDataKey*",
      "kms:Decrypt"
    ],
    "Resource": "arn:aws:kms:us-east-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"
  }, {
    "Effect": "Allow",
    "Action": [
      "sns:Publish"
    ],
    "Resource": "arn:aws:sns:*:123456789012:MyTopic"
  }]
}
```

### 啟用來自 AWS 服務和加密主題的事件來源之間的相容性
<a name="compatibility-with-aws-services"></a>

數個 AWS 服務會將事件發佈至 Amazon SNS 主題。若要允許這些事件來源可用於加密主題，您必須執行以下步驟。

1. 使用客戶受管金鑰。如需詳細資訊，請參閱*《AWS Key Management Service 開發人員指南》*中的[建立索引鍵](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。

1. 若要允許 AWS 服務擁有 `kms:GenerateDataKey*`和 `kms:Decrypt`許可，請將下列陳述式新增至 KMS 政策。

   ```
   {
     "Statement": [{
       "Effect": "Allow",
       "Principal": {
         "Service": "service.amazonaws.com"
       },
       "Action": [
         "kms:GenerateDataKey*",
         "kms:Decrypt"
       ],
       "Resource": "*"
     }]
   }
   ```    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/sns/latest/dg/sns-key-management.html)
**注意**  
有些 Amazon SNS 事件來源會要求您在 AWS KMS key 政策中提供 IAM 角色 （而不是服務主體）：  
[Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ASGettingNotifications.html)
[Amazon Elastic Transcoder](https://docs.aws.amazon.com/elastictranscoder/latest/developerguide/notifications.html)
[AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/approvals.html#approvals-configuration-options)
[AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/notifications-for-AWS-Config.html)
[AWS Elastic Beanstalk](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.managing.sns.html)
[AWS IoT](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sns-rule.html)
[EC2 Image Builder](https://docs.aws.amazon.com/imagebuilder/latest/userguide/ibhow-integrations.html#integ-sns-encrypted)

1. 將 `aws:SourceAccount` 和 `aws:SourceArn` 條件金鑰新增至 KMS 資源政策，以進一步保護 KMS 金鑰免遭[混淆代理人](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)攻擊。有關每種情況的確切詳細資訊，請參閱服務專屬文件清單（上方）。
**重要**  
EventBridge-to-encrypted主題不支援將 `aws:SourceAccount``aws:SourceArn`、 和 `aws:SourceOrgID`新增至 AWS KMS 政策。

   ```
   {
     "Effect": "Allow",
     "Principal": {
       "Service": "service.amazonaws.com"
     },
     "Action": [
       "kms:GenerateDataKey*",
       "kms:Decrypt"
     ],
     "Resource": "*",
     "Condition": {
       "StringEquals": {
         "aws:SourceAccount": "customer-account-id"
       },
       "ArnLike": {
         "aws:SourceArn": "arn:aws:service:region:customer-account-id:resource-type:customer-resource-id"
       }
     }
   }
   ```

1. [啟用主題的 SSE](sns-enable-encryption-for-topic.md) 使用您的 KMS。

1. 提供加密主題的 ARN 至事件來源。

## AWS KMS 錯誤
<a name="sse-troubleshooting-errors"></a>

當您使用 Amazon SNS 和 時 AWS KMS，您可能會遇到錯誤。以下清單說明錯誤和可能的故障診斷解決方案。

**KMSAccessDeniedException**  
加密文字參考不存在或您無法存取的金鑰。  
HTTP 狀態碼：400

**KMSDisabledException**  
由於指定的 KMS 未啟用，因此請求遭到拒絕。  
HTTP 狀態碼：400

**KMSInvalidStateException**  
由於所指定資源的狀態對於此請求無效，因此請求遭到拒絕。如需詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**中的 [AWS KMS keys的金鑰狀態](https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html)。  
HTTP 狀態碼：400

**KMSNotFoundException**  
由於找不到指定的實體或資源，因此請求遭到拒絕。  
HTTP 狀態碼：400

**KMSOptInRequired**  
 AWS 存取金鑰 ID 需要 服務的訂閱。  
HTTP 狀態碼：403

**KMSThrottlingException**  
由於請求調節，因此請求遭到拒絕。如需限流的詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**中的[配額](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html#requests-per-second)。  
HTTP 狀態碼：400

# 使用伺服器端加密設定 Amazon SNS 主題加密
<a name="sns-enable-encryption-for-topic"></a>

Amazon SNS 支援伺服器端加密 (SSE)，以使用 AWS Key Management Service () 保護訊息的內容AWS KMS。請依照下列指示，使用 Amazon SNS 主控台或 CDK 啟用 SSE。

## 選項 1：使用 啟用加密 AWS 管理主控台
<a name="enable-encryption-console"></a>

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

1. 導覽至**主題**頁面，選取您的**主題**，然後選擇**編輯**。

1. 展開 **Encryption** (加密) 區段並執行下列動作：
   + 將加密切換為**啟用**。
   + 選取 **AWS 受管SNS金鑰** (alias/aws/sns) 做為加密金鑰。預設會選取此項。

1. 選擇**儲存變更**。

**注意**  
如果 不存在， AWS 受管金鑰 則會自動建立 。
如果您沒有看到金鑰或許可不足，請向管理員詢問 `kms:ListAliases`和 `kms:DescribeKey`。

## 選項 2：使用 啟用加密 AWS CDK
<a name="enable-encryption-cdk"></a>

若要在 CDK 應用程式中使用 AWS 受管SNS 金鑰，請新增下列程式碼片段：

```
import software.amazon.awscdk.services.sns.*;
import software.amazon.awscdk.services.kms.*;
import software.amazon.awscdk.core.*;

public class SnsEncryptionExample extends Stack {
    public SnsEncryptionExample(final Construct scope, final String id) {
        super(scope, id);

        // Define the managed SNS key
        IKey snsKey = Alias.fromAliasName(this, "helloKey", "alias/aws/sns");

        // Create the SNS Topic with encryption enabled
        Topic.Builder.create(this, "MyEncryptedTopic")
            .masterKey(snsKey)
            .build();
    }
}
```

## 其他資訊
<a name="set-up-topic-with-sse"></a>
+ **自訂 KMS 金鑰** – 您可以視需要指定自訂金鑰。在 Amazon SNS 主控台中，從清單中選擇您的自訂 KMS 金鑰或輸入 ARN。
+ **自訂 KMS 金鑰的許可** – 如果使用自訂 KMS 金鑰，請在金鑰政策中包含下列項目，以允許 Amazon SNS 加密和解密訊息：

```
{ 
    "Effect": "Allow", 
    "Principal": { 
        "Service": "sns.amazonaws.com" 
     },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
    ],
    "Resource": "*",
    "Condition": {
        "ArnLike": { 
            "aws:SourceArn": "arn:aws:service:region:customer-account-id:resource-type/customer-resource-id" 
        },
        "StringEquals": { 
            "kms:EncryptionContext:aws:sns:topicArn": "arn:aws:sns:your_region:customer-account-id:your_sns_topic_name" 
        }
    }
}
```

## 對消費者的影響
<a name="enable-encryption-impact-on-consumers"></a>

啟用 SSE 不會變更訂閱者以透明方式使用 message. AWS manages 加密和解密的方式。訊息會保持靜態加密，並在交付給訂閱者之前自動解密。為了獲得最佳安全性， AWS 建議為所有端點啟用 HTTPS，以確保訊息的安全傳輸。

# 使用加密的 Amazon SQS 佇列訂閱設定 Amazon SNS 主題加密 Amazon SQS
<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)。

本主題說明如何使用 為具有加密 Amazon SQS 佇列訂閱的 Amazon SNS Amazon SQS AWS 管理主控台。

## 步驟 1：建立自訂 KMS 金鑰
<a name="create-custom-cmk"></a>

1. 用至少具有 `AWSKeyManagementServicePowerUser` 政策的使用者登入 [AWS KMS 主控台](https://console.aws.amazon.com/kms/)。

1. 選擇 **Create a key** (建立金鑰)。

1. 若要建立對稱加密 KMS 金鑰，在 **Key type** (金鑰類型) 欄位中，選擇 **Symmetric** (對稱)。

   如需如何在 AWS KMS 主控台中建立非對稱 KMS 金鑰的相關資訊，請參閱[建立非對稱 KMS 金鑰 (主控台)](https://docs.aws.amazon.com/kms/latest/developerguide/asymm-create-key.html#create-asymmetric-keys-console)。

1. 在 **Key usage** (金鑰用途) 欄位中，系統會自動選取 **Encrypt and decrypt** (加密和解密) 選項。

   如需如何建立可以產生和驗證 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 金鑰的許可。如需詳細資訊，請參閱 [ABAC for AWS KMS](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 金鑰的許可。如需詳細資訊，請參閱 [ABAC for AWS KMS](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)和 [ABAC for AWS KMS](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 金鑰，請在頁面底部的 **Key deletion** (金鑰刪除) 區段中，清除 **Allow key administrators to delete this key** (允許金鑰管理員刪除此金鑰) 核取方塊。

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. 在導覽面板上，選擇 **Topics (主題)**。

1. 請選擇**建立主題**。

1. 在 **Create new topic** (建立新主題) 頁面的 **Name** (名稱) 中，輸入主題名稱 (例如 `MyEncryptedTopic`)，然後選擇 **Create topic** (建立主題)。

1. 展開 **Encryption** (加密) 區段並執行下列動作：

   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 開發人員指南》中的[AWS KMS API 許可：動作和資源參考](https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html)。

   1. 對於**客戶受管金鑰**，選擇[您之前建立的](#create-custom-cmk) **MyCustomKey**，然後選擇**啟用伺服器端加密**。

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**，選擇[您之前建立的](#create-custom-cmk) **MyCustomKey**，然後選擇**建立佇列**。

1. 重複進行以上程序，以建立第二個佇列 (例如，名為 `MyEncryptedQueue2`)。

   您的新加密佇列會顯示在佇列清單。

1. 在 Amazon SQS 主控台，選擇 `MyEncryptedQueue1` 和 `MyEncryptedQueue2` 然後選擇 **Queue Actions** (佇列動作)、**Subscribe Queues to SNS Topic** (訂閱佇列至 SNS 主題)。

1. 在 **Subscribe to a Topic** (訂閱主題) 對話方塊中，於 **Choose a Topic** (選擇主題) 中選取 **MyEncryptedTopic**，然後選擇 **Subscribe** (訂閱)。

   您對加密主題的加密佇列訂閱會顯示在 **Topic Subscription Result** (主題訂閱結果) 對話方塊中。

1. 選擇 **OK** (確定)。

## 步驟 4：將訊息發佈至您的加密主題
<a name="publish-to-encrypted-topic"></a>

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

1. 在導覽面板上，選擇 **Topics (主題)**。

1. 從主題清單中，選擇 **MyEncryptedTopic**，然後選擇 **Publish message** (發佈訊息)。

1. 在 **Publish a message** (發佈訊息) 頁面上，執行下列步驟：

   1. (選用) 在 **Message details** (訊息詳細資訊) 區段中，輸入 **Subject** (主旨) (例如，`Testing message publishing`)。

   1. 在 **Message body** (訊息內文) 區段中，輸入訊息內文 (例如，`My message body is encrypted at rest.`)。

   1. 選擇 **Publish message** (發佈訊息)。

您的訊息會發佈到您的訂閱加密佇列。

## 步驟 5：驗證訊息交付
<a name="verify-message-delivery"></a>

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

1. 從佇列清單中，選擇 **MyEncryptedQueue1**，然後選擇 **Send and receive messages** (傳送及接收訊息)。

1. 在 **Send and receive messages in MyEncryptedQueue1** (在 MyEncryptedQueue1 中傳送和接收訊息) 頁面上，選擇 **Poll for messages** (輪詢訊息)。

   此時將會顯示[您稍早傳送的](#publish-to-encrypted-topic)訊息。

1. 選擇 **More Details** (更多詳細資訊) 可檢視您的訊息。

1. 完成後，請選擇 **Close** (關閉)。

1. 針對 **MyEncryptedQueue2** 重複此程序。