

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

# Amazon MSK 的安全性
<a name="security"></a>

的雲端安全性 AWS 是最高優先順序。身為 AWS 客戶，您可以受益於資料中心和網路架構，這些架構專為滿足最安全敏感組織的需求而建置。

安全性是 AWS 與您之間的共同責任。[共同責任模式](https://aws.amazon.com/compliance/shared-responsibility-model/)將其描述為雲端*的*安全性，和雲端*中*的安全性：
+ **雲端的安全性** – AWS 負責保護在 AWS Cloud 中執行 AWS 服務的基礎設施。 AWS 也為您提供可安全使用的服務。作為[AWS 合規計畫](https://aws.amazon.com/compliance/programs/)的一部分，第三方稽核人員會定期測試和驗證我們安全的有效性。若要了解適用於 Amazon Managed Streaming for Apache Kafka 的合規計畫，請參閱 [Amazon Web Services 的合規計劃服務範圍](https://aws.amazon.com/compliance/services-in-scope/)。
+ **雲端的安全性** – 您的責任取決於您使用 AWS 的服務。您也必須對其他因素負責，包括資料的機密性、您公司的要求和適用法律和法規。

本文件有助於您了解如何在使用 Amazon MSK 時套用共同責任模型。下列主題說明如何設定 Amazon MSK 來符合您的安全與合規目標。您也將了解如何使用其他 Amazon Web Services，幫助您監控並保護 Amazon MSK 資源。

**Topics**
+ [Amazon Managed Streaming for Apache Kafka 的資料保護](data-protection.md)
+ [Amazon MSK API 的身分驗證和授權](security-iam.md)
+ [Apache Kafka API 的身分驗證和授權](kafka_apis_iam.md)
+ [變更 Amazon MSK 叢集的安全群組](change-security-group.md)
+ [控制對 Amazon MSK 叢集中 Apache ZooKeeper 節點的存取](zookeeper-security.md)
+ [Amazon Managed Streaming for Apache Kafka 的合規驗證](MSK-compliance.md)
+ [Amazon Managed Streaming for Apache Kafka 的復原能力](disaster-recovery-resiliency.md)
+ [Amazon Managed Streaming for Apache Kafka 的基礎設施安全性](infrastructure-security.md)

# 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"
                }
            }
        }
    ]
}
```

------

# Amazon MSK API 的身分驗證和授權
<a name="security-iam"></a>

AWS Identity and Access Management (IAM) 是一種 AWS 服務 ，可協助管理員安全地控制對 AWS 資源的存取。IAM 管理員可控制哪些人員可*進行身分驗證* (登入) 並*獲得授權* (具有許可) 以使用 Amazon MSK 資源。IAM 是您可以免費使用 AWS 服務 的 。

**Topics**
+ [Amazon MSK 如何搭配 IAM 運作](security_iam_service-with-iam.md)
+ [Amazon MSK 身分型政策範例](security_iam_id-based-policy-examples.md)
+ [Amazon MSK 的服務連結角色](using-service-linked-roles.md)
+ [AWS Amazon MSK 的 受管政策](security-iam-awsmanpol.md)
+ [對 Amazon MSK 身分和存取進行故障診斷](security_iam_troubleshoot.md)

# Amazon MSK 如何搭配 IAM 運作
<a name="security_iam_service-with-iam"></a>

在您使用 IAM 管理對 Amazon MSK 的存取權之前，您應該了解哪些 IAM 功能可以與 Amazon MSK 搭配使用。若要全面了解 Amazon MSK 和其他 AWS 服務如何與 IAM 搭配使用，請參閱《IAM *使用者指南*》中的與 IAM [AWS 搭配使用的 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。

**Topics**
+ [Amazon MSK 身分型政策](security_iam_service-with-iam-id-based-policies.md)
+ [Amazon MSK 資源型政策](security_iam_service-with-iam-resource-based-policies.md)
+ [基於 Amazon MSK 標籤的授權](security_iam_service-with-iam-tags.md)
+ [Amazon MSK IAM 角色](security_iam_service-with-iam-roles.md)

# Amazon MSK 身分型政策
<a name="security_iam_service-with-iam-id-based-policies"></a>

使用 IAM 身分型政策，您可以指定允許或拒絕的動作和資源，以及在何種條件下允許或拒絕動作。Amazon MSK 支援特定動作、資源和條件鍵。若要了解您在 JSON 政策中使用的所有元素，請參閱 *IAM 使用者指南*中的 [JSON 政策元素參考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)。

## Amazon MSK 身分型政策的動作
<a name="security_iam_service-with-iam-id-based-policies-actions"></a>

管理員可以使用 AWS JSON 政策來指定誰可以存取內容。也就是說，哪個**主體**在什麼**條件**下可以對什麼**資源**執行哪些**動作**。

JSON 政策的 `Action` 元素描述您可以用來允許或拒絕政策中存取的動作。政策會使用動作來授予執行相關聯動作的許可。

Amazon MSK 中的政策動作會在動作之前使用下列前綴：`kafka:`。例如，若要授予某人使用 Amazon MSK `DescribeCluster` API 操作描述 MSK 叢集的許可，請在其政策中包含 `kafka:DescribeCluster` 動作。政策陳述式必須包含 `Action` 或 `NotAction` 元素。Amazon MSK 會定義自己的一組動作，描述您可以使用此服務執行的任務。

請注意，MSK 主題 APIs的政策動作在動作之前使用 `kafka-cluster`字首，請參閱 [IAM 授權政策動作和資源的語意](kafka-actions.md)。

若要在單一陳述式中指定多個動作，請用逗號分隔，如下所示：

```
"Action": ["kafka:action1", "kafka:action2"]
```

您也可以使用萬用字元 (\$1) 來指定多個動作。例如，若要指定開頭是 `Describe` 文字的所有動作，請包含以下動作：

```
"Action": "kafka:Describe*"
```



若要查看 Amazon MSK 動作的清單，請參閱《IAM 使用者指南**》中的 [Amazon Managed Streaming for Apache Kafka 的動作、資源和條件鍵](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonmanagedstreamingforapachekafka.html)。

## Amazon MSK 身分型政策的資源
<a name="security_iam_service-with-iam-id-based-policies-resources"></a>

管理員可以使用 AWS JSON 政策來指定誰可以存取內容。也就是說，哪個**主體**在什麼**條件**下可以對什麼**資源**執行哪些**動作**。

`Resource` JSON 政策元素可指定要套用動作的物件。最佳實務是使用其 [Amazon Resource Name (ARN)](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html) 來指定資源。若動作不支援資源層級許可，使用萬用字元 (\$1) 表示該陳述式適用於所有資源。

```
"Resource": "*"
```



Amazon MSK 執行個體資源具有以下 ARN：

```
arn:${Partition}:kafka:${Region}:${Account}:cluster/${ClusterName}/${UUID}
```

如需 ARNs 格式的詳細資訊，請參閱 [Amazon Resource Name (ARNs AWS 和服務命名空間](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)。

例如，若要在陳述式中指定 `CustomerMessages` 執行個體，請使用以下 ARN：

```
"Resource": "arn:aws:kafka:us-east-1:123456789012:cluster/CustomerMessages/abcd1234-abcd-dcba-4321-a1b2abcd9f9f-2"
```

若要指定屬於特定帳戶的所有執行個體，請使用萬用字元 (\$1)：

```
"Resource": "arn:aws:kafka:us-east-1:123456789012:cluster/*"
```

有些 Amazon MSK 動作無法對特定資源執行，例如用來建立資源的動作。在這些情況下，您必須使用萬用字元 (\$1)。

```
"Resource": "*"
```

若要在單一陳述式中指定多項資源，請使用逗號分隔 ARN。

```
"Resource": ["resource1", "resource2"]
```

若要查看 Amazon MSK 資源類型及其 ARN 的清單，請參閱《IAM 使用者指南**》中的 [Amazon Managed Streaming for Apache Kafka 定義的資源](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazonmanagedstreamingforkafka.html#amazonmanagedstreamingforkafka-resources-for-iam-policies)。若要了解您可以使用哪些動作指定每個資源的 ARN，請參閱 [Amazon Managed Streaming for Apache Kafka 定義的動作](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazonmanagedstreamingforkafka.html#amazonmanagedstreamingforkafka-actions-as-permissions)。

## Amazon MSK 身分型政策的條件索引鍵
<a name="security_iam_service-with-iam-id-based-policies-conditionkeys"></a>

管理員可以使用 AWS JSON 政策來指定誰可以存取內容。也就是說，哪個**主體**在什麼**條件**下可以對什麼**資源**執行哪些**動作**。

`Condition` 元素會根據定義的條件，指定陳述式的執行時機。您可以建立使用[條件運算子](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)的條件運算式 (例如等於或小於)，來比對政策中的條件和請求中的值。若要查看所有 AWS 全域條件索引鍵，請參閱《*IAM 使用者指南*》中的[AWS 全域條件內容索引鍵](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。

Amazon MSK 會定義自己的一組條件鍵，也支援使用一些全域條件鍵。若要查看所有 AWS 全域條件金鑰，請參閱《*IAM 使用者指南*》中的[AWS 全域條件內容金鑰](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。



若要查看 Amazon MSK 條件鍵的清單，請參閱《IAM 使用者指南**》中的 [Amazon Managed Streaming for Apache Kafka 的條件鍵](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazonmanagedstreamingforkafka.html#amazonmanagedstreamingforkafka-policy-keys)。若要了解您可以搭配哪些動作和資源使用條件鍵，請參閱 [Amazon Managed Streaming for Apache Kafka 定義的動作](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazonmanagedstreamingforkafka.html#amazonmanagedstreamingforkafka-actions-as-permissions)。

## Amazon MSK 身分型政策的範例
<a name="security_iam_service-with-iam-id-based-policies-examples"></a>



若要檢視 Amazon MSK 身分型政策的範例，請參閱 [Amazon MSK 身分型政策範例](security_iam_id-based-policy-examples.md)。

# Amazon MSK 資源型政策
<a name="security_iam_service-with-iam-resource-based-policies"></a>

Amazon MSK 支援將叢集政策 (也稱為資源型政策) 與 Amazon MSK 叢集搭配使用。您可以使用叢集政策定義哪些 IAM 主體具有跨帳戶許可，可以設定 Amazon MSK 叢集的私有連線。與 IAM 用戶端身分驗證搭配使用時，您還可以使用叢集政策為連線的用戶端精細定義 Kafka 資料平面的許可。

叢集政策支援的大小上限為 20 KB。

若要檢視如何設定叢集政策的範例，請參閱[步驟 2：將叢集政策連接至 MSK 叢集](mvpc-cluster-owner-action-policy.md)。

# 基於 Amazon MSK 標籤的授權
<a name="security_iam_service-with-iam-tags"></a>

您可以將標籤連接至 Amazon MSK 叢集。若要根據標籤控制存取，請使用 `kafka:ResourceTag/key-name`、`aws:RequestTag/key-name` 或 `aws:TagKeys` 條件鍵，在政策的[條件元素](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)中，提供標籤資訊。如需標記 Amazon MSK 資源的資訊，請參閱 [標記 Amazon MSK 叢集](msk-tagging.md)。

您只能在標籤的協助下控制叢集存取。若要標記主題和取用者群組，您需要在政策中新增沒有標籤的個別陳述式。

若要檢視身分型政策的範例，以根據叢集上的標籤限制對叢集的存取，請參閱 [根據標籤存取 Amazon MSK 叢集](security_iam_id-based-policy-examples-view-widget-tags.md)。

您可以在身分型政策中使用條件，根據標籤控制對 Amazon MSK 資源的存取權。下列範例顯示的政策可讓使用者描述叢集、取得其引導代理程式、列出其代理程式節點、更新和刪除它。不過，只有在叢集標籤`Owner`的值為該使用者的 時，此政策才會授予許可`username`。下列政策中的第二個陳述式允許存取叢集上的主題。此政策中的第一個陳述式不會授權任何主題存取。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AccessClusterIfOwner",
      "Effect": "Allow",
      "Action": [
        "kafka:Describe*",
        "kafka:Get*",
        "kafka:List*",
        "kafka:Update*",
        "kafka:Delete*"
      ],
      "Resource": "arn:aws:kafka:us-east-1:123456789012:cluster/*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/Owner": "${aws:username}"
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": [
        "kafka-cluster:*Topic*",
        "kafka-cluster:WriteData",
        "kafka-cluster:ReadData"
      ],
      "Resource": [
        "arn:aws:kafka:us-east-1:123456789012:topic/*"
      ]
    }
  ]
}
```

------

# Amazon MSK IAM 角色
<a name="security_iam_service-with-iam-roles"></a>

[IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)是您 Amazon Web Services 帳戶中具備特定許可的實體。

## 將暫時憑證與 Amazon MSK 搭配使用
<a name="security_iam_service-with-iam-roles-tempcreds"></a>

您可以搭配聯合使用暫時憑證、擔任 IAM 角色，或是擔任跨帳戶角色。您可以透過呼叫 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) 或 [GetFederationToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html) 等 AWS STS API 操作來取得臨時安全登入資料。

Amazon MSK 支援使用暫時憑證。

## 服務連結角色
<a name="security_iam_service-with-iam-roles-service-linked"></a>

[服務連結角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#iam-term-service-linked-role)允許 Amazon Web Services 存取其他服務中的資源，以代您完成動作。服務連結角色會顯示在您的 IAM 帳戶中，並由該服務所擁有。 管理員可以檢視，但不能編輯服務連結角色的許可。

Amazon MSK 支援服務連結角色。如需有關建立或管理 Amazon MSK 服務連結角色的詳細資訊，請參閱[Amazon MSK 的服務連結角色](using-service-linked-roles.md)。

# Amazon MSK 身分型政策範例
<a name="security_iam_id-based-policy-examples"></a>

根據預設，IAM 使用者和角色沒有執行 Amazon MSK API 動作的許可。管理員必須建立 IAM 政策，授與使用者和角色在指定資源上執行特定 API 操作所需的許可。管理員接著必須將這些政策連接至需要這些許可的 IAM 使用者或群組。

若要了解如何使用這些範例 JSON 政策文件建立 IAM 身分型政策，請參閱《IAM 使用者指南》**中的[在 JSON 標籤上建立政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-json-editor)。

**Topics**
+ [政策最佳實務](security_iam_service-with-iam-policy-best-practices.md)
+ [允許使用者檢視他們自己的許可](security_iam_id-based-policy-examples-view-own-permissions.md)
+ [存取 Amazon MSK 叢集](security_iam_id-based-policy-examples-access-one-cluster.md)
+ [根據標籤存取 Amazon MSK 叢集](security_iam_id-based-policy-examples-view-widget-tags.md)

# 政策最佳實務
<a name="security_iam_service-with-iam-policy-best-practices"></a>

身分型政策會判斷您帳戶中的某個人員是否可以建立、存取或刪除 Amazon MSK 資源。這些動作可能會讓您的 AWS 帳戶產生費用。當您建立或編輯身分型政策時，請遵循下列準則及建議事項：
+ **開始使用 AWS 受管政策並邁向最低權限許可** – 若要開始將許可授予您的使用者和工作負載，請使用將許可授予許多常見使用案例的 *AWS 受管政策*。它們可在您的 中使用 AWS 帳戶。我們建議您定義特定於使用案例 AWS 的客戶受管政策，以進一步減少許可。如需更多資訊，請參閱《*IAM 使用者指南*》中的 [AWS 受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)或[任務職能的AWS 受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)。
+ **套用最低權限許可** – 設定 IAM 政策的許可時，請僅授予執行任務所需的許可。為實現此目的，您可以定義在特定條件下可以對特定資源採取的動作，這也稱為*最低權限許可*。如需使用 IAM 套用許可的更多相關資訊，請參閱《*IAM 使用者指南*》中的 [IAM 中的政策和許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)。
+ **使用 IAM 政策中的條件進一步限制存取權** – 您可以將條件新增至政策，以限制動作和資源的存取。例如，您可以撰寫政策條件，指定必須使用 SSL 傳送所有請求。如果透過特定 例如 使用服務動作 AWS 服務，您也可以使用條件來授予其存取權 CloudFormation。如需詳細資訊，請參閱《*IAM 使用者指南*》中的 [IAM JSON 政策元素：條件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)。
+ **使用 IAM Access Analyzer 驗證 IAM 政策，確保許可安全且可正常運作** – IAM Access Analyzer 驗證新政策和現有政策，確保這些政策遵從 IAM 政策語言 (JSON) 和 IAM 最佳實務。IAM Access Analyzer 提供 100 多項政策檢查及切實可行的建議，可協助您撰寫安全且實用的政策。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[使用 IAM Access Analyzer 驗證政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)。
+ **需要多重要素驗證 (MFA)** – 如果您的案例需要 IAM 使用者或 中的根使用者 AWS 帳戶，請開啟 MFA 以提高安全性。如需在呼叫 API 操作時請求 MFA，請將 MFA 條件新增至您的政策。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[透過 MFA 的安全 API 存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)。

如需 IAM 中最佳實務的相關資訊，請參閱《*IAM 使用者指南*》中的 [IAM 安全最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

# 允許使用者檢視他們自己的許可
<a name="security_iam_id-based-policy-examples-view-own-permissions"></a>

此範例會示範如何建立政策，允許 IAM 使用者檢視附加到他們使用者身分的內嵌及受管政策。此政策包含在主控台或使用 或 AWS CLI AWS API 以程式設計方式完成此動作的許可。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ViewOwnUserInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetUserPolicy",
                "iam:ListGroupsForUser",
                "iam:ListAttachedUserPolicies",
                "iam:ListUserPolicies",
                "iam:GetUser"
            ],
            "Resource": ["arn:aws:iam::*:user/${aws:username}"]
        },
        {
            "Sid": "NavigateInConsole",
            "Effect": "Allow",
            "Action": [
                "iam:GetGroupPolicy",
                "iam:GetPolicyVersion",
                "iam:GetPolicy",
                "iam:ListAttachedGroupPolicies",
                "iam:ListGroupPolicies",
                "iam:ListPolicyVersions",
                "iam:ListPolicies",
                "iam:ListUsers"
            ],
            "Resource": "*"
        }
    ]
}
```

# 存取 Amazon MSK 叢集
<a name="security_iam_id-based-policy-examples-access-one-cluster"></a>

在此範例中，您想要授予您 Amazon Web Services 帳戶中的 IAM 使用者存取您的其中一個叢集 `purchaseQueriesCluster`。此政策允許使用者描述叢集，獲取其引導代理程式，列出其代理程式節點並將其更新。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"UpdateCluster",
         "Effect":"Allow",
         "Action":[
            "kafka:Describe*",
            "kafka:Get*",
            "kafka:List*",
            "kafka:Update*"
         ],
         "Resource":"arn:aws:kafka:us-east-1:012345678012:cluster/purchaseQueriesCluster/abcdefab-1234-abcd-5678-cdef0123ab01-2"
      }
   ]
}
```

------

# 根據標籤存取 Amazon MSK 叢集
<a name="security_iam_id-based-policy-examples-view-widget-tags"></a>

您可以在身分型政策中使用條件，根據標籤控制對 Amazon MSK 資源的存取權。此範例顯示您可能會如何建立政策，以允許使用者描述叢集、取得其引導代理程式、列出其代理節點、更新及刪除。但是，只有在叢集標籤 `Owner` 的值是該使用者的使用者名稱時，才會授予許可。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AccessClusterIfOwner",
      "Effect": "Allow",
      "Action": [
        "kafka:Describe*",
        "kafka:Get*",
        "kafka:List*",
        "kafka:Update*",
        "kafka:Delete*"
      ],
      "Resource": "arn:aws:kafka:us-east-1:012345678012:cluster/*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/Owner": "${aws:username}"
        }
      }
    }
  ]
}
```

------

您可以將此政策連接到您帳戶中的 IAM 使用者。若名為 `richard-roe` 的使用者嘗試更新 MSK 叢集，則叢集必須被標記為 `Owner=richard-roe` 或 `owner=richard-roe`。否則，他便會被拒絕存取。條件標籤鍵 `Owner` 符合 `Owner` 和 `owner`，因為條件索引鍵名稱不區分大小寫。如需詳細資訊，請參閱*《IAM 使用者指南》*中的 [IAM JSON 政策元素：條件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)。

# Amazon MSK 的服務連結角色
<a name="using-service-linked-roles"></a>

Amazon MSK 使用 AWS Identity and Access Management (IAM) [ 服務連結角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#iam-term-service-linked-role)。服務連結角色是直接連結至 Amazon MSK 的一種特殊 IAM 角色類型。服務連結角色是由 Amazon MSK 預先定義，並包含該服務代表您呼叫其他 AWS 服務所需的所有許可。

服務連結角色可讓設定 Amazon MSK 更為簡單，因為您不必手動新增必要的許可。Amazon MSK 會定義其服務連結角色的許可。除非另有定義，否則僅 Amazon MSK 能擔任其角色。定義的許可包括信任政策和許可政策，且該許可政策無法附加至其他 IAM 實體。

如需有關支援服務連結角色的其他服務的資訊，請參閱[可搭配 IAM 運作的 Amazon Web Services](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)，並尋找**服務連結角色**資料欄顯示為**是**的服務。選擇具有連結的**是**，以檢視該服務的服務連結角色文件。

**Topics**
+ [服務連結角色許可](slr-permissions.md)
+ [建立服務連結角色](create-slr.md)
+ [編輯服務連結角色](edit-slr.md)
+ [服務連結角色支援的區域](slr-regions.md)

# Amazon MSK 的服務連結角色許可
<a name="slr-permissions"></a>

Amazon MSK 會使用名為 **AWSServiceRoleForKafka** 的服務連結角色。Amazon MSK 會使用此角色存取您的資源並執行以下操作：
+ `*NetworkInterface`：在客戶帳戶中建立和管理網路介面，讓客戶 VPC 中的用戶端可以存取叢集代理程式。
+ `*VpcEndpoints` – 管理客戶帳戶中的 VPC 端點，這些端點可讓客戶 VPC 中的用戶端使用 存取叢集代理程式 AWS PrivateLink。Amazon MSK 會使用 `DescribeVpcEndpoints`、`ModifyVpcEndpoint` 和 `DeleteVpcEndpoints` 許可。
+ `secretsmanager` – 使用 管理用戶端登入資料 AWS Secrets Manager。
+ `GetCertificateAuthorityCertificate`：擷取私有憑證授權機構的憑證。
+ `*Ipv6Addresses` – 將 IPv6 地址指派和取消指派至客戶帳戶中的網路介面，以啟用 MSK 叢集的 IPv6 連線。
+ `ModifyNetworkInterfaceAttribute` – 修改客戶帳戶中的網路介面屬性，以設定 MSK 叢集連線的 IPv6 設定。

此服務連結角色連接至下列受管政策：`KafkaServiceRolePolicy`。如需此政策的更新，請參閱 [KafkaServiceRolePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/KafkaServiceRolePolicy.html)。

AWSServiceRoleForKafka 服務連結角色信任下列服務以擔任角色：
+ `kafka.amazonaws.com`

角色許可政策允許 Amazon MSK 對資源完成下列動作。

您必須設定許可，IAM 實體 (如使用者、群組或角色) 才可建立、編輯或刪除服務連結角色。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[服務連結角色許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html#service-linked-role-permissions)。

# 為 Amazon MSK 建立服務連結角色
<a name="create-slr"></a>

您不需要手動建立一個服務連結角色。當您在 AWS 管理主控台、 AWS CLI或 AWS API 中建立 Amazon MSK 叢集時，Amazon MSK 會為您建立服務連結角色。

若您刪除此服務連結角色，之後需要再次建立，您可以在帳戶中使用相同程序重新建立角色。當您建立 Amazon MSK 叢集時，Amazon MSK 會再次為您建立服務連結角色。

# 編輯 Amazon MSK 的服務連結角色
<a name="edit-slr"></a>

Amazon MSK 不允許您編輯 AWSServiceRoleForKafka 服務連結角色。因為有各種實體可能會參考服務連結角色，所以您無法在建立角色之後變更角色名稱。然而，您可使用 IAM 來編輯角色描述。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[編輯服務連結角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html#edit-service-linked-role)。

# Amazon MSK 服務連結角色支援的區域
<a name="slr-regions"></a>

Amazon MSK 在所有提供此服務的區域中支援使用服務連結的角色。如需詳細資訊，請參閱 [AWS 區域與端點](https://docs.aws.amazon.com/general/latest/gr/rande.html)。

# AWS Amazon MSK 的 受管政策
<a name="security-iam-awsmanpol"></a>

 AWS 受管政策是由 AWS AWS 受管政策建立和管理的獨立政策旨在為許多常用案例提供許可，以便您可以開始將許可指派給使用者、群組和角色。

請記住， AWS 受管政策可能不會授予特定使用案例的最低權限許可，因為這些許可可供所有 AWS 客戶使用。我們建議您定義特定於使用案例的[客戶管理政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)，以便進一步減少許可。

您無法變更 AWS 受管政策中定義的許可。如果 AWS 更新受 AWS 管政策中定義的許可，則更新會影響政策連接的所有主體身分 （使用者、群組和角色）。當新的 AWS 服務 啟動或新的 API 操作可供現有服務使用時， AWS 最有可能更新 AWS 受管政策。

如需詳細資訊，請參閱 *IAM 使用者指南*中的 [AWS 受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

# AWS 受管政策：AmazonMSKFullAccess
<a name="security-iam-awsmanpol-AmazonMSKFullAccess"></a>

此政策會授予管理許可，允許主體完整存取所有 Amazon MSK 動作。此政策中的許可分組如下：
+ Amazon MSK 許可允許所有 Amazon MSK 動作。
+ **`Amazon EC2` 許可** – 在此政策中，需要 驗證 API 請求中傳遞的資源。這是為了確保 Amazon MSK 能夠成功使用叢集資源。此政策中的其餘 Amazon EC2 許可允許 Amazon MSK 建立所需的 AWS 資源，讓您可以連線到叢集。
+ **`AWS KMS` 許可** – 在 API 呼叫期間用來驗證請求中傳遞的資源。Amazon MSK 需要它們才能使用 Amazon MSK 叢集傳遞的密鑰。
+ **`CloudWatch Logs, Amazon S3, and Amazon Data Firehose` 許可** – Amazon MSK 需要 才能確保日誌交付目的地可連線，且適用於代理程式日誌。
+ **`IAM` 許可** – Amazon MSK 必須在您的帳戶中建立服務連結角色，並允許您將服務執行角色傳遞給 Amazon MSK。

------
#### [ JSON ]

****  

```
    {
    	"Version":"2012-10-17",		 	 	 
    	"Statement": [{
    			"Effect": "Allow",
    			"Action": [
    				"kafka:*",
    				"ec2:DescribeSubnets",
    				"ec2:DescribeVpcs",
    				"ec2:DescribeSecurityGroups",
    				"ec2:DescribeRouteTables",
    				"ec2:DescribeVpcEndpoints",
    				"ec2:DescribeVpcAttribute",
    				"kms:DescribeKey",
    				"kms:CreateGrant",
    				"logs:CreateLogDelivery",
    				"logs:GetLogDelivery",
    				"logs:UpdateLogDelivery",
    				"logs:DeleteLogDelivery",
    				"logs:ListLogDeliveries",
    				"logs:PutResourcePolicy",
    				"logs:DescribeResourcePolicies",
    				"logs:DescribeLogGroups",
    				"S3:GetBucketPolicy",
    				"firehose:TagDeliveryStream"
    			],
    			"Resource": "*"
    		},
    		{
    			"Effect": "Allow",
    			"Action": [
    				"ec2:CreateVpcEndpoint"
    			],
    			"Resource": [
    				"arn:*:ec2:*:*:vpc/*",
    				"arn:*:ec2:*:*:subnet/*",
    				"arn:*:ec2:*:*:security-group/*"
    			]
    		},
    		{
    			"Effect": "Allow",
    			"Action": [
    				"ec2:CreateVpcEndpoint"
    			],
    			"Resource": [
    				"arn:*:ec2:*:*:vpc-endpoint/*"
    			],
    			"Condition": {
    				"StringEquals": {
    					"aws:RequestTag/AWSMSKManaged": "true"
    				},
    				"StringLike": {
    					"aws:RequestTag/ClusterArn": "*"
    				}
    			}
    		},
    		{
    			"Effect": "Allow",
    			"Action": [
    				"ec2:CreateTags"
    			],
    			"Resource": "arn:*:ec2:*:*:vpc-endpoint/*",
    			"Condition": {
    				"StringEquals": {
    					"ec2:CreateAction": "CreateVpcEndpoint"
    				}
    			}
    		},
    		{
    			"Effect": "Allow",
    			"Action": [
    				"ec2:DeleteVpcEndpoints"
    			],
    			"Resource": "arn:*:ec2:*:*:vpc-endpoint/*",
    			"Condition": {
    				"StringEquals": {
    					"ec2:ResourceTag/AWSMSKManaged": "true"
    				},
    				"StringLike": {
    					"ec2:ResourceTag/ClusterArn": "*"
    				}
    			}
    		},
    		{
    			"Effect": "Allow",
    			"Action": "iam:PassRole",
    			"Resource": "*",
    			"Condition": {
    				"StringEquals": {
    					"iam:PassedToService": "kafka.amazonaws.com"
    				}
    			}
    		},
    		{
    			"Effect": "Allow",
    			"Action": "iam:CreateServiceLinkedRole",
    			"Resource": "arn:aws:iam::*:role/aws-service-role/kafka.amazonaws.com/AWSServiceRoleForKafka*",
    			"Condition": {
    				"StringLike": {
    					"iam:AWSServiceName": "kafka.amazonaws.com"
    				}
    			}
    		},
    		{
    			"Effect": "Allow",
    			"Action": [
    				"iam:AttachRolePolicy",
    				"iam:PutRolePolicy"
    			],
    			"Resource": "arn:aws:iam::*:role/aws-service-role/kafka.amazonaws.com/AWSServiceRoleForKafka*"
    		},
    		{
    			"Effect": "Allow",
    			"Action": "iam:CreateServiceLinkedRole",
    			"Resource": "arn:aws:iam::*:role/aws-service-role/delivery.logs.amazonaws.com/AWSServiceRoleForLogDelivery*",
    			"Condition": {
    				"StringLike": {
    					"iam:AWSServiceName": "delivery.logs.amazonaws.com"
    				}
    			}
    		}

    	]
    }
