

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

# Amazon Managed Streaming for Apache Kafka 的資料保護
<a name="data-protection"></a>

 AWS [共同責任模型](https://aws.amazon.com/compliance/shared-responsibility-model/)適用於 Amazon Managed Streaming for Apache Kafka 中的資料保護。如此模型所述， AWS 負責保護執行所有 的全域基礎設施 AWS 雲端。您負責維護在此基礎設施上託管內容的控制權。您也同時負責所使用 AWS 服務 的安全組態和管理任務。如需資料隱私權的詳細資訊，請參閱[資料隱私權常見問答集](https://aws.amazon.com/compliance/data-privacy-faq/)。如需有關歐洲資料保護的相關資訊，請參閱*AWS 安全性部落格*上的[AWS 共同責任模型和 GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 部落格文章。

基於資料保護目的，我們建議您保護 AWS 帳戶 登入資料，並使用 AWS IAM Identity Center 或 AWS Identity and Access Management (IAM) 設定個別使用者。如此一來，每個使用者都只會獲得授與完成其任務所必須的許可。我們也建議您採用下列方式保護資料：
+ 每個帳戶均要使用多重要素驗證 (MFA)。
+ 使用 SSL/TLS 與 AWS 資源通訊。我們需要 TLS 1.2 並建議使用 TLS 1.3。
+ 使用 設定 API 和使用者活動記錄 AWS CloudTrail。如需有關使用 CloudTrail 追蹤擷取 AWS 活動的資訊，請參閱*AWS CloudTrail 《 使用者指南*》中的[使用 CloudTrail 追蹤](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-trails.html)。
+ 使用 AWS 加密解決方案，以及其中的所有預設安全控制 AWS 服務。
+ 使用進階的受管安全服務 (例如 Amazon Macie)，協助探索和保護儲存在 Amazon S3 的敏感資料。
+ 如果您在 AWS 透過命令列界面或 API 存取 時需要 FIPS 140-3 驗證的密碼編譯模組，請使用 FIPS 端點。如需有關 FIPS 和 FIPS 端點的更多相關資訊，請參閱[聯邦資訊處理標準 (FIPS) 140-3](https://aws.amazon.com/compliance/fips/)。

我們強烈建議您絕對不要將客戶的電子郵件地址等機密或敏感資訊，放在標籤或自由格式的文字欄位中，例如**名稱**欄位。這包括當您使用 Amazon MSK 或使用 AWS 服務 主控台、API AWS CLI或其他 AWS SDKs 時。您在標籤或自由格式文字欄位中輸入的任何資料都可能用於計費或診斷日誌。如果您提供外部伺服器的 URL，我們強烈建議請勿在驗證您對該伺服器請求的 URL 中包含憑證資訊。

**Topics**
+ [Amazon MSK 加密](msk-encryption.md)
+ [開始使用 Amazon MSK 加密](msk-working-with-encryption.md)
+ [搭配界面 VPC 端點使用 Amazon MSK APIs](privatelink-vpc-endpoints.md)

# Amazon MSK 加密
<a name="msk-encryption"></a>

Amazon MSK 提供資料加密選項，您可以使用這些選項來符合嚴格的資料管理需求。Amazon MSK 用於加密的憑證必須每 13 個月更新一次。Amazon MSK 會自動更新所有叢集的這些憑證。當 Amazon MSK 啟動憑證更新操作時，快速代理程式叢集會保持 `ACTIVE` 狀態。對於標準代理程式叢集，Amazon MSK 會在叢集啟動 certificate-update 操作`MAINTENANCE`時，將叢集的狀態設定為 。MSK 會在更新完成`ACTIVE`時將其設回 。當叢集在憑證更新操作中時，您可以繼續產生和使用資料，但無法對其執行任何更新操作。

## Amazon MSK 靜態加密
<a name="msk-encryption-at-rest"></a>

Amazon MSK 與 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/) (KMS) 整合，以提供透明的伺服器端加密。Amazon MSK 一律會加密靜態資料。建立 MSK 叢集代理程式時，可以指定想要 Amazon MSK 用來加密靜態資料的 AWS KMS key 。如不指定 KMS 金鑰，Amazon MSK 就會為您建立 [AWS 受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)，並代表您使用它。如需 KMS 金鑰的詳細資訊，請參閱《*AWS Key Management Service 開發人員指南*》中的 [AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys)。

## 傳輸中的 Amazon MSK 加密
<a name="msk-encryption-in-transit"></a>

Amazon MSK 使用 TLS 1.2。根據預設，會加密您 MSK 叢集代理程式之間傳輸中的資料。您可以在建立叢集時覆寫此預設值。

針對用戶端與代理程式之間的通訊，您必須指定下列三種設定之一：
+ 只允許 TLS 加密的資料。這是預設設定。
+ 允許純文字，以及 TLS 加密的資料。
+ 只允許純文字資料。

Amazon MSK 代理程式使用公有 AWS Certificate Manager 憑證。因此，任何信任 Amazon 信任服務的信任存放區，也會信任 Amazon MSK 代理程式憑證。

我們強烈建議啟用傳輸中加密，但這可能會給 CPU 增加額外的負荷和幾毫秒的延遲。不過，大多數使用案例對這些差異並不敏感，且影響程度取決於叢集、用户端和使用設定檔的組態。

# 開始使用 Amazon MSK 加密
<a name="msk-working-with-encryption"></a>

建立 MSK 叢集時，可以指定 JSON 格式的加密設定。下列是 範例。

```
{
   "EncryptionAtRest": {
       "DataVolumeKMSKeyId": "arn:aws:kms:us-east-1:123456789012:key/abcdabcd-1234-abcd-1234-abcd123e8e8e"
    },
   "EncryptionInTransit": {
        "InCluster": true,
        "ClientBroker": "TLS"
    }
}
```

針對 `DataVolumeKMSKeyId`，您可以指定[客戶自管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)，或為您的帳戶中的 MSK 選擇 AWS 受管金鑰 (`alias/aws/kafka`)。如果您未指定 `EncryptionAtRest`，Amazon MSK 仍會在 下加密靜態資料 AWS 受管金鑰。若要判斷叢集正在使用哪個金鑰，請傳送 `GET` 請求或調用 `DescribeCluster` API 操作。

針對 `EncryptionInTransit`，`InCluster` 的預設值為 true，但如果您不想要 Amazon MSK 加密在代理程式之間傳遞的資料，則可將其設定為 false。

若要指定用戶端與代理程式之間傳輸資料的加密模式，請將 `ClientBroker` 設定為下列三個值之一：`TLS`、`TLS_PLAINTEXT`、或 `PLAINTEXT`。

**Topics**
+ [建立 Amazon MSK 叢集時指定加密設定](msk-working-with-encryption-cluster-create.md)
+ [測試 Amazon MSK TLS 加密](msk-working-with-encryption-test-tls.md)

# 建立 Amazon MSK 叢集時指定加密設定
<a name="msk-working-with-encryption-cluster-create"></a>

此程序說明如何在建立 Amazon MSK 叢集時指定加密設定。

**建立叢集時指定加密設定**

1. 將前一個範例的內容儲存在檔案中，並為檔案命名為任何您想要的名稱。例如，稱之為 `encryption-settings.json`。

1. 執行 `create-cluster` 命令並使用 `encryption-info` 選項來指定您儲存 JSON 組態的文件。下列是 範例。使用 Apache Kafka 用戶端版本取代 *\$1YOUR MSK VERSION\$1*。如需有關如何尋找 MSK 叢集版本的資訊，請參閱[判斷您的 MSK 叢集版本](create-topic.md#find-msk-cluster-version)。請注意，使用與 MSK 叢集版本不同的 Apache Kafka 用戶端版本，可能導致 Apache Kafka 資料損毀、遺失和發生停機。

   ```
   aws kafka create-cluster --cluster-name "ExampleClusterName" --broker-node-group-info file://brokernodegroupinfo.json --encryption-info file://encryptioninfo.json --kafka-version "{YOUR MSK VERSION}" --number-of-broker-nodes 3
   ```

   以下是執行此命令後成功回應的範例。

   ```
   {
       "ClusterArn": "arn:aws:kafka:us-east-1:123456789012:cluster/SecondTLSTest/abcdabcd-1234-abcd-1234-abcd123e8e8e",
       "ClusterName": "ExampleClusterName",
       "State": "CREATING"
   }
   ```

# 測試 Amazon MSK TLS 加密
<a name="msk-working-with-encryption-test-tls"></a>

此程序說明如何在 Amazon MSK 上測試 TLS 加密。

**若要測試 TLS 加密**

1. 依照 [步驟 3：建立用戶端機器](create-client-machine.md) 中的指引建立用戶端機器。

1. 在用戶端機器上安裝 Apache Kafka。

1. 在此範例中，我們使用 JVM 信任存放區與 MSK 叢集通話。若要這樣做，請先在用戶端機器上建立名為 `/tmp` 的資料夾。然後，前往 Apache Kafka 安裝的 `bin` 資料夾，並執行以下命令。(您的 JVM 路徑可能不同。)

   ```
   cp /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-0.amzn2.x86_64/jre/lib/security/cacerts /tmp/kafka.client.truststore.jks
   ```

1. 同時仍然在用戶端機器上的 Apache Kafka 安裝的 `bin` 資料夾中，建立一個名為 `client.properties` 且具有以下內容的文字檔案。

   ```
   security.protocol=SSL
   ssl.truststore.location=/tmp/kafka.client.truststore.jks
   ```

1. 在 AWS CLI 已安裝 的機器上執行下列命令，以叢集的 ARN 取代 *clusterARN*。

   ```
   aws kafka get-bootstrap-brokers --cluster-arn clusterARN
   ```

   成功的結果看起來如下。儲存此結果，因為您下一個步驟需要它。

   ```
   {
       "BootstrapBrokerStringTls": "a-1.example.g7oein.c2.kafka.us-east-1.amazonaws.com:0123,a-3.example.g7oein.c2.kafka.us-east-1.amazonaws.com:0123,a-2.example.g7oein.c2.kafka.us-east-1.amazonaws.com:0123"
   }
   ```

1. 執行下列命令，將 *BootstrapBrokerStringTls* 取代為您在上一個步驟中取得的其中一個代理程式端點。

   ```
   <path-to-your-kafka-installation>/bin/kafka-console-producer.sh --broker-list BootstrapBrokerStringTls --producer.config client.properties --topic TLSTestTopic
   ```

1. 開啟新的命令視窗並連線至相同的用戶端機器。然後，執行下列命令來建立主控台取用者。

   ```
   <path-to-your-kafka-installation>/bin/kafka-console-consumer.sh --bootstrap-server BootstrapBrokerStringTls --consumer.config client.properties --topic TLSTestTopic
   ```

1. 在生產者視窗中，輸入文字訊息後方跟著換行符號，然後在取用者視窗中尋找相同的訊息。Amazon MSK 會在傳輸中加密此訊息。

如需有關設定 Apache Kafka 用戶端以使用加密資料的詳細資訊，請參閱 [設定 Kafka 用戶端](https://kafka.apache.org/documentation/#security_configclients)。

# 搭配界面 VPC 端點使用 Amazon MSK APIs
<a name="privatelink-vpc-endpoints"></a>

您可以使用介面 VPC 端點，由 AWS PrivateLink 提供支援，以防止 Amazon VPC 和 Amazon MSK APIs 之間的流量離開 Amazon 網路。介面 VPC 端點不需要網際網路閘道、NAT 裝置、VPN 連線或 AWS Direct Connect 連線。[AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/what-is-privatelink.html) 是一種 AWS 技術，可讓您在 Amazon VPC 中使用具有私有 IPs彈性網路界面，在 AWS 服務之間進行私有通訊。如需詳細資訊，請參閱 [Amazon Virtual Private Cloud](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) 和[界面 VPC 端點 (AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint)。

您的應用程式可以使用 AWS PrivateLink 與 Amazon MSK Provisioned 和 MSK Connect APIs 連線。若要開始使用，請為您的 Amazon MSK API 建立介面 VPC 端點，以啟動透過介面 VPC 端點往返 Amazon VPC 資源的流量。啟用 FIPS 的界面 VPC 端點適用於美國區域。如需詳細資訊，請參閱[建立界面端點](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint)。

使用此功能，您的 Apache Kafka 用戶端可以動態擷取連線字串以與 MSK 佈建或 MSK Connect 資源連線，而無需周遊網際網路以擷取連線字串。

建立介面 VPC 端點時，請選擇下列其中一個服務名稱端點：

**對於 MSK 佈建：**
+ 新連線不再支援下列服務名稱端點：
  + com.amazonaws.region.kafka
  + com.amazonaws.region.kafka-fips （啟用 FIPS)
+ 支援 IPv4 和 IPv6 流量的雙堆疊端點服務包括：
  + aws.api.region.kafka-api
  + aws.api.region.kafka-api-fips （啟用 FIPS)

若要設定雙堆疊端點，您必須遵循[雙堆疊和 FIPS 端點](https://docs.aws.amazon.com/sdkref/latest/guide/feature-endpoints.html)準則。

其中 region 是您的區域名稱。選擇此服務名稱以使用 MSK 佈建相容的 APIs。如需詳細資訊，請參閱 https：//*https://docs.aws.amazon.com/msk/1.0/apireference/* 中的[操作](https://docs.aws.amazon.com/msk/1.0/apireference/operations.html)。

**對於 MSK Connect：**
+ com.amazonaws.region.kafkaconnect

其中 region 是您的區域名稱。選擇此服務名稱以使用 MSK Connect 相容 APIs。如需詳細資訊，請參閱《*Amazon MSK Connect API 參考*》中的[動作](https://docs.aws.amazon.com/MSKC/latest/mskc/API_Operations.html)。

如需詳細資訊，包括建立介面 VPC step-by-step說明，請參閱《 *AWS PrivateLink 指南*》中的[建立介面端點](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint)。

## 控制對 Amazon MSK 佈建或 MSK Connect APIs 的 VPC 端點的存取
<a name="vpc-endpoints-control-access"></a>

VPC 端點政策可讓您透過將政策連接至 VPC 端點，或使用連接至 IAM 使用者、群組或角色的政策中的其他欄位來控制存取，以限制只能透過指定的 VPC 端點進行存取。使用適當的範例政策來定義 MSK 佈建或 MSK Connect 服務的存取許可。

如果您未在建立端點時連接政策，Amazon VPC 會以預設政策連接以允許完整存取服務。端點政策不會覆寫或取代 IAM 身分基礎政策或服務特定的政策。這個另行區分的政策會控制從端點到所指定之服務的存取。

如需詳細資訊，請參閱《 *AWS PrivateLink 指南*》中的[使用 VPC 端點控制對 服務的存取](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)。

------
#### [ MSK Provisioned — VPC policy example ]

**唯讀存取**  
此範例政策可以連接到 VPC 端點。(如需詳細資訊，請參閱 控制 Amazon VPC 資源的存取)。它將動作限制為僅透過其連接的 VPC 端點列出和描述操作。

```
{
  "Statement": [
    {
      "Sid": "MSKReadOnly",
      "Principal": "*",
      "Action": [
        "kafka:List*",
        "kafka:Describe*"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```

**MSK 佈建 — VPC 端點政策範例**  
限制對特定 MSK 叢集的存取

此範例政策可以連接到 VPC 端點。它透過其連接的 VPC 端點限制對特定 Kafka 叢集的存取。

```
{
  "Statement": [
    {
      "Sid": "AccessToSpecificCluster",
      "Principal": "*",
      "Action": "kafka:*",
      "Effect": "Allow",
      "Resource": "arn:aws:kafka:us-east-1:123456789012:cluster/MyCluster"
    }
  ]
}
```

------
#### [ MSK Connect — VPC endpoint policy example ]

**列出連接器並建立新的連接器**  
以下是 MSK Connect 端點政策的範例。此政策允許指定的角色列出連接器並建立新的連接器。

```
{
    "Version": "2012-10-17", 		 	 	 		 	 	 
    "Statement": [
        {
            "Sid": "MSKConnectPermissions",
            "Effect": "Allow",
            "Action": [
                "kafkaconnect:ListConnectors",
                "kafkaconnect:CreateConnector"
            ],
            "Resource": "*",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:role/MyMSKConnectExecutionRole"
                ]
            }
        }
    ]
}
```

**MSK Connect — VPC 端點政策範例**  
僅允許來自指定 VPC 中特定 IP 地址的請求

下列範例顯示的原則僅允許來自指定 VPC 中指定 IP 位址的要求成功。來自其他 IP 位址的要求將會失敗。

```
{
    "Statement": [
        {
            "Action": "kafkaconnect:*",
            "Effect": "Allow",
            "Principal": "*",
            "Resource": "*",
            "Condition": {
                "IpAddress": {
                    "aws:VpcSourceIp": "192.0.2.123"
                },
        "StringEquals": {
                    "aws:SourceVpc": "vpc-555555555555"
                }
            }
        }
    ]
}
```

------