```

------

# AWS 受管政策：AmazonMSKReadOnlyAccess
<a name="security-iam-awsmanpol-AmazonMSKReadOnlyAccess"></a>

此政策授予唯讀許可，允許使用者檢視 Amazon MSK 中的資訊。連接此政策的主體無法進行任何更新或刪除現有資源，也無法建立新的 Amazon MSK 資源。例如，具有這些許可的主體可以檢視與其帳戶相關聯的叢集和組態清單，但無法變更任何叢集的組態或設定。此政策中的許可分組如下：
+ **`Amazon MSK` 許可** – 可讓您列出 Amazon MSK 資源、描述它們，以及取得其相關資訊。
+ **`Amazon EC2` 許可** – 用於描述與叢集相關聯的 Amazon VPC、子網路、安全群組和 ENIs。
+ **`AWS KMS` 許可** – 用於描述與叢集相關聯的金鑰。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "kafka:Describe*",
                "kafka:List*",
                "kafka:Get*",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcs",
                "kms:DescribeKey"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
```

------

# AWS 受管政策：KafkaServiceRolePolicy
<a name="security-iam-awsmanpol-KafkaServiceRolePolicy"></a>

您無法將 KafkaServiceRolePolicy 連接至 IAM 實體。此政策會連接到服務連結角色，可讓 Amazon MSK 執行動作，例如管理 MSK 叢集上的 VPC 端點 (連接器)、管理網路介面，以及透過 AWS Secrets Manager管理叢集憑證。如需詳細資訊，請參閱[Amazon MSK 的服務連結角色](using-service-linked-roles.md)。

下表說明自 Amazon MSK 開始追蹤變更以來KafkaServiceRolePolicy 受管政策的更新。


| 變更 | 描述 | Date | 
| --- | --- | --- | 
|  [已將 IPv6 連線支援新增至 KafkaServiceRolePolicy](#security-iam-awsmanpol-KafkaServiceRolePolicy) – 更新至現有政策  |  Amazon MSK 新增許可至 KafkaServiceRolePolicy，以啟用 MSK 叢集的 IPv6 連線。這些許可允許 Amazon MSK 將 IPv6 地址指派和取消指派至網路介面，並修改客戶帳戶中的網路介面屬性。  | 2025 年 11 月 17 日 | 
|  [KafkaServiceRolePolicy](#security-iam-awsmanpol-KafkaServiceRolePolicy)：更新至現有政策  |  Amazon MSK 新增許可以支援多 VPC 私有連線。  | 2023 年 3 月 8 日 | 
|  Amazon MSK 開始追蹤變更  |  Amazon MSK 開始追蹤 KafkaServiceRolePolicy 受管政策的變更。  | 2023 年 3 月 8 日 | 

# AWS 受管政策：AWSMSKReplicatorExecutionRole
<a name="security-iam-awsmanpol-AWSMSKReplicatorExecutionRole"></a>

此`AWSMSKReplicatorExecutionRole`政策授予許可給 Amazon MSK 複寫器，以在 MSK 叢集之間複寫資料。此政策中的許可分組如下：
+ **`cluster`** – 授予 Amazon MSK Replicator 使用 IAM 身分驗證連線至叢集的許可。同時授予描述和更改叢集的許可。
+ **`topic`** – 准許 Amazon MSK Replicator 描述、建立和更改主題，以及更改主題的動態組態。
+ **`consumer group`** – 授予 Amazon MSK Replicator 許可，以描述和變更取用者群組、從 MSK 叢集讀取和寫入日期，以及刪除複寫器建立的內部主題。

------
#### [ JSON ]

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Sid": "ClusterPermissions",
			"Effect": "Allow",
			"Action": [
				"kafka-cluster:Connect",
				"kafka-cluster:DescribeCluster",
				"kafka-cluster:AlterCluster",
				"kafka-cluster:DescribeTopic",
				"kafka-cluster:CreateTopic",
				"kafka-cluster:AlterTopic",
				"kafka-cluster:WriteData",
				"kafka-cluster:ReadData",
				"kafka-cluster:AlterGroup",
				"kafka-cluster:DescribeGroup",
				"kafka-cluster:DescribeTopicDynamicConfiguration",
				"kafka-cluster:AlterTopicDynamicConfiguration",
				"kafka-cluster:WriteDataIdempotently"
			],
			"Resource": [
				"arn:aws:kafka:*:*:cluster/*"
			]
		},
		{
			"Sid": "TopicPermissions",
			"Effect": "Allow",
			"Action": [
				"kafka-cluster:DescribeTopic",
				"kafka-cluster:CreateTopic",
				"kafka-cluster:AlterTopic",
				"kafka-cluster:WriteData",
				"kafka-cluster:ReadData",
				"kafka-cluster:DescribeTopicDynamicConfiguration",
				"kafka-cluster:AlterTopicDynamicConfiguration",
				"kafka-cluster:AlterCluster"
			],
			"Resource": [
				"arn:aws:kafka:*:*:topic/*/*"
			]
		},
		{
			"Sid": "GroupPermissions",
			"Effect": "Allow",
			"Action": [
				"kafka-cluster:AlterGroup",
				"kafka-cluster:DescribeGroup"
			],
			"Resource": [
				"arn:aws:kafka:*:*:group/*/*"
			]
		}
	]
}
```

------

# AWS 受管政策的 Amazon MSK 更新
<a name="security-iam-awsmanpol-updates"></a>

檢視自此服務開始追蹤 Amazon MSK AWS 受管政策更新以來的詳細資訊。


| 變更 | 描述 | Date | 
| --- | --- | --- | 
|  [新增至 AWSMSKReplicatorExecutionRole 的 WriteDataIdempotently 許可](security-iam-awsmanpol-AWSMSKReplicatorExecutionRole.md) – 更新現有政策  |  Amazon MSK 已將 WriteDataIdempotently 許可新增至 AWSMSKReplicatorExecutionRole 政策，以支援 MSK 叢集之間的資料複寫。  | 2024 年 3 月 12 日 | 
|  [AWSMSKReplicatorExecutionRole](security-iam-awsmanpol-AWSMSKReplicatorExecutionRole.md) – 新政策  |  Amazon MSK 新增 AWSMSKReplicatorExecutionRole 政策以支援 Amazon MSK Replicator。  | 2023 年 12 月 4 日 | 
|  [AmazonMSKFullAccess](security-iam-awsmanpol-AmazonMSKFullAccess.md)：更新至現有政策  |  Amazon MSK 新增許可以支援 Amazon MSK Replicator。  | 2023 年 9 月 28 日 | 
|  [KafkaServiceRolePolicy](security-iam-awsmanpol-KafkaServiceRolePolicy.md)：更新至現有政策  |  Amazon MSK 新增許可以支援多 VPC 私有連線。  | 2023 年 3 月 8 日 | 
| [AmazonMSKFullAccess](security-iam-awsmanpol-AmazonMSKFullAccess.md)：更新至現有政策 |  Amazon MSK 新增 Amazon EC2 許可，可以連線到叢集。  | 2021 年 11 月 30 日 | 
|  [AmazonMSKFullAccess](security-iam-awsmanpol-AmazonMSKFullAccess.md)：更新至現有政策  |  Amazon MSK 新增許可，允許描述 Amazon EC2 路由表。  | 2021 年 11 月 19 日 | 
|  Amazon MSK 開始追蹤變更  |  Amazon MSK 開始追蹤其 AWS 受管政策的變更。  | 2021 年 11 月 19 日 | 

# 對 Amazon MSK 身分和存取進行故障診斷
<a name="security_iam_troubleshoot"></a>

請使用以下資訊來協助您診斷和修正使用 Amazon MSK 和 IAM 時可能遇到的常見問題。

**Topics**
+ [我未獲授權，不得在 Amazon MSK 中執行動作](#security_iam_troubleshoot-no-permissions)

## 我未獲授權，不得在 Amazon MSK 中執行動作
<a name="security_iam_troubleshoot-no-permissions"></a>

如果 AWS 管理主控台 告知您無權執行 動作，則必須聯絡您的管理員尋求協助。您的管理員是為您提供簽署憑證的人員。

以下範例錯誤會在 `mateojackson` IAM 使用者嘗試使用主控台刪除叢集，但卻沒有 `kafka:DeleteCluster` 許可時發生。

```
User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: kafka:DeleteCluster on resource: purchaseQueriesCluster
```

在此情況下，Mateo 會請求管理員更新他的政策，允許他使用 `purchaseQueriesCluster` 動作存取 `kafka:DeleteCluster` 資源。

# Apache Kafka API 的身分驗證和授權
<a name="kafka_apis_iam"></a>

您可以使用 IAM 來對用戶端進行身分驗證，以及允許或拒絕 Apache Kafka 動作。也可以使用 TLS 或 SASL/SCRAM 來來對用戶端進行身分驗證，以及使用 Apache Kafka ACL 來允許或拒絕動作。

如需有關如何控制誰可以在叢集上執行 [Amazon MSK 操作](https://docs.aws.amazon.com/msk/1.0/apireference/operations.html)的相關資訊，請參閱 [Amazon MSK API 的身分驗證和授權](security-iam.md)。

**Topics**
+ [IAM 存取控制](iam-access-control.md)
+ [Amazon MSK 的相互 TLS 用戶端身分驗證](msk-authentication.md)
+ [使用 AWS Secrets Manager 進行登入憑證身分驗證](msk-password.md)
+ [Apache Kafka ACL](msk-acls.md)

# IAM 存取控制
<a name="iam-access-control"></a>

適用於 Amazon MSK 的 IAM 存取控制可讓您處理 MSK 叢集的身分驗證和授權。這樣，您就對身分驗證和授權分別使用不同的機制。例如，當用戶端嘗試寫入至您的叢集時，Amazon MSK 會使用 IAM 來檢查該用戶端是否為已驗證的身分，以及是否已獲授權可對您的叢集進行生產。

IAM 存取控制適用於 Java 和非 Java 用戶端，包括使用 Python、Go、JavaScript 和 .NET 編寫的 Kafka 用戶端。非 Java 用戶端的 IAM 存取控制適用於 Kafka 2.7.1 版或更新版本的 MSK 叢集。

為了讓 IAM 存取控制得以運作，Amazon MSK 會對 Apache Kafka 的原始程式碼進行輕微修改。這些修改不會對您的 Apache Kafka 使用產生明顯差異。Amazon MSK 會記錄存取事件以便您稽核。

您可以針對使用 IAM 存取控制的 MSK 叢集調用 Apache Kafka ACL API。不過，Apache Kafka ACLs不會影響 IAM 身分的授權。您必須使用 IAM 政策來控制 IAM 身分的存取。

**重要考量**  
當您搭配 MSK 叢集使用 IAM 存取控制時，請記住下列重要考量事項：  
IAM 存取控制不適用於 Apache ZooKeeper 節點。如需有關如何控制節點存取權的詳細資訊，請參閱[控制對 Amazon MSK 叢集中 Apache ZooKeeper 節點的存取](zookeeper-security.md)。
如果您的叢集使用 IAM 存取控制，則 `allow.everyone.if.no.acl.found` Apache Kafka 設定將無作用。
您可以針對使用 IAM 存取控制的 MSK 叢集調用 Apache Kafka ACL API。不過，Apache Kafka ACLs不會影響 IAM 身分的授權。您必須使用 IAM 政策來控制 IAM 身分的存取。

# Amazon MSK 的 IAM 存取控制運作方式
<a name="how-to-use-iam-access-control"></a>

若要使用 Amazon MSK 的 IAM 存取控制，請執行下列步驟，這些主題中會詳細說明這些步驟：
+ [建立使用 IAM 存取控制的 Amazon MSK 叢集](create-iam-access-control-cluster-in-console.md) 
+ [設定 IAM 存取控制的用戶端](configure-clients-for-iam-access-control.md)
+ [建立 IAM 角色的授權政策](create-iam-access-control-policies.md)
+ [取得 IAM 存取控制的引導代理程式](get-bootstrap-brokers-for-iam.md)

# 建立使用 IAM 存取控制的 Amazon MSK 叢集
<a name="create-iam-access-control-cluster-in-console"></a>

本節說明如何使用 AWS 管理主控台、 API 或 AWS CLI 來建立使用 IAM 存取控制的 Amazon MSK 叢集。如需有關如何啟用現有叢集的 IAM 存取控制的資訊，請參閱[更新 Amazon MSK 叢集的安全設定](msk-update-security.md)。

**使用 AWS 管理主控台 建立使用 IAM 存取控制的叢集**

1. 開啟位於 [https://console.aws.amazon.com/msk/](https://console.aws.amazon.com/msk/) 的 Amazon MSK 主控台。

1. 選擇 **Create Cluster** (建立叢集)。

1. 選擇**使用自訂設定建立叢集**。

1. 在**身分驗證**區段中，選擇 **IAM 存取控制**。

1. 完成其餘工作流程以建立叢集。

**使用 API 或 AWS CLI 建立使用 IAM 存取控制的叢集**
+ 若要建立啟用 IAM 存取控制的叢集，請使用 [CreateCluster](https://docs.aws.amazon.com/msk/1.0/apireference/clusters.html#CreateCluster) API 或 [create-cluster](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kafka/create-cluster.html) CLI 命令，並為 `ClientAuthentication` 參數傳遞下列 JSON：`"ClientAuthentication": { "Sasl": { "Iam": { "Enabled": true } }`。

# 設定 IAM 存取控制的用戶端
<a name="configure-clients-for-iam-access-control"></a>

若要讓用戶端能夠與使用 IAM 存取控制的 MSK 叢集通訊，您可以使用下列其中一種機制：
+ 使用 SASL\$1OAUTHBEARER 機制的非 Java 用戶端組態
+ 使用 SASL\$1OAUTHBEARER 機制或 AWS\$1MSK\$1IAM 機制的 Java 用戶端組態

## 使用 SASL\$1OAUTHBEARER 機制來設定 IAM
<a name="configure-clients-for-iam-access-control-sasl-oauthbearer"></a>

1. 使用下列 Python Kafka 用戶端範例編輯 client.properties 組態檔案。其他語言的組態變更也與其類似。

   ```
   from kafka import KafkaProducer
   from kafka.errors import KafkaError
   from kafka.sasl.oauth import AbstractTokenProvider
   import socket
   import time
   from aws_msk_iam_sasl_signer import MSKAuthTokenProvider
   
   class MSKTokenProvider():
       def token(self):
           token, _ = MSKAuthTokenProvider.generate_auth_token('<my AWS 區域>')
           return token
   
   tp = MSKTokenProvider()
   
   producer = KafkaProducer(
       bootstrap_servers='<myBootstrapString>',
       security_protocol='SASL_SSL',
       sasl_mechanism='OAUTHBEARER',
       sasl_oauth_token_provider=tp,
       client_id=socket.gethostname(),
   )
   
   topic = "<my-topic>"
   while True:
       try:
           inp=input(">")
           producer.send(topic, inp.encode())
           producer.flush()
           print("Produced!")
       except Exception:
           print("Failed to send message:", e)
   
   producer.close()
   ```

1. 下載所選組態語言的協助程式庫，並遵循該語言程式庫首頁*入門*一節中的指示。
   + JavaScript：[https://github.com/aws/aws-msk-iam-sasl-signer-js\$1getting-started](https://github.com/aws/aws-msk-iam-sasl-signer-js#getting-started)
   + Python：[https://github.com/aws/aws-msk-iam-sasl-signer-python\$1get-started](https://github.com/aws/aws-msk-iam-sasl-signer-python#get-started)
   + Go：[https://github.com/aws/aws-msk-iam-sasl-signer-go\$1getting-started](https://github.com/aws/aws-msk-iam-sasl-signer-go#getting-started)
   + .NET：[https://github.com/aws/aws-msk-iam-sasl-signer-net\$1getting-started](https://github.com/aws/aws-msk-iam-sasl-signer-net#getting-started)
   + JAVA：可透過 [https://github.com/aws/aws-msk-iam-auth/releases](https://github.com/aws/aws-msk-iam-auth/releases) jar 檔案獲得 Java 的 SASL\$1OAUTHBEARE 支援

## 使用 MSK 自訂 AWS\$1MSK\$1IAM 機制來設定 IAM
<a name="configure-clients-for-iam-access-control-msk-iam"></a>

1. 將以下內容新增到 `client.properties` 檔案。使用用戶端信任存放區檔案的完整路徑取代 *<PATH\$1TO\$1TRUST\$1STORE\$1FILE>*。
**注意**  
如果您不想使用特定憑證，可以從 `client.properties` 檔案中移除 `ssl.truststore.location=<PATH_TO_TRUST_STORE_FILE>`。如果您沒有為 `ssl.truststore.location` 指定值，Java 程序會使用預設憑證。

   ```
   ssl.truststore.location=<PATH_TO_TRUST_STORE_FILE>
   security.protocol=SASL_SSL
   sasl.mechanism=AWS_MSK_IAM
   sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule required;
   sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler
   ```

   若要使用您為 AWS 登入資料建立的具名設定檔，`awsProfileName="your profile name";`請在用戶端組態檔案中包含 。如需具名設定檔的相關資訊，請參閱 AWS CLI 文件中的[具名設定檔](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html)。

1. 下載最新的穩定版 [aws-msk-iam-auth](https://github.com/aws/aws-msk-iam-auth/releases) JAR 文件，並將其放置在類路徑中。如果您使用 Maven，請新增以下依賴項，根據需要調整版本號：

   ```
   <dependency>
       <groupId>software.amazon.msk</groupId>
       <artifactId>aws-msk-iam-auth</artifactId>
       <version>1.0.0</version>
   </dependency>
   ```

Amazon MSK 用戶端外掛程式已在 Apache 2.0 授權下開放原始碼。

# 建立 IAM 角色的授權政策
<a name="create-iam-access-control-policies"></a>

將授權政策連接至對應用戶端的 IAM 角色。在授權政策中，您可以指定角色要允許或拒絕的動作。如果您的用戶端位於 Amazon EC2 執行個體上，請將授權政策與該 Amazon EC2 執行個體的 IAM 角色建立關聯。或者，您可以將用戶端設定為使用命名設定檔，然後將授權政策與該命名設定檔的角色建立關聯。[設定 IAM 存取控制的用戶端](configure-clients-for-iam-access-control.md) 說明如何設定用戶端以使用命名設定檔。

如需有關建立 IAM 政策的詳細資訊，請參閱[建立 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

以下是名為 MyTestCluster 之叢集的授權政策範例。若要了解 `Action` 和 `Resource` 元素的語意，請參閱[IAM 授權政策動作和資源的語意](kafka-actions.md)。

**重要**  
您對 IAM 政策所做的變更會立即反映在 IAM API 與 AWS CLI 中。不過，政策變更可能需要一點時間才會生效。在大多數情況下，政策變更會在一分鐘內生效。有時網路狀況可能會增加延遲。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:Connect",
                "kafka-cluster:AlterCluster",
                "kafka-cluster:DescribeCluster"
            ],
            "Resource": [
                "arn:aws:kafka:us-east-1:111122223333:cluster/MyTestCluster/abcd1234-0123-abcd-5678-1234abcd-1"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:*Topic*",
                "kafka-cluster:WriteData",
                "kafka-cluster:ReadData"
            ],
            "Resource": [
                "arn:aws:kafka:us-east-1:123456789012:topic/MyTestCluster/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:AlterGroup",
                "kafka-cluster:DescribeGroup"
            ],
            "Resource": [
                "arn:aws:kafka:us-east-1:123456789012:group/MyTestCluster/*"
            ]
        }
    ]
}
```

------

若要了解如何使用對應常見 Apache Kafka 使用案例的動作元素 (例如產生和使用資料) 建立政策，請參閱[用戶端授權政策的常見使用案例](iam-access-control-use-cases.md)。

對於 Kafka 2.8.0 及以上版本，**WriteDataIdempotently** 許可已棄用 ([KIP-679](https://cwiki.apache.org/confluence/display/KAFKA/KIP-679%3A+Producer+will+enable+the+strongest+delivery+guarantee+by+default))。預設為 `enable.idempotence = true`。因此，對於 Kafka 2.8.0 版和更新版本，IAM 不提供與 Kafka ACLs相同的功能。僅提供該主題的`WriteData`存取權，就無法`WriteDataIdempotently`存取該主題。當 `WriteData` 提供給 **ALL** 主題時，這不會影響案例。在這種情況下，`WriteDataIdempotently` 是允許的。這是因為 IAM 邏輯實作的差異，以及 Kafka ACLs的實作方式。此外，以冪等方式寫入主題也需要存取 `transactional-ids`。

若要解決此問題，建議您使用類似下列政策的政策。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:Connect",
                "kafka-cluster:AlterCluster",
                "kafka-cluster:DescribeCluster",
                "kafka-cluster:WriteDataIdempotently"
            ],
            "Resource": [
                "arn:aws:kafka:us-east-1:123456789012:cluster/MyTestCluster/abcd1234-0123-abcd-5678-1234abcd-1"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:*Topic*",
                "kafka-cluster:WriteData",
                "kafka-cluster:ReadData"
            ],
            "Resource": [
                "arn:aws:kafka:us-east-1:123456789012:topic/MyTestCluster/abcd1234-0123-abcd-5678-1234abcd-1/TestTopic",
                "arn:aws:kafka:us-east-1:123456789012:transactional-id/MyTestCluster/abcd1234-0123-abcd-5678-1234abcd-1/*"
            ]
        }
    ]
}
```

------

在這種情況下，`WriteData` 允許寫入 `TestTopic`，同時 `WriteDataIdempotently` 允許等冪寫入叢集。此政策也會新增對所需`transactional-id`資源的存取權。

由於 `WriteDataIdempotently` 是叢集層級許可，您無法在主題層級使用它。如果 `WriteDataIdempotently` 受限於主題層級，則此政策將無法運作。

# 取得 IAM 存取控制的引導代理程式
<a name="get-bootstrap-brokers-for-iam"></a>

請參閱 [取得 Amazon MSK 叢集的引導代理程式](msk-get-bootstrap-brokers.md)。

# IAM 授權政策動作和資源的語意
<a name="kafka-actions"></a>

**注意**  
對於執行 Apache Kafka 3.8 版或更新版本的叢集，IAM 存取控制支援 WriteTxnMarkers API 來終止交易。對於執行 3.8 之前 Kafka 版本的叢集，IAM 存取控制不支援內部叢集動作，包括 WriteTxnMarkers。對於這些舊版，若要終止交易，請使用 SCRAM 或 mTLS 身分驗證搭配適當的 ACLs，而非 IAM 身分驗證。

本節說明您可以在 IAM 授權政策中使用的動作和資源元素的語義。如需政策範例，請參閱 [建立 IAM 角色的授權政策](create-iam-access-control-policies.md)。

## 授權政策動作
<a name="actions"></a>

下表列出在 Amazon MSK 使用 IAM 存取控制時，可包含在授權政策中的動作。當您在授權政策中加入來自表格*動作*資料欄中的動作時，您還必須加入*必要動作*資料欄中的對應動作。


| Action | Description | 必要的動作 | 必要的資源 | 適用於無伺服器叢集 | 
| --- | --- | --- | --- | --- | 
| kafka-cluster:Connect | 准許與叢集連線並進行身分驗證。 | 無 | 叢集 | 是 | 
| kafka-cluster:DescribeCluster | 准許描述叢集的各方面，相當於 Apache Kafka 的 DESCRIBE CLUSTER ACL。 |  `kafka-cluster:Connect`  | 叢集 | 是 | 
| kafka-cluster:AlterCluster | 准許改變叢集的各方面，相當於 Apache Kafka 的 ALTER CLUSTER ACL。 |  `kafka-cluster:Connect` `kafka-cluster:DescribeCluster`  | 叢集 | 否 | 
| kafka-cluster:DescribeClusterDynamicConfiguration | 准許描述叢集的動態組態，相當於 Apache Kafka 的 DESCRIBE\$1CONFIGS CLUSTER ACL。 |  `kafka-cluster:Connect`  | 叢集 | 否 | 
| kafka-cluster:AlterClusterDynamicConfiguration | 准許改變叢集的動態組態，相當於 Apache Kafka 的 ALTER\$1CONFIGS CLUSTER ACL。 |  `kafka-cluster:Connect` `kafka-cluster:DescribeClusterDynamicConfiguration`  | 叢集 | 否 | 
| kafka-cluster:WriteDataIdempotently | 准許在叢集上等冪寫入資料，相當於 Apache Kafka 的 IDEMPOTENT\$1WRITE CLUSTER ACL。 |  `kafka-cluster:Connect` `kafka-cluster:WriteData`  | 叢集 | 是 | 
| kafka-cluster:CreateTopic | 准許在叢集上建立主題，相當於 Apache Kafka 的 CREATE CLUSTER/TOPIC ACL。 |  `kafka-cluster:Connect`  | 主題 | 是 | 
| kafka-cluster:DescribeTopic | 准許描述叢集上的主題，相當於 Apache Kafka 的 DESCRIBE TOPIC ACL。 |  `kafka-cluster:Connect`  | 主題 | 是 | 
| kafka-cluster:AlterTopic | 准許改變叢集上的主題，相當於 Apache Kafka 的 ALTER TOPIC ACL。 |  `kafka-cluster:Connect` `kafka-cluster:DescribeTopic`  | 主題 | 是 | 
| kafka-cluster:DeleteTopic | 准許刪除叢集上的主題，相當於 Apache Kafka 的 DELETE TOPIC ACL。 |  `kafka-cluster:Connect` `kafka-cluster:DescribeTopic`  | 主題 | 是 | 
| kafka-cluster:DescribeTopicDynamicConfiguration | 准許描述叢集上主題的動態組態，相當於 Apache Kafka 的 DESCRIBE\$1CONFIGS TOPIC ACL。 |  `kafka-cluster:Connect`  | 主題 | 是 | 
| kafka-cluster:AlterTopicDynamicConfiguration | 准許改變叢集上主題的動態組態，相當於 Apache Kafka 的 ALTER\$1CONFIGS TOPIC ACL。 |  `kafka-cluster:Connect` `kafka-cluster:DescribeTopicDynamicConfiguration`  | 主題 | 是 | 
| kafka-cluster:ReadData | 准許讀取叢集上主題的資料，相當於 Apache Kafka 的 READ TOPIC ACL。 |  `kafka-cluster:Connect` `kafka-cluster:DescribeTopic` `kafka-cluster:AlterGroup`  | 主題 | 是 | 
| kafka-cluster:WriteData | 准許寫入叢集上主題的資料，相當於 Apache Kafka 的 WRITE TOPIC ACL。 |  `kafka-cluster:Connect` `kafka-cluster:DescribeTopic`  | 主題 | 是 | 
| kafka-cluster:DescribeGroup | 准許描述叢集上的群組，相當於 Apache Kafka 的 DESCRIBE GROUP ACL。 |  `kafka-cluster:Connect`  | 群組 | 是 | 
| kafka-cluster:AlterGroup | 准許加入叢集上的群組，相當於 Apache Kafka 的 READ GROUP ACL。 |  `kafka-cluster:Connect` `kafka-cluster:DescribeGroup`  | 群組 | 是 | 
| kafka-cluster:DeleteGroup | 准許刪除叢集上的群組，相當於 Apache Kafka 的 DELETE GROUP ACL。 |  `kafka-cluster:Connect` `kafka-cluster:DescribeGroup`  | 群組 | 是 | 
| kafka-cluster:DescribeTransactionalId | 准許描述叢集上的交易 ID，相當於 Apache Kafka 的 DESCRIBE TRANSACTIONAL\$1ID ACL。 |  `kafka-cluster:Connect`  | transactional-id | 是 | 
| kafka-cluster:AlterTransactionalId | 准許改變叢集上的交易 ID，相當於 Apache Kafka 的 WRITE TRANSACTIONAL\$1ID ACL。 |  `kafka-cluster:Connect` `kafka-cluster:DescribeTransactionalId` `kafka-cluster:WriteData`  | transactional-id | 是 | 

您可以在動作中的冒號後面使用星號 (\$1) 萬用字元任意次數。範例如下。
+ `kafka-cluster:*Topic` 代表 `kafka-cluster:CreateTopic`、`kafka-cluster:DescribeTopic`、`kafka-cluster:AlterTopic`、和 `kafka-cluster:DeleteTopic`。它不包括 `kafka-cluster:DescribeTopicDynamicConfiguration` 或 `kafka-cluster:AlterTopicDynamicConfiguration`。
+ `kafka-cluster:*` 代表所有許可。

## 授權政策資源
<a name="msk-iam-resources"></a>

下表顯示將 IAM 存取控制用於 Amazon MSK 時，可在授權政策中使用的四種資源類型。您可以從 取得叢集 Amazon Resource Name (ARN)， AWS 管理主控台 或使用 [DescribeCluster](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn.html#DescribeCluster) API 或 [describe-cluster](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kafka/describe-cluster.html) AWS CLI 命令。然後，您可以使用叢集 ARN 來建構主題、群組和交易 ID ARN。若要在授權政策中指定資源，請使用該資源的 ARN。


| 資源 | ARN 格式 | 
| --- | --- | 
| 叢集 | arn:aws:kafka:region:account-id:cluster/cluster-name/cluster-uuid | 
| 主題 | arn:aws:kafka:region:account-id:topic/cluster-name/cluster-uuid/topic-name | 
| Group | arn:aws:kafka:region:account-id:group/cluster-name/cluster-uuid/group-name | 
| 交易 ID | arn:aws:kafka:region:account-id:transactional-id/cluster-name/cluster-uuid/transactional-id | 

您可以在 ARN 中的 `:cluster/`、`:topic/`、`:group/`、`:transactional-id/` 後隨時使用星號 (\$1) 萬用字元任意次數。以下是使用星號 (\$1) 萬用字元表示多種資源的範例：
+ `arn:aws:kafka:us-east-1:0123456789012:topic/MyTestCluster/*`：任何名為 MyTestCluster 的叢集中的所有主題，不論叢集的 UUID 為何。
+ `arn:aws:kafka:us-east-1:0123456789012:topic/MyTestCluster/abcd1234-0123-abcd-5678-1234abcd-1/*_test`：名稱以 "\$1test" 結尾的所有主題，所屬叢集名稱是 MyTestCluster，叢集 UUID 是 abcd1234-0123-abcd-5678-1234abcd-1。
+ `arn:aws:kafka:us-east-1:0123456789012:transactional-id/MyTestCluster/*/5555abcd-1111-abcd-1234-abcd1234-1`：您帳戶中名為 MyTestCluster 的叢集的所有化身中交易 ID 為 5555abcd-1111-ABCD-1234-ABCD1234-1 的所有交易。這表示，如果您建立名為 MyTestCluster 的叢集並將其刪除，然後以相同的名稱建立另一個叢集，您可以使用此資源 ARN 來代表這兩個叢集上的相同交易 ID。但是，您無法存取已刪除的叢集。

# 用戶端授權政策的常見使用案例
<a name="iam-access-control-use-cases"></a>

下表中的第一個資料欄顯示一些常見的使用案例。若要授權用戶端執行指定的使用案例，請在用戶端的授權政策中包含該使用案例所需的動作，然後將 `Effect` 設定為 `Allow`。

如需有關 Amazon MSK 上所有 IAM 存取控制動作的相關資訊，請參閱[IAM 授權政策動作和資源的語意](kafka-actions.md)。

**注意**  
根據預設，動作會被拒絕。您必須明確允許要授權用戶端執行的每個動作。


****  

| 使用案例 | 必要的動作 | 
| --- | --- | 
| 管理員 |  `kafka-cluster:*`  | 
| 建立主題 |  `kafka-cluster:Connect` `kafka-cluster:CreateTopic`  | 
| 產生資料 |  `kafka-cluster:Connect` `kafka-cluster:DescribeTopic` `kafka-cluster:WriteData`  | 
| 取用資料 |  `kafka-cluster:Connect` `kafka-cluster:DescribeTopic` `kafka-cluster:DescribeGroup` `kafka-cluster:AlterGroup` `kafka-cluster:ReadData`  | 
| 等冪產生資料 |  `kafka-cluster:Connect` `kafka-cluster:DescribeTopic` `kafka-cluster:WriteData` `kafka-cluster:WriteDataIdempotently`  | 
| 交易產生資料 |  `kafka-cluster:Connect` `kafka-cluster:DescribeTopic` `kafka-cluster:WriteData` `kafka-cluster:DescribeTransactionalId` `kafka-cluster:AlterTransactionalId`  | 
| 說明叢集的組態 |  `kafka-cluster:Connect` `kafka-cluster:DescribeClusterDynamicConfiguration`  | 
| 更新叢集的組態 |  `kafka-cluster:Connect` `kafka-cluster:DescribeClusterDynamicConfiguration` `kafka-cluster:AlterClusterDynamicConfiguration`  | 
| 說明主題的組態 |  `kafka-cluster:Connect` `kafka-cluster:DescribeTopicDynamicConfiguration` | 
| 更新主題的組態 |  `kafka-cluster:Connect` `kafka-cluster:DescribeTopicDynamicConfiguration` `kafka-cluster:AlterTopicDynamicConfiguration`  | 
| 改變主題 |  `kafka-cluster:Connect` `kafka-cluster:DescribeTopic` `kafka-cluster:AlterTopic`  | 

# Amazon MSK 的相互 TLS 用戶端身分驗證
<a name="msk-authentication"></a>

您可以使用 TLS 啟用用戶端身分驗證，以便從應用程式連線至 Amazon MSK 代理程式。如要使用用戶端身分驗證，您需要一個 AWS 私有 CA。 AWS 私有 CA 可以與您的叢集 AWS 帳戶 位於相同的 中，也可以位於不同的 帳戶中。如需 AWS 私有 CA的相關資訊，請參閱[建立和管理 AWS 私有 CA](https://docs.aws.amazon.com/acm-pca/latest/userguide/create-CA.html)。

Amazon MSK 不支援憑證撤銷清單 (CRL)。若要控制對叢集主題的存取或封鎖遭到入侵ACLs 和 AWS 安全群組。如需有關使用 Apache Kafka ACL 的詳細資訊，請參閱 [Apache Kafka ACL](msk-acls.md)。

**Topics**
+ [建立支援用戶端身分驗證的 Amazon MSK 叢集](msk-authentication-cluster.md)
+ [設定用戶端以使用身分驗證](msk-authentication-client.md)
+ [使用身分驗證產生和使用訊息](msk-authentication-messages.md)

# 建立支援用戶端身分驗證的 Amazon MSK 叢集
<a name="msk-authentication-cluster"></a>

此程序說明如何使用 啟用用戶端身分驗證 AWS 私有 CA。
**注意**  
當您使用交互 AWS 私有 CA TLS 控制存取時，強烈建議為每個 MSK 叢集使用獨立 。這樣做可確保由 PCA 簽署的 TLS 憑證僅透過單一 MSK 叢集進行身分驗證。

1. 使用下列內容建立名為 `clientauthinfo.json` 的檔案。將 *Private-CA-ARN* 取代為您 PCA 的 ARN。

   ```
   {
      "Tls": {
          "CertificateAuthorityArnList": ["Private-CA-ARN"]
       }
   }
   ```

1. 建立名為 `brokernodegroupinfo.json` 的檔案，如 [使用 建立佈建的 Amazon MSK 叢集 AWS CLI](create-cluster-cli.md) 中所說明。

1. 用戶端身分驗證要求您也啟用用戶端和代理程式之間的傳輸中加密。使用下列內容建立名為 `encryptioninfo.json` 的檔案。將 *KMS-Key-ARN* 取代為您 KMS 金鑰的 ARN。您可以設定 `ClientBroker` 為 `TLS` 或 `TLS_PLAINTEXT`。

   ```
   {
      "EncryptionAtRest": {
          "DataVolumeKMSKeyId": "KMS-Key-ARN"
       },
      "EncryptionInTransit": {
           "InCluster": true,
           "ClientBroker": "TLS"
       }
   }
   ```

   如需加密的詳細資訊，請參閱 [Amazon MSK 加密](msk-encryption.md)。

1. 在 AWS CLI 已安裝 的機器上，執行下列命令來建立啟用身分驗證和傳輸中加密的叢集。儲存回應中提供的叢集 ARN。

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

# 設定用戶端以使用身分驗證
<a name="msk-authentication-client"></a>

此程序說明如何設定 Amazon EC2 執行個體做為用戶端使用身分驗證。

此程序說明如何透過建立用戶端機器、建立主題，以及設定必要的安全設定，來使用身分驗證產生和取用訊息。

1. 建立用作用戶端機器的 Amazon EC2 執行個體。為求簡化，請在與叢集相同的 VPC 中建立此執行個體。如需如何建立這類用戶端機器的範例，請參閱 [步驟 3：建立用戶端機器](create-client-machine.md)。

1. 建立主題。如需範例，請參閱 [步驟 4：在 Amazon MSK 叢集中建立主題](create-topic.md) 下方的說明。

1. 在 AWS CLI 已安裝 的機器上執行下列命令，以取得叢集的引導代理程式。將 *Cluster-ARN* 取代為您的叢集 ARN。

   ```
   aws kafka get-bootstrap-brokers --cluster-arn Cluster-ARN
   ```

   儲存回應中與 `BootstrapBrokerStringTls` 相關聯的字串。

1. 在用戶端機器上，執行下列命令以使用 JVM 信任存放區來建立用戶端信任存放區。如果您的 JVM 路徑不同，請相應地調整命令。

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

1. 在用戶端機器上，執行下列命令以建立用戶端私有金鑰。將 *Distinguished-Name*、*Example-Alias*、*Your-Store-Pass* 和 *Your-Key-Pass* 取代為您選擇的字串。

   ```
   keytool -genkey -keystore kafka.client.keystore.jks -validity 300 -storepass Your-Store-Pass -keypass Your-Key-Pass -dname "CN=Distinguished-Name" -alias Example-Alias -storetype pkcs12 -keyalg rsa
   ```

1. 在用戶端機器上，執行下列命令，以使用您在上一個步驟中建立的私有金鑰來建立憑證要求。

   ```
   keytool -keystore kafka.client.keystore.jks -certreq -file client-cert-sign-request -alias Example-Alias -storepass Your-Store-Pass -keypass Your-Key-Pass
   ```

1. 打開 `client-cert-sign-request` 文件並確保以 `-----BEGIN CERTIFICATE REQUEST-----` 開始和以 `-----END CERTIFICATE REQUEST-----` 結束。如果開頭為 `-----BEGIN NEW CERTIFICATE REQUEST-----`，請從檔案的開頭和結尾刪除單字 `NEW` (以及其後的單一空格)。

1. 在 AWS CLI 已安裝 的電腦上，執行下列命令來簽署您的憑證請求。將 *Private-CA-ARN* 取代為您 PCA 的 ARN。如果想要，您可以變更有效性值。在這裡，我們使用 300 做為範例。

   ```
   aws acm-pca issue-certificate --certificate-authority-arn Private-CA-ARN --csr fileb://client-cert-sign-request --signing-algorithm "SHA256WITHRSA" --validity Value=300,Type="DAYS"
   ```

   儲存回應中提供的憑證 ARN。
**注意**  
若要擷取用戶端憑證，請使用 `acm-pca get-certificate` 指令並指定憑證 ARN。如需詳細資訊，請參閱 *AWS CLI Command Reference* 中的 [get-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/acm-pca/get-certificate.html)。

1. 執行下列命令以取得為您 AWS 私有 CA 簽署的憑證。將 *Certificate-ARN* 取代為您從先前命令的回應中取得的 ARN。

   ```
   aws acm-pca get-certificate --certificate-authority-arn Private-CA-ARN --certificate-arn Certificate-ARN
   ```

1. 從執行上一個命令的 JSON 結果中，複製與 `Certificate` 和 `CertificateChain` 相關聯的字串。將這兩個字串貼到名為 signed-certificate-from-acm 的新文件中。首先貼上與 `Certificate` 相關連的字串，接著與 `CertificateChain` 相關聯的字串。將 `\n` 取代為新行字元。以下是您貼上憑證和憑證鏈結之後的檔案結構。

   ```
   -----BEGIN CERTIFICATE-----
   ...
   -----END CERTIFICATE-----
   -----BEGIN CERTIFICATE-----
   ...
   -----END CERTIFICATE-----
   -----BEGIN CERTIFICATE-----
   ...
   -----END CERTIFICATE-----
   ```

1. 在用戶端機器上執行以下命令以將此憑證新增到您的金鑰存放區，以便其在與 MSK 代理程式通話時顯示。

   ```
   keytool -keystore kafka.client.keystore.jks -import -file signed-certificate-from-acm -alias Example-Alias -storepass Your-Store-Pass -keypass Your-Key-Pass
   ```

1. 使用下列內容建立名為 `client.properties` 的檔案。將信任庫和密鑰庫位置調整為您儲存 `kafka.client.truststore.jks` 的路徑。使用您的 Kafka 用戶端版本取代 *\$1YOUR KAFKA VERSION\$1* 預留位置。

   ```
   security.protocol=SSL
   ssl.truststore.location=/tmp/kafka_2.12-{YOUR KAFKA VERSION}/kafka.client.truststore.jks
   ssl.keystore.location=/tmp/kafka_2.12-{YOUR KAFKA VERSION}/kafka.client.keystore.jks
   ssl.keystore.password=Your-Store-Pass
   ssl.key.password=Your-Key-Pass
   ```

# 使用身分驗證產生和使用訊息
<a name="msk-authentication-messages"></a>

此程序說明如何使用身分驗證產生和取用訊息。

1. 執行下列命令以建立主題。名為的檔案 `client.properties` 是您在上一個程序中建立的檔案。

   ```
   <path-to-your-kafka-installation>/bin/kafka-topics.sh --create --bootstrap-server BootstrapBroker-String --replication-factor 3 --partitions 1 --topic ExampleTopic --command-config client.properties
   ```

1. 執行下列命令以啟動主控台生產者。名為的檔案 `client.properties` 是您在上一個程序中建立的檔案。

   ```
   <path-to-your-kafka-installation>/bin/kafka-console-producer.sh --bootstrap-server BootstrapBroker-String --topic ExampleTopic --producer.config client.properties
   ```

1. 在用戶端機器的新命令視窗中，執行下列命令以啟動主控台取用者。

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

1. 在生產者視窗中輸入訊息，並觀看訊息出現在取用者視窗中。

# 使用 AWS Secrets Manager 進行登入憑證身分驗證
<a name="msk-password"></a>

您可以使用使用 AWS Secrets Manager 存放和保護的登入憑證來控制對 Amazon MSK 叢集的存取。將使用者憑證儲存在 Secrets Manager 中，可減少叢集身分驗證 (例如稽核、更新和輪換憑證) 的額外負荷。Secrets Manager 也可讓您跨叢集共用使用者憑證。

將秘密與 MSK 叢集建立關聯後，MSK 會定期同步登入資料。

**Topics**
+ [登入憑證身分驗證的運作方式](msk-password-howitworks.md)
+ [設定 Amazon MSK 叢集的 SASL/SCRAM 身分驗證](msk-password-tutorial.md)
+ [使用使用者](msk-password-users.md)
+ [使用 SCRAM 秘密的限制](msk-password-limitations.md)

# 登入憑證身分驗證的運作方式
<a name="msk-password-howitworks"></a>

Amazon MSK 的登入憑證身分驗證會使用 SASL/SCRAM (簡易身分驗證及安全性階層/Salted Challenge Response Mechanism) 身分驗證。若要設定叢集的登入憑證身分驗證，您可以在 [AWS Secrets Manager](https://docs.aws.amazon.com//secretsmanager/?id=docs_gateway) 中建立秘密資源，並將登入憑證與該秘密建立關聯。

SAS/SCRM 定義見 [RFC 5802](https://tools.ietf.org/html/rfc5802)。SCRAM 使用安全的雜湊演算法，不會在用戶端與伺服器之間傳輸純文字登入憑證。

**注意**  
為叢集設定 SASL/SCRAM 身分驗證後，Amazon MSK 會為用戶端和代理程式之間的所有流量開啟 TLS 加密。

# 設定 Amazon MSK 叢集的 SASL/SCRAM 身分驗證
<a name="msk-password-tutorial"></a>

若要在 AWS Secrets Manager 中設定秘密，請遵循 [AWS Secrets Manager 使用者指南](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)中的[建立和擷取](https://docs.aws.amazon.com/secretsmanager/latest/userguide/tutorials_basic.html)秘密教學課程。

為 Amazon MSK 叢集建立秘密時，請注意以下要求：
+ 針對秘密類型，選擇**其他秘密類型 (如 API 金鑰)**。
+ 您的秘密名稱必須以 **Amazon MSK\$1** 字首開頭。
+ 您必須使用現有的自訂 AWS KMS 金鑰或為您的秘密建立新的自訂 AWS KMS 金鑰。Secrets Manager 預設會使用秘密的預設 AWS KMS 金鑰。
**重要**  
使用預設 AWS KMS 金鑰建立的秘密無法與 Amazon MSK 叢集搭配使用。
+ 您的登入憑證資料必須採用下列格式，才能使用**純文字**選項輸入鍵值對。

  ```
  {
    "username": "alice",
    "password": "alice-secret"
  }
  ```
+ 記錄秘密的 ARN (Amazon Resource Name) 值。
+ 
**重要**  
您無法將 Secret Manager 秘密與超過 [正確調整叢集大小：每個標準代理程式的分割區數量](bestpractices.md#partitions-per-broker) 中所述限制的叢集建立關聯。
+ 如果您使用 AWS CLI 建立秘密，請指定 `kms-key-id` 參數的金鑰 ID 或 ARN。請勿指定別名。
+ 若要將秘密與叢集建立關聯，請使用 Amazon MSK 主控台或 [BatchAssociateScramSecret](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn-scram-secrets.html#BatchAssociateScramSecret) 操作。
**重要**  
將秘密與叢集建立關聯後，Amazon MSK 會將資源政策連接至秘密，以便叢集能夠存取和讀取您定義的秘密值。您不應該修改此資源政策。這樣做可以防止您的叢集存取您的秘密。如果您對 Secrets 資源政策和/或用於秘密加密的 KMS 金鑰進行任何變更，請務必重新建立秘密與 MSK 叢集的關聯。這將確保您的叢集可以繼續存取您的秘密。

  下列範例中的 `BatchAssociateScramSecret` 操作 JSON 輸入會將秘密與叢集建立關聯：

  ```
  {
    "clusterArn" : "arn:aws:kafka:us-west-2:0123456789019:cluster/SalesCluster/abcd1234-abcd-cafe-abab-9876543210ab-4",          
    "secretArnList": [
      "arn:aws:secretsmanager:us-west-2:0123456789019:secret:AmazonMSK_MyClusterSecret"
    ]
  }
  ```

# 使用登入憑證連線至叢集
<a name="msk-password-tutorial-connect"></a>

建立秘密並將其與叢集建立關聯後，即可將用戶端連線至叢集。下列程序示範如何將用戶端連線至使用 SASL/SCRAM 身分驗證的叢集。它還顯示如何從範例主題產生和使用 。

**Topics**
+ [使用 SASL/SCRAM 身分驗證將用戶端連線至叢集](#w2aab9c13c29c17c13c11b9b7)
+ [連線問題疑難排解](#msk-password-tutorial-connect-troubleshooting)

## 使用 SASL/SCRAM 身分驗證將用戶端連線至叢集
<a name="w2aab9c13c29c17c13c11b9b7"></a>

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

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

   從此命令的 JSON 結果中，儲存與名為 的字串相關聯的值`BootstrapBrokerStringSaslScram`。您將在後續步驟中使用此值。

1. 在用戶端機器上建立 JAAS 組態檔案，其中內含儲存在秘密中的使用者憑證。例如，為使用者 **alice**，建立一個名為 `users_jaas.conf` 的檔案，內含以下內容。

   ```
   KafkaClient {
      org.apache.kafka.common.security.scram.ScramLoginModule required
      username="alice"
      password="alice-secret";
   };
   ```

1. 使用以下命令將 JAAS 組態檔案匯出為 `KAFKA_OPTS` 環境參數。

   ```
   export KAFKA_OPTS=-Djava.security.auth.login.config=<path-to-jaas-file>/users_jaas.conf
   ```

1. 在 `/tmp` 目錄中，建立名為 `kafka.client.truststore.jks` 的檔案。

1. （選用） 使用下列命令，將 JDK 金鑰存放區檔案從 JVM `cacerts` 資料夾複製到您在上一個步驟中建立`kafka.client.truststore.jks`的檔案。使用執行個體上 JDK 資料夾的名稱取代 *JDKFolder*。例如，您的 JDK 資料夾可能會命名為 `java-1.8.0-openjdk-1.8.0.201.b09-0.amzn2.x86_64`。

   ```
   cp /usr/lib/jvm/JDKFolder/lib/security/cacerts /tmp/kafka.client.truststore.jks
   ```

1. 在安裝 Apache Kafka 的 `bin` 目錄中，建立名為 `client_sasl.properties` 的用戶端屬性檔案，內含以下內容。此檔案會定義 SASL 機制和通訊協定。

   ```
   security.protocol=SASL_SSL
   sasl.mechanism=SCRAM-SHA-512
   ```

1. 若要建立範例主題，請執行下列命令。將 *BootstrapBrokerStringSaslScram* 取代為您在本主題的步驟 1 中取得的引導代理程式字串。

   ```
   <path-to-your-kafka-installation>/bin/kafka-topics.sh --create --bootstrap-server BootstrapBrokerStringSaslScram --command-config <path-to-client-properties>/client_sasl.properties --replication-factor 3 --partitions 1 --topic ExampleTopicName
   ```

1. 若要產生資料到您建立的範例主題，請在用戶端機器上執行下列命令。將 *BootstrapBrokerStringSaslScram* 取代為您在本主題的步驟 1 中擷取的引導代理程式字串。

   ```
   <path-to-your-kafka-installation>/bin/kafka-console-producer.sh --broker-list BootstrapBrokerStringSaslScram --topic ExampleTopicName --producer.config client_sasl.properties
   ```

1. 若要從您建立的主題取用資料，請在用戶端機器上執行下列命令。將 *BootstrapBrokerStringSaslScram* 取代為您在本主題的步驟 1 中取得的引導代理程式字串。

   ```
   <path-to-your-kafka-installation>/bin/kafka-console-consumer.sh --bootstrap-server BootstrapBrokerStringSaslScram --topic ExampleTopicName --from-beginning --consumer.config client_sasl.properties
   ```

## 連線問題疑難排解
<a name="msk-password-tutorial-connect-troubleshooting"></a>

執行 Kafka 用戶端命令時，您可能會遇到 Java 堆積記憶體錯誤，特別是在使用大型主題或資料集時。發生這些錯誤是因為 Kafka 工具以 Java 應用程式的形式執行，其預設記憶體設定可能不足以滿足您的工作負載。

若要解決`Out of Memory Java Heap`錯誤，您可以透過修改`KAFKA_OPTS`環境變數以包含記憶體設定來增加 Java 堆積大小。

下列範例會將堆積大小上限設定為 1GB (`-Xmx1G`)。您可以根據可用的系統記憶體和需求來調整此值。

```
export KAFKA_OPTS="-Djava.security.auth.login.config=<path-to-jaas-file>/users_jaas.conf -Xmx1G"
```

對於使用大型主題，請考慮使用時間型或位移型參數，而不是`--from-beginning`限制記憶體用量：

```
<path-to-your-kafka-installation>/bin/kafka-console-consumer.sh --bootstrap-server BootstrapBrokerStringSaslScram --topic ExampleTopicName --max-messages 1000 --consumer.config client_sasl.properties
```

# 使用使用者
<a name="msk-password-users"></a>

**建立使用者：**您可以在秘密中將使用者建立鍵值對。當您在 Secrets Manager 主控台中使用**純文字**選項時，您應該以下列格式指定登入憑證資料。

```
{
  "username": "alice",
  "password": "alice-secret"
}
```

**撤銷使用者存取權：**若要撤銷使用者存取叢集的憑證，建議您先移除或強制執行叢集上的 ACL，然後取消與秘密的關聯。其原因如下：
+ 移除使用者並不會關閉現有的連線。
+ 對秘密等變更最多需要 10 分鐘的時間傳播。

如需有關搭配 Amazon MSK 使用 ACL 的詳細資訊，請參閱 [Apache Kafka ACL](msk-acls.md)。

對於使用 ZooKeeper 模式的叢集，我們建議您限制對 ZooKeeper 節點的存取，以防止使用者修改 ACLs。如需詳細資訊，請參閱[控制對 Amazon MSK 叢集中 Apache ZooKeeper 節點的存取](zookeeper-security.md)。

# 使用 SCRAM 秘密的限制
<a name="msk-password-limitations"></a>

使用 SCRAM 秘密時，請注意以下限制：
+ Amazon MSK 僅支援 SCRAM-SHA-512 身分驗證。
+ 一個 Amazon MSK 叢集最多可以有 1000 個使用者。
+ 您必須將 AWS KMS key 與秘密搭配使用。您無法將採取預設 Secrets Manager 加密金鑰的秘密與 Amazon MSK 搭配使用。如需有關建立 KMS 金鑰的相關資訊，請參閱[建立對稱加密 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)。
+ 您無法透過 Secrets Manager 使用非對稱 KMS 金鑰。
+ 您可以使用 [BatchAssociateScramSecret](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn-scram-secrets.html#BatchAssociateScramSecret) 操作，一次最多將 10 個秘密與叢集建立關聯。
+ 與 Amazon MSK 叢集相關聯的秘密名稱必須使用字首 **Amazon MSK\$1**。
+ 與 Amazon MSK 叢集相關聯的秘密必須與叢集位於相同的 Amazon Web Services 帳戶和 AWS 區域中。

# Apache Kafka ACL
<a name="msk-acls"></a>

Apache Kafka 具有可插入的授權方，並隨附out-of-box授權方實作。Amazon MSK 會在代理程式的 `server.properties` 檔案中啟用此授權。

Apache Kafka ACL 的格式為「主體 P 被主機 H [允許/拒絕] 在任何匹配 ResourcePattern RP 的資源 R 上進行操作 O」。如果 RP 不匹配特定的資源 R，那麼 R 和 ACL 無關聯，因此除了超級使用者以外沒有其他人能夠存取 R。若要變更此 Apache Kafka 行為，請將屬性 `allow.everyone.if.no.acl.found` 設定為 "true"。Amazon MSK 預設設定為 "true"。這表示使用 Amazon MSK 叢集時，如果您未在資源上明確設定 ACL，則所有委託人都可以存取此資源。如果您啟用資源上的 ACL，只有授權的委託人可以存取它。如果您想要限制對主題的存取，並授權使用 TLS 相互驗證的用戶端，請使用 Apache Kafka 授權方 CLI 來新增 ACL。如需有關新增、移除和列出 ACL 的詳細資訊，請參閱 [Kafka 授權命令列界面](https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Authorization+Command+Line+Interface)。

由於 Amazon MSK 會將代理程式設定為超級使用者，因此他們可以存取所有主題。這有助於代理程式從主要分割區複寫訊息，無論是否為叢集的組態定義 `allow.everyone.if.no.acl.found` 屬性。

**若要新增或移除主題的讀取和寫入權限**

1. 將您的代理程式新增至 ACL 表格，以允許它們讀取所有具有 ACL 的主題。若要授予代理程式對主題的讀取權限，請在可與 MSK 叢集通訊的用戶端機器上執行下列命令。

   使用叢集的任何引導代理程式的 DNS 取代 *Distinguished-Name*，然後以星號 (`*`) 取代此辨別名稱中第一個句點之前的字串。例如，如果其中一個叢集的引導代理程式具有 DNS，`b-6.mytestcluster.67281x.c4.kafka.us-east-1.amazonaws.com`請使用 `*.mytestcluster.67281x.c4.kafka.us-east-1.amazonaws.com` 取代下列命令中的 *Distinguished-Name*。如需有關如何取得引導代理程式的資訊，請參閱[取得 Amazon MSK 叢集的引導代理程式](msk-get-bootstrap-brokers.md)。

   ```
   <path-to-your-kafka-installation>/bin/kafka-acls.sh --bootstrap-server BootstrapServerString --add --allow-principal "User:CN=Distinguished-Name" --operation Read --group=* --topic Topic-Name
   ```

1. 若要授予用戶端應用程式對主題的讀取存取權，請在用戶端機器上執行下列命令。若您使用雙向 TLS 身分驗證，使用與建立私有金鑰時相同的 *Distinguished-Name*。

   ```
   <path-to-your-kafka-installation>/bin/kafka-acls.sh --bootstrap-server BootstrapServerString --add --allow-principal "User:CN=Distinguished-Name" --operation Read --group=* --topic Topic-Name
   ```

   若要移除讀取權限，您可以執行相同的命令，將 `--add` 取代為 `--remove`。

1. 若要授與主題的寫入權限，請在用戶端機器上執行下列命令。若您使用雙向 TLS 身分驗證，使用與建立私有金鑰時相同的 *Distinguished-Name*。

   ```
   <path-to-your-kafka-installation>/bin/kafka-acls.sh --bootstrap-server BootstrapServerString --add --allow-principal "User:CN=Distinguished-Name" --operation Write --topic Topic-Name
   ```

   若要移除寫入權限，您可以執行相同的命令，將 `--add` 取代為 `--remove`。

# 變更 Amazon MSK 叢集的安全群組
<a name="change-security-group"></a>

本頁說明如何變更現有 MSK 叢集的安全群組。您可能需要變更叢集的安全群組，才能提供對特定使用者集的存取權，或限制對叢集的存取。如需安全群組的詳細資訊，請參閱《Amazon VPC 使用者指南》中的 [VPC 的安全群組](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)。

1. 使用 中的 [ListNodes](https://docs.amazonaws.cn/en_us/msk/1.0/apireference/clusters-clusterarn-nodes.html#ListNodes) API 或 [list-nodes](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kafka/list-nodes.html) 命令 AWS CLI 來取得叢集中的代理程式清單。此操作的結果包括與代理程式相關聯的彈性網路介面 (ENI) ID。

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)：// 開啟 Amazon EC2 主控台。

1. 使用靠近螢幕右上角的下拉式清單，選取部署叢集的區域。

1. 在左側窗格中**網路與安全**下，選擇**網路介面**。

1. 選擇您在第一步中獲得的第一個 ENI。選擇畫面頂端的**動作**選單，然後選擇**變更安全群組**。將新的安全群組指派給此 ENI。針對您在第一個步驟中取得的每個 ENI 重複此步驟。
**注意**  
您使用 Amazon EC2 主控台對叢集安全群組所做的變更，不會反映在**網路設定**下的 MSK 主控台中。

1. 設定新安全群組的規則，以確保您的用戶端可以存取代理程式。如需有關設定安全群組規則的詳細資訊，請參閱《Amazon VPC 使用者指南》中的[新增、移除及更新規則](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html?shortFooter=true#AddRemoveRules)。

**重要**  
如果您變更與叢集中代理程式相關聯的安全群組，然後將新代理程式新增至該叢集，Amazon MSK 會將新代理程式與叢集建立時相關聯的原始安全群組建立關聯。不過，若要讓叢集正常運作，叢集的所有代理程式都必須與相同的安全群組相關聯。因此，如果在變更安全群組後添加新代理程式，則必須再次執行之前的過程並更新新代理程式的 ENI。

# 控制對 Amazon MSK 叢集中 Apache ZooKeeper 節點的存取
<a name="zookeeper-security"></a>

基於安全考量，您可以對屬於 Amazon MSK 叢集的 Apache ZooKeeper 節點存取權進行限制。若要限制對這些節點的存取權，您可以將個別的安全群組指派給這些節點。然後，您可以決定誰可以存取該安全群組。

**重要**  
本節不適用於在 KRaft 模式下執行的叢集。請參閱 [KRaft 模式](metadata-management.md#kraft-intro)。

**Topics**
+ [將 Apache ZooKeeper 節點放在個別的安全群組](zookeeper-security-group.md)
+ [搭配 Apache ZooKeeper 使用 TLS 安全功能](zookeeper-security-tls.md)

# 將 Apache ZooKeeper 節點放在個別的安全群組
<a name="zookeeper-security-group"></a>

若要限制對 Apache ZooKeeper 節點的存取，您可以為其指派個別的安全群組。您可以透過設定安全群組規則來選擇有權存取此新安全群組的人員。

1. 取得叢集的 Apache ZooKeeper 連線字串。若要了解作法，請參閱[ZooKeeper 模式](metadata-management.md#msk-get-connection-string)。連線字串包含 Apache ZooKeeper 節點的 DNS 名稱。

1. 使用 `host` 或 `ping` 之類的工具，來將您在上一個步驟中獲得的 DNS 名稱轉換為 IP 地址。儲存這些 IP 地址，因為稍後在此程序中需要這些資訊。

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)：// 開啟 Amazon EC2 主控台。

1. 在左側窗格中的 **NETWORK & SECURITY (網路與安全)** 下，選擇 **Network Interfaces (網路界面)**。

1. 在網路界面表格上方的搜尋欄位中，輸入叢集的名稱，然後輸入 return。這會將表格中顯示的網路界面數量限制為與叢集相關聯的那些界面。

1. 在清單中與第一個網路界面相對應的資料列開頭選取核取方塊。

1. 在頁面底部的詳細資訊窗格中，尋找 **Primary private IPv4 IP (主要私有 IPv4 IP)**。如果此 IP 地址與您在此程序的第一步中獲得的其中一個 IP 地址相符，這意味著系統會將此網路界面指派給屬於您叢集的 Apache ZooKeeper 節點。否則，請取消選取此網路界面旁的核取方塊，然後選取清單中的下一個網路界面。網路界面的選取順序無關緊要。在接下來的步驟中，您將對指派給 Apache ZooKeeper 節點的所有網路界面一個接一個執行相同的操作。

1. 當您選取與 Apache ZooKeeper 節點對應的網路界面時，請選擇頁面頂端的 **Actions (動作)** 功能表，然後選擇 **Change Security Groups (變更安全群組)**。將新的安全群組指派至此網路界面。如需有關建立安全群組的詳細資訊，請參閱 Amazon VPC 文件中的[建立安全群組](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html?shortFooter=true#CreatingSecurityGroups)。

1. 重複上述步驟，將相同的新安全群組指派給與叢集 Apache ZooKeeper 節點相關聯的所有網路界面。

1. 您現在可以選擇可存取此全新安全群組的人員。如需有關設定安全群組規則的資訊，請參閱 Amazon VPC 文件中的[新增、移除和更新規則](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html?shortFooter=true#AddRemoveRules)。

# 搭配 Apache ZooKeeper 使用 TLS 安全功能
<a name="zookeeper-security-tls"></a>

您可以使用 TLS 安全功能加密用戶端與 Apache ZooKeeper 節點之間的傳輸。要搭配 Apache ZooKeeper 節點使用 TLS 安全功能，請執行以下操作：
+ 叢集必須使用 Apache Kafka 2.5.1 版或更高版本以搭配 Apache ZooKeeper 使用 TLS 安全功能。
+ 建立或設定叢集時啟用 TLS 安全功能。使用 Apache Kafka version 2.5.1 版或更高版本建立，且啟用 TLS 的叢集，會自動搭配 Apache ZooKeeper 端點使用 TLS 安全功能。如需有關 TLS 安全功能設定的資訊，請參閱 [開始使用 Amazon MSK 加密](msk-working-with-encryption.md)。
+ 使用 [DescribeCluste ](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn.html#DescribeCluster) 操作擷取 TLS Apache ZooKeeper 端點。
+ 建立 Apache ZooKeeper 組態檔案，以搭配 `kafka-configs.sh` 和 [https://kafka.apache.org/documentation/#security_authz_cli](https://kafka.apache.org/documentation/#security_authz_cli) 工具使用，或搭配 ZooKeeper Shell 使用。搭配各個工具，您可以使用 `--zk-tls-config-file` 參數來指定您的 Apache ZooKeeper 組態。

  以下範例顯示了一個典型的 Apache ZooKeeper 組態檔案：

  ```
  zookeeper.ssl.client.enable=true
  zookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty
  zookeeper.ssl.keystore.location=kafka.jks
  zookeeper.ssl.keystore.password=test1234
  zookeeper.ssl.truststore.location=truststore.jks
  zookeeper.ssl.truststore.password=test1234
  ```
+ 對於其他命令 (如 `kafka-topics`)，您必須使用 `KAFKA_OPTS` 環境變量來設定 Apache ZooKeeper 參數。以下範例演示了如何設定 `KAFKA_OPTS` 環境變量來將 Apache ZooKeeper 參數傳遞到其他命令：

  ```
  export KAFKA_OPTS="
  -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty 
  -Dzookeeper.client.secure=true 
  -Dzookeeper.ssl.trustStore.location=/home/ec2-user/kafka.client.truststore.jks
  -Dzookeeper.ssl.trustStore.password=changeit"
  ```

  設定 `KAFKA_OPTS` 環境變數之後，就可以正常使用 CLI 命令。以下範例使用來自 `KAFKA_OPTS` 環境變量的 Apache ZooKeeper 組態建立 Apache Kafka 主題：

  ```
  <path-to-your-kafka-installation>/bin/kafka-topics.sh --create --zookeeper ZooKeeperTLSConnectString --replication-factor 3 --partitions 1 --topic AWSKafkaTutorialTopic
  ```

**注意**  
您在 Apache ZooKeeper 組態檔案中使用的參數名稱，與您在 `KAFKA_OPTS` 環境變量中使用的參數不一致。請注意您在組態檔案和 `KAFKA_OPTS` 環境變量中使用了哪些參數名稱。

如需有關透過 TLS 存取 Apache ZooKeeper 節點的詳細資訊，請參閱 [ KIP-515: Enable ZK client to use the new TLS supported authentication](https://cwiki.apache.org/confluence/display/KAFKA/KIP-515%3A+Enable+ZK+client+to+use+the+new+TLS+supported+authentication)。

# Amazon Managed Streaming for Apache Kafka 的合規驗證
<a name="MSK-compliance"></a>

在 AWS 合規計劃中，第三方稽核人員會評估 Amazon Managed Streaming for Apache Kafka 的安全與合規情況。這些包含 PCI 和 HIPAA BAA。

如需特定合規計劃範圍內 AWS 的服務清單，請參閱[合規計劃的 Amazon Services 範圍](https://aws.amazon.com/compliance/services-in-scope/)。如需一般資訊，請參閱 [AWS Compliance Programs](https://aws.amazon.com/compliance/programs/)。

您可以使用 下載第三方稽核報告 AWS Artifact。如需詳細資訊，請參閱[下載報告 in AWS Artifact](https://docs.aws.amazon.com/artifact/latest/ug/downloading-documents.html)

您使用 Amazon MSK 時的合規責任取決於資料的機密性、您公司的合規目標，以及適用的法律和法規。 AWS 提供下列資源以協助合規：
+ [安全與合規快速入門指南](https://aws.amazon.com/quickstart/?awsf.quickstart-homepage-filter=categories%23security-identity-compliance)：這些部署指南討論架構考量，並提供在 AWS上部署以安全及合規為重心之基準環境的步驟。
+ [HIPAA 安全與合規架構白皮書](https://docs.aws.amazon.com/whitepapers/latest/architecting-hipaa-security-and-compliance-on-aws/architecting-hipaa-security-and-compliance-on-aws.html) – 此白皮書說明公司如何使用 AWS 來建立符合 HIPAA 規範的應用程式。
+ [AWS 合規資源](https://aws.amazon.com/compliance/resources/) – 此工作手冊和指南集合可能適用於您的產業和位置。
+ 《 *AWS Config 開發人員指南*》中的[使用規則評估資源](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config.html) – AWS Config 服務會評估資源組態符合內部實務、產業準則和法規的程度。
+ [AWS Security Hub CSPM](https://docs.aws.amazon.com/securityhub/latest/userguide/what-is-securityhub.html) – AWS 此服務提供 內安全狀態的完整檢視 AWS ，協助您檢查是否符合安全產業標準和最佳實務。

# Amazon Managed Streaming for Apache Kafka 的復原能力
<a name="disaster-recovery-resiliency"></a>

 AWS 全球基礎設施是以 AWS 區域和可用區域為基礎建置的。 AWS 區域提供多個實體隔離和隔離的可用區域，這些區域以低延遲、高輸送量和高度備援的網路連接。透過可用區域，您可以設計與操作的應用程式和資料庫，在可用區域之間自動容錯移轉而不會發生中斷。可用區域的可用性、容錯能力和擴展能力，均較單一或多個資料中心的傳統基礎設施還高。

如需 AWS 區域和可用區域的詳細資訊，請參閱 [AWS 全球基礎設施](https://aws.amazon.com/about-aws/global-infrastructure/)。

# Amazon Managed Streaming for Apache Kafka 的基礎設施安全性
<a name="infrastructure-security"></a>

作為受管服務，Amazon Managed Streaming for Apache Kafka 受到 [Amazon Web Services：安全程序概觀](https://d0.awsstatic.com/whitepapers/Security/AWS_Security_Whitepaper.pdf)白皮書中所述 AWS 的全球網路安全程序的保護。

您可以使用 AWS 發佈的 API 呼叫，透過網路存取 Amazon MSK。用戶端必須支援 Transport Layer Security (TLS) 1.0 或更新版本。建議使用 TLS 1.2 或更新版本。用戶端也必須支援具備完美轉送私密 (PFS) 的密碼套件，例如臨時 Diffie-Hellman (DHE) 或橢圓曲線臨時 Diffie-Hellman (ECDHE)。現代系統 (如 Java 7 和更新版本) 大多會支援這些模式。

此外，請求必須使用存取金鑰 ID 和與 IAM 主體相關聯的私密存取金鑰來簽署。或者，您可以透過 [AWS Security Token Service](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html) (AWS STS) 來產生暫時安全憑證來簽署請求。