

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

# 中的安全性 AWS IoT
<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/)中，第三方稽核員會定期測試並驗證我們的安全功效。若要了解適用的合規計劃 AWS IoT，請參閱[AWS 合規計劃範圍內的服務](https://aws.amazon.com/compliance/services-in-scope/)。
+ **雲端的安全性** – 您的責任取決於您使用 AWS 的服務。您也必須對其他因素負責，包括資料的機密性、您公司的要求和適用法律和法規。

本文件可協助您了解如何在使用 時套用共同責任模型 AWS IoT。下列主題說明如何設定 AWS IoT 以符合您的安全與合規目標。您也會了解如何使用其他 AWS 服務來協助您監控和保護 AWS IoT 資源。

**Topics**
+ [AWS IoT 安全性](iot-security.md)
+ [身分驗證](authentication.md)
+ [Authorization](iot-authorization.md)
+ [中的資料保護 AWS IoT Core](data-protection.md)
+ [的身分和存取管理 AWS IoT](security-iam.md)
+ [記錄和監控](security-logging.md)
+ [AWS IoT 核心的合規驗證](compliance.md)
+ [AWS IoT Core 中的彈性](disaster-recovery-resiliency.md)
+ [AWS IoT Core 搭配界面 VPC 端點使用](IoTCore-VPC.md)
+ [中的基礎設施安全 AWS IoT](infrastructure-security.md)
+ [使用 AWS IoT Core 對生產機群或裝置進行安全監控](security-monitoring.md)
+ [中的安全最佳實務 AWS IoT Core](security-best-practices.md)
+ [AWS 訓練和認證](#iot-security-training)

# AWS IoT 安全性
<a name="iot-security"></a>

每個連線的裝置或用戶端都必須具有憑證才能與 AWS IoT互動。所有往返 的流量 AWS IoT 都會透過 Transport Layer Security (TLS) 安全傳送。 AWS 雲端安全機制會在資料在 AWS IoT 和其他 AWS 服務之間移動時保護資料。

![\[AWS IoT 安全工作流程，包括要互動的登入資料 AWS IoT、傳輸層安全以保護連線，以及保護資料的 AWS 雲端安全機制。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/thunderball-overview.png)

+ 您需負責管理 AWS IoT中的裝置憑證 (X.509 憑證、 AWS 憑證、Amazon Cognito 身分、聯合身分或自訂身分驗證字符) 以及政策。您也必須負責為每個裝置指派唯一身分，並管理每個裝置或裝置群組的許可。
+ 您的裝置會透過安全的 TLS 連線 AWS IoT ，使用 X.509 憑證或 Amazon Cognito 身分連線至 。在研究和開發期間，以及對於進行 API 呼叫或使用 WebSocket 的某些應用程式，您也可以使用 IAM 使用者和群組或自訂身分驗證字符來進行驗證。如需詳細資訊，請參閱[IAM 使用者、群組和角色](iam-users-groups-roles.md)。
+ 使用 AWS IoT 身分驗證時，訊息代理程式會負責驗證您的裝置、安全地擷取裝置資料，以及授予或拒絕您使用 AWS IoT 政策為裝置指定的存取許可。
+ 使用自訂身分驗證時，自訂授權方會負責驗證您的裝置，並授予或拒絕您使用 AWS IoT 或 IAM 政策為裝置指定的存取許可。
+  AWS IoT 規則引擎會根據您定義的規則，將裝置資料轉送至其他裝置或其他 AWS 服務。它使用 AWS Identity and Access Management 安全地將資料傳輸到其最終目的地。如需詳細資訊，請參閱[的身分和存取管理 AWS IoT](security-iam.md)。

# 身分驗證
<a name="authentication"></a>

身分驗證是一種機制，您可以用來驗證用戶端或伺服器的身分。伺服器身分驗證是裝置或其他用戶端確保與實際 AWS IoT 端點通訊的程序。用戶端身分驗證是裝置或其他用戶端自行進行身分驗證的程序 AWS IoT。

## X.509 憑證概觀
<a name="x509-certificate-overview"></a>

X.509 憑證為數位憑證，其依據 [X.509 公有金鑰基礎設施標準](https://en.wikipedia.org/wiki/X.509)，將公有金鑰與憑證內含的身分建立關聯。X.509 憑證由稱為認證機構 (CA) 的可信任實體發行。CA 負責維護一個或多個稱為憑證授權機構憑證的特殊憑證，用以發行 X.509 憑證。僅認證機構可存取憑證授權機構憑證。X.509 憑證鏈同時用於用戶端的伺服器身分驗證，和伺服器的用戶端身分驗證。

# 伺服器驗證
<a name="server-authentication"></a>

當您的裝置或其他用戶端嘗試連線時 AWS IoT Core AWS IoT Core ，伺服器會傳送 X.509 憑證，供您的裝置用來驗證伺服器。身分驗證是透過在 TLS 層驗證 [ X.509 憑證鏈](x509-client-certs.md)進行。這與您造訪 HTTPS URL 時瀏覽器所使用的方法相同。如果您要使用自己的憑證授權單位的憑證，請參閱 [管理您的憑證授權機構憑證](manage-your-CA-certs.md)。

當您的裝置或其他用戶端建立與端點的 AWS IoT Core TLS 連線時， 會 AWS IoT Core 呈現憑證鏈，供裝置用來驗證其是否正在與 通訊 AWS IoT Core ，而非其他伺服器模擬 AWS IoT Core。顯示的鏈取決於裝置所連接端點的類型，以及在 TLS 交握期間用戶端和 AWS IoT Core 交涉[的密碼套件](transport-security.md)的組合。

## 端點類型
<a name="endpoint-types"></a>

AWS IoT Core 支援 `iot:Data-ATS`。 `iot:Data-ATS`端點提供由 [Amazon Trust Services](https://www.amazontrust.com/repository/) CA 簽署的伺服器憑證。

ATS 端點呈現的憑證由 Starfield 交叉簽署。某些 TLS 用戶端實作需要驗證信任根，並要求在用戶端的信任存放區中安裝 Starfield 憑證授權機構憑證。

**警告**  
不建議使用雜湊整個憑證 (包括發行者名稱等) 的憑證關聯方法，因為這會導致憑證驗證失敗，因為我們提供的 ATS 憑證是由 Starfield 交叉簽署，且具有不同的發行者名稱。

**重要**  
使用`iot:Data-ATS`端點。Symantec 和 Verisign 憑證已棄用，不再受 支援 AWS IoT Core。

您可以使用 `describe-endpoint` 命令建立 ATS 端點。

```
aws iot describe-endpoint --endpoint-type iot:Data-ATS
```

`describe-endpoint` 命令會傳回下列格式的端點。

```
account-specific-prefix.iot.your-region.amazonaws.com
```

**注意**  
第一次呼叫 `describe-endpoint` 時，會建立一個端點。所有後續呼叫 `describe-endpoint` 會傳回相同的端點。

**注意**  
若要在 AWS IoT Core 主控台中查看您的`iot:Data-ATS`端點，請選擇**設定**。主控台只會顯示 `iot:Data-ATS` 端點。

### `IotDataPlaneClient` 使用適用於 Java 的 AWS 開發套件建立
<a name="java-client"></a>

若要建立`IotDataPlaneClient`使用 `iot:Data-ATS`端點的 ，您必須執行下列動作。
+ 使用 [DescribeEndpoint](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeEndpoint.html) API 建立 `iot:Data-ATS` 端點。
+ 在建立 `IotDataPlaneClient` 時指定該端點。

下列範例會同時執行這些操作。

```
public void setup() throws Exception {
        IotClient client = IotClient.builder().credentialsProvider(CREDENTIALS_PROVIDER_CHAIN).region(Region.US_EAST_1).build();
        String endpoint = client.describeEndpoint(r -> r.endpointType("iot:Data-ATS")).endpointAddress();
        iot = IotDataPlaneClient.builder()
                                .credentialsProvider(CREDENTIALS_PROVIDER_CHAIN)
                                .endpointOverride(URI.create("https://" + endpoint))
                                .region(Region.US_EAST_1)
                                .build();
}
```

## 伺服器身分驗證的憑證授權機構憑證
<a name="server-authentication-certs"></a>

根據您正在使用的資料端點類型，以及您已交涉的密碼套件， AWS IoT Core 伺服器身分驗證憑證會由下列其中一個根 CA 憑證簽署：

**Amazon Trust Services 端點 (首選)**

**注意**  
您可能需要在這些連結上按一下滑鼠右鍵，然後選取 **Save link as...** (另存連結為...) 以將這些憑證儲存為檔案。
+ RSA 2048 位元金鑰：[https://www.amazontrust.com/repository/AmazonRootCA1.pem](https://www.amazontrust.com/repository/AmazonRootCA1.pem)。
+ RSA 4096 位元金鑰：Amazon Root CA 2。保留以供日後使用。
+ ECC 256 位元金鑰：[https://www.amazontrust.com/repository/AmazonRootCA3.pem](https://www.amazontrust.com/repository/AmazonRootCA3.pem)。
+ ECC 384 位元金鑰：Amazon Root CA 4。保留以供日後使用。

這些憑證都是由 [Starfield 根憑證授權機構憑證](https://www.amazontrust.com/repository/SFSRootCAG2.pem)交叉簽署的。所有新的 AWS IoT Core 區域，從 2018 年 5 月 9 日 AWS IoT Core 在亞太區域 （孟買） 區域推出 開始，僅提供 ATS 憑證。

**VeriSign 端點 (舊版)**
+ RSA 2048 位元金鑰：[VeriSign 類別 3 公開主要 G5 根憑證授權機構憑證](https://www.digicert.com/kb/digicert-root-certificates.htm)

## 伺服器身分驗證準則
<a name="server-authentication-guidelines"></a>

有許多變數會影響裝置驗證 AWS IoT Core 伺服器驗證憑證的能力。例如，裝置的記憶體可能受限，無法保存所有可能的根憑證授權機構憑證，或者裝置可能實作非標準的憑證驗證方法。基於這些原因，我們建議您遵循以下準則：
+ 我們建議您使用 ATS 端點並安裝所有支援的 Amazon Root CA 憑證。
+ 如果您無法在裝置上存放全部這些憑證，而且您的裝置未使用 ECC 式驗證，則可以略過 [https://www.amazontrust.com/repository/AmazonRootCA3.pem](https://www.amazontrust.com/repository/AmazonRootCA3.pem) 和 [https://www.amazontrust.com/repository/AmazonRootCA4.pem](https://www.amazontrust.com/repository/AmazonRootCA4.pem) 4 ECC 憑證。如果您的裝置未實作 RSA 式憑證驗證，則可以略過 [https://www.amazontrust.com/repository/AmazonRootCA1.pem](https://www.amazontrust.com/repository/AmazonRootCA1.pem) 和 [https://www.amazontrust.com/repository/AmazonRootCA2.pem](https://www.amazontrust.com/repository/AmazonRootCA2.pem) RSA 憑證。您可能需要在這些連結上按一下滑鼠右鍵，然後選取 **Save link as...** (另存連結為...) 以將這些憑證儲存為檔案。
+ 如果您在連線至 ATS 端點時遇到伺服器憑證驗證問題，請嘗試將相關的交叉簽署 Amazon Root 憑證授權機構憑證新增至信任存放區。您可能需要在這些連結上按一下滑鼠右鍵，然後選取 **Save link as...** (另存連結為...) 以將這些憑證儲存為檔案。
  + [交叉簽署 Amazon Root CA 1](https://www.amazontrust.com/repository/G2-RootCA1.pem)
  + [交叉簽署的 Amazon Root CA 2](https://www.amazontrust.com/repository/G2-RootCA2.pem) - 預留以供日後使用。
  + [交叉簽署 Amazon Root CA 3](https://www.amazontrust.com/repository/G2-RootCA3.pem)
  + [交叉簽署的 Amazon Root CA 4 - 預留以供日後使用。](https://www.amazontrust.com/repository/G2-RootCA4.pem)
+ 如果您遇到伺服器憑證驗證問題，則您的裝置可能需要明確地信任根 CA。嘗試將 [https://www.amazontrust.com/repository/SFSRootCAG2.pem](https://www.amazontrust.com/repository/SFSRootCAG2.pem) 新增到您的信任存放區。
+ 如果您在執行上述步驟後仍然遇到問題，請聯絡 [AWS 開發人員支援](https://aws.amazon.com/premiumsupport/plans/developers/)。

**注意**  
憑證授權機構憑證在過期日期之後，即無法用於驗證伺服器的憑證。憑證授權機構憑證過期日期之前，可能需要進行替代。請確認您能夠於所有裝置或用戶端更新根憑證授權機構憑證，以維持連線能力並取得最新的安全最佳實務。

**注意**  
在裝置程式碼 AWS IoT Core 中連線至 時，請將憑證傳遞至您用來連線的 API。您使用的 API 會因 SDK 而異。如需詳細資訊，請參閱 [AWS IoT Core 裝置開發套件](iot-sdks.md)。

# 用戶端身分驗證
<a name="client-authentication"></a>

AWS IoT 支援三種類型的身分主體進行裝置或用戶端身分驗證：
+ [X.509 用戶端憑證](x509-client-certs.md)
+ [IAM 使用者、群組和角色](iam-users-groups-roles.md)
+ [Amazon Cognito 身分](cognito-identities.md)

這些身分可用於裝置、行動裝置、網頁或桌面應用程式。使用者輸入 AWS IoT 命令列界面 (CLI) 命令甚至可以使用它們。一般而言， AWS IoT 裝置使用 X.509 憑證，而行動應用程式則使用 Amazon Cognito 身分。Web 和桌面應用程式則使用 IAM 或聯合身分。 AWS CLI 命令會使用 IAM。如需 IAM 身分的詳細資訊，請參閱[的身分和存取管理 AWS IoT](security-iam.md)。

# X.509 用戶端憑證
<a name="x509-client-certs"></a>

X.509 憑證 AWS IoT 提供驗證用戶端和裝置連線的能力。用戶端憑證必須先向 註冊 AWS IoT ，用戶端才能與 通訊 AWS IoT。您可以在相同 中的多個 AWS 帳戶中註冊用戶端憑證 AWS 區域 ，以便在同一區域中的 AWS 帳戶之間移動裝置。如需詳細資訊，請參閱 [在具有多帳戶註冊的多個 AWS 帳戶中使用 X.509 用戶端憑證](#multiple-account-cert)。

我們建議為每個裝置或用戶端提供唯一的憑證，藉此更精細地管理用戶端，包括憑證撤銷作業。裝置必須支援憑證的輪換和替代，以確保憑證過期時操作順暢。

如需使用 X.509 憑證支援數個裝置的詳細資訊，請參閱 [裝置佈建](iot-provision.md)，以檢閱 AWS IoT 支援的不同憑證管理和佈建選項。

**AWS IoT 支援這些類型的 X.509 用戶端憑證：**
+  產生的 X.509 憑證 AWS IoT
+  由向 註冊的 CA 簽署的 X.509 憑證 AWS IoT。
+  未註冊 AWS IoT且有 CA 簽署的 X.509 憑證。

本節說明如何在 AWS IoT中管理 X.509 憑證。您可以使用 AWS IoT 主控台或 AWS CLI 來執行這些憑證操作：
+ [建立 AWS IoT 用戶端憑證](device-certs-create.md)
+ [建立您自己的用戶端憑證](device-certs-your-own.md)
+ [註冊用戶端憑證](register-device-cert.md)
+ [啟用或停用用戶端憑證](activate-or-deactivate-device-cert.md)
+ [撤銷用戶端憑證](revoke-ca-cert.md)

如需執行這些操作之 AWS CLI 命令的詳細資訊，請參閱 [AWS IoT CLI 參考](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/index.html)。

## 使用 X.509 用戶端憑證
<a name="x509-client-cert-basics"></a>

X.509 憑證會驗證用戶端和裝置的連線 AWS IoT。相較於其他識別和身分驗證機制，X.509 憑證具備多種好處。X.509 憑證可讓裝置使用非對稱金鑰。例如，您可以將私密金鑰燒錄到裝置上的安全儲存空間，這樣敏感的密碼編譯資料永遠不會離開裝置。由於私有金鑰絕對不會離開裝置，因此 X.509 憑證提供更勝於其他機制 (例如使用者名稱和密碼或承載符記) 的強大用戶端身分驗證。

AWS IoT 會使用 TLS 通訊協定的用戶端身分驗證模式來驗證用戶端憑證。TLS 支援多種程式設計語言與作業系統，且普遍用於加密資料。在 TLS 用戶端身分驗證中， AWS IoT 會請求 X.509 用戶端憑證，並根據憑證 AWS 帳戶 登錄檔驗證憑證的狀態。然後，它會向用戶端挑戰與憑證中包含的公有金鑰對應的私有金鑰的擁有權證明。 AWS IoT 要求用戶端將[伺服器名稱指示 (SNI) 延伸](https://tools.ietf.org/html/rfc3546#section-3.1)模組傳送至 Transport Layer Security (TLS) 通訊協定。如需設定 SNI 延伸模組的詳細資訊，請參閱 [中的傳輸安全性 AWS IoT Core](transport-security.md)。

為了促進安全且一致的用戶端連線至 AWS IoT 核心，X.509 用戶端憑證必須擁有下列項目：
+ 在 AWS IoT Core 中註冊。如需詳細資訊，請參閱[註冊用戶端憑證](register-device-cert.md)。
+ 狀態為 `ACTIVE`。如需詳細資訊，請參閱[啟用或停用用戶端憑證](activate-or-deactivate-device-cert.md)。
+ 尚未到達憑證過期日期。

您可以建立使用 Amazon 根 CA 的用戶端憑證，也可以使用由其他憑證授權單位 (CA) 簽署的自有用戶端憑證。如需使用 AWS IoT 主控台建立使用 Amazon 根 CA 的憑證的詳細資訊，請參閱 [建立 AWS IoT 用戶端憑證](device-certs-create.md)。如需使用您自己的 X.509 憑證的詳細資訊，請參閱 [建立您自己的用戶端憑證](device-certs-your-own.md)。

對於有憑證授權機構憑證簽署的憑證，其過期日期與時間會於憑證建立時設定。產生的 X.509 憑證會在 2049 年 12 月 31 日 UTC 午夜 (2049-12-31T23：59：59Z AWS IoT 過期）。

AWS IoT Device Defender 可以對支援常見 IoT 安全最佳實務的 AWS 帳戶 和裝置執行稽核。這包括管理您的 CA 或 Amazon 根 CA 簽署的 X.509 憑證過期日期。如需管理憑證過期日期的詳細資訊，請參閱[裝置憑證過期](https://docs.aws.amazon.com/iot-device-defender/latest/devguide/audit-chk-device-cert-approaching-expiration.html)和 [CA 憑證過期](https://docs.aws.amazon.com/iot-device-defender/latest/devguide/audit-chk-ca-cert-approaching-expiration.html)。

在官方 AWS IoT 部落格上，如需深入了解裝置憑證輪換的管理，以及安全最佳實務，請參閱[如何使用 管理 IoT 裝置憑證輪換 AWS IoT](https://aws.amazon.com/blogs/iot/how-to-manage-iot-device-certificate-rotation-using-aws-iot/)。

## 在具有多帳戶註冊的多個 AWS 帳戶中使用 X.509 用戶端憑證
<a name="multiple-account-cert"></a>

多帳戶註冊可讓您在相同區域或不同區域的 AWS 帳戶之間移動裝置。您可以在生產前帳戶中註冊、測試和設定裝置，然後在生產帳戶中註冊並使用相同的裝置和裝置憑證。您也可以在裝置上註冊用戶端憑證，或在沒有註冊 CA 的情況下註冊裝置憑證 AWS IoT。如需詳細資訊，請參閱[註冊未註冊 CA 所簽署的用戶端憑證 (CLI)](manual-cert-registration.md#manual-cert-registration-noca-cli)。

**注意**  
`iot:Data-ATS`、`iot:Data` (舊式)、`iot:Jobs` 及 `iot:CredentialProvider` 端點類型上支援用於多帳戶註冊的憑證。如需 AWS IoT 裝置端點的詳細資訊，請參閱 [AWS IoT 裝置資料和服務端點](iot-connect-devices.md#iot-connect-device-endpoints)。

使用多帳戶註冊的裝置必須將[伺服器名稱指示 (SNI) 延伸](https://tools.ietf.org/html/rfc3546#section-3.1)項目傳送至 Transport Layer Security (TLS) 通訊協定，並在連線至 時提供 `host_name` 欄位中的完整端點地址 AWS IoT。 AWS IoT 會使用 中的端點地址，將連線`host_name`路由至正確的 AWS IoT 帳戶。未在 `host_name` 中傳送有效端點位址的現有裝置將繼續運作，但無法使用需要此資訊的功能。如需 SNI 延伸模組的詳細資訊，以及如何識別 `host_name` 欄位的端點位址，請參閱 [中的傳輸安全性 AWS IoT Core](transport-security.md)。

**使用多帳戶註冊**

1. 您可以在有 CA 的情況下註冊裝置憑證。您可以在 `SNI_ONLY` 模式下在多個帳戶中註冊簽署 CA，並使用該 CA 將相同的用戶端憑證註冊到多個帳戶。如需詳細資訊，請參閱[在 SNI\$1ONLY 模式下註冊 CA 憑證 (CLI) - 建議](manage-your-CA-certs.md#register-CA-cert-SNI-cli)。

1. 您可以在沒有 CA 的情況下註冊裝置憑證。請參閱 [註冊未註冊 CA 所簽署的用戶端憑證 (CLI)](manual-cert-registration.md#manual-cert-registration-noca-cli)。註冊 CA 非必須。您不需要註冊簽署裝置憑證的 CA AWS IoT。

## 支援的憑證簽署演算法 AWS IoT
<a name="x509-cert-algorithms"></a>

AWS IoT 支援下列憑證簽署演算法：
+ SHA256WITHRSA
+ SHA384WITHRSA
+ SHA512WITHRSA
+ SHA256WITHRSAANDMGF1 (RSASSA-PSS)
+ SHA384WITHRSAANDMGF1 (RSASSA-PSS)
+ SHA512WITHRSAANDMGF1 (RSASSA-PSS)
+ DSA\$1WITH\$1SHA256
+ ECDSA-WITH-SHA256
+ ECDSA-WITH-SHA384
+ ECDSA-WITH-SHA512

如需憑證身分驗證和安全性的詳細資訊，請參閱[裝置憑證金鑰品質](https://docs.aws.amazon.com/iot-device-defender/latest/devguide/audit-chk-device-cert-key-quality.html)。

**注意**  
憑證簽署請求 (CSR) 必須包含公開金鑰。該金鑰可以是公開金鑰 (長度至少 2,048 位元) 或 ECC 金鑰 (至少 NIST P-256、NIST P-384 或 NIST P-521 曲線)。如需詳細資訊，請參閱《*AWS IoT API 參考指南*》中的 [CreateCertificateFromCsr](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateCertificateFromCsr.html)。

## 支援的金鑰演算法 AWS IoT
<a name="x509-cert-key-algorithms"></a>

下表顯示如何支援金鑰演算法：


****  

| 金鑰演算法 | 憑證簽署演算法 | TLS 版本控制 | 支援？ 是或否 | 
| --- | --- | --- | --- | 
| 金鑰大小至少為 2048 位元的 RSA | 全部 | TLS 1.2 TLS 1.3 | 是 | 
| ECC NIST P-256/P-384/P-521 | 全部 | TLS 1.2 TLS 1.3 | 是 | 
| 金鑰大小至少為 2048 位元的 RSA-PSS | 全部 | TLS 1.2 | 否 | 
| 金鑰大小至少為 2048 位元的 RSA-PSS | 全部 | TLS 1.3 | 是 | 

若要使用 [CreateCertificateFromCSR](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateCertificateFromCsr.html) 建立憑證，您可以使用支援的金鑰演算法來產生 CSR 的公有金鑰。若要使用 [RegisterCertificate](https://docs.aws.amazon.com//iot/latest/apireference/API_RegisterCertificate.html) 或 [RegisterCertificateWithoutCA](https://docs.aws.amazon.com//iot/latest/apireference/API_RegisterCertificateWithoutCA.html) 註冊您自己的憑證，您可以使用支援的金鑰演算法來產生憑證的公有金鑰。

如需詳細資訊，請參閱 [安全政策](https://docs.aws.amazon.com//iot/latest/developerguide/transport-security.html#tls-policy-table)。

# 建立 AWS IoT 用戶端憑證
<a name="device-certs-create"></a>

AWS IoT 提供由 Amazon 根憑證授權機構 (CA) 簽署的用戶端憑證。

本主題說明如何建立由 Amazon 根憑證授權機構簽署的用戶端憑證，以及憑證檔案的下載方式。建立用戶端憑證檔案之後，您必須將它們安裝在用戶端上。

**注意**  
提供的每個 X.509 用戶端憑證都會 AWS IoT 保留您在憑證建立時設定的發行者和主體屬性。只在建立憑證之後，憑證屬性才是不可變的。

您可以使用 AWS IoT 主控台或 AWS CLI 來建立由 Amazon 根 AWS IoT 憑證授權單位簽署的憑證。

## 建立 AWS IoT 憑證 （主控台）
<a name="device-certs-create-console"></a>

**使用 AWS IoT 主控台建立 AWS IoT 憑證**

1. 登入 AWS 管理主控台 並開啟 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在導覽窗格中，依序選擇**安全**、**憑證**，然後選擇**建立**。

1. 選擇 **One-click certificate creation (一鍵建立憑證)** - **Create certificate (建立憑證)**。

1. 從**已建立的憑證**頁面上，將該物件的用戶端憑證檔案、公開金鑰和私密金鑰下載到安全的位置。產生的這些憑證只能與 AWS IoT AWS IoT 服務搭配使用。

   如果您還需要 Amazon 根 CA 憑證檔案，此頁面上也有可下載該憑證的頁面連結。

1. 現在已建立用戶端憑證，並已註冊 AWS IoT。您必須先啟動憑證，才能在用戶端中使用憑證。

    若要立即啟用用戶端憑證，請選擇**啟用**。如果您不想立即啟用憑證，請參閱 [啟動用戶端憑證 (主控台)](activate-or-deactivate-device-cert.md#activate-device-cert-console) 以了解如何稍後再啟用憑證。

   

1. 如果您要將政策連接至憑證，請選擇 **Attach a policy** (連接政策)。

   如果您不想立即連接政策，請選擇 **Done** (完成) 來完成。您可以稍後附加政策。

完成程序之後，請在用戶端上安裝憑證檔案。

## 建立 AWS IoT 憑證 (CLI)
<a name="device-certs-create-cli"></a>

 AWS CLI 提供 **[create-keys-and-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/create-keys-and-certificate.html)**命令來建立由 Amazon 根憑證授權單位簽署的用戶端憑證。但是，此命令不會下載 Amazon 根憑證授權機構憑證檔案。您可以從 [伺服器身分驗證的憑證授權機構憑證](server-authentication.md#server-authentication-certs) 下載 Amazon 根 CA 憑證檔案。

此命令會建立私有金鑰、公有金鑰和 X.509 憑證檔案，並使用 註冊和啟用憑證。 AWS IoT

```
aws iot create-keys-and-certificate \
    --set-as-active \
    --certificate-pem-outfile certificate_filename.pem \
    --public-key-outfile public_filename.key \
    --private-key-outfile private_filename.key
```

如果您不想在建立並註冊憑證時啟動憑證，此命令會建立私有金鑰、公有金鑰和 X.509 憑證檔案並註冊憑證，但不會啟動憑證。[啟動用戶端憑證 (CLI)](activate-or-deactivate-device-cert.md#activate-device-cert-cli) 描述稍後如何啟用憑證。

```
aws iot create-keys-and-certificate \
    --no-set-as-active \
    --certificate-pem-outfile certificate_filename.pem \
    --public-key-outfile public_filename.key \
    --private-key-outfile private_filename.key
```



在用戶端上安裝憑證檔案。

# 建立您自己的用戶端憑證
<a name="device-certs-your-own"></a>

AWS IoT 支援由任何根憑證或中繼憑證授權機構 (CA) 簽署的用戶端憑證。 AWS IoT 會使用 CA 憑證來驗證憑證的擁有權。若要使用由非 Amazon CA 的 CA 簽署的裝置憑證，CA 的憑證必須向 註冊， AWS IoT 以便我們驗證裝置憑證的擁有權。

AWS IoT 支援多種自帶憑證 (BYOC) 的方式：
+ 首先，註冊用於簽署用戶端憑證的 CA，然後註冊個別的用戶端憑證。如果您想要在裝置或用戶端首次連線至其用戶端憑證 AWS IoT （也稱為[Just-in-Time佈建](https://docs.aws.amazon.com//iot/latest/developerguide/jit-provisioning.html)) 時註冊裝置或用戶端，您必須向 AWS IoT 註冊簽署 CA，並啟用自動註冊。
+ 如果您無法註冊簽署 CA，則可以選擇不使用 CA 註冊用戶端憑證。對於不使用 CA 註冊的裝置，在將它們連接到 AWS IoT時需要出示[伺服器名稱指示 (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)。

**注意**  
若要使用 CA 註冊用戶端憑證，您必須向 註冊簽署 CA AWS IoT，而不是階層中的任何其他 CAs。

**注意**  
一個 CA 憑證只能由一個區域中的一個帳戶在 `DEFAULT` 模式下註冊。一個 CA 憑證可以由一個區域中的多個帳戶在 `SNI_ONLY` 模式下註冊。

如需有關使用 X.509 憑證支援數個以上裝置的詳細資訊，請參閱 [裝置佈建](iot-provision.md)，以檢閱 AWS IoT 支援的不同憑證管理和佈建選項。

**Topics**
+ [管理您的憑證授權機構憑證](manage-your-CA-certs.md)
+ [使用您的憑證授權機構憑證建立用戶端憑證](create-device-cert.md)

# 管理您的憑證授權機構憑證
<a name="manage-your-CA-certs"></a>

本節說明管理您自己的憑證授權機構 (CA) 憑證的一般工作。

 AWS IoT 如果您使用的用戶端憑證是由 AWS IoT 無法辨識的 CA 簽署，則可以向 註冊憑證授權機構 (CA)。

如果您希望用戶端在第一次連線 AWS IoT 時自動向 註冊其用戶端憑證，則必須向簽署用戶端憑證的 CA 註冊 AWS IoT。否則，您不需要註冊已簽署用戶端憑證的憑證授權機構憑證。

**注意**  
一個 CA 憑證只能由一個區域中的一個帳戶在 `DEFAULT` 模式下註冊。一個 CA 憑證可以由一個區域中的多個帳戶在 `SNI_ONLY` 模式下註冊。

**Topics**
+ [建立憑證授權機構憑證](#create-your-CA-cert)
+ [註冊您的憑證授權機構憑證](#register-CA-cert)
+ [停用憑證授權機構憑證](#deactivate-ca-cert)

## 建立憑證授權機構憑證
<a name="create-your-CA-cert"></a>

如果沒有 憑證授權機構憑證，您可以使用 [OpenSSL v1.1.1i](https://www.openssl.org/) 工具來建立憑證授權機構憑證。

**注意**  
您無法在 AWS IoT 主控台中執行此程序。

**使用 [OpenSSL v1.1.1i](https://www.openssl.org/) 工具來建立憑證授權機構憑證**

1. 產生金鑰對。

   ```
   openssl genrsa -out root_CA_key_filename.key 2048
   ```

1. 透過該金鑰對的私有金鑰來產生憑證授權機構憑證。

   ```
   openssl req -x509 -new -nodes \
       -key root_CA_key_filename.key \
       -sha256 -days 1024 \
       -out root_CA_cert_filename.pem
   ```

## 註冊您的憑證授權機構憑證
<a name="register-CA-cert"></a>

這些程序說明如何從不是 Amazon CA 的憑證授權單位 (CA) 註冊憑證。 AWS IoT Core 會使用 CA 憑證來驗證憑證的擁有權。若要使用由非 Amazon CA 的 CA 簽署的裝置憑證，您必須向 註冊 CA 憑證， AWS IoT Core 以便驗證裝置憑證的擁有權。

### 註冊憑證授權機構憑證 (主控台)。
<a name="register-CA-cert-console"></a>

**注意**  
若要在主控台中註冊憑證授權機構憑證，請在主控台中的[註冊憑證授權機構憑證](https://console.aws.amazon.com//iot/home#/create/cacertificate)開始。您可在多帳戶模式下註冊您的 CA，而無需提供驗證憑證或私有金鑰的存取權。一個 CA 可由相同 AWS 區域中的多個 AWS 帳戶 以多帳戶模式進行註冊。您可透過提供驗證憑證和 CA 私有金鑰的擁有權證明，以單一帳戶模式註冊您的 CA。

### 註冊憑證授權機構憑證 (CLI)
<a name="register-CA-cert-cli"></a>

您可以在 `DEFAULT` 模式或 `SNI_ONLY` 模式下註冊 CA 憑證。CA 可以在 `DEFAULT` 中以 模式註冊 AWS 帳戶 AWS 區域。CA 可以由相同 AWS 帳戶 中的多個 以 `SNI_ONLY` 模式註冊 AWS 區域。如需 CA 憑證模式的詳細資訊，請參閱 [certificateMode](https://docs.aws.amazon.com//iot/latest/apireference/API_CACertificateDescription.html#iot-Type-CACertificateDescription-certificateMode)。

**注意**  
我們建議您在 `SNI_ONLY` 模式下註冊 CA。您不需要提供驗證憑證或存取私有金鑰，而且您可以在相同 AWS 帳戶 中透過多個 註冊 CA AWS 區域。

#### 在 SNI\$1ONLY 模式下註冊 CA 憑證 (CLI) - 建議
<a name="register-CA-cert-SNI-cli"></a>

**先決條件**

繼續操作之前，請確定您的電腦上具有下列資訊：
+ 根 CA 憑證檔案 (於下列範例中引用為 `root_CA_cert_filename.pem`)
+ [OpenSSL v1.1.1i](https://www.openssl.org/) 或更新版本

**使用 在 `SNI_ONLY` 模式下註冊 CA 憑證 AWS CLI**

1. 向 註冊 CA 憑證 AWS IoT。使用 **register-ca-certificate** 命令，輸入 CA 憑證檔案名稱。如需詳細資訊，請參閱 *AWS CLI 命令參考*中的 [register-ca-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-ca-certificate.html)。

   ```
   aws iot register-ca-certificate \
       --ca-certificate file://root_CA_cert_filename.pem \
       --certificate-mode SNI_ONLY
   ```

   若成功，此命令會傳回 *certificateId*。

1. 此時，CA 憑證已向 註冊， AWS IoT 但處於非作用中狀態。CA 憑證必須處於作用中狀態，您才能註冊已簽署的任何用戶端憑證。

   這個步驟會啟動 CA 憑證。

   若要啟用該 CA 憑證，請按如下所示使用 **update-certificate** 命令。如需詳細資訊，請參閱 *AWS CLI 命令參考*中的 [update-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html)。

   ```
   aws iot update-ca-certificate \
       --certificate-id certificateId \
       --new-status ACTIVE
   ```

若要查看 CA 憑證的狀態，請使用 **describe-ca-certificate** 命令。如需詳細資訊，請參閱 *AWS CLI 命令參考*中的 [describe-ca-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html)。

#### 在 `DEFAULT` 模式下註冊 CA 憑證 (CLI)
<a name="register-CA-cert-default-cli"></a>

**先決條件**

繼續操作之前，請確定您的電腦上具有下列資訊：
+ 根 CA 憑證檔案 (於下列範例中引用為 `root_CA_cert_filename.pem`)
+ 根 CA 憑證私有金鑰檔案 (於下列範例中引用為 `root_CA_key_filename.key`)
+ [OpenSSL v1.1.1i](https://www.openssl.org/) 或更新版本

**使用 在 `DEFAULT` 模式下註冊 CA 憑證 AWS CLI**

1. 若要從 取得註冊碼 AWS IoT，請使用 **get-registration-code**。將傳回的 `registrationCode` 儲存為私有金鑰驗證憑證的 `Common Name`。如需詳細資訊，請參閱 *AWS CLI 命令參考*中的 [get-registration-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/get-registration-code.html)。

   ```
   aws iot get-registration-code
   ```

1. 產生私有金鑰驗證憑證的金鑰對：

   ```
   openssl genrsa -out verification_cert_key_filename.key 2048
   ```

1. 建立私密金鑰驗證憑證的憑證簽署要求 (CSR)。將憑證的 `Common Name` 欄位設定為 **get-registration-code** 傳回的 `registrationCode`。

   ```
   openssl req -new \
       -key verification_cert_key_filename.key \
       -out verification_cert_csr_filename.csr
   ```

   將顯示提示要求您輸入一些此憑證的資訊，包括 `Common Name`。

   ```
   You are about to be asked to enter information that will be incorporated
   into your certificate request.
   What you are about to enter is what is called a Distinguished Name or a DN.
   There are quite a few fields but you can leave some blank
   For some fields there will be a default value,
   If you enter '.', the field will be left blank.
   -----
   Country Name (2 letter code) [AU]:
       State or Province Name (full name) []:
       Locality Name (for example, city) []:
       Organization Name (for example, company) []:
       Organizational Unit Name (for example, section) []:
       Common Name (e.g. server FQDN or YOUR name) []:your_registration_code
       Email Address []:
   
       Please enter the following 'extra' attributes
       to be sent with your certificate request
       A challenge password []:
       An optional company name []:
   ```

1. 使用 CSR 建立私有金鑰驗證憑證：

   ```
   openssl x509 -req \
       -in verification_cert_csr_filename.csr \
       -CA root_CA_cert_filename.pem \
       -CAkey root_CA_key_filename.key \
       -CAcreateserial \
       -out verification_cert_filename.pem \
       -days 500 -sha256
   ```

1. 向 註冊 CA 憑證 AWS IoT。將 CA 憑證檔案名稱和私有金鑰驗證憑證檔案名稱傳遞給 **register-ca-certificate** 命令，如下所示。如需詳細資訊，請參閱 *AWS CLI 命令參考*中的 [register-ca-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-ca-certificate.html)。

   ```
   aws iot register-ca-certificate \
       --ca-certificate file://root_CA_cert_filename.pem \
       --verification-cert file://verification_cert_filename.pem
   ```

   如果成功，此命令會傳回 *certificateId*。

1. 此時，CA 憑證已向 註冊， AWS IoT 但未處於作用中狀態。CA 憑證必須處於作用中狀態，您才能註冊已簽署的任何用戶端憑證。

   這個步驟會啟動 CA 憑證。

   若要啟用該 CA 憑證，請按如下所示使用 **update-certificate** 命令。如需詳細資訊，請參閱 *AWS CLI 命令參考*中的 [update-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html)。

   ```
   aws iot update-ca-certificate \
       --certificate-id certificateId \
       --new-status ACTIVE
   ```

若要查看 CA 憑證的狀態，請使用 **describe-ca-certificate** 命令。如需詳細資訊，請參閱 *AWS CLI 命令參考*中的 [describe-ca-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html)。

### 建立憑證授權機構驗證憑證以在主控台中註冊憑證授權機構憑證
<a name="create-CA-verification-cert"></a>

**注意**  
此程序僅適用於從 AWS IoT 主控台註冊 CA 憑證的情況。  
如果您不是從 AWS IoT 主控台前往此程序，請在註冊 CA 憑證的主控台中啟動 [CA 憑證註冊](https://console.aws.amazon.com//iot/home#/create/cacertificate)程序。

繼續操作之前，請確定您在同一台電腦上具有下列可用項目：
+ 根 CA 憑證檔案 (於下列範例中引用為 `root_CA_cert_filename.pem`)
+ 根 CA 憑證私有金鑰檔案 (於下列範例中引用為 `root_CA_key_filename.key`)
+ [OpenSSL v1.1.1i](https://www.openssl.org/) 或更新版本

**如要使用命令列介面來建立 CA 驗證憑證，以於主控台中註冊您的 CA 憑證**

1. 將 `verification_cert_key_filename.key` 替換為您要建立的驗證憑證金鑰檔案名稱 (例如 **verification\$1cert.key**)。然後執行此命令以產生私有金鑰驗證憑證的金鑰對：

   ```
   openssl genrsa -out verification_cert_key_filename.key 2048
   ```

1. 將 `verification_cert_key_filename.key` 替換為您在步驟 1 建立的金鑰檔案名稱。

   `verification_cert_csr_filename.csr` 替換為您要建立的憑證簽署請求 (CSR) 檔案名稱。例如 **verification\$1cert.csr**。

   執行此命令以建立 CSR 檔案。

   ```
   openssl req -new \
       -key verification_cert_key_filename.key \
       -out verification_cert_csr_filename.csr
   ```

   命令會提示您輸入其他資訊 (稍後會說明)。

1. 在 AWS IoT 主控台的**驗證憑證**容器中，複製註冊碼。

1. **openssl** 命令提示您輸入的資訊如下列範例所示。除了 `Common Name` 欄位，您可輸入自己的值或將其留空。

   於 `Common Name` 欄位中，請貼上您在上一個步驟中複製的註冊碼。

   ```
   You are about to be asked to enter information that will be incorporated
   into your certificate request.
   What you are about to enter is what is called a Distinguished Name or a DN.
   There are quite a few fields but you can leave some blank
   For some fields there will be a default value,
   If you enter '.', the field will be left blank.
   -----
   Country Name (2 letter code) [AU]:
       State or Province Name (full name) []:
       Locality Name (for example, city) []:
       Organization Name (for example, company) []:
       Organizational Unit Name (for example, section) []:
       Common Name (e.g. server FQDN or YOUR name) []:your_registration_code
       Email Address []:
   
       Please enter the following 'extra' attributes
       to be sent with your certificate request
       A challenge password []:
       An optional company name []:
   ```

   完成後，命令將建立 CSR 檔案。

1. `verification_cert_csr_filename.csr` 替換為您在上一個步驟中使用的 `verification_cert_csr_filename.csr`。

   將 `root_CA_cert_filename.pem` 替換為您要註冊的 CA 憑證檔案名稱。

   將 `root_CA_key_filename.key` 替換為 CA 憑證私有金鑰檔案的檔案名稱。

   將 `verification_cert_filename.pem` 替換為您要建立的驗證憑證檔案名稱。例如 **verification\$1cert.pem**。

   ```
   openssl x509 -req \
       -in verification_cert_csr_filename.csr \
       -CA root_CA_cert_filename.pem \
       -CAkey root_CA_key_filename.key \
       -CAcreateserial \
       -out verification_cert_filename.pem \
       -days 500 -sha256
   ```

1. OpenSSL 命令完成後，您應準備好這些檔案，以供返回主控台時使用。
   + 您的憑證授權機構憑證檔案 (在上一個命令中使用的 `root_CA_cert_filename.pem`)
   + 您在上一個步驟中建立的驗證憑證 (用於上一個命令中的 *verification\$1cert\$1filename.pem*)

## 停用憑證授權機構憑證
<a name="deactivate-ca-cert"></a>

當憑證授權機構 (CA) 憑證啟用自動用戶端憑證註冊時， 會 AWS IoT 檢查 CA 憑證，以確保 CA 為 `ACTIVE`。如果 CA 憑證為 `INACTIVE`， AWS IoT 則不允許註冊用戶端憑證。

藉由將 CA 憑證設定為 `INACTIVE`，您可防止自動註冊 CA 所核發的任何新用戶端憑證。

**注意**  
由有風險之憑證授權機構憑證簽署的任何已註冊裝置憑證將持續運作，直到您確實逐一撤銷這些憑證為止。

### 停用憑證授權機構憑證 (主控台)
<a name="deactivate-ca-cert-console"></a>

**使用 AWS IoT 主控台停用 CA 憑證**

1. 登入 AWS 管理主控台 並開啟 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 請在左側導覽窗格中，選擇 **Secure** (安全)、**CAs** (CA)。

1. 於憑證授權單位清單中，找出您要停用的憑證授權單位，接著選擇省略號圖示開啟選項選單。

1. 在選項選單上，選擇 **Deactivate (停用)**。

憑證授權機構應在清單中顯示為 **Inactive (非作用中)**。

**注意**  
 AWS IoT 主控台不提供列出您停用之 CA 簽署的憑證的方法。如需列出這些憑證的 AWS CLI 選項，請參閱 [停用憑證授權機構憑證 (CLI)](#deactivate-ca-cert-cli)。

### 停用憑證授權機構憑證 (CLI)
<a name="deactivate-ca-cert-cli"></a>

 AWS CLI 提供 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-ca-certificate.html)命令來停用 CA 憑證。

```
aws iot update-ca-certificate \
    --certificate-id certificateId \
    --new-status INACTIVE
```

使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-certificates-by-ca.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-certificates-by-ca.html) 命令，取得由指定 CA 簽署的所有已註冊裝置憑證清單。針對由指定憑證授權機構憑證所簽署的每一裝置憑證，請使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html) 命令來撤銷該裝置憑證，以避免受到使用。

使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html) 命令來查看 CA 憑證的狀態。

# 使用您的憑證授權機構憑證建立用戶端憑證
<a name="create-device-cert"></a>

您可以使用自己的憑證授權機構 (CA) 來建立用戶端憑證。用戶端憑證必須先向 註冊 AWS IoT ，才能使用。如需用戶端憑證之註冊選項的詳細資訊，請參閱 [註冊用戶端憑證](register-device-cert.md)。

## 建立用戶端憑證 (CLI)
<a name="create-device-cert-cli"></a>

**注意**  
您無法在 AWS IoT 主控台中執行此程序。

**使用 建立用戶端憑證 AWS CLI**

1. 產生金鑰對。

   ```
   openssl genrsa -out device_cert_key_filename.key 2048
   ```

1. 建立用戶端憑證的 CSR。

   ```
   openssl req -new \
       -key device_cert_key_filename.key \
       -out device_cert_csr_filename.csr
   ```

   將出現提示，要求您輸入一些資訊，如下所示：

   ```
   You are about to be asked to enter information that will be incorporated
   into your certificate request.
   What you are about to enter is what is called a Distinguished Name or a DN.
   There are quite a few fields but you can leave some blank
   For some fields there will be a default value,
   If you enter '.', the field will be left blank.
   -----
   Country Name (2 letter code) [AU]:
       State or Province Name (full name) []:
       Locality Name (for example, city) []:
       Organization Name (for example, company) []:
       Organizational Unit Name (for example, section) []:
       Common Name (e.g. server FQDN or YOUR name) []:
       Email Address []:
   
       Please enter the following 'extra' attributes
       to be sent with your certificate request
       A challenge password []:
       An optional company name []:
   ```

1. 從 CSR 建立用戶端憑證。

   ```
   openssl x509 -req \
       -in device_cert_csr_filename.csr \
       -CA root_CA_cert_filename.pem \
       -CAkey root_CA_key_filename.key \
       -CAcreateserial \
       -out device_cert_filename.pem \
       -days 500 -sha256
   ```

 此時，用戶端憑證已建立，但尚未註冊 AWS IoT。如需如何和何時註冊用戶端憑證的詳細資訊，請參閱 [註冊用戶端憑證](register-device-cert.md)。

# 註冊用戶端憑證
<a name="register-device-cert"></a>

用戶端憑證必須向 註冊 AWS IoT ，才能啟用用戶端與 之間的通訊 AWS IoT。您可以手動註冊每個用戶端憑證，也可以將用戶端憑證設定為 AWS IoT 在用戶端第一次連線至 時自動註冊。

 如果想要您的用戶端和裝置在第一次連線時註冊，您必須使用 [註冊您的憑證授權機構憑證](manage-your-CA-certs.md#register-CA-cert)，在要使用用戶端憑證的區域中透過 AWS IoT 來簽署該用戶端憑證。Amazon 根 CA 會自動向 註冊 AWS IoT。

用戶端憑證可由 AWS 帳戶 和 區域共用。這些主題中的程序必須在您要使用用戶端憑證的每個帳戶和區域中執行。在一個帳戶或區域中註冊用戶端憑證時，另一個帳戶或區域不會自動加以辨識。

**注意**  
使用 Transport Layer Security (TLS) 通訊協定來連線 AWS IoT 的用戶端必須支援 TLS 的[伺服器名稱指示 (SNI) 延伸](https://tools.ietf.org/html/rfc3546#section-3.1)。如需詳細資訊，請參閱[中的傳輸安全性 AWS IoT Core](transport-security.md)。

**Topics**
+ [手動註冊用戶端憑證](manual-cert-registration.md)
+ [在用戶端連線至 AWS IoT just-in-time註冊 (JITR) 時註冊用戶端憑證](auto-register-device-cert.md)

# 手動註冊用戶端憑證
<a name="manual-cert-registration"></a>

您可以使用 AWS IoT 主控台和 手動註冊用戶端憑證 AWS CLI。

要使用的註冊程序取決於 AWS 帳戶和 區域是否會共用憑證。在一個帳戶或區域中註冊用戶端憑證時，另一個帳戶或區域不會自動加以辨識。

本主題中的程序必須在您要使用用戶端憑證的每個帳戶和區域中執行。用戶端憑證可由 AWS 帳戶和 區域共用。

## 註冊已註冊 CA 所簽署的用戶端憑證 (主控台)
<a name="manual-cert-registration-console"></a>

**注意**  
執行此程序之前，請確定您擁有用戶端憑證的 .pem 檔案，且用戶端憑證是由您已[註冊 AWS IoT](manage-your-CA-certs.md#register-CA-cert)的 CA 簽署。

**AWS IoT 使用主控台向 註冊現有憑證**

1. 登入 AWS 管理主控台並開啟 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 請在導覽窗格的 **Manage** (管理) 區段中，選擇 **Security** (安全性)，然後選擇 **Certificates** (憑證)。

1. 在 **Certificates** (憑證) 頁面的 **Certificates** (憑證) 對話方塊中，選擇 **Add certificate** (新增憑證)，然後選擇 **Register certificates** (註冊憑證)。

1. 在 **Register certificate** (登錄憑證) 頁面的 **Certificates to upload** (要上傳的憑證) 對話方塊中執行下列操作：
   + 請選擇 **CA is registered with AWS IoT** (已用註冊 CA)。
   + 從 **Choose a CA certificate** (選擇 CA 憑證) 中，選取您的 **Certification authority** (憑證授權機構)。
     + 選擇 **Register a new CA** (註冊新的憑證) 以註冊未使用 AWS IoT註冊的新 **Certification authority** (憑證授權機構)。
     + 若 **Amazon Root certificate authority** (Amazon 根憑證授權機構) 是您的憑證授權機構，**Choose a CA certificate** (選擇 CA 憑證) 請保留空白。
   + 最多選取要上傳和註冊的 10 個憑證 AWS IoT。
     + 請選擇您在 [建立 AWS IoT 用戶端憑證](device-certs-create.md) 和 [使用您的憑證授權機構憑證建立用戶端憑證](create-device-cert.md) 中建立的憑證檔案。
   + 請選擇 **Activate** (啟動) 或 **Deactivate** (停用)。若您選擇 **Deactive** (停用)，[啟用或停用用戶端憑證](activate-or-deactivate-device-cert.md) 會說明如何在註冊憑證後啟動憑證。
   + 選擇**註冊**。

您已註冊的憑證將會出現在 **Certificates** (憑證) 頁面的 **Certificates** (憑證) 對話方塊中。

## 註冊未註冊 CA 所簽署的用戶端憑證 (主控台)
<a name="manual-cert-registration-console-noca"></a>

**注意**  
執行此程序之前，請確定您擁有用戶端憑證的 .pem 檔案。

**AWS IoT 使用主控台向 註冊現有憑證**

1. 登入 AWS 管理主控台並開啟[AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在左側導覽窗格中，選擇 **Secure** (安全)、選擇 **Certificates** (憑證)，然後選擇 **Create** (建立)。

1. 在 **Create a certificate** (建立憑證) 上，找出 **Use my certificate** (使用我的憑證) 項目，然後選擇 **Get started** (開始使用)。

1. 在 **Select a CA** (選取 CA) 上，選擇 **Next** (下一步)。

1.  在 **Register existing device certificates** (註冊現有裝置憑證) 上，選擇 **Select certificates** (選取憑證)，然後選取最多 10 個要註冊的憑證檔案。

1.  關閉檔案對話方塊後，請選取您要在註冊用戶端憑證時啟用，還是撤銷用戶端憑證。

   如果您未在註冊憑證時啟用憑證，[啟動用戶端憑證 (主控台)](activate-or-deactivate-device-cert.md#activate-device-cert-console) 描述稍後如何啟用憑證。

   如果憑證在註冊時遭到撤銷，則無法稍後啟用。

   選擇要註冊的憑證檔案，並選取註冊後要採取的動作之後，請選取 **Register certificates** (註冊憑證)。

已成功註冊的用戶端憑證會出現在憑證清單中。

## 註冊已註冊 CA 所簽署的用戶端憑證 (CLI)
<a name="manual-cert-registration-cli"></a>

**注意**  
執行此程序之前，請確定您擁有憑證授權機構 (CA) .pem 和用戶端憑證的 .pem 檔案。用戶端憑證必須由您已[註冊 AWS IoT](manage-your-CA-certs.md#register-CA-cert)的憑證授權機構 (CA) 簽署。

使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-certificate.html) 命令來註冊 (但不是啟動) 用戶端憑證。

```
aws iot register-certificate \
    --certificate-pem file://device_cert_filename.pem \
    --ca-certificate-pem file://ca_cert_filename.pem
```

用戶端憑證已向 註冊 AWS IoT，但尚未啟用。如需稍後如何啟用用戶端憑證的詳細資訊，請參閱 [啟動用戶端憑證 (CLI)](activate-or-deactivate-device-cert.md#activate-device-cert-cli)。

當您使用這個命令註冊用戶端憑證時，也可以啟動用戶端憑證。

```
aws iot register-certificate \
    --set-as-active \
    --certificate-pem file://device_cert_filename.pem \
    --ca-certificate-pem file://ca_cert_filename.pem
```

如需啟用憑證使其可用於連線的詳細資訊 AWS IoT，請參閱 [啟用或停用用戶端憑證](activate-or-deactivate-device-cert.md)

## 註冊未註冊 CA 所簽署的用戶端憑證 (CLI)
<a name="manual-cert-registration-noca-cli"></a>

**注意**  
執行此程序之前，請確定您擁有憑證的 .pem 檔案。

使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-certificate-without-ca.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-certificate-without-ca.html) 命令來註冊 (但不是啟動) 用戶端憑證。

```
aws iot register-certificate-without-ca \
    --certificate-pem file://device_cert_filename.pem
```

用戶端憑證已向 註冊 AWS IoT，但尚未啟用。如需稍後如何啟用用戶端憑證的詳細資訊，請參閱 [啟動用戶端憑證 (CLI)](activate-or-deactivate-device-cert.md#activate-device-cert-cli)。

當您使用這個命令註冊用戶端憑證時，也可以啟動用戶端憑證。

```
aws iot register-certificate-without-ca \
    --status ACTIVE \
    --certificate-pem file://device_cert_filename.pem
```

如需啟用憑證使其可用於連線至 的詳細資訊 AWS IoT，請參閱 [啟用或停用用戶端憑證](activate-or-deactivate-device-cert.md)。

# 在用戶端連線至 AWS IoT just-in-time註冊 (JITR) 時註冊用戶端憑證
<a name="auto-register-device-cert"></a>

您可以設定 CA 憑證，以啟用其簽署的用戶端憑證，以便在用戶端第一次連線時 AWS IoT 自動向 註冊 AWS IoT。

若要在用戶端 AWS IoT 第一次連線至 時註冊用戶端憑證，您必須啟用 CA 憑證以進行自動註冊，並設定用戶端提供所需憑證的第一個連線。

## 設定憑證授權機構憑證以支援自動註冊 (主控台)
<a name="enable-auto-registration-console"></a>

**使用 AWS IoT 主控台設定 CA 憑證以支援自動用戶端憑證註冊**

1. 登入 AWS 管理主控台並開啟 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 請在左側導覽窗格中，選擇 **Secure** (安全)、**CAs** (CA)。

1. 在憑證授權單位清單中，尋找您要啟用自動註冊的憑證授權單位，然後使用省略符號圖示開啟選項選單。

1. 在選項選單上，選擇 **Enable auto-registration (啟用自動註冊)**。

**注意**  
自動註冊狀態不會顯示在憑證授權單位清單中。若要查看憑證授權機構的自動註冊狀態，您必須開啟憑證授權機構的 **Details (詳細資料)** 頁面。

## 設定憑證授權機構憑證以支援自動註冊 (CLI)
<a name="enable-auto-registration-cli"></a>

如果您已向 註冊 CA 憑證 AWS IoT，請使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-ca-certificate.html)命令`autoRegistrationStatus`將 CA 憑證設定為 `ENABLE`。

```
aws iot update-ca-certificate \
--certificate-id caCertificateId \
--new-auto-registration-status ENABLE
```

如果您想要在註冊憑證授權機構憑證時啟用 `autoRegistrationStatus`，請使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-ca-certificate.html) 命令。

```
aws iot register-ca-certificate \
--allow-auto-registration  \
--ca-certificate file://root_CA_cert_filename.pem \
--verification-cert file://verification_cert_filename.pem
```

使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html) 命令來查看 CA 憑證的狀態。

## 設定用戶端的首次連線進行自動註冊
<a name="configure-auto-reg-first-connect"></a>

當用戶端 AWS IoT 第一次嘗試連線至 時，在 Transport Layer Security (TLS) 交握期間，用戶端上必須存在由 CA 憑證簽署的用戶端憑證。

當用戶端連線到 時 AWS IoT，請使用您在[建立用戶端憑證或建立您自己的用戶端憑證中建立的 AWS IoT](https://docs.aws.amazon.com/iot/latest/developerguide/device-certs-create.html)用戶端憑證。 會將 CA 憑證 AWS IoT 辨識為已註冊的 CA 憑證、註冊用戶端憑證，並將其狀態設定為 `PENDING_ACTIVATION`。 [https://docs.aws.amazon.com/iot/latest/developerguide/device-certs-your-own.html](https://docs.aws.amazon.com/iot/latest/developerguide/device-certs-your-own.html)這代表系統會自動註冊該用戶端憑證，並準備啟用。用戶端憑證的狀態必須先是 `ACTIVE` 才能用來連線 AWS IoT。請參閱 [啟用或停用用戶端憑證](activate-or-deactivate-device-cert.md) 以了解啟用用戶端憑證的相關資訊。

**注意**  
您可以使用 AWS IoT Core just-in-time(JITR) 功能佈建裝置，而不必在裝置的第一個連線上傳送整個信任鏈 AWS IoT Core。雖不要求顯示憑證授權機構憑證，但需要裝置在連線時傳送[伺服器名稱指示 (SNI)](https://datatracker.ietf.org/doc/html/rfc3546#section-3.1) 延伸。

當 AWS IoT 自動註冊憑證或用戶端呈現 `PENDING_ACTIVATION` 狀態的憑證時， 會將訊息 AWS IoT 發佈至下列 MQTT 主題：

`$aws/events/certificates/registered/caCertificateId`

`caCertificateId` 為發行該用戶端憑證的憑證授權機構憑證 ID。

發佈至此主題的訊息具有以下結構：

```
{
        "certificateId": "certificateId",
        "caCertificateId": "caCertificateId",
        "timestamp": timestamp,
        "certificateStatus": "PENDING_ACTIVATION",
        "awsAccountId": "awsAccountId",
        "certificateRegistrationTimestamp": "certificateRegistrationTimestamp"
}
```

您可以建立規則以監聽此主題，並執行部分動作。我們建議您建立 Lambda 規則，此規則可驗證用戶端憑證未列於憑證撤銷清單 (CRL) 中，同時啟用憑證，並建立和連接政策至憑證。政策會決定用戶端能夠存取哪些資源。如果您要建立的政策需要連線裝置的用戶端 ID，您可以使用規則的 clientid() 函數來擷取用戶端 ID。範例規則定義可能如下所示：

```
SELECT *,
   clientid() as clientid
from $aws/events/certificates/registered/caCertificateId
```

在此範例中，規則會訂閱 JITR 主題`$aws/events/certificates/registered/caCertificateID`，並使用 clientid() 函數來擷取用戶端 ID。然後，規則會將用戶端 ID 附加至 JITR 承載。如需規則 clientid() 函數的詳細資訊，請參閱 [clientid()](https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-sql-function-clientid)。

如需如何建立會接聽 `$aws/events/certificates/registered/caCertificateID` 主題並執行這些動作之 Lambda 規則的詳細資訊，請參閱 [AWS IoT上用戶端憑證的即時註冊](https://aws.amazon.com/blogs/iot/just-in-time-registration-of-device-certificates-on-aws-iot/)。

如果在自動註冊用戶端憑證期間發生任何錯誤或例外狀況， 會將事件或訊息 AWS IoT 傳送至 CloudWatch Logs 中的日誌。如需為您帳戶設定記錄的詳細資訊，請參閱 [Amazon CloudWatch 文件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/)。

# 管理用戶端憑證
<a name="manage-device-cert"></a>

AWS IoT 為您提供管理用戶端憑證的功能。

**Topics**
+ [啟用或停用用戶端憑證](activate-or-deactivate-device-cert.md)
+ [將物件或政策連接至用戶端憑證](attach-to-cert.md)
+ [撤銷用戶端憑證](revoke-ca-cert.md)
+ [將憑證傳輸至另一個帳戶](transfer-cert.md)

# 啟用或停用用戶端憑證
<a name="activate-or-deactivate-device-cert"></a>

AWS IoT 驗證用戶端憑證在驗證連線時是否處於作用中狀態。

您可以建立和註冊用戶端憑證而不需啟用它們，這樣在您想要使用前，它們就不會被使用。您也可以停用作用中的用戶端憑證，以暫時停用這些憑證。最後，您可以撤銷用戶端憑證，以防止未來使用這些憑證。

## 啟動用戶端憑證 (主控台)
<a name="activate-device-cert-console"></a>

**使用 AWS IoT 主控台啟用用戶端憑證**

1. 登入 AWS 管理主控台並開啟[AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在左側導覽窗格中，選擇 **Secure (安全)**，然後選擇 **Certificates (憑證)**。

1. 在憑證清單中，找出您要啟用的憑證，然後使用省略符號圖示開啟選項選單。

1. 在選項選單中，選擇 **Activate (啟動)**。

憑證在憑證清單應顯示為 **Active (作用中)**。

## 停用用戶端憑證 (主控台)
<a name="deactivate-device-cert-console"></a>

**使用 AWS IoT 主控台停用用戶端憑證**

1. 登入 AWS 管理主控台並開啟[AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在左側導覽窗格中，選擇 **Secure (安全)**，然後選擇 **Certificates (憑證)**。

1. 在憑證清單中，找出您要停用的憑證，然後使用省略符號圖示開啟選項選單。

1. 在選項選單中，選擇 **Deactivate (停用)**。

憑證在憑證清單中應顯示為 **Inactive (非作用中)**。

## 啟動用戶端憑證 (CLI)
<a name="activate-device-cert-cli"></a>

 AWS CLI 提供 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html)命令來啟用憑證。

```
aws iot update-certificate \
    --certificate-id certificateId \
    --new-status ACTIVE
```

如果命令成功，則憑證的狀態將會是 `ACTIVE`。執行 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html) 以查看憑證的狀態。

```
aws iot describe-certificate \
    --certificate-id certificateId
```

## 停用用戶端憑證 (CLI)
<a name="deactivate-device-cert-cli"></a>

 AWS CLI 提供停用憑證的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html)命令。

```
aws iot update-certificate \
    --certificate-id certificateId \
    --new-status INACTIVE
```

如果命令成功，則憑證的狀態將會是 `INACTIVE`。執行 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html) 以查看憑證的狀態。

```
aws iot describe-certificate \
    --certificate-id certificateId
```

# 將物件或政策連接至用戶端憑證
<a name="attach-to-cert"></a>

當您建立和註冊與 AWS IoT 物件分開的憑證時，它不會有任何授權任何 AWS IoT 操作的政策，也不會與任何 AWS IoT 物件相關聯。本節說明如何在已註冊憑證上新增這些關聯。

**重要**  
要完成這些程序，您必須先建立要連接至憑證的物件或政策。

憑證會使用 驗證裝置， AWS IoT 使其可以連線。將憑證連接至物件資源會在裝置 (透過憑證) 與物件資源之間建立關係。若要授權裝置執行 AWS IoT 動作，例如允許裝置連接和發佈訊息，必須將適當的政策連接到裝置的憑證。

## 將物件連接至用戶端憑證 (主控台)
<a name="attach-to-cert-thing-console"></a>

您需要物件名稱才能完成此程序。

**將物件連接至已註冊憑證**

1. 登入 AWS 管理主控台並開啟[AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在左側導覽窗格中，選擇 **Secure (安全)**，然後選擇 **Certificates (憑證)**。

1. 在憑證清單中，找出要連接政策的憑證、選擇省略符號圖示來開啟憑證的選項選單，然後選擇 **Attach thing (連接物件)**。

1. 在彈出式視窗中，找出要連接至憑證的物件名稱、選擇其核取方塊，然後選擇 **Attach** (連接)。

物件現應出現在憑證詳細資訊頁面上的物件清單中。

## 將政策連接至用戶端憑證 (主控台)
<a name="attach-to-cert-policy-console"></a>

您需要政策物件名稱才能完成此程序。

**將政策物件連接至已註冊憑證**

1. 登入 AWS 管理主控台並開啟[AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在左側導覽窗格中，選擇 **Secure (安全)**，然後選擇 **Certificates (憑證)**。

1. 在憑證清單中，找出要連接政策的憑證、選擇省略符號圖示來開啟憑證的選項選單，然後選擇 **Attach policy (連接政策)**。

1. 在彈出式視窗中，找出要連接至憑證的政策名稱、選擇其核取方塊，然後選擇 **Attach** (連接)。

政策物件現應出現在憑證詳細資訊頁面上的政策清單中。

## 將物件連接至用戶端憑證 (CLI)
<a name="attach-to-cert-thing-cli"></a>

 AWS CLI 提供將物件連接到憑證的[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/attach-thing-principal.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/attach-thing-principal.html)命令。

```
aws iot attach-thing-principal \
    --principal certificateArn \
    --thing-name thingName
```

## 將政策連接至用戶端憑證 (CLI)
<a name="attach-to-cert-policy-cli"></a>

 AWS CLI 提供 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/attach-policy.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/attach-policy.html)命令，以將政策物件連接至憑證。

```
aws iot attach-policy \
    --target certificateArn \
    --policy-name policyName
```

# 撤銷用戶端憑證
<a name="revoke-ca-cert"></a>

如果您在已註冊的用戶端憑證上偵測到可疑活動，您可以撤銷該憑證，使其無法再次使用。

**注意**  
憑證一旦撤銷，就無法變更其狀態。也就是說，憑證狀態無法變更為 `Active` 或任何其他狀態。

## 撤銷用戶端憑證 (主控台)
<a name="revoke-device-cert-console"></a>

**使用 AWS IoT 主控台撤銷用戶端憑證**

1. 登入 AWS 管理主控台並開啟[AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在左側導覽窗格中，選擇 **Secure (安全)**，然後選擇 **Certificates (憑證)**。

1. 在憑證清單中，找出您要撤銷的憑證，然後使用省略符號圖示開啟選項選單。

1. 在選項選單中，選擇 **Revoke (撤銷)**。

如果憑證已成功撤銷，它會在憑證清單中顯示為 **Revoked (已撤銷)**。

## 撤銷用戶端憑證 (CLI)
<a name="revoke-device-cert-cli"></a>

 AWS CLI 提供撤銷憑證的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html) 命令。

```
aws iot update-certificate \
    --certificate-id certificateId \
    --new-status REVOKED
```

如果命令成功，則憑證的狀態將會是 `REVOKED`。執行 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html) 以查看憑證的狀態。

```
aws iot describe-certificate \
    --certificate-id certificateId
```

# 將憑證傳輸至另一個帳戶
<a name="transfer-cert"></a>

屬於某個憑證的 X.509 憑證 AWS 帳戶 可以轉移到另一個憑證 AWS 帳戶。

**將 X.509 憑證從一個憑證轉移到 AWS 帳戶 另一個憑證**

1. [開始傳輸憑證](#transfer-cert-init)

   在起始傳輸之前，必須先停用憑證，並將其與所有政策和物件分開。

1. [接受或拒絕憑證傳輸](#transfer-cert-accept)

   接收帳戶必須明確地接受或拒絕傳輸的憑證。在接收帳戶接受憑證之後，必須先啟用憑證才能使用。

1. [取消憑證傳輸](#transfer-cert-cancel)

   如果憑證未被接受，原始帳戶可以取消傳輸。

## 開始傳輸憑證
<a name="transfer-cert-init"></a>

您可以使用 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)或 ，開始 AWS 帳戶 將憑證轉移到另一個憑證 AWS CLI。

### 開始傳輸憑證 (主控台)
<a name="transfer-cert-init-console"></a>

若要完成此程序，將需要您想要傳輸之憑證的 ID。

從具有要傳輸之憑證的帳戶執行此程序。

**開始將憑證轉移到另一個憑證 AWS 帳戶**

1. 登入 AWS 管理主控台並開啟[AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在左側導覽窗格中，選擇 **Secure (安全)**，然後選擇 **Certificates (憑證)**。

   選擇您想要傳輸且狀態為 **Active** (作用中) 或 **Inactive** (非作用中) 的憑證，並開啟其詳細資訊頁面。

1. 在憑證 **Details** (詳細資訊) 頁面的 **Actions** (動作) 選單中，如果 **Deactivate** (停用) 選項可用，請選擇 **Deactivate** (停用) 選項來停用憑證。

1. 在憑證的 **Details** (詳細資訊) 頁面的左側選單中，選擇 **Policies** (政策)。

1. 在憑證的 **Policies** (政策) 頁面上，如果有任何政策連接至憑證，請開啟政策的選項選單並選擇 **Detach** (分開)，來分開每個政策。

   在您繼續之前，憑證不得有任何連接的政策。

1. 在憑證的 **Policies** (政策) 頁面的左側選單中，選擇 **Things** (物件)。

1. 在憑證的 **Things** (物件) 頁面上，如果有任何物件連接至憑證，請開啟物件的選項選單並選擇 **Detach** (分開)，來分開每個物件。

   在您繼續之前，憑證不得有任何連接的物件。

1. 在憑證的 **Things** (物件) 頁面的左側選單中，選擇 **Details** (詳細資訊)。

1. 在憑證的 **Details** (詳細資訊) 頁面的 **Actions** (動作) 選單中，選擇 **Start transfer** (開始傳輸) 以開啟 **Start transfer** (開始傳輸) 對話方塊。

1. 在**開始轉移**對話方塊中，輸入要接收憑證的帳戶 AWS 帳戶 號碼，以及選用的簡短訊息。

1. 選擇 **Start transfer** (開始傳輸) 以傳輸憑證。

主控台應該會顯示訊息，指出傳輸成功或失敗。如果傳輸已開始，則憑證的狀態會更新為 **Transferred** (已傳輸)。

### 開始傳輸憑證 (CLI)
<a name="transfer-cert-init-cli"></a>

若要完成此程序，將需要您想要傳輸之憑證的 *certificateId* 和 *certificateArn*。

從具有要傳輸之憑證的帳戶執行此程序。

**開始將憑證轉移到另一個 AWS 帳戶**

1. 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html) 命令來停用憑證

   ```
   aws iot update-certificate --certificate-id certificateId --new-status INACTIVE
   ```

1. 分開所有策略。

   1. 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-attached-policies.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-attached-policies.html) 命令來列出已連接至憑證的政策。

      ```
      aws iot list-attached-policies --target certificateArn
      ```

   1. 對於每個連接的政策，使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/detach-policy.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/detach-policy.html) 命令來分開政策。

      ```
      aws iot detach-policy --target certificateArn --policy-name policy-name
      ```

1. 分開所有物件。

   1. 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-principal-things.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-principal-things.html) 命令來列出已連接至憑證的物件。

      ```
      aws iot list-principal-things --principal certificateArn
      ```

   1. 對於每個連接的物件，使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/detach-thing-principal.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/detach-thing-principal.html) 命令來分開物件。

      ```
      aws iot detach-thing-principal --principal certificateArn --thing-name thing-name
      ```

1. 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/transfer-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/transfer-certificate.html) 命令來啟動憑證傳輸。

   ```
   aws iot transfer-certificate --certificate-id certificateId --target-aws-account account-id
   ```

## 接受或拒絕憑證傳輸
<a name="transfer-cert-accept"></a>

您可以使用 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)或 AWS 帳戶 ，接受或拒絕從另一個 傳輸給您 AWS 帳戶 的憑證 AWS CLI。

### 接受或拒絕憑證傳輸 (主控台)
<a name="transfer-cert-accept-console"></a>

若要完成此程序，將需要已傳輸至您帳戶之憑證的 ID。

從接收所傳輸憑證的帳戶執行此程序。

**接受或拒絕已傳輸至 的憑證 AWS 帳戶**

1. 登入 AWS 管理主控台並開啟[AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在左側導覽窗格中，選擇 **Secure (安全)**，然後選擇 **Certificates (憑證)**。

   選擇您想要接受或拒絕且狀態為 **Pending transfer** (待定傳輸) 的憑證，並開啟其詳細資訊頁面。

1. 在憑證的 **Details** (詳細資訊) 頁面的 **Actions** (動作) 選單中，
   + 若要接受憑證，請選擇 **Accept transfer** (接受傳輸)。
   + 若不要接受憑證，請選擇 **Reject transfer** (拒絕傳輸)。

### 接受或拒絕憑證傳輸 (CLI)
<a name="transfer-cert-accept-cli"></a>

若要完成此程序，將需要您想要接受或拒絕之憑證傳輸的 *certificateId*。

從接收所傳輸憑證的帳戶執行此程序。

**接受或拒絕已傳輸至 的憑證 AWS 帳戶**

1. 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/accept-certificate-transfer.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/accept-certificate-transfer.html) 命令來接受憑證。

   ```
   aws iot accept-certificate-transfer --certificate-id certificateId
   ```

1. 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/reject-certificate-transfer.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/reject-certificate-transfer.html) 命令來拒絕憑證。

   ```
   aws iot reject-certificate-transfer --certificate-id certificateId
   ```

## 取消憑證傳輸
<a name="transfer-cert-cancel"></a>

您可以在接受憑證傳輸之前，使用 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)或 AWS CLI來取消憑證傳輸。

### 取消憑證傳輸 (主控台)
<a name="transfer-cert-cancel-console"></a>

若要完成此程序，將需要您想要取消之憑證傳輸的 ID。

從已起始憑證傳輸的帳戶執行此程序。

**取消憑證傳輸**

1. 登入 AWS 管理主控台並開啟 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在左側導覽窗格中，選擇 **Secure (安全)**，然後選擇 **Certificates (憑證)**。

   選擇您想要取消其傳輸且狀態為 **Transferred** (已傳輸) 的憑證，並開啟其選項選單。

1. 在憑證的選項選單上，選擇 **Revoke transfer** (撤銷傳輸) 選項來取消憑證傳輸。
**重要**  
請小心不要弄錯 **Revoke transfer** (撤銷傳輸) 選項與 **Revoke** (撤銷) 選項。  
**Revoke transfer** (撤銷傳輸) 選項會取消憑證傳輸，而 **Revoke** (撤銷) 選項會使 AWS IoT無法復原且無法使用憑證。

### 取消憑證傳輸 (CLI)
<a name="transfer-cert-cancel-cli"></a>

若要完成此程序，將需要您想要取消之憑證傳輸的 *certificateId*。

從已起始憑證傳輸的帳戶執行此程序。

使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/cancel-certificate-transfer.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/cancel-certificate-transfer.html) 命令來取消憑證傳輸。

```
aws iot cancel-certificate-transfer --certificate-id certificateId
```

# 自訂用戶端憑證驗證
<a name="customize-client-auth"></a>

AWS IoT Core 支援 X.509 用戶端憑證的自訂用戶端憑證驗證，可增強用戶端身分驗證管理。此憑證驗證方法也稱為驗證前憑證檢查，您會根據自己的條件 （在 Lambda 函數中定義） 評估用戶端憑證，並撤銷用戶端憑證或憑證的簽署憑證授權單位 (CA) 憑證，以防止用戶端連線至 AWS IoT Core。例如，您可以建立自己的憑證撤銷檢查，以針對支援[線上憑證狀態通訊協定 (OCSP) 或憑證撤銷清單 (CRL) 端點的驗證授權單位驗證憑證的狀態](https://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol)，並防止具有撤銷憑證的用戶端連線。 [https://en.wikipedia.org/wiki/Certificate_revocation_list](https://en.wikipedia.org/wiki/Certificate_revocation_list)用於評估用戶端憑證的條件是在 Lambda 函數 （也稱為預先驗證 Lambda) 中定義。您必須使用網域組態中設定的端點，且[身分驗證類型](protocols.md#connection-protocol-auth-mode)必須是 X.509 憑證。此外，用戶端在連線至 時必須提供[伺服器名稱指示 (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) 延伸 AWS IoT Core。

**注意**  
 AWS GovCloud (US) 區域不支援此功能。

**Topics**
+ [步驟 1：向 註冊您的 X.509 用戶端憑證 AWS IoT Core](#client-auth-cert-verification)
+ [步驟 2：建立 Lambda 函數](#customize-client-auth-lambda)
+ [步驟 3：授權 AWS IoT 叫用您的 Lambda 函數](#customize-client-configuration-grant-permission)
+ [步驟 4：設定網域的身分驗證組態](#customize-client-configuration)

## 步驟 1：向 註冊您的 X.509 用戶端憑證 AWS IoT Core
<a name="client-auth-cert-verification"></a>

如果您尚未這麼做，請註冊並啟用 [X.509 用戶端憑證。](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html) AWS IoT Core否則，跳至下一步。

若要使用 註冊和啟用您的用戶端憑證 AWS IoT Core，請遵循下列步驟：

1. 如果您[直接使用 建立用戶端憑證 AWS IoT](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-create.html)。這些用戶端憑證會自動向 註冊 AWS IoT Core。

1. 如果您[建立自己的用戶端憑證](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-your-own.html)，請依照[這些指示向 註冊 AWS IoT Core](https://docs.aws.amazon.com//iot/latest/developerguide/register-device-cert.html)憑證。

1. 若要啟用您的用戶端憑證，請遵循[這些指示](https://docs.aws.amazon.com//iot/latest/developerguide/activate-or-deactivate-device-cert.html)。

## 步驟 2：建立 Lambda 函數
<a name="customize-client-auth-lambda"></a>

您需要建立 Lambda 函數來執行憑證驗證，並針對所設定端點的每次用戶端連線嘗試呼叫 。建立此 Lambda 函數時，請遵循[建立第一個 Lambda 函數](https://docs.aws.amazon.com//lambda/latest/dg/getting-started.html)的一般指引。此外，請確定 Lambda 函數遵循預期的請求和回應格式，如下所示：

**Lambda 函數事件範例**

```
{
	"connectionMetadata": {
		"id": "string"
	},
	"principalId": "string",
	"serverName": "string",
	"clientCertificateChain": [
		"string",
		"string"
	]
}
```

`connectionMetadata`  
中繼資料或與用戶端連線相關的其他資訊 AWS IoT Core。

`principalId`  
在 TLS 連線中與用戶端相關聯的主體識別符。

`serverName`  
[伺服器名稱指示 (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) 主機名稱字串。 AWS IoT Core 需要裝置將 [SNI 延伸](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)項目傳送至 Transport Layer Security (TLS) 通訊協定，並在 `host_name`欄位中提供完整的端點地址。

`clientCertificateChain`  
代表用戶端 X.509 憑證鏈的字串陣列。

**Lambda 函數回應範例**

```
{
	"isAuthenticated": "boolean"
}
```

`isAuthenticated`  
布林值，指出是否驗證請求。

**注意**  
在 Lambda 回應中， `isAuthenticated` 必須`true`繼續進行進一步的身分驗證和授權。否則，可以停用 IoT 用戶端憑證，也可以封鎖使用 X.509 用戶端憑證的自訂身分驗證，以進一步進行身分驗證和授權。

## 步驟 3：授權 AWS IoT 叫用您的 Lambda 函數
<a name="customize-client-configuration-grant-permission"></a>

建立 Lambda 函數之後，您必須使用 [add-permission](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html) CLI 命令，授予 AWS IoT 叫用它的許可。請注意，每次嘗試連線到您設定的端點時，都會叫用此 Lambda 函數。如需詳細資訊，請參閱[授權 AWS IoT 叫用 Lambda 函數](custom-auth-authorize.md)。

## 步驟 4：設定網域的身分驗證組態
<a name="customize-client-configuration"></a>

下一節說明如何使用 設定自訂網域的身分驗證組態 AWS CLI。

### 設定網域的用戶端憑證組態 (CLI)
<a name="customize-client-auth-cli"></a>

如果您沒有網域組態，請使用 [https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html) CLI 命令來建立組態。如果您已有網域組態，請使用 [https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html) CLI 命令來更新網域的用戶端憑證組態。您必須新增您在上一個步驟中建立的 Lambda 函數 ARN。

```
aws iot create-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type AWS_X509|CUSTOM_AUTH_X509 \
    --application-protocol SECURE_MQTT|HTTPS \
    --client-certificate-config 'clientCertificateCallbackArn":"arn:aws:lambda:us-east-2:123456789012:function:my-function:1"}'
```

```
aws iot update-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type AWS_X509|CUSTOM_AUTH_X509 \
    --application-protocol SECURE_MQTT|HTTPS \
    --client-certificate-config '{"clientCertificateCallbackArn":"arn:aws:lambda:us-east-2:123456789012:function:my-function:1"}'
```

`domain-configuration-name`  
網域組態的名稱。

`authentication-type`  
網域組態的身分驗證類型。如需詳細資訊，請參閱[選擇身分驗證類型](protocols.md#connection-protocol-auth-mode)。

`application-protocol`  
裝置用來與之通訊的應用程式通訊協定 AWS IoT Core。如需詳細資訊，請參閱[選擇應用程式通訊協定](protocols.md#protocol-selection)。

`client-certificate-config`  
指定網域用戶端身分驗證組態的物件。

`clientCertificateCallbackArn`  
建立新連線時，在 TLS layer 中 AWS IoT 叫用之 Lambda 函數的 Amazon Resource Name (ARN)。若要自訂用戶端身分驗證以執行自訂用戶端憑證驗證，您必須新增您在上一個步驟中建立之 Lambda 函數的 ARN。

如需詳細資訊，請參閱 *AWS IoT API 參考*中的 [CreateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateDomainConfiguration.html) 和 [UpdateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateDomainConfiguration.html)。如需網域組態的詳細資訊，請參閱[網域組態](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html)。

# IAM 使用者、群組和角色
<a name="iam-users-groups-roles"></a>

IAM 使用者、群組和角色為管理 AWS中身分及身分驗證的標準機制，您可以使用它們來使用 AWS SDK 和 連線到 AWS IoT HTTP 介面 AWS CLI。

IAM 角色也允許 代表您 AWS IoT 存取您帳戶中的其他 AWS 資源。例如，如果您想要讓裝置將其狀態發佈至 DynamoDB 資料表，IAM 角色 AWS IoT 允許 與 Amazon DynamoDB 互動。如需詳細資訊，請參閱 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html)。

對於透過 HTTP 的訊息中介裝置連線， 會使用 Signature 第 4 版簽署程序來 AWS IoT 驗證使用者、群組和角色。如需詳細資訊，請參閱[簽署 AWS API 請求](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)。

搭配 AWS Signature 第 4 版使用 時 AWS IoT，用戶端必須在其 TLS 實作中支援下列項目：
+ TLS 1.2
+ SHA-256 RSA 憑證簽章驗證
+ TLS 密碼套件支援部分的一種密碼套件

如需相關資訊，請參閱 [的身分和存取管理 AWS IoT](security-iam.md)。

# Amazon Cognito 身分
<a name="cognito-identities"></a>

Amazon Cognito Identity 可讓您建立暫時性的有限權限 AWS 登入資料，以用於行動和 Web 應用程式。當您使用 Amazon Cognito Identity 時，請建立身分集區，為您的使用者建立唯一身分，並使用 Login with Amazon、Facebook 和 Google 等身分提供者進行身分驗證。您也可以將 Amazon Cognito 身分識別與自己的開發人員已驗證身分搭配使用。如需詳細資訊，請參閱 [Amazon Cognito 身分](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html)。

若要使用 Amazon Cognito Identity，請定義與 IAM 角色相關聯的 Amazon Cognito 身分集區。IAM 角色與 IAM 政策相關聯，該政策會授予身分集區中的身分存取 AWS 資源的許可，例如呼叫 AWS 服務。

Amazon Cognito 身分會建立未驗證和已驗證的身分。未驗證的身分適用於行動裝置或 Web 應用程式中想使用應用程式但不想登入的訪客使用者。未驗證的使用者只會獲得與身分集區相關聯之 IAM 政策中所指定的許可。

當您使用已驗證的身分時，除了連接到身分集區的 IAM 政策之外，您還必須將 AWS IoT 政策連接到 Amazon Cognito 身分。若要連接政策 AWS IoT ，請使用 [ AttachPolicy](https://docs.aws.amazon.com/iot/latest/apireference/API_AttachPolicy.html) API，並將許可授予 AWS IoT 應用程式的個別使用者。您可以使用 AWS IoT 政策為特定客戶及其裝置指派精細的許可。

已驗證和未驗證的使用者是不同的身分類型。如果您未將 AWS IoT 政策連接至 Amazon Cognito 身分，則已驗證的使用者在 中的授權會失敗， AWS IoT 而且無法存取 AWS IoT 資源和動作。如需為 Amazon Cognito 身分建立政策的詳細資訊，請參閱 [發佈/訂閱政策範例](pub-sub-policy.md) 和 [使用 Amazon Cognito 身分授權](cog-iot-policies.md)。

![\[使用 Amazon Cognito Identity 存取裝置的應用程式。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/device-cognito.png)


# 自訂身分驗證和授權
<a name="custom-authentication"></a>

 AWS IoT Core 可讓您定義自訂授權方，以便管理自己的用戶端身分驗證和授權。當您需要使用 AWS IoT Core 非原生支援的身分驗證機制時，這會很有用。(如需原生支援機制的詳細資訊，請參閱 [用戶端身分驗證](client-authentication.md))。  

 例如，如果您要將 欄位中的現有裝置遷移至 ， AWS IoT Core 而這些裝置使用自訂承載字符或 MQTT 使用者名稱和密碼進行身分驗證， 則可以將其遷移至 ， AWS IoT Core 而不必為其佈建新身分。您可以搭配 AWS IoT Core 支援的任何通訊協定使用自訂身分驗證。如需 AWS IoT Core 支援的通訊協定的詳細資訊，請參閱 [裝置通訊協定](protocols.md)。

**Topics**
+ [了解自訂身分驗證工作流程](custom-authorizer.md)
+ [建立和管理自訂授權方 (CLI)](config-custom-auth.md)
+ [使用 X.509 用戶端憑證進行自訂身分驗證](custom-auth-509cert.md)
+ [AWS IoT Core 使用自訂身分驗證連線至](custom-auth.md)
+ [疑難排解您的授權方](custom-auth-troubleshooting.md)

# 了解自訂身分驗證工作流程
<a name="custom-authorizer"></a>

自訂身分驗證可讓您定義如何使用[授權方資源](https://docs.aws.amazon.com/iot/latest/apireference/API_AuthorizerDescription.html)來驗證和授權用戶端。  每個授權方都包含客戶受管 Lambda 函數的參考、用於驗證裝置憑證的選用公有金鑰，以及其他組態資訊。 下圖說明 中自訂身分驗證的授權工作流程 AWS IoT Core。

![\[在 中自訂身分驗證的自訂授權工作流程 AWS IoT Core。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/custom-authentication.png)


## AWS IoT Core 自訂身分驗證和授權工作流程
<a name="custom-authentication-workflow"></a>

下方清單說明自訂身分驗證和授權工作流程中的每個步驟。

1. 裝置會使用其中一個支援的 來連線至客戶 AWS IoT Core 的資料端點[裝置通訊協定](protocols.md)。裝置會在請求的標頭欄位或查詢參數 （適用於 HTTP Publish 或 MQTT over WebSockets 通訊協定） 中，或在 MQTT CONNECT 訊息的使用者名稱和密碼欄位 （適用於 MQTT 和 MQTT over WebSockets 通訊協定） 中傳遞登入資料。

1. AWS IoT Core 會檢查兩個條件之一：
   + 傳入的請求指定授權方。
   + 接收請求 AWS IoT Core 的資料端點已為其設定預設授權方。

   如果 以下列其中一種方式 AWS IoT Core 尋找授權方， AWS IoT Core 會觸發與授權方相關聯的 Lambda 函數。

1.  （選用） 如果您已啟用權杖簽署，請在觸發 Lambda 函數之前，使用存放在授權方中的 公有金鑰 AWS IoT Core 驗證請求簽章。如果驗證失敗， AWS IoT Core 會停止請求，而不會叫用 Lambda 函數。  

1. Lambda 函數會接收請求中的憑證和連線中繼資料，並做出身分驗證決策。

1. Lambda 函數會傳回身分驗證決策的結果，以及指定連線中允許哪些動作 AWS IoT Core 的政策文件。Lambda 函數也會傳回資訊，指定透過叫用 Lambda 函數 AWS IoT Core 重新驗證請求中登入資料的頻率。

1. AWS IoT Core 根據從 Lambda 函數接收到的政策，評估連線上的活動。

1. 建立連線且最初調用您的自訂授權方 Lambda 後，閒置連線的下一個調用最多可延遲 5 分鐘，而不需要任何 MQTT 操作。之後，後續調用將遵循自訂授權方 Lambda 中的重新整理間隔。這種方法可以防止超出 Lambda 並行限制的過度調用 AWS 帳戶。

## 擴展考量
<a name="custom-authentication-scaling"></a>

 因為 Lambda 函數會為您的授權方處理身分驗證和授權，所以此函數會受制於 Lambda 定價和服務配額，例如並行執行速率。 如需 Lambda 定價的詳細資訊，請參閱[ Lambda 定價](https://aws.amazon.com/lambda/pricing/)。您可以調整 Lambda 函數回應中的 `refreshAfterInSeconds` 和 `disconnectAfterInSeconds` 參數，管理 Lambda 函數上的負載。如需 Lambda 函數回應內容的詳細資訊，請參閱 [定義您的 Lambda 函式](custom-auth-lambda.md)。

**注意**  
如果將簽署保持啟用狀態，您可以防止無法辨識的用戶端過度觸發 Lambda。在您的授權方中停用簽署之前，請考慮這一點。

**注意**  
自訂授權方的 Lambda 函數逾時限制為 5 秒。

# 建立和管理自訂授權方 (CLI)
<a name="config-custom-auth"></a>

AWS IoT Core 使用自訂授權方實作自訂身分驗證和授權機制。自訂授權方是一種 AWS IoT Core 資源，可讓您根據特定需求彈性定義和實作規則和政策。若要使用step-by-step說明建立自訂授權方，請參閱[教學課程：為 建立自訂授權方 AWS IoT Core](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html)。

每個授權方都包含以下元件：
+  *名稱*：識別授權方的唯一使用者定義字串。
+  *Lambda 函數 ARN*：Lambda 函數的 Amazon 資源名稱 (ARN)，用於實作授權和身分驗證邏輯。  
+  *字符金鑰名稱*：用來從 HTTP 標頭、查詢參數或 MQTT CONNECT 使用者名稱擷取字符以執行簽章驗證的金鑰名稱。如果在您的授權方中啟用簽署，則此值為必要的。
+  *已停用簽署旗標 (選用)*：布林值，用來指定是否要停用憑證上的簽署需求。 這對於簽署憑證沒有意義的案例很有用，例如使用 MQTT 使用者名稱和密碼的身分驗證結構述。預設值為 `false`，因此預設會啟用簽署。
+  *字符簽署公有金鑰*： AWS IoT Core 用來驗證字符簽章的公有金鑰。其長度下限為 2,048 位元。如果在您的授權方中啟用簽署，則此值為必要的。  

Lambda 會依據 Lambda 函數執行的次數，以及在您函數中執行程式碼所需的時間，向您收費。如需 Lambda 定價的詳細資訊，請參閱 [Lambda 定價](https://aws.amazon.com/lambda/pricing/)。如需建立 Lambda 函數的詳細資訊，請參閱《[Lambda 開發人員指南](https://docs.aws.amazon.com/lambda/latest/dg/)》。

**注意**  
如果將簽署保持啟用狀態，您可以防止無法辨識的用戶端過度觸發 Lambda。在您的授權方中停用簽署之前，請考慮這一點。

**注意**  
自訂授權方的 Lambda 函數逾時限制為 5 秒。

**Topics**
+ [定義您的 Lambda 函式](custom-auth-lambda.md)
+ [建立授權方](custom-auth-create-authorizer.md)
+ [授權 AWS IoT 叫用您的 Lambda 函數](custom-auth-authorize.md)
+ [測試您的授權方](custom-auth-testing.md)
+ [管理自訂授權方](custom-auth-manage.md)

# 定義您的 Lambda 函式
<a name="custom-auth-lambda"></a>

 當 AWS IoT Core 叫用您的授權方時，它會觸發與授權方相關聯的 Lambda，其中包含下列 JSON 物件的事件。範例 JSON 物件包含所有可能的欄位。不包含與連線請求無關的任何欄位。

```
{
    "token" :"aToken",
    "signatureVerified": Boolean, // Indicates whether the device gateway has validated the signature.
    "protocols": ["tls", "http", "mqtt"], // Indicates which protocols to expect for the request.
    "protocolData": {
        "tls" : {
            "serverName": "serverName" // The server name indication (SNI) host_name string.
        },
        "http": {
            "headers": {
                "#{name}": "#{value}"
            },
            "queryString": "?#{name}=#{value}"
        },
        "mqtt": {
            "username": "myUserName",
            "password": "myPassword", // A base64-encoded string.
            "clientId": "myClientId" // Included in the event only when the device sends the value.
        }
    },
    "connectionMetadata": {
        "id": UUID // The connection ID. You can use this for logging.
    },
}
```

 Lambda 函數應該使用此資訊來驗證傳入連線，並決定連線中允許哪些動作。此函數應該傳送包含下列值的回應。
+  `isAuthenticated`：指出是否驗證請求的布林值。
+  `principalId`：英數字串，作為自訂授權請求所傳送之字符的識別符。該值必須為英數字串 (字元數量不低於 1 個且不超過 128 個)，且符合此規則表達式 (regex) 模式：`([a-zA-Z0-9]){1,128}`。不允許非英數字元的特殊字元與 `principalId`搭配使用 AWS IoT Core。如果允許 使用非英數特殊字元，請參閱 AWS 其他服務的文件`principalId`。
+  `policyDocuments`：JSON 格式 AWS IoT Core 政策文件的清單 如需建立 AWS IoT Core 政策的詳細資訊，請參閱[AWS IoT Core 政策](iot-policies.md)。政策文件的數目上限為 10 份政策文件。每份政策文件最多可包含 2,048 個字元。
+  `disconnectAfterInSeconds`：整數，用來指定連接至 AWS IoT Core 閘道的持續時間上限 (以秒為單位)。最小值為 300 秒，最大值為 86,400 秒。預設值為 86，400。
**注意**  
建立連線時，會設定 的值 `disconnectAfterInSeconds`（由 Lambda 函數傳回）。在後續政策重新整理 Lambda 調用期間，無法修改此值。
+  `refreshAfterInSeconds`：整數，用來指定政策重新整理的間隔。一旦超出此間隔， AWS IoT Core 便會叫用 Lambda 函數，以允許政策重新整理。最小值為 300 秒，最大值為 86,400 秒。

  下列 JSON 物件包含您的 Lambda 函數可以傳送的回應範例。

 **\$1 "isAuthenticated":true, //A Boolean that determines whether client can connect. "principalId": "xxxxxxxx",  //A string that identifies the connection in logs. "disconnectAfterInSeconds": 86400,  "refreshAfterInSeconds": 300,   "policyDocuments": [       \$1         "Version": "2012-10-17",         "Statement": [            \$1               "Action": "iot:Publish",               "Effect": "Allow",               "Resource": "arn:aws:iot:us-east-1:<your\$1aws\$1account\$1id>:topic/customauthtesting"             \$1          ]        \$1     ] \$1**

 `policyDocument` 值必須包含有效的 AWS IoT Core 政策文件。如需 AWS IoT Core 政策的詳細資訊，請參閱[AWS IoT Core 政策](iot-policies.md)。  在 MQTT over TLS 和 MQTT over WebSockets 連線中， 會在 `refreshAfterInSeconds` 欄位值中指定的間隔內 AWS IoT Core 快取此政策。如果採用 HTTP 連線，除非裝置使用的是 HTTP 持續連線 (也稱為 HTTP 保持連線或 HTTP 連線重複使用)，否則每個授權請求都會呼叫 Lambda 函數。您可以在設定授權方時選擇啟用快取。在此間隔期間， 會針對此快取政策 AWS IoT Core 授權已建立連線中的動作，而不會再次觸發您的 Lambda 函數。如果在自訂身分驗證期間發生失敗， 會 AWS IoT Core 終止連線。如果連線開啟的時間超過 `disconnectAfterInSeconds`參數中指定的值， AWS IoT Core 也會終止連線。

 下列 JavaScript 包含範例 Node.js Lambda 函數，其會在 MQTT Connect 訊息中尋找值為 的密碼，`test`並傳回政策，授予許可，以 AWS IoT Core 連接至名為 的用戶端，`myClientName`並發佈至包含相同用戶端名稱的主題。如果找不到預期的密碼，它會傳回拒絕這兩個動作的政策。

```
// A simple Lambda function for an authorizer. It demonstrates 
// how to parse an MQTT password and generate a response.

exports.handler = function(event, context, callback) { 
    var uname = event.protocolData.mqtt.username;
    var pwd = event.protocolData.mqtt.password;
    var buff = new Buffer(pwd, 'base64');
    var passwd = buff.toString('ascii');
    switch (passwd) { 
        case 'test': 
            callback(null, generateAuthResponse(passwd, 'Allow')); 
            break;
        default: 
            callback(null, generateAuthResponse(passwd, 'Deny'));  
    }
};

// Helper function to generate the authorization response.
var generateAuthResponse = function(token, effect) { 
    var authResponse = {}; 
    authResponse.isAuthenticated = true; 
    authResponse.principalId = 'TEST123'; 
    
    var policyDocument = {}; 
    policyDocument.Version = '2012-10-17';		 	 	 
    policyDocument.Statement = []; 
    var publishStatement = {}; 
    var connectStatement = {};
    connectStatement.Action = ["iot:Connect"];
    connectStatement.Effect = effect;
    connectStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:client/myClientName"];
    publishStatement.Action = ["iot:Publish"]; 
    publishStatement.Effect = effect; 
    publishStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"]; 
    policyDocument.Statement[0] = connectStatement;
    policyDocument.Statement[1] = publishStatement; 
    authResponse.policyDocuments = [policyDocument]; 
    authResponse.disconnectAfterInSeconds = 3600; 
    authResponse.refreshAfterInSeconds = 300;
    
    return authResponse; 
}
```

 當上述 Lambda 函數在 MQTT Connect 訊息中收到 `test` 的預期密碼時，它會傳回下列 JSON。`password` 和 `principalId` 屬性的值會是 MQTT 連結訊息的值。

```
{
  "password": "password",
  "isAuthenticated": true,
  "principalId": "principalId",
  "policyDocuments": [
    {
      "Version": "2012-10-17",		 	 	 
      "Statement": [
        {
          "Action": "iot:Connect",
          "Effect": "Allow",
          "Resource": "*"
        },
        {
          "Action": "iot:Publish",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}"
        },
        {
          "Action": "iot:Subscribe",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topicfilter/telemetry/${iot:ClientId}"
        },
        {
          "Action": "iot:Receive",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}"
        }
      ]
    }
  ],
  "disconnectAfterInSeconds": 3600,
  "refreshAfterInSeconds": 300
}
```

# 建立授權方
<a name="custom-auth-create-authorizer"></a>

 您可以使用 [CreateAuthorizer API](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateAuthorizer.html) 建立授權方。下列範例描述此命令。

```
aws iot create-authorizer
--authorizer-name MyAuthorizer
--authorizer-function-arn arn:aws:lambda:us-west-2:<account_id>:function:MyAuthorizerFunction  //The ARN of the Lambda function.
[--token-key-name MyAuthorizerToken //The key used to extract the token from headers.
[--token-signing-public-keys FirstKey=
 "-----BEGIN PUBLIC KEY-----
  [...insert your public key here...] 
  -----END PUBLIC KEY-----"
[--status ACTIVE]
[--tags <value>]
[--signing-disabled | --no-signing-disabled]
```

您可以使用 `signing-disabled` 參數，在每次叫用授權方時選擇退出簽章驗證。除非您必須停用簽署，否則強烈建議您不要這樣做。簽章驗證可保護您防範未知裝置過度叫用 Lambda 函數。在建立授權方之後，您無法更新授權方的 `signing-disabled` 狀態。若要變更此行為，您必須使用不同的 `signing-disabled` 參數值建立另一個自訂授權方。

如果您已停用簽署，`tokenKeyName` 和 `tokenSigningPublicKeys` 參數的值是選用值。如果啟用簽署，則它們是必要值。

建立 Lambda 函數和自訂授權方之後，您必須明確授予 AWS IoT Core 服務許可，才能代表您叫用函數。 您可以使用下列命令來執行此操作。

**注意**  
預設 IoT 端點可能不支援搭配 Lambda 函數使用自訂授權方。反之，您可以使用網域組態來定義新的端點，然後為自訂授權方指定該端點。

```
aws lambda add-permission --function-name <lambda_function_name>
--principal iot.amazonaws.com --source-arn <authorizer_arn>
--statement-id Id-123 --action "lambda:InvokeFunction"
```

# 授權 AWS IoT 叫用您的 Lambda 函數
<a name="custom-auth-authorize"></a>

在本節中，您將授予您剛建立的自訂授權方資源的許可，以執行 Lambda 函數。若要授與許可，您可以使用 [add-permission](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html) CLI 命令。

**使用 將許可授予 Lambda 函數 AWS CLI**

1. 在插入您的值之後，輸入以下命令。請注意，`statement-id` 值必須是唯一的。`Id-1234` 將 取代為您擁有的確切值，否則您可能會發生錯誤`ResourceConflictException`。

   ```
   aws lambda add-permission  \
   --function-name "custom-auth-function" \
   --principal "iot.amazonaws.com" \
   --action "lambda:InvokeFunction" \
   --statement-id "Id-1234" \
   --source-arn authorizerArn
   ```

1. 如果命令成功，它會傳回許可陳述式，例如此範例。您可以繼續下一節來測試自訂授權方。

   ```
   {
       "Statement": "{\"Sid\":\"Id-1234\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iot.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\"}}}"
   }
   ```

   如果命令未成功，它會傳回錯誤，例如此範例。您必須先檢閱並更正錯誤，然後才能繼續進行。

   ```
   An error occurred (AccessDeniedException) when calling the AddPermission operation: User: arn:aws:iam::57EXAMPLE833:user/EXAMPLE-1 is not authorized to perform: lambda:AddPer
   mission on resource: arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function
   ```

# 測試您的授權方
<a name="custom-auth-testing"></a>

 您可以使用 [TestInvokeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_TestInvokeAuthorizer.html) API 來測試授權方的叫用和傳回值。此 API 可讓您指定通訊協定中繼資料，並在您的授權方中測試簽章驗證。

下列標籤顯示如何使用 AWS CLI 來測試您的授權方。

------
#### [ Unix-like ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER \
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------
#### [ Windows CMD ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ^
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------
#### [ Windows PowerShell ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER `
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------

`token-signature` 參數的值是簽署的字符。若要了解如何取得此值，請參閱 [簽署字符](custom-auth.md#custom-auth-token-signature)。

如果您的授權方取得使用者名稱和密碼，您可以使用 `--mqtt-context` 參數來傳遞此資訊。下列標籤顯示如何使用 `TestInvokeAuthorizer` API，將包含使用者名稱、密碼和用戶端名稱的 JSON 物件傳送給您的自訂授權方。

------
#### [ Unix-like ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  \
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------
#### [ Windows CMD ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  ^
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------
#### [ Windows PowerShell ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  `
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------

密碼必須為 base64 編碼。下列範例顯示如何在類似 Unix 環境中編碼密碼。

```
echo -n PASSWORD | base64
```

# 管理自訂授權方
<a name="custom-auth-manage"></a>

 您可以使用下列 API 來管理授權方。
+ [ListAuthorizers](https://docs.aws.amazon.com/iot/latest/apireference/API_ListAuthorizers.html)：顯示您帳戶中的所有授權方。
+  [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html)：顯示所指定授權方的屬性。這些值包括建立日期、上次修改日期和其他屬性。
+ [SetDefaultAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_SetDefaultAuthorizer.html)：指定 AWS IoT Core 資料端點的預設授權方。如果裝置未傳遞 AWS IoT Core 登入資料，且未指定授權方，則 AWS IoT Core 使用此授權方。如需使用 AWS IoT Core 登入資料的詳細資訊，請參閱 [用戶端身分驗證](client-authentication.md)。
+ [UpdateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateAuthorizer.html)：變更所指定授權方的狀態、字符金鑰名稱或公有金鑰。
+  [DeleteAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteAuthorizer.html)：刪除指定的授權方。

**注意**  
 您無法更新授權方的簽署需求。這表示您無法在需要簽署的現有授權方中停用簽署。您也無法在不需要簽署的現有授權方中要求簽署。

# 使用 X.509 用戶端憑證進行自訂身分驗證
<a name="custom-auth-509cert"></a>

將裝置連線至 時 AWS IoT Core，您有多種身分[驗證類型](protocols.md#connection-protocol-auth-mode)可用。您可以使用 X.[509 用戶端憑證](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html)來驗證用戶端和裝置連線，或定義[自訂授權方](https://docs.aws.amazon.com//iot/latest/developerguide/custom-authentication.html)來管理自己的用戶端身分驗證和授權邏輯。本主題說明如何搭配 X.509 用戶端憑證使用自訂身分驗證。

如果您已經使用 X.509 憑證對裝置進行身分驗證，並想要執行額外的驗證和自訂授權，則使用自訂身分驗證搭配 X.509 憑證可能會有所幫助。例如，如果您在 X.509 用戶端憑證中存放裝置的資料，例如其序號，則在 AWS IoT Core 驗證 X.509 用戶端憑證之後，您可以使用自訂授權方，根據憑證的 CommonName 欄位中存放的資訊來識別特定裝置。將裝置連線至 時，搭配 X.509 憑證使用自訂身分驗證可增強裝置安全管理， AWS IoT Core 並提供管理身分驗證和授權邏輯的更多彈性。 AWS IoT Core 支援搭配 X.509 憑證的自訂身分驗證，其使用 X.509 憑證和自訂授權方身分驗證類型，同時適用於 [MQTT](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html) 通訊協定和 [HTTPS](https://docs.aws.amazon.com//iot/latest/developerguide/http.html) 通訊協定。如需裝置端點支援的身分驗證類型和應用程式通訊協定 AWS IoT Core 的詳細資訊，請參閱[裝置通訊協定](https://docs.aws.amazon.com//iot/latest/developerguide/protocols.html)。

**注意**  
 AWS GovCloud (US) 區域不支援使用 X.509 用戶端憑證的自訂身分驗證。

**重要**  
您必須使用使用[網域組態](iot-custom-endpoints-configurable.md)建立的端點。此外，用戶端在連線至 時必須提供[伺服器名稱指示 (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) 延伸 AWS IoT Core。

**Topics**
+ [步驟 1：向 註冊您的 X.509 用戶端憑證 AWS IoT Core](#custom-auth-509cert-client)
+ [步驟 2：建立 Lambda 函數](#custom-auth-509cert-lambda)
+ [步驟 3：建立自訂授權方](#custom-auth-509cert-authorizer)
+ [步驟 4：在網域組態中設定身分驗證類型和應用程式通訊協定](#custom-auth-509cert-domainconfig)

## 步驟 1：向 註冊您的 X.509 用戶端憑證 AWS IoT Core
<a name="custom-auth-509cert-client"></a>

如果您尚未這麼做，請註冊並啟用 [X.509 用戶端憑證。](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html) AWS IoT Core否則，跳至下一步。

若要使用 註冊和啟用您的用戶端憑證 AWS IoT Core，請遵循下列步驟：

1. 如果您[直接使用 建立用戶端憑證 AWS IoT](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-create.html)。這些用戶端憑證會自動向 註冊 AWS IoT Core。

1. 如果您[建立自己的用戶端憑證](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-your-own.html)，請依照[這些指示向 註冊 AWS IoT Core](https://docs.aws.amazon.com//iot/latest/developerguide/register-device-cert.html)憑證。

1. 若要啟用您的用戶端憑證，請遵循[這些指示](https://docs.aws.amazon.com//iot/latest/developerguide/activate-or-deactivate-device-cert.html)。

## 步驟 2：建立 Lambda 函數
<a name="custom-auth-509cert-lambda"></a>

AWS IoT Core 使用自訂授權方來實作自訂身分驗證和授權機制。自訂授權方與 Lambda 函數相關聯，該函數會判斷裝置是否經過身分驗證，以及允許裝置執行哪些操作。當裝置連線到 時 AWS IoT Core， 會 AWS IoT Core 擷取授權方詳細資訊，包括授權方名稱和相關聯的 Lambda 函數，並叫用 Lambda 函數。Lambda 函數會收到事件，其中包含具有裝置 X.509 用戶端憑證資料的 JSON 物件。您的 Lambda 函數使用此事件 JSON 物件來評估身分驗證請求、決定要採取的動作，以及傳送回應。

### Lambda 函數事件範例
<a name="custom-auth-509cert-event"></a>

下列範例 JSON 物件包含可以包含的所有可能欄位。實際 JSON 物件只會包含與特定連線請求相關的欄位。

```
{
	"token": "aToken",
	"signatureVerified": true,
	"protocols": [
		"tls",
		"mqtt"
	],
	"protocolData": {
		"tls": {
			"serverName": "serverName",
			"x509CertificatePem": "x509CertificatePem",
			"principalId": "principalId"
		},
		"mqtt": {
			"clientId": "myClientId",
                     "username": "myUserName",
                     "password": "myPassword"
		}
	},
	"connectionMetadata": {
		"id": "UUID"
	}
}
```

`signatureVerified`  
布林值，指出在叫用授權方的 Lambda 函數之前，是否驗證授權方中設定的字符簽章。如果授權方設定為停用權杖簽署，則此欄位將為 false。

`protocols`  
包含請求預期通訊協定的陣列。

`protocolData`  
包含連線中所用通訊協定資訊的物件。它提供通訊協定特定的詳細資訊，可用於身分驗證、授權等。  
`tls` - 此物件會保留與 TLS (Transport Layer Security) 通訊協定相關的資訊。  
+ `serverName` - [伺服器名稱指示 (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) 主機名稱字串。 AWS IoT Core 要求裝置將 [SNI 延伸](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)模組傳送至 Transport Layer Security (TLS) 通訊協定，並在 `host_name`欄位中提供完整的端點地址。
+ `x509CertificatePem` - PEM 格式的 X.509 憑證，用於 TLS 連線中的用戶端身分驗證。
+ `principalId` - TLS 連線中與用戶端相關聯的主體識別符。
`mqtt` - 此物件會保留 MQTT 通訊協定的相關資訊。  
+ `clientId` - 字串只需要包含在裝置傳送此值的事件中。
+ `username` - MQTT Connect 封包中提供的使用者名稱。
+ `password` - MQTT Connect 封包中提供的密碼。

`connectionMetadata`  
連線的中繼資料。  
`id` - 用於記錄和故障診斷的連線 ID。

**注意**  
在此事件中，JSON 物件 `x509CertificatePem`和 `principalId`是請求中的兩個新欄位。的值`principalId`與 的值相同`certificateId`。如需詳細資訊，請參閱[憑證](https://docs.aws.amazon.com//iot/latest/apireference/API_Certificate.html)。

### Lambda 函數回應範例
<a name="custom-auth-509cert-response"></a>

Lambda 函數應使用事件 JSON 物件中的資訊來驗證傳入連線，並決定連線中允許哪些動作。

下列 JSON 物件包含 Lambda 函數可以傳送的範例回應。

```
{
	"isAuthenticated": true,
	"principalId": "xxxxxxxx",
	"disconnectAfterInSeconds": 86400,
	"refreshAfterInSeconds": 300,
	"policyDocuments": [
		{
			"Version": "2012-10-17",		 	 	 
			"Statement": [
				{
					"Effect": "Allow",
					"Action": "iot:Publish",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topic/customauthtesting"
				}
			]
		}
	]
}
```

在此範例中，此函數應該傳送包含下列值的回應。

`isAuthenticated`  
布林值，指出是否驗證請求。

`principalId`  
英數字串，可做為自訂授權請求所傳送字符的識別符。值必須是至少包含一個英數字串，且不超過 128 個字元。它會識別日誌中的連線。的值`principalId`必須與事件 JSON 物件`principalId`中的 值相同 （即 X.509 憑證的 certificateId)。

`policyDocuments`  
JSON 格式 AWS IoT Core 政策文件的清單。此值為選用，並支援[物件政策變數](https://docs.aws.amazon.com//iot/latest/developerguide/thing-policy-variables.html)和[憑證政策變數](https://docs.aws.amazon.com//iot/latest/developerguide/cert-policy-variables.html)。政策文件的數量上限為 10。每份政策文件最多可包含 2,048 個字元。如果您將多個政策連接到用戶端憑證和 Lambda 函數，則許可是所有政策的集合。如需建立 AWS IoT Core 政策的詳細資訊，請參閱 [政策](https://docs.aws.amazon.com//iot/latest/developerguide/iot-policies.html)。

`disconnectAfterInSeconds`  
整數，指定與 AWS IoT Core 閘道連線的最長持續時間 （以秒為單位）。最小值為 300 秒，最大值為 86，400 秒。 `disconnectAfterInSeconds`是連線的生命週期，不會在連續政策重新整理時重新整理。

`refreshAfterInSeconds`  
整數，指定政策重新整理之間的間隔。當此間隔通過時， 會 AWS IoT Core 叫用 Lambda 函數以允許政策重新整理。最小值為 300 秒，最大值為 86,400 秒。

### Lambda 函數範例
<a name="custom-auth-509cert-js-example"></a>

以下是 Node.js Lambda 函數的範例。函數會檢查用戶端的 X.509 憑證，並擷取相關資訊，例如序號、指紋和主體名稱。如果擷取的資訊符合預期值，則會授予用戶端連線的存取權。此機制可確保只有具有有效憑證的授權用戶端才能建立連線。

```
const crypto = require('crypto');

exports.handler = async (event) => {
    
    // Extract the certificate PEM from the event
    const certPem = event.protocolData.tls.x509CertificatePem;
    
    // Parse the certificate using Node's crypto module
    const cert = new crypto.X509Certificate(certPem);
    
    var effect = "Deny";
    // Allow permissions only for a particular certificate serial, fingerprint, and subject
    if (cert.serialNumber === "7F8D2E4B9C1A5036DE8F7C4B2A91E5D80463BC9A1257" // This is a random serial
       && cert.fingerprint === "F2:9A:C4:1D:B5:E7:08:3F:6B:D0:4E:92:A7:C1:5B:8D:16:0F:E3:7A" // This is a random fingerprint
       && cert.subject === "allow.example.com") {
      effect = "Allow";
    }
    
    return generateAuthResponse(event.protocolData.tls.principalId, effect);
};


// Helper function to generate the authorization response.
function generateAuthResponse(principalId, effect) {
    const authResponse = {
        isAuthenticated: true,
        principalId,
        disconnectAfterInSeconds: 3600,
        refreshAfterInSeconds: 300,
        policyDocuments: [
          {
            Version: "2012-10-17",		 	 	 
            Statement: [
              {
                Action: ["iot:Connect"],
                Effect: effect,
                Resource: [
                  "arn:aws:iot:us-east-1:123456789012:client/myClientName"
                ]
              },
              {
                Action: ["iot:Publish"],
                Effect: effect,
                Resource: [
                  "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
                ]
              },
              {
                Action: ["iot:Subscribe"],
                Effect: effect,
                Resource: [
                   "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName"
                ]
              },
              {
                Action: ["iot:Receive"],
                Effect: effect,
                Resource: [
                   "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
                ]
              }
            ]
          }
        ]
      };

  return authResponse;
}
```

上述 Lambda 函數在收到具有預期序列、指紋和主體的憑證時，會傳回下列 JSON。的值`x509CertificatePem`將是 TLS 交握中提供的用戶端憑證。如需詳細資訊，請參閱[定義 Lambda 函數](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html#custom-auth-lambda)。

```
{
	"isAuthenticated": true,
	"principalId": "principalId in the event JSON object",
	"policyDocuments": [
		{
			"Version": "2012-10-17",		 	 	 
			"Statement": [
				{
					"Action": "iot:Connect",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:client/myClientName"
				},
				{
					"Action": "iot:Publish",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
				},
				{
					"Action": "iot:Subscribe",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName"
				},
				{
					"Action": "iot:Receive",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
				}
			]
		}
	],
	"disconnectAfterInSeconds": 3600,
	"refreshAfterInSeconds": 300
}
```

## 步驟 3：建立自訂授權方
<a name="custom-auth-509cert-authorizer"></a>

[定義 Lambda 函數](#custom-auth-509cert-lambda)之後，請建立自訂授權方來管理您自己的用戶端身分驗證和授權邏輯。您可以遵循[步驟 3：建立客戶授權方資源及其授權](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html#custom-auth-tutorial-authorizer)中的詳細說明。如需詳細資訊，請參閱[建立 授權方](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html)。

在建立自訂授權方的過程中，您必須授予 AWS IoT 許可，才能在 Lambda 函數建立之後叫用該函數。如需詳細說明，請參閱[授權 AWS IoT 叫用您的 Lambda 函數](custom-auth-authorize.md)。

## 步驟 4：在網域組態中設定身分驗證類型和應用程式通訊協定
<a name="custom-auth-509cert-domainconfig"></a>

若要使用自訂身分驗證搭配 X.509 用戶端憑證來驗證裝置，您必須在網域組態中設定身分驗證類型和應用程式通訊協定，而且必須傳送 SNI 延伸。的值`authenticationType`必須是 `CUSTOM_AUTH_X509`，而 的值`applicationProtocol`可以是 `SECURE_MQTT`或 `HTTPS`。

### 在網域組態 (CLI) 中設定身分驗證類型和應用程式通訊協定
<a name="custom-auth-509cert-cli"></a>

如果您沒有網域組態，請使用 [https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html)命令來建立組態。的值`authenticationType`必須是 `CUSTOM_AUTH_X509`，而 的值`applicationProtocol`可以是 `SECURE_MQTT`或 `HTTPS`。

```
aws iot create-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type CUSTOM_AUTH_X509 \  
    --application-protocol SECURE_MQTT \ 
    --authorizer-config '{
        "defaultAuthorizerName": my-custom-authorizer
    }'
```

如果您已有網域組態，`applicationProtocol`請視需要使用[https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html)命令更新`authenticationType`和 。請注意，您無法變更預設端點 () 上的身分驗證類型或通訊協定`iot:Data-ATS`。

```
aws iot update-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type CUSTOM_AUTH_X509 \  
    --application-protocol SECURE_MQTT \
    --authorizer-config '{
        "defaultAuthorizerName": my-custom-authorizer
    }'
```

`domain-configuration-name`  
網域組態的名稱。

`authentication-type`  
網域組態的身分驗證類型。如需詳細資訊，請參閱[選擇身分驗證類型](protocols.md#connection-protocol-auth-mode)。

`application-protocol`  
裝置用來與之通訊的應用程式通訊協定 AWS IoT Core。如需詳細資訊，請參閱[選擇應用程式通訊協定](protocols.md#protocol-selection)。

`--authorizer-config`  
在網域組態中指定授權方組態的物件。

`defaultAuthorizerName`  
網域組態的授權方名稱。

如需詳細資訊，請參閱 *AWS IoT API 參考*中的 [CreateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateDomainConfiguration.html) 和 [UpdateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateDomainConfiguration.html)。如需網域組態的詳細資訊，請參閱[網域組態](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html)。

# AWS IoT Core 使用自訂身分驗證連線至
<a name="custom-auth"></a>

 裝置可以使用 AWS IoT Core 自訂身分驗證搭配 AWS IoT Core 支援裝置傳訊的任何通訊協定來連線至 。如需受支援通訊協定的詳細資訊，請參閱 [裝置通訊協定](protocols.md)。  傳遞至授權方 Lambda 函數的連線資料取決於您使用的通訊協定。如需建立授權方 Lambda 函數的詳細資訊，請參閱 [定義您的 Lambda 函式](custom-auth-lambda.md)。以下各節說明如何使用每個支援的通訊協定來連線，以便進行身分驗證。

## HTTPS
<a name="custom-auth-http"></a>

 AWS IoT Core 使用 [HTTP Publish API](https://docs.aws.amazon.com/iot/latest/apireference/API_iotdata_Publish.html) 將資料傳送到 的裝置，可以透過請求標頭或查詢其 HTTP POST 請求中的參數來傳遞憑證。裝置可以指定要使用 `x-amz-customauthorizer-name` 標頭或查詢參數叫用的授權方。如果您已在授權方中啟用字符簽署，則必須在請求標頭或查詢參數中傳遞 `token-key-name` 和 `x-amz-customauthorizer-signature`。請注意，在瀏覽器中使用 JavaScript 時，`token-signature` 的值必須是 URL 編碼格式。

**注意**  
HTTPS 通訊協定的客戶授權方僅支援發佈操作。如需有關 HTTP 通訊協定的詳細資訊，請參閱 [裝置通訊協定](protocols.md)。

下列範例請求會顯示如何在請求標頭和查詢參數中傳遞這些參數。

```
//Passing credentials via headers
POST /topics/topic?qos=qos HTTP/1.1
Host: your-endpoint 
x-amz-customauthorizer-signature: token-signature
token-key-name: token-value 
x-amz-customauthorizer-name: authorizer-name

//Passing credentials via query parameters
POST /topics/topic?qos=qos&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value HTTP/1.1
```

## MQTT
<a name="custom-auth-mqtt"></a>

 AWS IoT Core 使用 MQTT 連線連線至 的裝置可以透過 MQTT 訊息的 `username`和 `password` 欄位傳遞登入資料。此 `username` 值也可以選擇包含一個查詢字串，將其他值 (包括字符、簽章和授權方名稱) 傳遞給您的授權方。如果您想要使用字符型身分驗證結構描述，而不是 `username` 和 `password` 值，則可使用此查詢字串。  

**注意**  
 密碼欄位中的資料由 base64 編碼 AWS IoT Core。您的 Lambda 函數必須將其解碼。

 以下範例包含一個 `username` 字串，其中包含指定字符和簽章的額外參數。  

```
username?x-amz-customauthorizer-name=authorizer-name&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value
```

若要叫用 授權方， AWS IoT Core 使用 MQTT 和自訂身分驗證連線至 的裝置必須在連接埠 443 上連線。他們也必須傳遞值為 的應用程式層通訊協定交涉 (ALPN) TLS 延伸，`mqtt`以及其 AWS IoT Core 資料端點主機名稱的伺服器名稱指示 (SNI) 延伸。為了避免潛在的錯誤，`x-amz-customauthorizer-signature` 的值必須進行 URL 編碼。我們也強烈建議您對 `x-amz-customauthorizer-name` 和 `token-key-name` 值進行 URL 編碼。如需這些值的詳細資訊，請參閱 [裝置通訊協定](protocols.md)。V2 [AWS IoT 裝置SDKs、行動SDKs和 AWS IoT 裝置用戶端](iot-sdks.md) 可以設定這些延伸模組。 

## MQTT over WebSockets
<a name="custom-auth-websockets"></a>

 AWS IoT Core 透過 WebSockets 使用 MQTT 連線至 的裝置可以透過下列兩種方式之一傳遞登入資料。
+ 透過 HTTP UPGRADE 請求中的請求標頭或查詢參數來建立 WebSockets 連線。
+ 透過 MQTT CONNECT 訊息中的 `username` 和 `password` 欄位。

 如果透過 MQTT CONNECT 訊息傳遞憑證，則需要 ALPN 和 SNI TLS 延伸。如需這些延伸的詳細資訊，請參閱 [MQTT](#custom-auth-mqtt)。下列範例顯示如何透過 HTTP Upgrade 請求傳遞憑證。

```
GET /mqtt HTTP/1.1
Host: your-endpoint 
Upgrade: WebSocket 
Connection: Upgrade 
x-amz-customauthorizer-signature: token-signature
token-key-name: token-value 
sec-WebSocket-Key: any random base64 value 
sec-websocket-protocol: mqtt 
sec-WebSocket-Version: websocket version
```

## 簽署字符
<a name="custom-auth-token-signature"></a>

您必須利用您在 `create-authorizer` 呼叫中所使用之公有/私有金鑰對中的私有金鑰簽署字符。下列範例顯示如何使用類似 UNIX 的命令和 JavaScript 來建立字符簽章。它們會使用 SHA-256 雜湊演算法來編碼簽章。

------
#### [ Command line ]

```
echo -n TOKEN_VALUE | openssl dgst -sha256 -sign PEM encoded RSA private key | openssl base64
```

------
#### [ JavaScript ]

```
const crypto = require('crypto')

const key = "PEM encoded RSA private key"

const k = crypto.createPrivateKey(key)
let sign = crypto.createSign('SHA256')
sign.write(t)
sign.end()
const s = sign.sign(k, 'base64')
```

------

# 疑難排解您的授權方
<a name="custom-auth-troubleshooting"></a>

 本主題逐步解說可能會在自訂身分驗證工作流程中產生問題的常見問題，以及解決這些問題的步驟。若要最有效地疑難排解問題，請啟用 的 CloudWatch 日誌， AWS IoT Core 並將日誌層級設定為 **DEBUG**。您可以在 AWS IoT Core 主控台中啟用 CloudWatch 日誌 ([https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/iot/)：//)。如需針對 AWS IoT Core啟用和設定記錄的詳細資訊，請參閱 [設定 AWS IoT 記錄](configure-logging.md)。

**注意**  
如果您長期將日誌層級保留在 **DEBUG**，CloudWatch 可能會存放大量的記錄資料。這可能會增加您的 CloudWatch 費用。請考慮使用資源型記錄，以增加特定物件群組中僅限裝置的詳細資訊。如需資源型記錄的詳細資訊，請參閱 [設定 AWS IoT 記錄](configure-logging.md)。此外，當您完成疑難排解時，請將日誌層級降低到較不詳細的層級。

開始疑難排解之前，請檢閱 [了解自訂身分驗證工作流程](custom-authorizer.md)，以取得自訂身分驗證程序的高階檢視。這協助您了解可在哪裡尋找問題的來源。

本主題討論下列兩個可供您調查的領域。
+ 與您授權方 Lambda 函數相關的問題。
+ 與您裝置相關的問題。

## 檢查您的授權方 Lambda 函數中的問題
<a name="custom-auth-troubleshooting-lambda"></a>

執行下列步驟，以確定您裝置的連線嘗試正在叫用 Lambda 函數。

1. 確認哪個 Lambda 函數與您的授權方相關聯。

   若要執行此確認，您可以呼叫 [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html) API，或在 AWS IoT Core 主控台的 **Secure** (安全) 區段中按一下所需的授權方。

1. 檢查 Lambda 函數的叫用指標。執行下列步驟來執行此動作。

   1. 開啟 AWS Lambda 主控台 ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)：//)，然後選取與您的授權方相關聯的 函數。

   1. 選擇 **Monitor** (監控) 標籤，並檢視與您問題相關之時間範圍的指標。

1. 如果您未看到叫用，請確認 AWS IoT Core 具有叫用 Lambda 函數的許可。如果您看到叫用，請跳到下一個步驟。執行下列步驟來驗證您的 Lambda 函數是否具有必要的許可。

   1. 在 AWS Lambda 主控台中為您的函數選擇**許可**索引標籤。

   1. 在頁面底部尋找 **Resource-based Policy** (資源型政策) 區段。如果您的 Lambda 函數具有必要的許可，政策看起來像下列範例。  
****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Id": "default",
        "Statement": [
          {
            "Sid": "Id123",
            "Effect": "Allow",
            "Principal": {
              "Service": "iot.amazonaws.com"
            },
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-east-1:111111111111:function:FunctionName",
            "Condition": {
              "ArnLike": {
                "AWS:SourceArn": "arn:aws:iot:us-east-1:111111111111:authorizer/AuthorizerName"
              },
              "StringEquals": {
                "AWS:SourceAccount": "111111111111"
              }
            }
          }
        ]
      }
      ```

   1. 此政策會將函數的`InvokeFunction`許可授予 AWS IoT Core 委託人。如果您沒有看到它，您必須使用 [AddPermission](https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html) API 來新增它。下列範例顯示如何使用 AWS CLI來做到這一點。

      ```
      aws lambda add-permission --function-name FunctionName --principal iot.amazonaws.com --source-arn AuthorizerARn --statement-id Id-123 --action "lambda:InvokeFunction"
      ```

1. 如果您看到叫用，請確認沒有錯誤。錯誤可能表示 Lambda 函數未正確處理 AWS IoT Core 傳送給它的連線事件。

   如需在 Lambda 函數中處理事件的相關資訊，請參閱 [定義您的 Lambda 函式](custom-auth-lambda.md)。您可以使用 AWS Lambda 主控台中的測試功能 ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)：//) 在函數中硬式編碼測試值，以確保函數正確處理事件。

1. 如果您看到叫用沒有錯誤，但您的裝置無法連接 (或發佈、訂閱和接收訊息)，問題可能是您 Lambda 函數傳回的政策未對您裝置正在嘗試採取的動作提供許可。執行下列步驟，以判斷函數傳回的政策是否發生任何錯誤。

   1. 使用 Amazon CloudWatch Logs Insights 查詢，來掃描短時間內的記錄以檢查是否發生失敗。下列範例查詢會依時間戳記排序事件並尋找失敗。

      ```
      display clientId, eventType, status, @timestamp | sort @timestamp desc | filter status = "Failure"    
      ```

   1. 更新您的 Lambda 函數以記錄其傳回的資料， AWS IoT Core 以及觸發函數的事件。您可以使用這些記錄來檢查函數建立的政策。

1. 如果您看到叫用沒有錯誤，但您的裝置無法連接 (或發佈、訂閱和接收訊息)，另一個原因可能是您 Lambda 函數超過逾時限制。自訂授權方的 Lambda 函數逾時限制為 5 秒。您可以在 CloudWatch 日誌或指標中查看函數持續時間。

## 調查裝置問題
<a name="custom-auth-troubleshooting-investigate"></a>

如果您發現叫用 Lambda 函數沒有問題，函數傳回的政策也沒有問題，請尋找裝置嘗試連線方面的問題。格式不正確的連線請求可能會導致 AWS IoT Core 不觸發您的授權方。在 TLS 和應用程式層可能會同時發生連線問題。

**可能的 TLS 層問題：**
+ 客戶必須在所有自訂身分驗證請求中傳遞主機名稱標頭 (HTTP、MQTT over WebSockets) 或伺服器名稱指示 TLS 延伸 (HTTP、MQTT over WebSockets、MQTT)。在這兩種情況下，傳遞的值必須符合您帳戶的其中一個 AWS IoT Core 資料端點。這些是當您執行下列 CLI 命令時傳回的端點。
  + `aws iot describe-endpoint --endpoint-type iot:Data-ATS`
  + `aws iot describe-endpoint --endpoint-type iot:Data` (適用於舊式 VeriSign 端點)
+ 使用自訂身分驗證進行 MQTT 連線的裝置也須傳遞應用程式層通訊協定交涉 (ALPN) TLS 延伸 (其值為 `mqtt`)。
+ 自訂身分驗證目前僅適用於連接埠 443。

**可能的應用程式層問題：**
+ 如果已啟用簽署 (在您的授權方中，`signingDisabled` 欄位是 false)，請尋找下列簽章問題。
  + 確定您是在 `x-amz-customauthorizer-signature` 標頭或在查詢字串參數中傳遞字符簽章。
  + 確定服務不是簽署字符以外的值。
  + 確定您在標頭或查詢參數中傳遞字符，而此標頭或查詢參數是您在授權方的 `token-key-name` 欄位中所指定的。
+ 確定您在 `x-amz-customauthorizer-name` 標頭或查詢字串參數中傳遞的授權方名稱是有效的，或者您已為您的帳戶定義預設授權方。

# Authorization
<a name="iot-authorization"></a>

授權是授與許可給已驗證身分的程序。您可以在 AWS IoT Core 中使用 AWS IoT Core 和 IAM 政策授予許可。本主題涵蓋 AWS IoT Core 政策。如需建立 IAM 政策的詳細資訊，請參閱 [的身分和存取管理 AWS IoT](security-iam.md) 和 [AWS IoT 如何使用 IAM](security_iam_service-with-iam.md)。

AWS IoT Core 政策會決定已驗證身分可執行的操作。裝置、行動應用程式、Web 應用程式和桌面應用程式，都會使用未驗證的身分，已驗證的身分甚至可以是輸入 CLI AWS IoT Core 命令的使用者。只有當身分具有授予這些 AWS IoT Core 操作許可的政策時，才能執行操作。

 AWS IoT Core 政策和 IAM 政策都與 搭配使用， AWS IoT Core 以控制身分 （也稱為*委託人*) 可執行的操作。您使用的政策類型取決於您用來進行身分驗證的身分類型 AWS IoT Core。

AWS IoT Core 操作分為兩個群組：
+ 控制平面 API 可讓您執行管理任務，例如建立或更新憑證、物件、規則等。
+ 資料平面 API 可讓您將資料傳送至 並從中接收資料 AWS IoT Core。

您使用的政策類型，取決於您正使用控制平面或資料平面 API。

下表說明身分類型、其使用的通訊協定以及可用於授權的政策類型。


**AWS IoT Core 資料平面 API 和政策類型**  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/iot-authorization.html)


**AWS IoT Core 控制平面 API 和政策類型**  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/iot-authorization.html)

AWS IoT Core 政策會連接到 X.509 憑證、Amazon Cognito 身分或物件群組。IAM 政策會連接至 IAM 使用者、群組或角色。如果您使用 AWS IoT 主控台或 AWS IoT Core CLI 連接政策 （連接至憑證、Amazon Cognito Identity 或物件群組），您可以使用 AWS IoT Core 政策。否則，您使用連接到物件群組的 IAM policy. AWS IoT Core policies 適用於該物件群組中的任何物件。若要讓 AWS IoT Core 政策生效， `clientId`和 物件名稱必須相符。

政策型授權是一項強大工具。能夠讓您完全控制裝置、使用者或應用程式可在 AWS IoT Core執行的動作。例如，請考慮 AWS IoT Core 使用憑證連線至 的裝置。您可以允許該裝置存取所有 MQTT 主題，或者限制其存取單一主題。以另一個範例而言，假設一名使用者於命令列輸入 CLI 命令。透過使用政策，您可以允許或拒絕使用者存取任何命令或 AWS IoT Core 資源。您也可以控制應用程式存取 AWS IoT Core 資源。

由於 AWS IoT 快取政策文件的方式，對政策所做的變更可能需要幾分鐘的時間才能生效。亦即，存取最近已授與存取權的資源可能需要幾分鐘的時間，而且在撤銷資源的存取權之後，可能仍有數分鐘的時間可存取該資源。

## AWS 訓練和認證
<a name="iot-authorization-training"></a>

如需有關 中授權的資訊 AWS IoT Core，請前往 AWS Training and Certification 網站上的 [Deep Dive to AWS IoT Core Authentication and Authorization](https://www.aws.training/Details/Curriculum?id=42335) 課程。

# AWS IoT Core 政策
<a name="iot-policies"></a>

AWS IoT Core 政策是 JSON 文件。它們遵循與 IAM 政策相同的慣例。 AWS IoT Core 支援具名政策，因此許多身分可以參考相同的政策文件。具名政策會經過版本控制，因此可輕鬆還原。

AWS IoT Core 政策可讓您控制對 AWS IoT Core 資料平面的存取。 AWS IoT Core 資料平面包含您可進行的操作，像是連線至 AWS IoT Core 訊息代理程式、傳送及接收 MQTT 訊息，以及取得或更新物件的 Device Shadow。

 AWS IoT Core 政策是包含一或多個政策陳述式的 JSON 文件。每個陳述式都包含：
+ `Effect`，指定是否允許或拒絕該動作。
+ `Action`，指定政策允許或拒絕的動作。
+ `Resource`，指定資源或動作可用或不可用的資源。

由於 AWS IoT 快取政策文件的方式，對政策所做的變更可能需要 6 到 8 分鐘才會生效。亦即，存取最近已授與存取權的資源可能需要幾分鐘的時間，而且在撤銷資源的存取權之後，可能仍有數分鐘的時間可存取該資源。

AWS IoT Core 政策可以連接到 X.509 憑證、Amazon Cognito 身分和物件群組。附加至物件群組的政策會套用至該群組內的任何物件。若要使政策生效，`clientId` 與物件名稱必須相符。 AWS IoT Core 政策遵循與 IAM 政策相同的政策規避邏輯。根據預設，所有的政策都會以隱含方式拒絕。任何身分型或資源型政策中的明確允許會覆寫預設行為。任何政策中的明確拒絕會覆寫任何允許。如需詳細資訊，請參閱《AWS Identity and Access Management 使用者指南》**中的[政策評估邏輯](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow)。

**Topics**
+ [AWS IoT Core 政策動作](iot-policy-actions.md)
+ [AWS IoT Core 動作資源](iot-action-resources.md)
+ [AWS IoT Core 政策變數](iot-policy-variables.md)
+ [預防跨服務混淆代理人](cross-service-confused-deputy-prevention.md)
+ [AWS IoT Core 政策範例](example-iot-policies.md)
+ [使用 Amazon Cognito 身分授權](cog-iot-policies.md)

# AWS IoT Core 政策動作
<a name="iot-policy-actions"></a>

以下為 AWS IoT Core定義的政策動作：MQTT 政策動作

`iot:Connect`  
代表連線至 AWS IoT Core 訊息中介裝置的許可。代理程式每次接收 `iot:Connect` 要求，就會檢查 `CONNECT` 許可。訊息代理程式不允許兩個相同用戶端 ID 的用戶端同時保持連線。第二個用戶端連線之後，代理程式會關閉現有的連線。使用 `iot:Connect` 許可，以確保僅使用特定用戶端 ID 的已授權用戶端可連線。

`iot:DeleteConnection`  
代表將連線的 MQTT 用戶端從 中斷連線的許可 AWS IoT Core。每次發出強制中斷連線用戶端的請求時，都會檢查 `iot:DeleteConnection`許可。當您中斷連接用戶端時， 會 AWS IoT Core 關閉用戶端的網路連線，並選擇性地清除工作階段狀態。

`iot:GetRetainedMessage`  
代表單一保留訊息內容的取得許可。保留訊息是已設定 RETAIN 旗標並存放的訊息 AWS IoT Core。如需取得所有帳戶保留訊息清單的許可，請參閱 [iot:ListRetainedMessages](#action_listretainedmessages)。

`iot:ListRetainedMessages`  
代表與帳戶保留訊息相關之摘要資訊的擷取許可，但不包括訊息內容。保留訊息是已設定 RETAIN 旗標並存放的訊息 AWS IoT Core。針對此動作指定的資源 ARN 必須是 `*`。如需取得單一保留訊息內容的許可，請參閱 [iot:GetRetainedMessage](#action_getretainpublish)。

`iot:Publish`  
代表發佈 MQTT 主題的許可。代理程式每次接收 PUBLISH 請求，就會檢查此許可。您可以使用此許可來允許用戶端發佈至特定主題模式。  
您必須也授予 `iot:Connect` 的許可，方能授予 `iot:Publish` 的許可。

`iot:Receive`  
代表從 接收訊息的許可 AWS IoT Core。每次在將訊息傳送至用戶端時，系統就會確認 `iot:Receive` 許可。由於每次交付都會檢查此許可，因此您可以用其來撤銷目前訂閱某主題的用戶端許可。

`iot:RetainPublish`  
代表發佈已設定 RETAIN 旗標之 MQTT 訊息的許可。  
您必須也授予 `iot:Publish` 的許可，方能授予 `iot:RetainPublish` 的許可。

`iot:Subscribe`  
代表主題篩選條件的訂閱許可。代理程式每次接收 SUBSCRIBE 請求，就會檢查此許可。可以使用此許可來允許用戶端訂閱與特定主題模式相符的主題。  
您必須也授予 `iot:Connect` 的許可，方能授予 `iot:Subscribe` 的許可。Device Shadow 政策動作

`iot:DeleteThingShadow`  
代表可刪除物件 Device Shadow 的許可。每次發出刪除物件 Device Shadow 內容的請求時，就會檢查一次 `iot:DeleteThingShadow` 許可。

`iot:GetThingShadow`  
代表可擷取物件 Device Shadow 的許可。每次發出擷取物件 Device Shadow 內容的請求時，就會檢查一次 `iot:GetThingShadow` 許可。

`iot:ListNamedShadowsForThing`  
代表可列出物件具名影子的許可。每次發出列出物件具名影子的請求時，就會檢查一次 `iot:ListNamedShadowsForThing` 許可。

`iot:UpdateThingShadow`  
代表可更新裝置影子的許可。每次發出更新物件 Device Shadow 內容的請求時，就會檢查一次 `iot:UpdateThingShadow` 許可。

**注意**  
任務執行政策動作僅適用於 HTTP TLS 端點。如果您使用 MQTT 端點，必須使用此主題上述所定義的 MQTT 政策動作。  
如需示範此情況的任務執行政策範例，請參閱可與 MQTT 通訊協定搭配使用的 [基本任務政策範例](basic-jobs-example.md)。任務執行 AWS IoT Core 政策動作

`iotjobsdata:DescribeJobExecution`  
代表可擷取指定物件之任務執行的許可。每次發出取得任務執行的要求時，就會檢查一次 `iotjobsdata:DescribeJobExecution` 許可。

`iotjobsdata:GetPendingJobExecutions`  
代表可擷取任務 (對物件來說並非結束狀態) 之清單的許可。每次發出擷取清單的要求時，就會檢查一次 `iotjobsdata:GetPendingJobExecutions` 許可。

`iotjobsdata:UpdateJobExecution`  
代表可更新任務執行的許可。每次發出更新任務執行狀態的要求時，就會檢查一次 `iotjobsdata:UpdateJobExecution` 許可。

`iotjobsdata:StartNextPendingJobExecution`  
代表可取得並啟動物件之下一個待定任務執行的許可。(也就是將狀態為 QUEUED 的任務執行，更新為 IN\$1PROGRESS。) 每次發出啟動下一個待定任務執行的要求時，就會檢查一次 `iotjobsdata:StartNextPendingJobExecution` 許可。AWS IoT Core 登入資料提供者政策動作

`iot:AssumeRoleWithCertificate`  
代表呼叫 AWS IoT Core 憑證提供者以使用憑證型身分驗證擔任 IAM 角色的許可。每次向 AWS IoT Core 登入資料提供者提出擔任角色的請求時，都會檢查 `iot:AssumeRoleWithCertificate`許可。

# AWS IoT Core 動作資源
<a name="iot-action-resources"></a>

若要指定 AWS IoT Core 政策動作的資源，請使用資源的 Amazon Resource Name (ARN)。所有資源 ARNs都遵循下列格式：

```
arn:partition:iot:region:AWS-account-ID:Resource-type/Resource-name
```

下表顯示要為每個動作類型指定的資源。ARN 範例適用於分區 `123456789012`中的帳戶 ID `aws`，以及區域 的特定 `us-east-1`。如需 ARNs，請參閱 AWS Identity and Access Management 《 使用者指南》中的 [Amazon Resource Name (ARNs)](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference-arns.html)。


| Action | Resource Type (資源類型) | 資源名稱 | ARN 範例 | 
| --- | --- | --- | --- | 
| iot:Connect | client |  用戶端的用戶端 ID  | arn:aws:iot:us-east-1:123456789012:client/myClientId | 
| iot:DeleteConnection | client |  用戶端的用戶端 ID  | arn:aws:iot:us-east-1:123456789012:client/myClientId | 
| iot:DeleteThingShadow | thing |  物件的名稱和影子的名稱，如果適用的話  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne arn:aws:iot:us-east-1:123456789012:thing/thingOne/shadowOne  | 
| iotjobsdata:DescribeJobExecution | thing |  物件的名稱  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne  | 
| iotjobsdata:GetPendingJobExecutions | thing |  物件的名稱  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne  | 
| iot:GetRetainedMessage | topic |  保留訊息主題  |  arn:aws:iot:us-east-1:123456789012:topic/myTopicName  | 
| iot:GetThingShadow | thing |  物件的名稱和影子的名稱，如果適用的話  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne arn:aws:iot:us-east-1:123456789012:thing/thingOne/shadowOne  | 
| iot:ListNamedShadowsForThing | 全部 | 全部 |  \$1 | 
| iot:ListRetainedMessages | 全部 | 全部 |  \$1 | 
| iot:Publish | topic |  主題字串  | arn:aws:iot:us-east-1:123456789012:topic/myTopicName | 
| iot:Receive | topic |  主題字串  | arn:aws:iot:us-east-1:123456789012:topic/myTopicName | 
| iot:RetainPublish | topic |  發佈已設定 RETAIN 旗標的主題  |  arn:aws:iot:us-east-1:123456789012:topic/myTopicName  | 
| iotjobsdata:StartNextPendingJobExecution | thing |  物件的名稱  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne  | 
| iot:Subscribe | topicfilter | 主題篩選條件字串 | arn:aws:iot:us-east-1:123456789012:topicfilter/myTopicFilter | 
| iotjobsdata:UpdateJobExecution | thing |  物件的名稱  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne  | 
| iot:UpdateThingShadow | thing |  物件的名稱和影子的名稱，如果適用的話  |  arn:aws:iot:us-east-1:123456789012:thing/thingOne arn:aws:iot:us-east-1:123456789012:thing/thingOne/shadowOne  | 
| iot:AssumeRoleWithCertificate | rolealias |  指向角色 ARN 的角色別名  |  arn:aws:iot:us-east-1:123456789012:rolealias/CredentialProviderRole\$1alias | 

# AWS IoT Core 政策變數
<a name="iot-policy-variables"></a>

AWS IoT Core 定義可在 `Resource`或 `Condition`區塊中的政策中使用的 AWS IoT Core 政策變數。當政策受到評估時，實際值就會替代政策變數。例如，如果裝置連接到用戶端 ID 為 100-234-3456 AWS IoT Core 的訊息中介裝置，`iot:ClientId`政策變數會在政策文件中替換為 100-234-3456。

AWS IoT Core 政策可以使用萬用字元，並遵循與 IAM 政策類似的慣例。在字串中插入 `*` (星號) 可以視為萬用字元，比對任何字元。例如，您可以使用 `*` 在政策的 `Resource` 屬性描述多個 MQTT 主題名稱。字元 `+` 和 `#` 在政策中視為文字字串。如需示範如何使用萬用字元的政策範例，請參閱 [在 MQTT 和 AWS IoT Core 政策中使用萬用字元](pub-sub-policy.md#pub-sub-policy-cert)。

您也可以使用具有固定值的預先定義政策變數，表示具有特殊含意的字元。這些特殊字元包括 `$(*)`、`$(?)` 和 `$($)`。如需更多關於政策變數與特殊字元的資訊，請參閱 [IAM 政策元素：變數與標籤](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html)和[建立具有多個索引鍵或值的條件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_multi-value-conditions.html)。

**Topics**
+ [基本 AWS IoT Core 政策變數](basic-policy-variables.md)
+ [物件政策變數](thing-policy-variables.md)
+ [X.509 憑證 AWS IoT Core 政策變數](cert-policy-variables.md)

# 基本 AWS IoT Core 政策變數
<a name="basic-policy-variables"></a>

AWS IoT Core 定義下列基本政策變數：
+ `aws:SourceIp`：連接至 AWS IoT Core 訊息中介裝置的用戶端 IP 地址。
+ `iot:ClientId`：用於連接至 AWS IoT Core 訊息代理程式的用戶端 ID。
+ `iot:DomainName`：用戶端連線的網域名稱 AWS IoT Core。

**Topics**
+ [`ClientId` 和 `SourceIp`政策變數的範例](#basic-policy-variables-example)
+ [`iot:DomainName` 政策變數的範例](#basic-policy-variables-example-domain)

## `ClientId` 和 `SourceIp`政策變數的範例
<a name="basic-policy-variables-example"></a>

下列 AWS IoT Core 政策顯示使用政策變數的政策。 `aws:SourceIp`可用於政策的條件元素，以允許委託人僅在特定地址範圍內提出 API 請求。如需範例，請參閱 [授權使用者和雲端服務使用 AWS IoT 任務](iam-policy-users-jobs.md)。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/clientid1"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/my/topic/${iot:ClientId}"
			],
			"Condition": {
				"IpAddress": {
					"aws:SourceIp": "123.45.167.89"
				}
			}
		}
	]
}
```

在這些範例中， `${iot:ClientId}` 會在評估政策時，以連線至 AWS IoT Core 訊息中介裝置的用戶端 ID 取代。在使用諸如 `${iot:ClientId}` 的政策變數時，您可能會意外開放部分主題的存取權限。例如，若您的政策使用 `${iot:ClientId}` 來指定主題篩選條件：

```
{
	"Effect": "Allow",
	"Action": [
		"iot:Subscribe"
	],
	"Resource": [
		"arn:aws:iot:us-east-1:123456789012:topicfilter/my/${iot:ClientId}/topic"
	]
}
```

用戶端可使用 `+` 作為用戶端 ID 來連線，使用者即可訂閱符合主題篩選條件 `my/+/topic` 的任何主題。若要避免這類安全漏洞，請使用 `iot:Connect` 政策動作來控制可連接的用戶端 ID。例如，此政策僅允許那些用戶端 ID 為 `clientid1` 的用戶端連接：

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/clientid"
			]
		}
	]
}
```

**注意**  
不建議搭配 `Connect` 使用政策變數 `${iot:ClientId}`。沒有對 `ClientId` 的值進行檢查，因此具有不同用戶端 ID 的附加工具可以通過驗證，但會導致連線中斷。因為允許任何 `ClientId`，所以設定隨機用戶端 ID 可以略過物件群組政策。

## `iot:DomainName` 政策變數的範例
<a name="basic-policy-variables-example-domain"></a>

您可以新增`iot:DomainName`政策變數，以限制允許使用哪些網域。新增`iot:DomainName`政策變數可讓裝置僅連線到特定設定的端點。

下列政策允許裝置連線到指定的網域。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": {
		"Sid": "AllowConnectionsToSpecifiedDomain",
		"Effect": "Allow",
		"Action": [
			"iot:Connect"
		],
		"Resource": "arn:aws:iot:us-east-1:123456789012:client/clientid",
		"Condition": {
			"StringEquals": {
				"iot:DomainName": "d1234567890abcdefghij-ats.iot.us-east-1.amazonaws.com"
			}
		}
	}
}
```

下列政策拒絕裝置連線到指定的網域。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": {
		"Sid": "DenyConnectionsToSpecifiedDomain",
		"Effect": "Deny",
		"Action": [
			"iot:Connect"
		],
		"Resource": "arn:aws:iot:us-east-1:123456789012:client/clientid",
		"Condition": {
			"StringEquals": {
				"iot:DomainName": "d1234567890abcdefghij-ats.iot.us-east-1.amazonaws.com"
			}
		}
	}
}
```

如需政策條件式運算子的詳細資訊，請參閱 [IAM JSON 政策元素：條件式運算子](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)。如需網域組態的詳細資訊，請參閱[什麼是網域組態？](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html)。

# 物件政策變數
<a name="thing-policy-variables"></a>

物件政策變數可讓您撰寫 AWS IoT Core 政策，根據物件名稱、物件類型和物件屬性值等物件屬性來授予或拒絕許可。您可以使用物件政策變數來套用相同的政策來控制許多 AWS IoT Core 裝置。如需裝置佈建的詳細資訊，請參閱[裝置佈建](iot-provision.html)。

如果您使用非專屬物件關聯，則可以將相同的憑證連接到多個物件。若要維持明確的關聯並避免潛在的衝突，您必須將用戶端 ID 與物件名稱相符。在此情況下，您會從用戶端 ID 取得物件名稱，該用戶端 ID 位於當物件連線時傳送的 MQTT `Connect` 訊息中 AWS IoT Core。

使用 AWS IoT Core 政策中的物件政策變數時，請注意下列事項。
+ 使用 [AttachThingPrincipal](https://docs.aws.amazon.com/iot/latest/apireference/API_AttachThingPrincipal.html) API，將憑證或委託人 (已驗證的 Amazon Cognito 身分) 連接至物件。
+ 如果具有非專屬物件關聯，當您將物件名稱取代為物件政策變數時，MQTT 連線訊息或 TLS 連線`clientId`中的 值必須與物件名稱完全相符。

現已提供下列物件政策變數：
+ `iot:Connection.Thing.ThingName`

  這會解析為正在評估政策之 AWS IoT Core 登錄檔中的物件名稱。 AWS IoT Core 會使用裝置在驗證時提供的憑證來判斷要使用哪些物件來驗證連線。本政策變數僅在裝置透過 MQTT 或 MQTT over WebSocket 通訊協定進行連線時可用。
+ `iot:Connection.Thing.ThingTypeName`

  當政策受到評估時，這可以解析為所屬物件相關的物件類型。MQTT/WebSocket 連線的用戶端 ID 必須與物件名稱相同。本政策變數僅在透過 MQTT 或是經 WebSocket 通訊協定的 MQTT 進行連線時可用。
+ `iot:Connection.Thing.Attributes[attributeName]`

  當政策受到評估時，這可以解析為所屬物件相關的特定屬性值。單一物件至多可具備 50 個屬性。每一屬性均可作為政策變數：`iot:Connection.Thing.Attributes[attributeName]`，其中 *attributeName* 為屬性名稱。MQTT/WebSocket 連線的用戶端 ID 必須與物件名稱相同。本政策變數僅在透過 MQTT 或是經 WebSocket 通訊協定的 MQTT 進行連線時可用。
+ `iot:Connection.Thing.IsAttached`

  `iot:Connection.Thing.IsAttached: ["true"]` 強制執行只有在 中註冊 AWS IoT 並連接到主體的裝置才能存取政策內的許可。如果裝置提供的憑證未連接到登錄檔中的 AWS IoT Core IoT 物件，您可以使用此變數來防止 AWS IoT Core 裝置連接到 。此變數具有 值，`true`或`false`指出連線物件使用 [AttachThingPrincipal](https://docs.aws.amazon.com/iot/latest/apireference/API_AttachThingPrincipal.html) API 連接到登錄檔中的憑證或 Amazon Cognito 身分。物件名稱作為用戶端 ID。

如果您的用戶端 ID 與您的物件名稱相符，或者您只將憑證連接到物件，則使用政策定義中的政策變數可以簡化政策管理。您可以使用物件政策變數定義單一政策，而不是為每個 IoT 物件建立個別政策。此政策可以動態套用至所有裝置。以下是顯示其運作方式的範例政策。如需詳細資訊，請參閱[將 AWS IoT 物件與 MQTT 用戶端連線建立關聯](exclusive-thing.md)。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Condition": {
				"StringLike": {
					"iot:ClientId": "*${iot:Connection.Thing.Attributes[envType]}"
				}
			},
			"Effect": "Allow",
			"Action": "iot:Connect",
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/*"
		}
	]
}
```

 AWS IoT Core 如果物件的用戶端 ID 以`envType`其屬性的值結尾，則此政策範例允許物件連線到 。只有具有相符用戶端 ID 模式的物件才能連線。

# X.509 憑證 AWS IoT Core 政策變數
<a name="cert-policy-variables"></a>

X.509 憑證政策變數可協助撰寫 AWS IoT Core 政策。這些政策會根據 X.509 憑證屬性授予許可。下列各節說明如何使用這些憑證政策變數。

**重要**  
如果您的 X.509 憑證不包含特定的憑證屬性，但您的政策文件中使用了對應的憑證政策變數，則政策評估可能會導致非預期的行為。

## CertificateId
<a name="cert-policy-variables-certid"></a>

在 [RegisterCertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCertificate.html) API 中，`certificateId` 會顯示在回應內文中。若要取得憑證的相關資訊，請使用 [DescribeCertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeCertificate.html) `certificateId`中的 。

## 發行者屬性
<a name="issuer-attributes"></a>

下列 AWS IoT Core 政策變數支援根據憑證發行者設定的憑證屬性，允許或拒絕許可。
+ `iot:Certificate.Issuer.DistinguishedNameQualifier`
+ `iot:Certificate.Issuer.Country`
+ `iot:Certificate.Issuer.Organization`
+ `iot:Certificate.Issuer.OrganizationalUnit`
+ `iot:Certificate.Issuer.State`
+ `iot:Certificate.Issuer.CommonName`
+ `iot:Certificate.Issuer.SerialNumber`
+ `iot:Certificate.Issuer.Title`
+ `iot:Certificate.Issuer.Surname`
+ `iot:Certificate.Issuer.GivenName`
+ `iot:Certificate.Issuer.Initials`
+ `iot:Certificate.Issuer.Pseudonym`
+ `iot:Certificate.Issuer.GenerationQualifier` 

## 主體屬性
<a name="subject-attributes"></a>

下列 AWS IoT Core 政策變數支援根據憑證發行者設定的憑證主體屬性授予或拒絕許可。
+ `iot:Certificate.Subject.DistinguishedNameQualifier`
+ `iot:Certificate.Subject.Country`
+ `iot:Certificate.Subject.Organization`
+ `iot:Certificate.Subject.OrganizationalUnit`
+ `iot:Certificate.Subject.State`
+ `iot:Certificate.Subject.CommonName`
+ `iot:Certificate.Subject.SerialNumber`
+ `iot:Certificate.Subject.Title`
+ `iot:Certificate.Subject.Surname`
+ `iot:Certificate.Subject.GivenName`
+ `iot:Certificate.Subject.Initials`
+ `iot:Certificate.Subject.Pseudonym`
+ `iot:Certificate.Subject.GenerationQualifier` 

X.509 憑證為這些屬性提供包含一或多個值的選項。根據預設，每個多值屬性的政策變數會回傳第一個值。例如，`Certificate.Subject.Country` 屬性可能包含國家/地區名稱的清單，但在政策中評估時，會將 `iot:Certificate.Subject.Country` 取代為第一個國家/地區的名稱。

您可以使用開頭為一的索引，要求第一個值以外的特定屬性值。例如，在 `iot:Certificate.Subject.Country.1` 屬性中，第二個國家/地區名稱將取代 `Certificate.Subject.Country`。若您指定的索引值不存在 (例如，僅對該屬性指派兩個值但您要求第三個值)，將不會進行替換，而授權會失敗。您可以在政策變數名稱添加 `.List` 尾碼，指定屬性全部的值。

## 發行者別名屬性
<a name="issuer-alternate-name-attributes"></a>

下列 AWS IoT Core 政策變數支援根據憑證發行者設定的發行者替代名稱屬性授予或拒絕許可。
+ `iot:Certificate.Issuer.AlternativeName.RFC822Name`
+ `iot:Certificate.Issuer.AlternativeName.DNSName`
+ `iot:Certificate.Issuer.AlternativeName.DirectoryName`
+ `iot:Certificate.Issuer.AlternativeName.UniformResourceIdentifier`
+ `iot:Certificate.Issuer.AlternativeName.IPAddress`

## 主體別名屬性
<a name="subject-alternate-name-attributes"></a>

下列 AWS IoT Core 政策變數支援根據憑證發行者設定的主題替代名稱屬性授予或拒絕許可。
+ `iot:Certificate.Subject.AlternativeName.RFC822Name`
+ `iot:Certificate.Subject.AlternativeName.DNSName`
+ `iot:Certificate.Subject.AlternativeName.DirectoryName`
+ `iot:Certificate.Subject.AlternativeName.UniformResourceIdentifier`
+ `iot:Certificate.Subject.AlternativeName.IPAddress`

## 其他屬性
<a name="other-attributes"></a>

您可以使用 根據憑證的序號，`iot:Certificate.SerialNumber`允許或拒絕存取 AWS IoT Core 資源。`iot:Certificate.AvailableKeys` 政策變數包含的所有憑證政策變數名稱都具備值。

# 使用 X.509 憑證政策變數
<a name="use-policy-variables"></a>

本主題提供如何使用憑證政策變數的詳細資訊。當您建立 AWS IoT Core 根據 X.509 憑證屬性授予許可的政策時，X.509 憑證政策變數至關重要。如果您的 X.509 憑證不包含特定的憑證屬性，但您的政策文件中使用了對應的憑證政策變數，則政策評估可能會導致非預期的行為。這是因為政策陳述式中不會評估缺少的政策變數。

**Topics**
+ [X.509 憑證範例](#certificate-example)
+ [使用憑證發行者屬性做為憑證政策變數](#issuer-attributes-policy)
+ [使用憑證主體屬性做為憑證政策變數](#subject-attributes-policy)
+ [使用憑證發行者替代名稱屬性做為憑證政策變數](#issuer-alternate-name-attributes-policy)
+ [使用憑證主體替代名稱屬性做為憑證政策變數](#subject-alternate-name-attributes-policy)
+ [使用其他憑證屬性做為憑證政策變數](#other-attributes-policy)
+ [X.509 憑證政策變數限制](#policy-limits)
+ [使用憑證政策變數的範例政策](#example-attributes-policy)

## X.509 憑證範例
<a name="certificate-example"></a>

典型的 X.509 憑證可能會出現如下。此範例憑證包含憑證屬性。在評估 AWS IoT Core 政策期間，下列憑證屬性會填入為憑證政策變數：`Serial Number`、`Issuer`、`X509v3 Issuer Alternative Name`、 `Subject`和 `X509v3 Subject Alternative Name`。

```
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            92:12:85:cb:b7:a5:e0:86
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=IoT Devices, OU=SmartHome, ST=WA, CN=IoT Devices Primary CA, 
				GN=Primary CA1/initials=XY/dnQualifier=Example corp,
				SN=SmartHome/ title=CA1/pseudonym=Primary_CA/generationQualifier=2/serialNumber=987		
        Validity
            Not Before: Mar 26 03:25:40 2024 GMT
            Not After : Apr 28 03:25:40 2025 GMT
        Subject: C=US, O=IoT Devices, OU=LightBulb, ST=NY, CN=LightBulb Device Cert, 
				GN=Bulb/initials=ZZ/dnQualifier=Bulb001, 
				SN=Multi Color/title=RGB/pseudonym=RGB Device/generationQualifier=4/serialNumber=123
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    << REDACTED >>
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Key Usage: 
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Subject Alternative Name: 
                DNS:example.com, IP Address:1.2.3.4, URI:ResourceIdentifier001, email:device1@example.com, DirName:/C=US/O=IoT/OU=SmartHome/CN=LightBulbCert
            X509v3 Issuer Alternative Name: 
                DNS:issuer.com, IP Address:5.6.7.8, URI:PrimarySignerCA, email:primary@issuer.com, DirName:/C=US/O=Issuer/OU=IoT Devices/CN=Primary Issuer CA
    Signature Algorithm: sha256WithRSAEncryption
         << REDACTED >>
```

## 使用憑證發行者屬性做為憑證政策變數
<a name="issuer-attributes-policy"></a>

下表提供憑證發行者屬性如何填入 AWS IoT Core 政策的詳細資訊。


**要在政策中填入的發行者屬性**  

| 憑證發行者屬性 | 憑證政策變數 | 
| --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/use-policy-variables.html)  | 

## 使用憑證主體屬性做為憑證政策變數
<a name="subject-attributes-policy"></a>

下表提供如何在 AWS IoT Core 政策中填入憑證主體屬性的詳細資訊。


**要在政策中填入的主題屬性**  

| 憑證主體屬性 | 憑證政策變數 | 
| --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/use-policy-variables.html)  | 

## 使用憑證發行者替代名稱屬性做為憑證政策變數
<a name="issuer-alternate-name-attributes-policy"></a>

下表提供憑證發行者替代名稱屬性如何填入 AWS IoT Core 政策的詳細資訊。


**要在政策中填入的發行者替代名稱屬性**  

| X509v3 發行者替代名稱 | 政策中的屬性 | 
| --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/use-policy-variables.html)  | 

## 使用憑證主體替代名稱屬性做為憑證政策變數
<a name="subject-alternate-name-attributes-policy"></a>

下表提供如何在政策中 AWS IoT Core 填入憑證主體替代名稱屬性的詳細資訊。


**要在政策中填入的主題替代名稱屬性**  

| X509v3 主體替代名稱 | 政策中的屬性 | 
| --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/use-policy-variables.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/use-policy-variables.html)  | 

## 使用其他憑證屬性做為憑證政策變數
<a name="other-attributes-policy"></a>

下表提供如何在 AWS IoT Core 政策中填入其他憑證屬性的詳細資訊。


**要在政策中填入的其他屬性**  

| 其他憑證屬性 | 憑證政策變數 | 
| --- | --- | 
|  `Serial Number: 92:12:85:cb:b7:a5:e0:86`  |  `iot:Certificate.SerialNumber = 10525622389124227206`  | 

## X.509 憑證政策變數限制
<a name="policy-limits"></a>

以下限制適用於 X.509 憑證政策變數：

缺少政策變數  
如果您的 X.509 憑證不包含特定的憑證屬性，但您的政策文件中使用了對應的憑證政策變數，則政策評估可能會導致非預期的行為。這是因為政策陳述式中不會評估缺少的政策變數。

Certificate SerialNumber 格式  
AWS IoT Core 會將憑證序號視為十進位整數的字串表示法。例如，如果政策只允許用戶端 ID 與憑證序號相符的連線，則用戶端 ID 必須是十進位格式的序號。

萬用字元  
如果憑證屬性中存在萬用字元，則不會以憑證屬性值取代政策變數。這會將`${policy-variable}`文字保留在政策文件中。如此可能導致授權失敗。可使用下列萬用字元：`*`、`$`、`+`、`?` 及 `#`。

陣列欄位  
具備陣列的憑證屬性僅限五個項目，其他項目會遭到忽略。

字串長度  
所有字串值上限為 1024 個字元。如果憑證屬性包含超過 1024 個字元的字串，則不會以憑證屬性值取代政策變數。這會將 保留`${policy-variable}`在政策文件中。如此可能導致授權失敗。

特殊字元  
在政策變數中使用時，`,`、`"`、`\`、`+`、`=`、`<`、`>` 及 `;` 等任何特殊字元的字首必須加上反斜線 (`\`)。例如，`Amazon Web Services O=Amazon.com Inc. L=Seattle ST=Washington C=US` 會變成 `Amazon Web Service O\=Amazon.com Inc. L\=Seattle ST\=Washington C\=US`。

## 使用憑證政策變數的範例政策
<a name="example-attributes-policy"></a>

下列政策文件允許用戶端 ID 符合憑證序號的連線，並發佈至符合模式的主題：`${iot:Certificate.Subject.Organization}/device-stats/${iot:ClientId}/*`。

**重要**  
如果您的 X.509 憑證不包含特定的憑證屬性，但您的政策文件中使用了對應的憑證政策變數，則政策評估可能會導致非預期的行為。這是因為政策陳述式中不會評估缺少的政策變數。例如，如果您將下列政策文件連接到不包含 `iot:Certificate.Subject.Organization` 屬性的憑證，則不會在政策評估期間填入`iot:Certificate.Subject.Organization`憑證政策變數。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Certificate.SerialNumber}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/${iot:Certificate.Subject.Organization}/device-stats/${iot:ClientId}/*"
			]
		}
	]
}
```

您也可以使用 [Null 條件運算子](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Null)，以確保政策中使用的憑證政策變數會在政策評估期間填入。下列政策文件只有在憑證序號和憑證主體通用名稱屬性存在時，才允許 `iot:Connect` 搭配憑證。

所有憑證政策變數都有字串值，因此支援所有[字串條件運算子](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String)。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/*"
			],
			"Condition": {
				"Null": {
					"iot:Certificate.SerialNumber": "false",
					"iot:Certificate.Subject.CommonName": "false"
				}
			}
		}
	]
}
```

# 預防跨服務混淆代理人
<a name="cross-service-confused-deputy-prevention"></a>

*混淆代理人問題*屬於安全性議題，其中沒有執行動作許可的實體可以強制具有更多權限的實體執行該動作。在 中 AWS，跨服務模擬可能會導致混淆代理人問題。在某個服務 (*呼叫服務*) 呼叫另一個服務 (*被呼叫服務*) 時，可能會發生跨服務模擬。可以操縱呼叫服務來使用其許可，以其不應有存取許可的方式對其他客戶的資源採取動作。為了預防這種情況， AWS 提供的工具可協助您保護所有服務的資料，而這些服務主體已獲得您帳戶中資源的存取權。

若要限制將另一個服務 AWS IoT 提供給資源的許可，我們建議在資源政策中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn)和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount)全域條件內容金鑰。如果同時使用全域條件內容索引鍵，則在相同政策陳述式中使用`aws:SourceAccount` 值和 `aws:SourceArn` 值中的帳戶時，必須使用相同的帳戶 ID。

防範混淆代理人問題的最有效方法是使用 `aws:SourceArn` 全域條件內容索引鍵，其中包含資源的完整 Amazon Resource Name (ARN)。對於 AWS IoT，您的 `aws:SourceArn` 必須符合格式：`arn:aws:iot:region:account-id:resource-type/resource-id`適用於資源特定許可或 `arn:aws:iot:region:account-id:*`。resource-id 可以是允許資源的名稱或 ID，也可以是允許資源 IDs的萬用字元陳述式。請確定該*區域*符合您的 AWS IoT 區域，且*帳戶 ID* 符合您的客戶帳戶 ID。

下列範例示範如何使用 AWS IoT 角色信任政策中的 `aws:SourceArn`和 `aws:SourceAccount`全域條件內容索引鍵，來防止混淆代理人問題。如需更多範例，請參閱[預防混淆代理人的詳細範例](#cross-service-confused-deputy-prevention-examples)。

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":"iot.amazonaws.com"
         },
         "Action":"sts:AssumeRole",
         "Condition":{
            "StringEquals":{
               "aws:SourceAccount":"123456789012"
        },
            "ArnLike":{
               "aws:SourceArn":"arn:aws:iot:us-east-1:123456789012:*"
        }
         }
      }
   ]
}
```

**注意**  
如果您收到存取拒絕錯誤，可能是因為與 AWS Security Token Service (STS) 的服務整合不支援 `aws:SourceArn`和 `aws:SourceAccount` 內容金鑰。

## 預防混淆代理人的詳細範例
<a name="cross-service-confused-deputy-prevention-examples"></a>

**本節提供詳細範例，說明如何使用 AWS IoT 角色信任政策中的 `aws:SourceArn`和 `aws:SourceAccount`全域條件內容索引鍵來防止混淆代理人問題。**
+ [機群佈建](#cross-service-confused-deputy-prevention-fleet-provision)
+ [JITP](#cross-service-confused-deputy-prevention-JITP)
+ [登入資料提供者](#cross-service-confused-deputy-prevention-credential-provider)

### 機群佈建
<a name="cross-service-confused-deputy-prevention-fleet-provision"></a>

您可以使用[佈建範本資源來設定機群](https://docs.aws.amazon.com/iot/latest/developerguide/iot-provision.html)佈建。當佈建範本參考佈建角色時，該角色的信任政策可以包含 `aws:SourceArn`和 `aws:SourceAccount`條件索引鍵。這些金鑰會限制組態可以調用`sts:AssumeRole`請求的資源。

具有下列信任政策的角色只能由 IoT 主體 (`iot.amazonaws.com`) 擔任 中指定的佈建範本`SourceArn`。

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":"iot.amazonaws.com"
         },
         "Action":"sts:AssumeRole",
         "Condition":{
            "StringEquals":{
               "aws:SourceAccount":"123456789012"
        },
            "ArnLike":{
               "aws:SourceArn":"arn:aws:iot:us-east-1:123456789012:provisioningtemplate/example_template"
        }
         }
      }
   ]
}
```

### JITP
<a name="cross-service-confused-deputy-prevention-JITP"></a>

在[just-in-time佈建 (JITP)](https://docs.aws.amazon.com//iot/latest/developerguide/jit-provisioning.html) 中，您可以使用佈建範本做為與 CA 分開的資源，或將範本內文和角色定義為 CA 憑證組態的一部分。 AWS IoT 角色信任政策`aws:SourceArn`中的 值取決於您如何定義佈建範本。

#### 將佈建範本定義為個別資源
<a name="cross-service-confused-deputy-prevention-JITP-template"></a>

如果您將佈建範本定義為單獨的資源，則 的值`aws:SourceArn`可以是 `"arn:aws:iot:region:account-id:provisioningtemplate/example_template"`。您可以在 中使用相同的政策範例[機群佈建](#cross-service-confused-deputy-prevention-fleet-provision)。

#### 在 CA 憑證中定義佈建範本
<a name="cross-service-confused-deputy-prevention-JITP-CA"></a>

如果您在 CA 憑證資源中定義佈建範本，則 的值`aws:SourceArn`可以是 `"arn:aws:iot:region:account-id:cacert/cert_id"`或 `"arn:aws:iot:region:account-id:cacert/*"`。您可以在建立時未知資源識別符時使用萬用字元，例如 CA 憑證的 ID。

具有下列信任政策的角色只能由 IoT 主體 (`iot.amazonaws.com`) 擔任 中指定的 CA 憑證`SourceArn`。

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":"iot.amazonaws.com"
         },
         "Action":"sts:AssumeRole",
         "Condition":{
            "StringEquals":{
               "aws:SourceAccount":"123456789012"
        },
            "ArnLike":{
               "aws:SourceArn":"arn:aws:iot:us-east-1:123456789012:cacert/8ecde6884f3d87b1125ba31ac3fcb13d7016de7f57cc904fe1cb97c6ae98196e"
        }
         }
      }
   ]
}
```

建立 CA 憑證時，您可以在註冊組態中參考佈建角色。佈建角色的信任政策可以使用 `aws:SourceArn`來限制角色可以擔任哪些資源。不過，在註冊 CA 憑證的初始 [RegisterCACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCACertificate.html) 呼叫期間，您沒有條件中要指定的 CA 憑證 ARN`aws:SourceArn`。

若要解決此問題，例如，若要將佈建角色信任政策指定給向 註冊的特定 CA 憑證 AWS IoT Core，您可以執行下列動作：
+ 首先，呼叫 [RegisterCACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCACertificate.html) 而不提供 `RegistrationConfig` 參數。
+ 向 CA 憑證註冊後 AWS IoT Core，請呼叫 [UpdateCACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateCACertificate.html)。

  在 UpdateCACertificate 呼叫中，提供 `RegistrationConfig`，其中包含佈建角色信任政策，並將 `aws:SourceArn`設定為新註冊 CA 憑證的 ARN。

### 登入資料提供者
<a name="cross-service-confused-deputy-prevention-credential-provider"></a>

對於[AWS IoT Core 登入資料提供者](https://docs.aws.amazon.com//iot/latest/developerguide/authorizing-direct-aws.html)，請使用 AWS 帳戶 您在 中建立角色別名的相同 `aws:SourceAccount`，並指定符合 中角色別名資源類型之資源 ARN 的陳述式`aws:SourceArn`。建立 IAM 角色以搭配 AWS IoT Core 登入資料提供者使用時，您必須在`aws:SourceArn`條件中包含可能需要擔任該角色之任何角色別名的 ARNs，藉此授權跨服務`sts:AssumeRole`請求。

具有下列信任政策的角色只能由 中指定之 roleAlias 的 AWS IoT Core 登入資料提供者 (`credentials.iot.amazonaws.com`) 主體擔任`SourceArn`。如果委託人嘗試擷取`aws:SourceArn`條件中指定以外之角色別名的登入資料，即使該其他角色別名參考相同的 IAM 角色，請求也會遭到拒絕。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "credentials.iot.amazonaws.com"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "123456789012"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:iot:us-east-1:123456789012:rolealias/example_rolealias"
        }
      }
    }
  ]
}
```

# AWS IoT Core 政策範例
<a name="example-iot-policies"></a>

本節中的範例政策說明在 AWS IoT Core中完成一般任務所用的政策文件。在為解決方案建立政策時，您可以將其作為範例來開始。<a name="example-iot-policies-elements"></a>

本節中的範例使用這些政策元素：
+ [AWS IoT Core 政策動作](iot-policy-actions.md)
+ [AWS IoT Core 動作資源](iot-action-resources.md)
+ [AWS IoT 身分型政策範例](security_iam_id-based-policy-examples.md)
+ [基本 AWS IoT Core 政策變數](basic-policy-variables.md)
+ [X.509 憑證 AWS IoT Core 政策變數](cert-policy-variables.md)

**Topics**
+ [連接政策範例](connect-policy.md)
+ [發佈/訂閱政策範例](pub-sub-policy.md)
+ [連線和發佈政策範例](connect-and-pub.md)
+ [保留訊息政策範例](retained-message-policy-examples.md)
+ [憑證政策範例](certificate-policy-examples.md)
+ [物件政策範例](thing-policy-examples.md)
+ [基本任務政策範例](basic-jobs-example.md)

# 連接政策範例
<a name="connect-policy"></a>

下列政策拒絕用戶端 IDs`client1`和 連線`client2`的許可 AWS IoT Core，同時允許裝置使用用戶端 ID 連線。用戶端 ID 符合在 AWS IoT Core 登錄檔中註冊並連接到用於連線之主體的物件名稱：

**注意**  
對於已註冊的裝置，建議您使用 `Connect` 動作的[物件政策變數](thing-policy-variables.md)，並將物件附加至用於連線的主體。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Deny",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/client1",
				"arn:aws:iot:us-east-1:123456789012:client/client2"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		}
	]
}
```

下列政策會授予使用 AWS IoT Core 用戶端 ID 連線至 的許可`client1`。此政策範例適用於未註冊的裝置。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/client1"
			]
		}
	]
}
```

## MQTT 持續工作階段政策範例
<a name="persistent-sessions-examples"></a>

`connectAttributes` 可讓您在 IAM 政策中指定要在連線訊息中使用的屬性，例如 `PersistentConnect` 和 `LastWill`。如需詳細資訊，請參閱[使用 connectAttributes](mqtt.md#connect-attribute)。

下列政策允許與 `PersistentConnect` 功能連接：

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect"
					]
				}
			}
		}
	]
}
```

下列政策不允許 `PersistentConnect`，允許其他功能：

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringNotEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect"
					]
				}
			}
		}
	]
}
```

上述政策也可以使用 `StringEquals` 表達，並允許任何其他功能，包括新功能：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1"
        },
        {
            "Effect": "Deny",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:ConnectAttributes": [
                        "PersistentConnect"
                    ]
            }
        }
        }
    ]
}
```

下列政策允許透過 `PersistentConnect` 和 `LastWill` 連接，但不允許任何其他新功能：

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect",
						"LastWill"
					]
				}
			}
		}
	]
}
```

下列政策允許透過具有或沒有 `LastWill` 的用戶端進行全新連接，但不允許任何其他功能：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Effect": "Allow",
        "Action": [
            "iot:Connect"
        ],
        "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
        "Condition": {
            "StringEquals": {
                "iot:ConnectAttributes": "LastWill"
        }
        }
    }]
}
```

下列政策只允許使用預設功能進行連接：

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": []
				}
			}
		}
	]
}
```

下列政策僅允許與 `PersistentConnect` 連接，而且只要連線使用 `PersistentConnect`，就允許任何新功能：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:ConnectAttributes": [
                        "PersistentConnect"
                    ]
            }
        }
        }
    ]
}
```

下列政策指出連接必須同時使用 `PersistentConnect` 和 `LastWill`，而且不允許任何新功能：

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect",
						"LastWill"
					]
				}
			}
		},
		{
			"Effect": "Deny",
			"Action": [
				"iot:Connect"
			],
			"Resource": "*",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"PersistentConnect"
					]
				}
			}
		},
		{
			"Effect": "Deny",
			"Action": [
				"iot:Connect"
			],
			"Resource": "*",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"LastWill"
					]
				}
			}
		},
		{
			"Effect": "Deny",
			"Action": [
				"iot:Connect"
			],
			"Resource": "*",
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": []
				}
			}
		}
	]
}
```

下列政策不得具有 `PersistentConnect`，但可以具有 `LastWill`，而且不允許任何其他新功能：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:ConnectAttributes": [
                        "PersistentConnect"
                    ]
            }
        }
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
            "Condition": {
                "ForAllValues:StringEquals": {
                    "iot:ConnectAttributes": [
                        "LastWill"
                    ]
            }
        }
        }
    ]
}
```

下列政策只允許透過具有 `LastWill` 與主題 `"my/lastwill/topicName"` 的用戶端連接，而且只要其使用 `LastWill` 主題，就允許任何功能：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
            "Condition": {
                "ArnEquals": {
                "iot:LastWillTopic": "arn:aws:iot:us-east-1:123456789012:topic/my/lastwill/topicName"
            }
        }
        }
    ]
}
```

下列政策僅允許使用特定的 `LastWillTopic` 進行全新連接，而且只要其使用 `LastWillTopic`，就允許任何功能：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "arn:aws:iot:us-east-1:123456789012:client/client1",
            "Condition": {
                "ArnEquals": {
                "iot:LastWillTopic": "arn:aws:iot:us-east-1:123456789012:topic/my/lastwill/topicName"
            }
        }
        },
        {
            "Effect": "Deny",
            "Action": [
                "iot:Connect"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:ConnectAttributes": [
                        "PersistentConnect"
                    ]
            }
        }
        }
    ]
}
```

# 發佈/訂閱政策範例
<a name="pub-sub-policy"></a>

您使用的政策取決於您的連線方式 AWS IoT Core。您可以使用 MQTT AWS IoT Core 用戶端、HTTP 或 WebSocket 連線至 。當您使用 MQTT 用戶端連接，必須使用 X.509 憑證進行驗證。當您透過 HTTP 或 WebSocket 通訊協定連接時，必須使用 Signature 第 4 版和 Amazon Cognito 進行驗證。

**注意**  
對於已註冊的裝置，建議您使用 `Connect` 動作的[物件政策變數](thing-policy-variables.md)，並將物件附加至用於連線的主體。

**Topics**
+ [在 MQTT 和 AWS IoT Core 政策中使用萬用字元](#pub-sub-policy-cert)
+ [向/從特定主題發佈、訂閱及接收訊息的政策](#pub-sub-specific-topic)
+ [向/從具有特定前綴主題發佈、訂閱及接收訊息的政策](#pub-sub-policy-specific-topic-prefix)
+ [向/從各項裝置特定主題發佈、訂閱及接收訊息的政策](#pub-sub-specific-topic-device)
+ [向/從主題名稱中具有物件屬性的主題發佈、訂閱和接收訊息的政策](#pub-sub-topic-attribute)
+ [拒絕向特定主題名稱的子主題進行發佈的政策](#pub-sub-deny-publish)
+ [拒絕從特定主題名稱的子主題進行接收的政策](#pub-sub-deny-receive)
+ [從使用 MQTT 萬用字元的主題進行訂閱的政策](#pub-sub-topic-wildcard)
+ [適用 HTTP 和 WebSocket 用戶端的政策](#pub-sub-policy-cognito)

## 在 MQTT 和 AWS IoT Core 政策中使用萬用字元
<a name="pub-sub-policy-cert"></a>

MQTT 和 AWS IoT Core 政策具有不同的萬用字元，您應該在仔細考慮後選擇它們。在 MQTT 中，萬用字元 `+`和 `#` 用於 [MQTT 主題篩選條件](https://docs.aws.amazon.com/iot/latest/developerguide/topics.html#topicfilters)，以訂閱多個主題 name. AWS IoT Core policies 使用 `*` 和 `?`做為萬用字元，並遵循 [IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_grammar.html#policies-grammar-json)的慣例。在政策文件中，`*` 代表任意字元組合，`?` 則代表任何單一字元。在政策文件中，MQTT 萬用字元 `+` 和 `#` 視為沒有特殊含義的字元。若要在政策中的 `resource` 屬性描述多個主題名稱和主題篩選條件，請使用 `*` 和 `?` 萬用字元代替 MQTT 萬用字元。

當您選擇要在政策文件中使用的萬用字元時，請考慮該`*`字元不限於單一主題層級。`+` 字元僅限於 MQTT 主題篩選條件中的單一主題層級。要幫助將萬用字元規範限制為單一 MQTT 主題篩選條件層級，請考慮使用多個 `?` 字元。更多有關在政策資源中使用萬用字元的資訊以及它們比對的更多範例，請參閱[在資源 ARN 中使用萬用字元](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_elements_resource.html#reference_policies_elements_resource_wildcards)。

下表顯示 MQTT 用戶端的 AWS IoT Core 政策中使用的不同萬用字元。


| 萬用字元 | 是 MQTT 萬用字元 | MQTT 中的範例 | 是 AWS IoT Core 政策萬用字元 | MQTT 用戶端 AWS IoT Core 政策中的範例 | 
| --- | --- | --- | --- | --- | 
| \$1 | 是 | some/\$1 | 否 | N/A | 
| \$1 | 是 | some/\$1/topic | 否 | 不適用 | 
| \$1 | 否 | N/A | 是 | `topicfilter/some/*/topic` `topicfilter/some/sensor*/topic`  | 
| ? | 否 | N/A | 是 |  `topic/some/?????/topic` `topicfilter/some/sensor???/topic`  | 

## 向/從特定主題發佈、訂閱及接收訊息的政策
<a name="pub-sub-specific-topic"></a>

以下範例顯示已註冊和未註冊裝置向/從名為 "some\$1specific\$1topic" 的主題發佈、訂閱和接收訊息的情形。這些範例也突顯 `Publish` 和 `Receive` 使用 "topic" 作為資源，以及 `Subscribe` 使用 "topicfilter" 作為資源。

------
#### [ Registered devices ]

對於在 AWS IoT Core 登錄檔中註冊的裝置，下列政策允許裝置使用與登錄檔中物件名稱相符的 clientId 進行連線。針對名為 "some\$1specific\$1topic" 的主題，它也提供 `Publish`、`Subscribe` 和 `Receive` 的許可。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/some_specific_topic"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Subscribe"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topicfilter/some_specific_topic"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Receive"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/some_specific_topic"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

對於未在 AWS IoT Core 登錄檔中註冊的裝置，下列政策允許裝置使用 clientId1, clientId2 或 clientId3 進行連線。針對名為 "some\$1specific\$1topic" 的主題，它也提供 `Publish`、`Subscribe` 和 `Receive` 的許可。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/some_specific_topic"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Subscribe"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topicfilter/some_specific_topic"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Receive"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/some_specific_topic"
            ]
        }
    ]
}
```

------

## 向/從具有特定前綴主題發佈、訂閱及接收訊息的政策
<a name="pub-sub-policy-specific-topic-prefix"></a>

以下範例顯示已註冊和未註冊裝置向/從具有 "topic\$1prefix" 前綴的主題發佈、訂閱和接收訊息的情形。

**注意**  
請注意，`*`在此範例中使用萬用字元。雖然在單一陳述式中提供多個主題名稱的許可`*`非常有用，但透過為裝置提供比所需更多的權限，可能會導致意外的後果。因此，我們建議您在仔細考慮`*`之後，才使用萬用字元。

------
#### [ Registered devices ]

對於在 AWS IoT Core 登錄檔中註冊的裝置，下列政策允許裝置使用與登錄檔中物件名稱相符的 clientId 進行連線。針對以 "topic\$1prefix" 為前綴的主題，它也提供 `Publish`、`Subscribe` 和 `Receive` 的許可。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish",
				"iot:Receive"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/topic_prefix*"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Subscribe"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topicfilter/topic_prefix*"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

對於未在 AWS IoT Core 登錄檔中註冊的裝置，下列政策允許裝置使用 clientId1, clientId2 或 clientId3 進行連線。它也為以 "topic\$1prefix" 為前綴的主題提供 `Publish`、`Subscribe` 和 `Receive` 的許可。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish",
                "iot:Receive"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/topic_prefix*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Subscribe"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topicfilter/topic_prefix*"
            ]
        }
    ]
}
```

------

## 向/從各項裝置特定主題發佈、訂閱及接收訊息的政策
<a name="pub-sub-specific-topic-device"></a>

以下範例顯示已註冊和未註冊裝置向/從特定裝置專屬的主題發佈、訂閱和接收訊息的情形。

------
#### [ Registered devices ]

對於在 AWS IoT Core 登錄檔中註冊的裝置，下列政策允許裝置使用與登錄檔中物件名稱相符的 clientId 進行連線。它提供向物件特定主題 (`sensor/device/${iot:Connection.Thing.ThingName}`) 進行發佈的許可，以及從物件特定主題 (`command/device/${iot:Connection.Thing.ThingName}`) 進行訂閱和接收的許可。如果登錄檔中的物件名稱是「thing1」，裝置將能夠發佈到主題「sensor/device/thing1」。裝置也可以訂閱主題「command/device/thing1」並從中接收。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/sensor/device/${iot:Connection.Thing.ThingName}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Subscribe"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topicfilter/command/device/${iot:Connection.Thing.ThingName}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Receive"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/command/device/${iot:Connection.Thing.ThingName}"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

對於未在 AWS IoT Core 登錄檔中註冊的裝置，下列政策允許裝置使用 clientId1, clientId2 或 clientId3 進行連線。它提供向用戶端特定主題 (`sensor/device/${iot:ClientId}`) 進行發佈的許可，以及從用戶端特定主題 (`command/device/${iot:ClientId}`) 進行訂閱和接收的許可。如果裝置以 clientId1 連接 clientId，它將能夠發佈到主題 "sensor/device/clientId1"。裝置也可以從主題 訂閱和接收 `device/clientId1/command`。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/sensor/device/${iot:Connection.Thing.ThingName}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Subscribe"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topicfilter/command/device/${iot:Connection.Thing.ThingName}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Receive"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/command/device/${iot:Connection.Thing.ThingName}"
            ]
        }
    ]
}
```

------

## 向/從主題名稱中具有物件屬性的主題發佈、訂閱和接收訊息的政策
<a name="pub-sub-topic-attribute"></a>

以下範例顯示已註冊裝置向/從名稱含有物件屬性的主題發佈、訂閱和接收訊息的情形。

**注意**  
物件屬性僅存在於登錄檔中 AWS IoT Core 註冊的裝置。未註冊的裝置沒有對應的範例。

------
#### [ Registered devices ]

對於在 AWS IoT Core 登錄檔中註冊的裝置，下列政策允許裝置使用與登錄檔中物件名稱相符的 clientId 進行連線。它提供向主題 (`sensor/${iot:Connection.Thing.Attributes[version]}`) 進行發佈的許可，以及從主題名稱含有物件屬性的主題 (`command/${iot:Connection.Thing.Attributes[location]}`) 進行訂閱和接收的許可。如果登錄檔中的物件名稱具有 `version=v1`和 `location=Seattle`，裝置將能夠發佈至主題「感應器/v1」，並從主題「命令/西雅圖」訂閱和接收。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/sensor/${iot:Connection.Thing.Attributes[version]}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Subscribe"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topicfilter/command/${iot:Connection.Thing.Attributes[location]}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Receive"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/command/${iot:Connection.Thing.Attributes[location]}"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

由於物件屬性僅適用於 AWS IoT Core 在登錄檔中註冊的裝置，因此沒有未註冊物件的對應範例。

------

## 拒絕向特定主題名稱的子主題進行發佈的政策
<a name="pub-sub-deny-publish"></a>

以下範例顯示已註冊和未註冊裝置向特定子主題以外的所有主題發佈訊息的情形。

------
#### [ Registered devices ]

對於在 AWS IoT Core 登錄檔中註冊的裝置，下列政策允許裝置使用與登錄檔中物件名稱相符的 clientId 進行連線。它提供向所有以 "department/" 為前綴的主題進行發佈的許可，但未及於 "department/admins" 子主題。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/department/*"
			]
		},
		{
			"Effect": "Deny",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/department/admins"
			]
		}
	]
}
```

------
#### [ Unregistered devices ]

對於未在 AWS IoT Core 登錄檔中註冊的裝置，下列政策允許裝置使用 clientId1, clientId2 或 clientId3 進行連線。它提供向所有以 "department/" 為前綴的主題進行發佈的許可，但未及於 "department/admins" 子主題。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/department/*"
            ]
        },
        {
            "Effect": "Deny",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/department/admins"
            ]
        }
    ]
}
```

------

## 拒絕從特定主題名稱的子主題進行接收的政策
<a name="pub-sub-deny-receive"></a>

以下範例顯示已註冊和未註冊裝置從特定子主題以外所有具特定前綴主題訂閱和接收訊息的情形。

------
#### [ Registered devices ]

對於在 AWS IoT Core 登錄檔中註冊的裝置，下列政策允許裝置使用與登錄檔中物件名稱相符的 clientId 進行連線。此政策允許裝置訂閱任何前綴為 "topic\$1prefix" 的主題。藉由在 `iot:Receive` 的陳述式中使用，`NotResource`我們允許裝置接收所有來自其已訂閱主題的訊息，但前綴為 "topic\$1prefix/restricted" 的主題除外。例如在此政策中，裝置可以訂閱 "topic\$1prefix/topic1" 甚至 "topic\$1prefix/restricted"，但是它們只會接收來自 "opic\$1prefix/topic1" 主題的訊息，且不會接收來自 "topic\$1prefix/restricted" 主題的訊息。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": "iot:Subscribe",
			"Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/topic_prefix/*"
		},
		{
			"Effect": "Allow",
			"Action": "iot:Receive",
			"NotResource": "arn:aws:iot:us-east-1:123456789012:topic/topic_prefix/restricted/*"
		}
	]
}
```

------
#### [ Unregistered devices ]

對於未在 AWS IoT Core 登錄檔中註冊的裝置，下列政策允許裝置使用 clientId1, clientId2 或 clientId3 進行連線。此政策允許裝置訂閱任何前綴為 "topic\$1prefix" 的主題。藉由在 `iot:Receive` 的陳述式中使用 `NotResource`，我們允許裝置接收所有來自其已訂閱主題的訊息，但前綴為 "topic\$1prefix/restricted" 的主題除外。例如，使用此政策，裝置可以訂閱 "topic\$1prefix/topic1" 甚至 "topic\$1prefix/restricted"。不過，他們只會收到主題 "topic\$1prefix/topic1" 的訊息，而不會收到主題 "topic\$1prefix/restricted" 的訊息。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "iot:Subscribe",
            "Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/topic_prefix/*"
        },
        {
            "Effect": "Allow",
            "Action": "iot:Receive",
            "NotResource": "arn:aws:iot:us-east-1:123456789012:topic/topic_prefix/restricted/*"
        }
    ]
}
```

------

## 從使用 MQTT 萬用字元的主題進行訂閱的政策
<a name="pub-sub-topic-wildcard"></a>

MQTT 萬用字元 \$1 和 \$1 視為文字字串，但在 AWS IoT Core 政策中使用時不會視為萬用字元。在 MQTT 中，僅在訂閱主題篩選條件時才會將 \$1 和 \$1 視為萬用字元，但在所有其他情況下視為常值字串。我們建議您在仔細考慮後，才使用這些 MQTT 萬用字元做為 AWS IoT Core 政策的一部分。

以下顯示 AWS IoT Core 政策中使用 MQTT 萬用字元註冊和未註冊物件的範例。這些萬用字元會視為常值字串。

------
#### [ Registered devices ]

對於在 AWS IoT Core 登錄檔中註冊的裝置，下列政策允許裝置使用與登錄檔中物件名稱相符的 clientId 進行連線。此政策允許裝置訂閱 "department/\$1/employees" 和 "location/\$1" 主題。由於 \$1 和 \$1 在 AWS IoT Core 政策中被視為文字字串，裝置可以訂閱主題「department/\$1/employees」，但不能訂閱主題「department/engineering/employees」。同樣，裝置可以訂閱 "location/\$1" 主題，但不能訂閱 "location/Seattle" 主題。但是，一旦裝置訂閱了 "department/\$1/employees" 主題，此政策將允許其接收來自 "department/engineering/employees" 主題的訊息。同樣，一旦裝置訂閱了 "location/\$1" 主題，其也將接收來自 "location/Seattle" 主題的訊息。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			],
			"Condition": {
				"Bool": {
					"iot:Connection.Thing.IsAttached": "true"
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": "iot:Subscribe",
			"Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/department/+/employees"
		},
		{
			"Effect": "Allow",
			"Action": "iot:Subscribe",
			"Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/location/#"
		},
		{
			"Effect": "Allow",
			"Action": "iot:Receive",
			"Resource": "arn:aws:iot:us-east-1:123456789012:topic/*"
		}
	]
}
```

------
#### [ Unregistered devices ]

對於未在 AWS IoT Core 登錄檔中註冊的裝置，下列政策允許裝置使用 clientId1, clientId2 或 clientId3 進行連線。此政策允許裝置訂閱 "department/\$1/employees" 和 "location/\$1" 主題。由於 \$1 和 \$1 在 AWS IoT Core 政策中被視為文字字串，裝置可以訂閱主題「department/\$1/employees」，但不能訂閱主題「department/engineering/employees」。同樣，裝置可以訂閱 "location/\$1" 主題，但不能訂閱 "location/Seattle"。但是，一旦裝置訂閱了 "department/\$1/employees" 主題，此政策將允許其接收來自 "department/engineering/employees" 主題的訊息。同樣，一旦裝置訂閱了 "location/\$1" 主題，其也將接收來自 "location/Seattle" 主題的訊息。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/clientId1",
                "arn:aws:iot:us-east-1:123456789012:client/clientId2",
                "arn:aws:iot:us-east-1:123456789012:client/clientId3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "iot:Subscribe",
            "Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/department/+/employees"
        },
        {
            "Effect": "Allow",
            "Action": "iot:Subscribe",
            "Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/location/#"
        },
        {
            "Effect": "Allow",
            "Action": "iot:Receive",
            "Resource": "arn:aws:iot:us-east-1:123456789012:topic/*"
        }
    ]
}
```

------

## 適用 HTTP 和 WebSocket 用戶端的政策
<a name="pub-sub-policy-cognito"></a>

當您透過 HTTP 或 WebSocket 通訊協定連接時，必須使用 Signature 第 4 版和 Amazon Cognito 進行驗證。Amazon Cognito 身分可以是已驗證或未驗證的身分。已驗證的身分屬於已由任何支援的身分提供者驗證的使用者。未驗證的身分通常屬於未向身分提供者驗證身分的訪客使用者。Amazon Cognito 提供唯一識別符和 AWS 登入資料，以支援未經驗證的身分。如需詳細資訊，請參閱[使用 Amazon Cognito 身分授權](cog-iot-policies.md)。

對於下列操作， AWS IoT Core 會使用透過 `AttachPolicy` API 連接到 Amazon Cognito 身分 AWS IoT Core 的政策。這會縮小連接到具有已驗證身分之 Amazon Cognito 身分集區的許可範圍。
+ `iot:Connect`
+ `iot:Publish`
+ `iot:Subscribe`
+ `iot:Receive`
+ `iot:GetThingShadow`
+ `iot:UpdateThingShadow`
+ `iot:DeleteThingShadow`

這表示 Amazon Cognito Identity 需要 IAM 角色政策和 AWS IoT Core 政策的許可。您可以透過 `AttachPolicy` API 將 IAM 角色政策連接至集區，並將 AWS IoT Core 政策連接至 Amazon Cognito Identity AWS IoT Core 。

已驗證和未驗證的使用者是不同的身分類型。如果您未將 AWS IoT 政策連接至 Amazon Cognito Identity，則已驗證的使用者在 中的授權會失敗 AWS IoT ，而且無法存取 AWS IoT 資源和動作。

**注意**  
對於其他 AWS IoT Core 操作或未經驗證的身分， AWS IoT Core 不會縮小連接到 Amazon Cognito 身分集區角色的許可範圍。對於已驗證和未驗證兩者的身分而言，這是我們針對連接至 Amazon Cognito 集區角色的政策，所提供的最寬容建議。

**HTTP**

若要允許未驗證 Amazon Cognito 身分透過 HTTP 對 Amazon Cognito 身分特定的主題發佈訊息，請將下列 IAM 政策連接至 Amazon Cognito 身分集區角色：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/${cognito-identity.amazonaws.com:sub}"
            ]
        }
    ]
}
```

若要允許已驗證的使用者，請使用 AWS IoT Core [AttachPolicy](https://docs.aws.amazon.com//iot/latest/apireference/API_AttachPolicy.html) API 將上述政策連接至 Amazon Cognito 身分集區角色和 Amazon Cognito 身分。

**注意**  
授權 Amazon Cognito 身分時， AWS IoT Core 請考慮政策並授予指定的最低權限。只有在兩個政策都允許要求的動作時，才會允許執行動作。如果兩個政策都禁止動作，則該動作為未授權。

**MQTT**

若要允許未驗證 Amazon Cognito 身分透過 WebSocket 對您帳戶中 Amazon Cognito 身分特定的主題發佈 MQTT 訊息，請將下列 IAM 政策連接至 Amazon Cognito 身分集區角色：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${cognito-identity.amazonaws.com:sub}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${cognito-identity.amazonaws.com:sub}"]
        }
    ]
}
```

若要允許已驗證的使用者，請使用 AWS IoT Core [AttachPolicy](https://docs.aws.amazon.com//iot/latest/apireference/API_AttachPolicy.html) API 將上述政策連接至 Amazon Cognito 身分集區角色和 Amazon Cognito 身分。

**注意**  
授權 Amazon Cognito 身分時， AWS IoT Core 同時考慮 和 會授予指定的最低權限。只有在兩個政策都允許要求的動作時，才會允許執行動作。如果兩個政策都禁止動作，則該動作為未授權。

# 連線和發佈政策範例
<a name="connect-and-pub"></a>

對於在 AWS IoT Core 登錄檔中註冊為實物的裝置，下列政策會授予許可，以 AWS IoT Core 使用符合實物名稱的用戶端 ID 連線至 ，並限制裝置在用戶端 ID 或實物名稱特定的 MQTT 主題上發佈。若要讓連線成功，物件名稱必須在 AWS IoT Core 登錄檔中註冊，並使用連接到物件的身分或主體進行身分驗證：

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish"
      ],
      "Resource": [
        "arn:aws:iot:us-east-1:123456789012:topic/${iot:Connection.Thing.ThingName}"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Connect"
      ],
      "Resource": [
        "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
      ]
    }
  ]
}
```

對於未在 AWS IoT Core 登錄檔中註冊為實物的裝置，下列政策會授予使用 AWS IoT Core 用戶端 ID 連線至 的許可，`client1`並限制裝置在 clientID 特定的 MQTT 主題上發佈：

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish"
      ],
      "Resource": [
        "arn:aws:iot:us-east-1:123456789012:topic/${iot:ClientId}"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Connect"
      ],
      "Resource": [
        "arn:aws:iot:us-east-1:123456789012:client/client1"
      ]
    }
  ]
}
```

# 保留訊息政策範例
<a name="retained-message-policy-examples"></a>

使用[保留訊息](mqtt.md#mqtt-retain)需要特定的政策。保留的訊息是使用 RETAIN 旗標設定並存放的 MQTT 訊息 AWS IoT Core。本節提供允許保留訊息常見用途的政策範例。

**Topics**
+ [連線和發佈保留訊息的政策](#retained-message-policy-examples-publish)
+ [連線和發佈保留 Will 訊息的政策](#retained-message-policy-examples-publish-lwt)
+ [列出和取得保留訊息的政策](#retained-message-policy-examples-list-get)

## 連線和發佈保留訊息的政策
<a name="retained-message-policy-examples-publish"></a>

對於發佈保留訊息的裝置，裝置必須能夠連線和發佈任何 MQTT 訊息，也能發佈 MQTT 保留訊息。下列政策會授予以下主題的許可：`device/sample/configuration` 至用戶端 **device1**。如需授予連線許可的其他範例，請參閱 [連線和發佈政策範例](connect-and-pub.md)。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/device1"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish",
				"iot:RetainPublish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/device/sample/configuration"
			]
		}
	]
}
```

## 連線和發佈保留 Will 訊息的政策
<a name="retained-message-policy-examples-publish-lwt"></a>

用戶端可以設定訊息， AWS IoT Core 在用戶端意外中斷連線時發佈。MQTT 會將這類訊息稱為 [*Will* 訊息](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/errata01/os/mqtt-v3.1.1-errata01-os-complete.html#_Will_Flag)。用戶端必須將擁有的其他條件新增至其連線許可，才能包含這些條件。

下列政策文件會授予所有用戶端連線和發佈 Will 訊息的許可；此類訊息由其主題 (`will`) 識別， AWS IoT Core 也將保留。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/device1"
			],
			"Condition": {
				"ForAllValues:StringEquals": {
					"iot:ConnectAttributes": [
						"LastWill"
					]
				}
			}
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish",
				"iot:RetainPublish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/will"
			]
		}
	]
}
```

## 列出和取得保留訊息的政策
<a name="retained-message-policy-examples-list-get"></a>

服務和應用程式可以透過呼叫 [https://docs.aws.amazon.com//iot/latest/apireference/API_iotdata_ListRetainedMessages.html](https://docs.aws.amazon.com//iot/latest/apireference/API_iotdata_ListRetainedMessages.html) 和 [https://docs.aws.amazon.com//iot/latest/apireference/API_iotdata_GetRetainedMessage.html](https://docs.aws.amazon.com//iot/latest/apireference/API_iotdata_GetRetainedMessage.html) 來存取保留訊息，不需支援 MQTT 用戶端。必須透過使用如下範例的政策來對呼叫這些動作的服務和應用程式進行授權。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:ListRetainedMessages"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/device1"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:GetRetainedMessage"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/foo"
            ]
        }
    ]
}
```

# 憑證政策範例
<a name="certificate-policy-examples"></a>

對於在 AWS IoT Core 登錄檔中註冊的裝置，下列政策會授予許可，以 AWS IoT Core 使用符合物件名稱的用戶端 ID 連線至 ，並發佈至其名稱等於裝置用來驗證其身分之憑證`certificateId`的 主題：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:CertificateId}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"]
        }
    ]
}
```

對於未在 AWS IoT Core 登錄檔中註冊的裝置，以下政策會授予許可，以 AWS IoT Core 使用用戶端 IDs、`client2`、 `client1``client3`和 連線至 ，以發佈至其名稱等於用於驗證裝置本身之憑證`certificateId`的 主題：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:CertificateId}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1",
                "arn:aws:iot:us-east-1:123456789012:client/client2",
                "arn:aws:iot:us-east-1:123456789012:client/client3"
            ]
        }
    ]
}
```

對於在 AWS IoT Core 登錄檔中註冊的裝置，下列政策會授予許可，以 AWS IoT Core 使用與物件名稱相符的用戶端 ID 連線至 ，並發佈至其名稱等於裝置用來驗證其身分之憑證主體`CommonName`欄位的主題：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:Certificate.Subject.CommonName}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"]
        }
    ]
}
```

**注意**  
在這個範例中，憑證的主體通用名稱欄位會用作為主題識別符，並假設主體通用名稱對每個登錄憑證是唯一的。如果憑證在多個裝置間共用，所有共用此憑證之裝置的主體通用名稱都是相同的，因此允許從多個裝置對相同主題的發佈權限 (不建議)。

對於未在 AWS IoT Core 登錄檔中註冊的裝置，下列政策會授予許可，以 AWS IoT Core 使用用戶端 IDs、`client2`、 `client1``client3`和 連線至 ，並發佈至其名稱等於裝置用來驗證其身分之憑證主體`CommonName`欄位的主題：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${iot:Certificate.Subject.CommonName}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1",
                "arn:aws:iot:us-east-1:123456789012:client/client2",
                "arn:aws:iot:us-east-1:123456789012:client/client3"
            ]
        }
    ]
}
```

**注意**  
在這個範例中，憑證的主體通用名稱欄位會用作為主題識別符，並假設主體通用名稱對每個登錄憑證是唯一的。如果憑證在多個裝置間共用，所有共用此憑證之裝置的主體通用名稱都是相同的，因此允許從多個裝置對相同主題的發佈權限 (不建議)。

對於在 AWS IoT Core 登錄檔中註冊的裝置，下列政策會授予許可，以 AWS IoT Core 使用與物件名稱相符的用戶端 ID 連線至 ，並在用於驗證裝置的憑證將 `Subject.CommonName.2` 欄位設定為 `admin/`時，發佈至其名稱字首為 的主題`Administrator`：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin/*"],
            "Condition": {
                "StringEquals": {
                    "iot:Certificate.Subject.CommonName.2": "Administrator"
            }
        }
        }
    ]
}
```

對於未在 AWS IoT Core 登錄檔中註冊的裝置，當用於驗證裝置的憑證將 `Subject.CommonName.2` 欄位設定為 `admin/`時，下列政策會授予許可，以使用 AWS IoT Core 用戶端 IDs `client1`、 和 連線至 `client2`，`client3`並發佈至其名稱字首為 的主題`Administrator`：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1",
                "arn:aws:iot:us-east-1:123456789012:client/client2",
                "arn:aws:iot:us-east-1:123456789012:client/client3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin/*"],
            "Condition": {
                "StringEquals": {
                    "iot:Certificate.Subject.CommonName.2": "Administrator"
            }
        }
        }
    ]
}
```

對於在 AWS IoT Core 登錄檔中註冊的裝置，下列政策允許裝置使用其實物名稱發佈到特定主題，該主題包含 `admin/`，當用來驗證裝置的憑證將其任何一個`Subject.CommonName`欄位設定為 `ThingName`時，後面接著 `Administrator`：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin/${iot:Connection.Thing.ThingName}"],
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:Certificate.Subject.CommonName.List": "Administrator"
            }
        }
        }
    ]
}
```

對於未在 AWS IoT Core 登錄檔中註冊的裝置，當用於驗證裝置的憑證將其任何一個`Subject.CommonName`欄位設定為 `admin`時`client1`，下列政策會授予許可，以 AWS IoT Core 使用用戶端 IDs `client2`、 和 連線至 ，`client3`並發佈至 主題`Administrator`：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1",
                "arn:aws:iot:us-east-1:123456789012:client/client2",
                "arn:aws:iot:us-east-1:123456789012:client/client3"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/admin"],
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "iot:Certificate.Subject.CommonName.List": "Administrator"
            }
        }
        }
    ]
}
```

# 物件政策範例
<a name="thing-policy-examples"></a>

如果用於向 驗證的憑證 AWS IoT Core 連接到正在評估政策的物件，則下列政策允許裝置連線：

****  

```
{  
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {  
            "Effect":"Allow",
            "Action":["iot:Connect"],
            "Resource":[ "*" ],
            "Condition": {
                "Bool": {
                    "iot:Connection.Thing.IsAttached": ["true"]
            }
        }
        }
    ]
}
```

下列政策在憑證連接至具有特定物件類型的物件，且該物件的 `attributeName` 屬性具有 `attributeValue` 值時，允許裝置發佈。如需物件政策變數的詳細資訊，請參閱[物件政策變數](thing-policy-variables.md)。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish"
      ],
      "Resource": "arn:aws:iot:us-east-1:123456789012:topic/device/stats",
      "Condition": {
        "StringEquals": {
          "iot:Connection.Thing.Attributes[attributeName]": "attributeValue",
          "iot:Connection.Thing.ThingTypeName": "Thing_Type_Name"
        },
        "Bool": {
          "iot:Connection.Thing.IsAttached": "true"
        }
      }
    }
  ]
}
```

下列政策允許裝置發佈至以物件屬性開頭的主題。如果裝置憑證與物件沒有關聯，則無法解析此變數，並會導致存取遭拒錯誤。如需物件政策變數的詳細資訊，請參閱[物件政策變數](thing-policy-variables.md)。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish"
      ],
      "Resource": "arn:aws:iot:us-east-1:123456789012:topic/${iot:Connection.Thing.Attributes[attributeName]}/*"
    }
  ]
}
```

# 基本任務政策範例
<a name="basic-jobs-example"></a>

此範例展示任務目標所需的政策陳述式，該目標為單一裝置，可接收任務請求並與 AWS IoT溝通任務執行狀態。

將 *us-west-2：57EXAMPLE833* 取代為您的 AWS 區域、冒號字元 (：) 和 12 位數字 AWS 帳戶 ，然後將 *uniqueThingName* 取代為代表裝置所在的物件資源名稱 AWS IoT。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:client/uniqueThingName"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:topic/test/dc/pubtopic",
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/job/*",
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/events/jobExecution/*",
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName/jobs/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Subscribe"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:topicfilter/test/dc/subtopic",
                "arn:aws:iot:us-west-2:123456789012:topicfilter/$aws/events/jobExecution/*",
                "arn:aws:iot:us-west-2:123456789012:topicfilter/$aws/things/uniqueThingName/jobs/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Receive"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:topic/test/dc/subtopic",
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName/jobs/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iotjobsdata:DescribeJobExecution",
                "iotjobsdata:GetPendingJobExecutions",
                "iotjobsdata:StartNextPendingJobExecution",
                "iotjobsdata:UpdateJobExecution"
            ],
            "Resource": [
                "arn:aws:iot:us-west-2:123456789012:topic/$aws/things/uniqueThingName"
            ]
        }
    ]
}
```

# 使用 Amazon Cognito 身分授權
<a name="cog-iot-policies"></a>

有兩種類型的 Amazon Cognito 身分：未驗證和已驗證。如果您的應用程式支援未驗證 Amazon Cognito 身分，則不會執行身分驗證，因此您不知道使用者是誰。

**Unauthenticated Identities**：(未驗證的身分) 對於未驗證的 Amazon Cognito 身分，您可以將 IAM 角色連接至未驗證的身分集區來授予許可。建議只授予您想要提供給未知使用者使用之資源的存取權。

**重要**  
對於未驗證的 Amazon Cognito 使用者連線到 AWS IoT Core，我們建議您授予 IAM 政策中非常有限資源的存取權。

**Authenticated Identities** (已驗證的身分)：對於已驗證的 Amazon Cognito 身分，您需要在兩個位置指定許可：
+ 將 IAM 政策連接到已驗證的 Amazon Cognito 身分集區，
+ 將 AWS IoT Core 政策連接至 Amazon Cognito 身分 （已驗證的使用者）。

## 未驗證和驗證連線至 的 Amazon Cognito 使用者的政策範例 AWS IoT Core
<a name="cog-iot-policies-auth-unauth-examples"></a>

下列範例顯示在 IAM 政策與 Amazon Cognito 身分 IoT 政策中的許可。已驗證身分的使用者希望發佈到裝置特定主題 (例如 device/DEVICE\$1ID/status)。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/Client_ID"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/device/Device_ID/status"
            ]
        }
    ]
}
```

下列範例顯示在 Amazon Cognito 未經驗證角色 IAM 政策中的許可。未驗證身分的使用者希望發佈到不需驗證身分的非裝置特定主題。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/non_device_specific_topic"
            ]
        }
    ]
}
```

## GitHub 範例
<a name="cog-iot-policies-github"></a>

GitHub 上的下列範例 Web 應用程式，展示如何將已驗證使用者的政策附件合併到使用者註冊和身分驗證程序中。
+ [MQTT 使用 AWS Amplify 和 發佈/訂閱 React Web 應用程式 適用於 JavaScript 的 AWS IoT Device SDK](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-cp)
+ [MQTT 使用 AWS Amplify、 適用於 JavaScript 的 AWS IoT Device SDK和 Lambda 函數發佈/訂閱 React Web 應用程式](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-lambda)

Amplify 是一組工具和服務，可協助您建置與 AWS 服務整合的 Web 和行動應用程式。如需有關 Amplify 的詳細資訊，請參閱 [Amplify Framework 說明文件](https://docs.amplify.aws/)。

這兩個範例都會執行以下步驟。

1. 當使用者註冊帳戶時，應用程式會建立 Amazon Cognito 使用者集區和身分。

1. 當使用者進行身分驗證時，應用程式會建立政策並將其連接至身分。這會為使用者提供發佈和訂閱許可。

1. 使用者可以使用應用程式來發佈和訂閱 MQTT 主題。

第一個範例在身分驗證操作中直接使用 `AttachPolicy` API 操作。下面的範例示範如何在使用 Amplify 和 適用於 JavaScript 的 AWS IoT Device SDK的 React Web 應用程式中實作此 API 呼叫。

```
function attachPolicy(id, policyName) {
    var Iot = new AWS.Iot({region: AWSConfiguration.region, apiVersion: AWSConfiguration.apiVersion, endpoint: AWSConfiguration.endpoint});
    var params = {policyName: policyName, target: id};

    console.log("Attach IoT Policy: " + policyName + " with cognito identity id: " + id);
    Iot.attachPolicy(params, function(err, data) {
         if (err) {
               if (err.code !== 'ResourceAlreadyExistsException') {
                  console.log(err);
               }
          }
         else  {
            console.log("Successfully attached policy with the identity", data);
         }
     });
}
```

此程式碼會出現在 [AuthDisplay.js](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-cp/blob/d1c307b36357be934db9dda020140fa337709cd9/src/AuthDisplay.js#L45) 檔案中。

第二個範例會在 Lambda 函數中實作 `AttachPolicy` API 操作。下列範例展示 Lambda 如何使用此 API 呼叫。

```
iot.attachPolicy(params, function(err, data) {
     if (err) {
           if (err.code !== 'ResourceAlreadyExistsException') {
              console.log(err);
              res.json({error: err, url: req.url, body: req.body});
           }
      }
     else  {
        console.log(data);
        res.json({success: 'Create and attach policy call succeed!', url: req.url, body: req.body});
     }
 });
```

此程式碼出現在 [app.js](https://github.com/aws-samples/aws-amplify-react-iot-pub-sub-using-lambda/blob/e493039581d2aff0faa3949086deead20a2c5385/amplify/backend/function/amplifyiotlambda/src/app.js#L50) 檔案的 `iot.GetPolicy` 函數中。

**注意**  
當您使用透過 Amazon Cognito Identity Pools 取得的 AWS 登入資料呼叫函數時，Lambda 函數中的內容物件會包含 的值`context.cognito_identity_id`。如需更多資訊，請參閱下列內容。  
[AWS Lambda Node.js 中的內容物件](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-context.html)
[AWS Lambda Python 中的內容物件](https://docs.aws.amazon.com/lambda/latest/dg/python-context.html)
[AWS Lambda Ruby 中的內容物件](https://docs.aws.amazon.com/lambda/latest/dg/ruby-context.html)
[AWS Lambda Java 中的內容物件](https://docs.aws.amazon.com/lambda/latest/dg/java-context.html)
[AWS Lambda Go 中的內容物件](https://docs.aws.amazon.com/lambda/latest/dg/golang-context.html)
[AWS Lambda C\$1 中的內容物件](https://docs.aws.amazon.com/lambda/latest/dg/csharp-context.html)
[AWS Lambda PowerShell 中的內容物件](https://docs.aws.amazon.com/lambda/latest/dg/powershell-context.html)

# 使用 AWS IoT Core 登入資料提供者授權直接呼叫 AWS 服務
<a name="authorizing-direct-aws"></a>

裝置可以使用 X.509 憑證， AWS IoT Core 使用 TLS 交互身分驗證通訊協定連線至 。 AWS 其他服務不支援以憑證為基礎的身分驗證，但可以使用 [AWS Signature 第 4 版格式](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)的 AWS 登入資料來呼叫。Signature [第 4 版演算法](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)通常要求發起人擁有存取金鑰 ID 和私密存取金鑰。 AWS IoT Core 具有登入資料提供者，可讓您使用內建[的 X.509 憑證](x509-client-certs.html)作為唯一裝置身分來驗證 AWS 請求。這樣就不需要在裝置上儲存存取金鑰 ID 與私密存取金鑰。

憑證提供者會使用 X.509 憑證來對呼叫者進行身分驗證並發出有限權限的臨時安全性字符。權杖可用來簽署和驗證任何 AWS 請求。這種驗證 AWS 請求的方式需要您建立和設定 [AWS Identity and Access Management (IAM) 角色](https://docs.aws.amazon.com/service-authorization/latest/reference/id_roles.html)，並將適當的 IAM 政策連接到該角色，以便登入資料提供者可以代表您擔任該角色。如需 AWS IoT Core 和 IAM 的詳細資訊，請參閱 [的身分和存取管理 AWS IoT](security-iam.md)。

 AWS IoT 需要裝置將[伺服器名稱指示 (SNI) 延伸](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)項目傳送至 Transport Layer Security (TLS) 通訊協定，並在 `host_name` 欄位中提供完整的端點地址。該 `host_name` 字段必須包含您正在呼叫的端點，並且它必須是：
+ 由 `aws iot [describe-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-endpoint.html) --endpoint-type iot:CredentialProvider` 傳回的 `endpointAddress`

沒有正確 `host_name` 值的裝置所嘗試的連線將會失敗。

下圖說明憑證提供者的工作流程。

![\[AWS IoT Core 登入資料提供者工作流程。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/credentials-provider-diagram.png)


1.  AWS IoT Core 裝置向登入資料提供者提出 HTTPS 請求，以取得安全字符。請求包含用於身分驗證的裝置 X.509 憑證。

1. 登入資料提供者會將請求轉送至 AWS IoT Core 身分驗證和授權模組，以驗證憑證並驗證裝置是否具有請求安全字符的許可。

1. 如果憑證有效且具有請求安全字符的許可，則 AWS IoT Core 身分驗證和授權模組會傳回成功。否則，它會傳送例外到裝置。

1. 在成功驗證憑證後，憑證提供者會叫用 [AWS Security Token ServiceAWS STS](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html) 來擔任您為該憑證建立的 IAM 角色。

1. AWS STS 會傳回臨時、有限權限的安全字符給登入資料提供者。

1. 憑證提供者傳回安全性字符到裝置。

1. 裝置使用安全字符來簽署 Signature AWS 第 4 版的 AWS 請求。

1. 請求的服務會叫用 IAM 來驗證簽章有效性並根據附加到您為憑證提供者建立的 IAM 角色的存取政策來授權請求。

1. 如果 IAM 成功驗證簽章有效性並授權請求，表示請求成功。否則，IAM 會傳送例外。

下列章節說明如何使用憑證來取得安全性字符。該流程假設您已經[註冊裝置](register-device.html)且[已建立並啟用自己的憑證](device-certs-your-own.html)。

## 如何使用憑證來取得安全性字符
<a name="authorizing-direct-aws.walkthrough"></a>

1. 設定憑證提供者代表您的裝置所擔任的 IAM 角色。將下列信任政策連接至該角色。  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Principal": {"Service": "credentials.iot.amazonaws.com"},
           "Action": "sts:AssumeRole"
       }
   }
   ```

   針對您要呼叫的每個 AWS 服務，將存取政策連接至角色。憑證提供者支援以下政策變數：
   + `credentials-iot:ThingName`
   + `credentials-iot:ThingTypeName`
   + `credentials-iot:AwsCertificateId`

   當裝置提供其對 AWS 服務的請求中的物件名稱時，憑證提供者會將 `credentials-iot:ThingName` 與 `credentials-iot:ThingTypeName` 當作內容變數新增到安全性字符。憑證提供者會提供 `credentials-iot:AwsCertificateId` 作為上下文變數，即使裝置在請求中未提供物件名稱。您以 `x-amzn-iot-thingname` HTTP 請求標頭的值來傳遞物件名稱。

   這三個變數僅適用於 IAM 政策，不適用於 AWS IoT Core 政策。

1. 請確認執行下一步驟 (建立角色別名) 的使用者擁有傳遞這個新建角色到 AWS IoT Core的權限。下列政策會將 `iam:GetRole`和 `iam:PassRole`許可提供給 AWS 使用者。`iam:GetRole` 許可讓使用者取得有關您剛建立的角色資訊。`iam:PassRole` 許可允許使用者將角色傳遞給另一個 AWS 服務。  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Action": [
               "iam:GetRole",
               "iam:PassRole"
           ],
           "Resource": "arn:aws:iam::123456789012:role/your role name"
       }
   }
   ```

1. 建立 AWS IoT Core 角色別名。將直接呼叫 AWS 服務的裝置必須知道連線到 時要使用的角色 ARN AWS IoT Core。硬式編碼的角色 ARN 不是好的解決方案，因為您需要隨角色 ARN 變更而更新裝置。更好的解決方案是使用 `CreateRoleAlias` API 來建立指向該角色 ARN 的角色別名。如果角色 ARN 變更時，您只需更新角色別名。無需在裝置上進行變更。此 API 會使用下列參數：  
`roleAlias`  
必要. 辨識角色別名的任意字串。可作為在角色別名資料模型中的主索引鍵功能。它包含 1-128 字元且必須僅包含英數字元和 =、@ 和 - 符號。可使用大寫和小寫字母字元。角色別名名稱區分大小寫。  
`roleArn`  
必要. 角色別名所指的角色之 ARN。  
`credentialDurationSeconds`  
選用。憑證有效期間 (秒)。最低值為 900 秒 (15 分鐘)。最高值為 43,200 秒 (12 小時)。預設值為 3,600 秒 (1 小時)。  
 AWS IoT Core 登入資料提供者可以發出生命週期上限為 43，200 秒 (12 小時） 的登入資料。讓憑證有效時間長達 12 小時，有助於藉由快取憑證更長的時間，減少呼叫憑證提供者的次數。  
`credentialDurationSeconds` 值必須小於或等於該角色別名參考的 IAM 角色最大工作階段持續時間。如需詳細資訊，請參閱 Identity and Access Management 使用者指南中的 AWS [修改角色最長工作階段持續時間 (AWS API)](https://docs.aws.amazon.com//IAM/latest/UserGuide/roles-managingrole-editing-api.html#roles-modify_max-session-duration-api)。

   如需此 API 的詳細資訊，請參閱 [CreateRoleAlias](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateRoleAlias.html)。

1. 將政策連接至裝置憑證。連接至本裝置憑證的政策，必須授予裝置承擔該角色的許可。您需要授予角色別名 `iot:AssumeRoleWithCertificate` 動作的許可，如下列範例。  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "iot:AssumeRoleWithCertificate",
               "Resource": "arn:aws:iot:us-east-1:123456789012:rolealias/your role alias"
           }
       ]
   }
   ```

1. 對憑證提供者發出 HTTPS 請求，以取得安全性字符。請提供下列資訊：
   + *憑證*：因為這是一個對 TLS 共同身分驗證的 HTTP 請求，您提出請求時需提供憑證與私有金鑰給用戶端。使用您在註冊憑證時使用的相同憑證和私有金鑰 AWS IoT Core。

     為了確保您的裝置正在與 AWS IoT Core （而不是模擬它的服務） 通訊，請參閱[伺服器身分驗證](x509-client-certs.html#server-authentication)，遵循連結下載適當的 CA 憑證，然後將它們複製到您的裝置。
   + *RoleAlias*：您為憑證提供者所建立的角色別名的名稱。角色別名名稱區分大小寫，且必須符合在其中建立的角色別名 AWS IoT Core。
   + *ThingName*：您在註冊物件時建立的 AWS IoT Core 物件名稱。這會以 `x-amzn-iot-thingname` HTTP 標頭的值來傳遞。只有在您使用物件屬性做為 AWS IoT Core 或 IAM 政策中的政策變數時，才需要此值。
**注意**  
您在 `x-amzn-iot-thingname` 中提供的 *ThingName* 必須符合指派給憑證的 AWS IoT 物件資源。如果不符合，則會傳回 403 錯誤。

   在 中執行下列命令 AWS CLI ，以取得 的登入資料提供者端點 AWS 帳戶。如需此 API 行為的詳細資訊，請參閱 [DescribeEndpoint](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeEndpoint.html)。如需啟用 FIPS 的端點，請參閱 [AWS IoT Core - 登入資料 提供者端點](iot-connect-fips.md#iot-connect-fips-credential)。

   ```
   aws iot describe-endpoint --endpoint-type iot:CredentialProvider
   ```

   以下 JSON 物件為 **describe-endpoint** 命令的範例輸出。它包含用來要求安全字符的 `endpointAddress`。

   ```
   {
       "endpointAddress": "your_aws_account_specific_prefix.credentials.iot.your region.amazonaws.com"
   }
   ```

   使用端點對憑證提供者發出 HTTPS 請求，以傳回安全性字符。下列範例命令使用 `curl`，但您可以使用任何 HTTP 用戶端。
**注意**  
*roleAlias* 名稱區分大小寫，且必須符合在其中建立的角色別名 AWS IoT。

   ```
   curl --cert your certificate --key your private key -H "x-amzn-iot-thingname: your thing name" --cacert AmazonRootCA1.pem https://your endpoint /role-aliases/your role alias/credentials
   ```

   此命令會傳回一個包含 `accessKeyId`、`secretAccessKey`、`sessionToken` 以及一個過期情況的安全性字符物件。以下 JSON 物件為 `curl` 命令的範例輸出。

   ```
       {"credentials":{"accessKeyId":"access key","secretAccessKey":"secret access key","sessionToken":"session token","expiration":"2018-01-18T09:18:06Z"}}
   ```

   然後，您可以使用 `accessKeyId`、 `secretAccessKey`和 `sessionToken`值來簽署對 AWS 服務的請求。如需end-to-end示範，請參閱 *AWS 安全部落格*上的[如何使用 AWS 登入資料提供者部落格文章，消除裝置中的硬編碼 AWS IoT 登入資料需求](https://aws.amazon.com/blogs/security/how-to-eliminate-the-need-for-hardcoded-aws-credentials-in-devices-by-using-the-aws-iot-credentials-provider/)。

# 利用 IAM 跨帳戶存取
<a name="cross-account-access"></a>

AWS IoT Core 可讓您讓委託人發佈或訂閱委託人 AWS 帳戶 未擁有之 中定義的主題。您可以建立 IAM 政策和 IAM 角色，藉此設定跨帳戶存取，並將政策連接至該角色。

首先，如[建立 IAM 政策](https://docs.aws.amazon.com//IAM/latest/UserGuide/access_policies_create.html)中所述建立客戶受管的 IAM 政策，如同為 AWS 帳戶中的其他使用者和憑證所做的一樣。

對於在 AWS IoT Core 登錄檔中註冊的裝置，下列政策會授予許可，讓裝置 AWS IoT Core 使用符合裝置實物名稱的用戶端 ID 連線至 ，並發佈至 ，`my/topic/thing-name `其中 *thing-name* 是裝置的實物名稱：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/my/topic/${iot:Connection.Thing.ThingName}"
            ]
        }
    ]
}
```

對於未在 AWS IoT Core 登錄檔中註冊的裝置，下列政策會將許可授予裝置，以使用您帳戶 (123456789012) AWS IoT Core 登錄檔中`client1`註冊的物件名稱來連線至 ， AWS IoT Core 並發佈至名稱字首為 的用戶端 ID 特定主題`my/topic/`：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/client1"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/my/topic/${iot:ClientId}"
            ]
        }
    ]
}
```

接著，依照[建立角色以將許可委派給 IAM 使用者](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html)中的步驟。輸入您欲共用存取的 AWS 帳戶 之帳戶 ID。最後一個步驟是，將政策連接至您剛建立的角色。若稍後您需要修改授予存取的 AWS 帳戶 ID，您可以使用下列信任政策的格式：

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": { 
                "AWS": "arn:aws:iam::567890123456:user/MyUser"
        },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

# 中的資料保護 AWS IoT Core
<a name="data-protection"></a>

 AWS [共同責任模型](https://aws.amazon.com/compliance/shared-responsibility-model/)適用於 中的資料保護 AWS IoT Core。如此模型所述， 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/)。

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

如需關於資料保護的詳細資訊，請參閱 *AWS 安全部落格*上的 [AWS 共同責任模型和歐盟《一般資料保護規範》(GDPR)](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 部落格文章。

AWS IoT 裝置會收集資料、對該資料執行一些操作，然後將該資料傳送至另一個 Web 服務。您可以選擇在裝置上短時間存放一些資料。您有責任對靜態資料提供資料保護。當您的裝置傳送資料至 時 AWS IoT，會透過本節稍後討論的 TLS 連線執行此操作。 AWS IoT 裝置可以將資料傳送至任何 AWS 服務。如需每個服務資料安全性的詳細資訊，請參閱該服務的文件。 AWS IoT 可設定為將日誌寫入 CloudWatch Logs 並記錄 AWS IoT API 呼叫 AWS CloudTrail。如需這些服務資料安全性的詳細資訊，請參閱 [Amazon CloudWatch 的身分驗證和存取控制](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/auth-and-access-control-cw.html)，以及[使用 AWS KMS 受管金鑰加密 CloudTrail 日誌檔案](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/encrypting-cloudtrail-log-files-with-aws-kms.html)。

## 中的資料加密 AWS IoT
<a name="data-protection-encrypt"></a>

根據預設，傳輸中和靜態的所有 AWS IoT 資料都會加密。[傳輸中的資料會使用 TLS 加密](transport-security.md)，而靜態資料會使用 AWS 擁有的金鑰加密。 AWS IoT 支援來自 AWS Key Management Service AWS KMS keys () 的客戶受管 (KMS 金鑰）AWS KMS。不過，Device Advisor 和 AWS IoT Wireless 僅使用 AWS 擁有的金鑰 來加密客戶資料。

 

# 中的傳輸安全性 AWS IoT Core
<a name="transport-security"></a>

TLS (Transport Layer Security) 是一種加密通訊協定，專為透過電腦網路進行安全通訊而設計。 AWS IoT Core Device Gateway 要求客戶在傳輸期間加密所有通訊，方法是使用 TLS 從裝置連線至 Gateway。TLS 可針對 AWS IoT Core支援的應用程式通訊協定 (MQTT、HTTP 和 WebSocket)，達到其機密性。多種程式設計語言與作業系統提供 TLS 支援。內的資料由特定 AWS 服務 AWS 加密。如需其他服務資料加密的詳細資訊 AWS ，請參閱該服務的安全文件。

**Topics**
+ [TLS 通訊協定](#tls-ssl-policy)
+ [安全政策](#tls-policy-table)
+ [中傳輸安全的重要注意事項 AWS IoT Core](#tls-ssl-core)
+ [LoRaWAN 無線裝置的傳輸安全性](#tls-lorawan)

## TLS 通訊協定
<a name="tls-ssl-policy"></a>

AWS IoT Core 支援下列版本的 TLS 通訊協定：
+ TLS 1.3 
+ TLS 1.2

使用 AWS IoT Core，您可以在網域組態中設定 TLS 設定 （適用於 [TLS 1.2](https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_1.2) 和 [TLS 1.3)。](https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_1.3)如需詳細資訊，請參閱[在網域組態中設定 TLS 設定](iot-endpoints-tls-config.md)。

## 安全政策
<a name="tls-policy-table"></a>

安全政策是 TLS 通訊協定及其密碼的組合，用來決定在用戶端與伺服器之間進行 TLS 交涉期間所支援的通訊協定和密碼。您可根據需要將裝置設定為使用預先定義的安全政策。請注意， AWS IoT Core 不支援自訂安全政策。

連線裝置時，您可以選擇其中一個預先定義的安全政策 AWS IoT Core。中最新預先定義安全政策的名稱 AWS IoT Core 包括根據發行月份和年份的版本資訊。預設的預先定義安全政策為 `IoTSecurityPolicy_TLS13_1_2_2022_10`。若要指定安全政策，您可以使用 AWS IoT 主控台或 AWS CLI。如需詳細資訊，請參閱[在網域組態中設定 TLS 設定](iot-endpoints-tls-config.md)。

下表說明 AWS IoT Core 支援的最新預先定義安全政策。已從標頭列的政策名稱移除 `IotSecurityPolicy_`，使其相符。


| **安全政策** | TLS13\$11\$13\$12022\$110 | TLS13\$11\$12\$12022\$110 | TLS12\$11\$12\$12022\$110 | TLS12\$11\$10\$12016\$101\$1 | TLS12\$11\$10\$12015\$101\$1 | 
| --- | --- | --- | --- | --- | --- | 
| TCP 連接埠 |  443/8443/8883  |  443/8443/8883  |  443/8443/8883  | 443 | 8443/8883 | 443 | 8443/8883 | 
| TLS 通訊協定 | 
| TLS 1.2 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| TLS 1.3 | ✓ | ✓ |  |  |  |  |  | 
| TLS 加密 | 
| TLS\$1AES\$1128\$1GCM\$1SHA256 | ✓ | ✓ |  |  |  |  |  | 
| TLS\$1AES\$1256\$1GCM\$1SHA384 | ✓ | ✓ |  |  |  |  |  | 
| TLS\$1CHACHA20\$1POLY1305\$1SHA256 | ✓ | ✓ |  |  |  |  |  | 
| ECDHE-RSA-AES128-GCM-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA-AES128-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA-AES128-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA-AES256-GCM-SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA-AES256-SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-RSA-AES256-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES128-GCM-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES128-SHA256 |  | ✓ | ✓ | ✓ |  | ✓ | ✓ | 
| AES128-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES256-GCM-SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES256-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| AES256-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| DHE-RSA-AES256-SHA |  |  |  |  |  | ✓ | ✓ | 
| ECDHE-ECDSA-AES128-GCM-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA-AES128-SHA256 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA-AES128-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA-AES256-GCM-SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA-AES256-SHA384 |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 
| ECDHE-ECDSA-AES256-SHA |  | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 

**注意**  
`TLS12_1_0_2016_01` 僅適用於下列項目 AWS 區域：ap-east-1、ap-northeast-2、ap-south-1、ap-southeast-2、ca-central-1、cn-north-1、cn-northwest-1、eu-north-1、eu-west-2、eu-west-3、me-south-1、sa-east-1、us-east-2、us-gov-west-1、us-gov-west-2、us-west-1。  
`TLS12_1_0_2015_01` 僅適用於下列項目 AWS 區域：ap-northeast-1、ap-southeast-1、eu-central-1、eu-west-1、us-east-1、us-west-2。

## 中傳輸安全的重要注意事項 AWS IoT Core
<a name="tls-ssl-core"></a>

對於 AWS IoT Core 使用 [MQTT](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html) 連線至 的裝置，TLS 會加密裝置與代理程式之間的連線， AWS IoT Core 並使用 TLS 用戶端身分驗證來識別裝置。如需更多資訊，請參閱[用戶端身分驗證](https://docs.aws.amazon.com//iot/latest/developerguide/client-authentication.html)。對於 AWS IoT Core 使用 [HTTP](https://docs.aws.amazon.com//iot/latest/developerguide/http.html) 連線至 的裝置，TLS 會加密裝置與代理程式之間的連線，並將身分驗證委派給 AWS Signature 第 4 版。如需詳細資訊，請參閱《AWS 一般參考》**中的[使用 Signature 第 4 版簽署請求](https://docs.aws.amazon.com//general/latest/gr/create-signed-request.html)。

當您將裝置連線到 時 AWS IoT Core，不需要傳送[伺服器名稱指示 (SNI) 擴充](https://tools.ietf.org/html/rfc3546#section-3.1)功能，但強烈建議您這麼做。若要使用[多帳戶註冊](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html#multiple-account-cert)、[自訂網域](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable-custom.html)、[VPC 端點](https://docs.aws.amazon.com//iot/latest/developerguide/IoTCore-VPC.html)和[已設定的 TLS 政策](https://docs.aws.amazon.com//iot/latest/developerguide/iot-endpoints-tls-config.html)等功能，您必須使用 SNI 延伸，並在 `host_name`欄位中提供完整的端點地址。該 `host_name` 欄位必須包含您正在呼叫的端點。該端點必須是下列其中一個：
+ `aws iot [describe-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-endpoint.html) --endpoint-type iot:Data-ATS` 返回的 `endpointAddress`
+ `aws iot [describe-domain-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-domain-configuration.html) –-domain-configuration-name "domain_configuration_name"` 返回的 `domainName`

具有不正確或無效`host_name`值的裝置嘗試的連線將會失敗。 AWS IoT Core 會針對[自訂身分驗證](https://docs.aws.amazon.com//iot/latest/developerguide/custom-authentication.html)的身分驗證類型，將失敗記錄到 CloudWatch。

AWS IoT Core 不支援 [SessionTicket TLS 延伸](https://www.ietf.org/rfc/rfc5077.txt)。

## LoRaWAN 無線裝置的傳輸安全性
<a name="tls-lorawan"></a>

LoRaWAN 裝置遵循 [LoRaWAN ™ SECURITY: A White Paper Prepared for the LoRa Alliance™ by Gemalto, Actility, and Semtech](https://lora-alliance.org/sites/default/files/2019-05/lorawan_security_whitepaper.pdf) 中所述的安全實務。

如需使用 LoRaWAN 裝置傳輸安全性的詳細資訊，請參閱 [LoRaWAN 資料和傳輸安全性](https://docs.aws.amazon.com/iot-wireless/latest/developerguide/iot-lorawan-security.html)。

# 中的資料加密 AWS IoT
<a name="data-encryption"></a>

資料保護是指在傳輸中 （往返 時 AWS IoT Core) 和靜態 （存放於裝置或其他 AWS 服務時） 時保護資料。傳送到 的所有資料 AWS IoT Core 都會使用 MQTT、HTTPS 和 WebSocket 通訊協定透過 TLS 連線傳送，因此在傳輸時預設會使其安全。 會從裝置 AWS IoT Core 收集資料，然後將其傳送至其他 AWS 服務以進行進一步處理。如需有關其他 AWS 服務上資料加密的詳細資訊，請參閱該服務的安全性文件。如需詳細資訊，請參閱[靜態資料加密](encryption-at-rest.md)。

FreeRTOS 提供 PKCS\$111 程式庫，可抽象化金鑰儲存、存取密碼編譯物件和管理工作階段。您有責任使用此程式庫來加密裝置上的靜態資料。如需詳細資訊，請參閱 [FreeRTOS 公有金鑰加密標準 (PKCS) \$111 程式庫](https://docs.aws.amazon.com/freertos/latest/userguide/security-pkcs.html)。

# 中的靜態資料加密 AWS IoT Core
<a name="encryption-at-rest"></a>

根據預設，所有靜態 AWS IoT Core 資料都會使用 AWS 擁有的金鑰進行加密。 AWS IoT Core 也支援來自 AWS Key Management Service (AWS KMS) 的對稱客戶受管金鑰。使用客戶受管金鑰，您可以建立、擁有和管理 AWS 帳戶中的 AWS KMS 金鑰。 AWS IoT Core 將使用 KMS 金鑰來加密靜態資料。您可以完全控制這些 KMS 金鑰，包括建立和維護其金鑰政策。您也可以為存取 的角色設定 IAM 政策， AWS KMS 以控制這些金鑰的許可。

## AWS 擁有的金鑰
<a name="aws-owned-keys"></a>

AWS 擁有的金鑰是 AWS 服務擁有和管理的 KMS 金鑰集合，可用於多個 AWS 帳戶。 AWS 服務可以使用 AWS 擁有的金鑰來保護您的資料。根據預設， 會使用 AWS 擁有的金鑰 AWS IoT Core 加密靜態資料。這些金鑰由 服務管理。您無法檢視、管理或使用 AWS 擁有的金鑰。不過，您不需要採取任何動作來保護這些金鑰。

如需 AWS 擁有金鑰的詳細資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的 [AWS 擁有金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-key)。

## 客戶自管金鑰
<a name="customer-managed-keys"></a>

客戶受管金鑰是您帳戶中建立、擁有和管理 AWS 的 KMS 金鑰。您可以完全控制這些 AWS KMS 金鑰，包括建立和維護其金鑰政策。您也可以為存取 的角色設定 IAM 政策， AWS KMS 以控制這些金鑰的許可。您可以設定 AWS IoT Core 使用客戶受管 KMS 金鑰來加密您的資料。

如需客戶受管金鑰的詳細資訊，請參閱《*AWS Key Management Service 開發人員指南*》中的[客戶受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

若要選擇加入客戶受管金鑰 AWS IoT Core，請遵循下列步驟：

**Topics**
+ [步驟 1：建立客戶受管金鑰](#encryption-at-rest-cmk-create)
+ [步驟 2：建立 IAM 角色以授予使用 KMS 金鑰的 AWS IoT Core 許可](#create-an-iam-role)
+ [步驟 3：選擇加入 中的客戶受管金鑰 AWS IoT Core](#opt-in-customer-managed-keys)
+ [步驟 4： AWS IoT Core 控制平面操作所需的其他許可](#cmk-control-plane-permissions)
+ [步驟 5：管理金鑰](#understanding-key-health)
+ [步驟 6：監控金鑰運作狀態](#health-status-monitoring)

### 步驟 1：建立客戶受管金鑰
<a name="encryption-at-rest-cmk-create"></a>

您可以使用 AWS KMS 主控台或 CLI AWS KMS 命令來建立對稱客戶受管金鑰。`keySpec` 必須是 `SYMMETRIC_DEFAULT`，而 `keyUsage`必須是 `ENCRYPT_DECRYPT`。

**注意**  
AWS IoT Core 僅支援具有客戶受管 AWS KMS 金鑰`SYMMETRIC_DEFAULT`之金鑰規格和`ENCRYPT_DECRYPT`金鑰用量的金鑰。

以下是建立 KMS 金鑰的範例 AWS CLI 命令，可用於 AWS IoT Core 客戶受管金鑰。

```
aws kms create-key --key-spec SYMMETRIC_DEFAULT --key-usage ENCRYPT_DECRYPT --region us-west-2
```

以下是 命令的範例輸出。

```
{
    "KeyMetadata": {
        "AWSAccountId": "111122223333",
        "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
        "Arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
        "CreationDate": "2024-09-19T11:45:23.982000-07:00",
        "Enabled": true,
        "Description": "",
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "Enabled",
        "Origin": "AWS_KMS",
        "KeyManager": "CUSTOMER",
        "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
        "KeySpec": "SYMMETRIC_DEFAULT",
        "EncryptionAlgorithms": [
            "SYMMETRIC_DEFAULT"
        ],
        "MultiRegion": false
    }
}
```

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

#### 金鑰政策
<a name="key-policy"></a>

建立客戶受管金鑰時，您可以指定金鑰政策。金鑰政策會控制客戶受管金鑰的存取權限。每個客戶受管金鑰都必須只有一個金鑰政策，其中包含決定誰可以使用金鑰及其使用方式的陳述式。如需詳細資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)。

AWS IoT Core 會在您的帳戶中使用 IAM 角色來存取您的客戶受管金鑰。如果您使用的是自訂金鑰政策，請確定在此金鑰上建立的 IAM 角色具有下列許可：
+ `kms:DescribeKey`
+ `kms:Decrypt`
+ `kms:Encrypt`
+ `kms:GenerateDataKeyWithoutPlaintext`
+ `kms:ReEncryptTo`
+ `kms:ReEncryptFrom`

### 步驟 2：建立 IAM 角色以授予使用 KMS 金鑰的 AWS IoT Core 許可
<a name="create-an-iam-role"></a>

若要 AWS IoT Core 讓 使用您建立的 KMS 金鑰來加密靜態資料，您也需要在帳戶中建立 IAM 角色，其 AWS IoT Core 可擔任 以存取 KMS 金鑰。

該角色必須具有下列信任政策，以允許 AWS IoT Core 擔任該角色。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Principal": {
            "Service": "iot.amazonaws.com"
        },
        "Action": "sts:AssumeRole",
        "Condition": {
            "StringEquals": {
                "aws:SourceAccount": "111122223333"
            },
            "ArnLike": {
                "aws:SourceArn": "arn:aws:iot:us-west-2:111122223333:*"
            }
        }
    }
}
```

確保連接至 IAM 角色的 IAM 政策具有 KMS 金鑰的下列許可：
+ `kms:DescribeKey`
+ `kms:Decrypt`
+ `kms:Encrypt`
+ `kms:GenerateDataKeyWithoutPlaintext`
+ `kms:ReEncryptTo`
+ `kms:ReEncryptFrom`

以下是具有客戶受管金鑰所需許可的 IAM 政策範例。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowIoTToAccessKMSResource",
            "Effect": "Allow",
            "Action": [
                "kms:DescribeKey",
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:ReEncryptTo",
                "kms:ReEncryptFrom",
                "kms:GenerateDataKeyWithoutPlaintext"
            ],
            "Resource": [
                "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
            ],
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:aws-crypto-ec:vendor": "iot.amazonaws.com"
                }
            }
        }
    ]
}
```

如需詳細資訊，請參閱《 *AWS Identity and Access Management 使用者指南*》中的[建立角色以將許可委派給 IAM 使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)。

### 步驟 3：選擇加入 中的客戶受管金鑰 AWS IoT Core
<a name="opt-in-customer-managed-keys"></a>

完成所有先前的步驟後，請執行 `update-encryption-configuration` CLI 命令，以選擇在 中使用客戶受管金鑰 AWS IoT Core。當您選擇加入客戶受管金鑰時， AWS 帳戶中的所有 AWS IoT Core 資源都會使用指定的 AWS KMS 金鑰加密。

1. 若要選擇使用 AWS IoT Core 中的客戶受管金鑰 AWS CLI，請執行 CLI `update-encryption-configuration` 命令。

   ```
   aws iot update-encryption-configuration --encryption-type "CUSTOMER_MANAGED_KMS_KEY" \
   --kms-access-role-arn "arn:aws:iam::111122223333:role/myrole" \
   --kms-key-arn "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" --region us-west-2
   ```

1. 若要 AWS IoT Core 使用 驗證 中的客戶受管金鑰 AWS CLI，請執行 CLI `describe-encryption-configuration` 命令：

   ```
   aws iot describe-encryption-configuration --region us-west-2
   ```

   如果您已在 中啟用客戶受管金鑰 AWS IoT Core，輸出可能如下所示：

   ```
   {
       "encryptionType": "CUSTOMER_MANAGED_KMS_KEY",
       "kmsKeyArn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
       "kmsAccessRoleArn": "arn:aws:iam::111122223333:role/myrole",
       "configurationDetails": {
           "configurationStatus": "HEALTHY"
       },
       "lastModifiedDate": "2024-09-26T22:01:02.365000-07:00"
   }
   ```

   `lastModifiedDate` 欄位指出上次更新加密組態的日期。

   如果您尚未啟用客戶受管金鑰，輸出可能如下所示：

   ```
   {
       "encryptionType": "AWS_OWNED_KMS_KEY",
       "lastModifiedDate": "2024-09-26T22:01:02.365000-07:00"
   }
   ```

### 步驟 4： AWS IoT Core 控制平面操作所需的其他許可
<a name="cmk-control-plane-permissions"></a>

在您選擇加入客戶受管金鑰之後，屬於您 AWS 帳戶的所有 AWS IoT Core 資源都會使用提供的 KMS 金鑰加密。除了 AWS IoT Core 資源上特定操作所需的`kms:Decrypt`許可之外，所有控制平面操作現在還要求發起人擁有 KMS 金鑰的許可。如果發起人沒有`kms:Decrypt`許可，而且他們進行需要加密或解密資料的 API 呼叫 （例如 `GetPolicy`)，他們將收到 `UnauthorizedException`。

例如，當您呼叫 時`GetPolicy`，您需要客戶受管 KMS 金鑰的 `iot:GetPolicy`和 `kms:Decrypt`許可，才能成功呼叫 API。

**注意**  
更新 IAM 使用者或角色以授予加密組態所用金鑰的 AWS KMS 許可時，請確定 KMS 金鑰政策也授予個別 IAM 使用者或角色所需的許可。

#### AWS KMS 的 許可 `UpdateEncryptionConfiguration`
<a name="kms-permissions-update-encryption-configuration"></a>

`UpdateEncryptionConfiguration` API 呼叫需要 KMS 金鑰的下列 AWS KMS 許可，才能選擇加入客戶受管金鑰或修改金鑰組態：
+ `kms:DescribeKey`
+ `kms:Decrypt`
+ `kms:Encrypt`
+ `kms:GenerateDataKeyWithoutPlaintext`
+ `kms:ReEncryptTo`
+ `kms:ReEncryptFrom`

#### AWS KMS 所有其他控制平面 APIs 許可
<a name="kms-permissions-control-plane-apis"></a>

啟用客戶受管金鑰時，大多數控制平面 APIs 都需要`kms:Decrypt`許可。不過，某些 APIs不需要這些額外的許可：

不需要 AWS KMS 許可APIs   
`List*` 和 `Delete*` APIs 不屬於此儲存貯體。客戶隨時可以叫用任何 `List*`或 `Delete*` 控制平面 API，即使發起人沒有`kms:Decrypt`許可，這些 API 呼叫也會成功。即使您的客戶受管金鑰運作狀態不佳，`List*`且 API 不會進行任何解密，這些 `Delete*` API 呼叫仍會成功。 APIs   
+ **List\$1 APIs** – 所有列出操作 （例如，、`ListThings``ListPolicies`、`ListCertificates`)
+ **Delete\$1 APIs** – 所有刪除操作 （例如，、`DeleteThing``DeletePolicy`、`DeleteCertificate`)

### 步驟 5：管理金鑰
<a name="understanding-key-health"></a>

AWS IoT Core 會定期檢查客戶受管金鑰組態，以確保加密和解密操作不會受到影響。這些運作狀態檢查每分鐘執行一次 AWS IoT Core，並驗證 存取和使用 AWS KMS 金鑰和相關聯 IAM 角色的能力，以進行加密和解密操作。

HEALTHY (狀況良好)  
AWS IoT Core 可以透過指定的 IAM 角色成功存取 AWS KMS 金鑰，並執行加密/解密操作。所有元件都能正常運作。

UNHEALTHY (狀況不良)  
AWS IoT Core 無法存取或使用 AWS KMS 金鑰。這可防止新的加密操作，並可能影響服務功能。`errorCode` 欄位指出問題是與金鑰還是 IAM 角色有關。

#### 可能影響金鑰運作狀態的客戶動作
<a name="customer-actions-affecting-health"></a>

數個客戶動作可能會導致金鑰運作狀態從 變更為 `HEALTHY` `UNHEALTHY`：

與金鑰相關的動作  
+ **刪除 AWS KMS 金鑰** – 當您排程刪除金鑰時，金鑰處於 `Pending deletion` 狀態且無法使用
+ **停用 AWS KMS 金鑰** – 當您停用 KMS 金鑰時，它無法再用於加密/解密操作
+ **排程刪除金鑰** – 刪除完成時，金鑰變得無法使用
+ **修改金鑰政策** – 移除 AWS IoT Core 存取的必要許可
+ **變更金鑰使用許可** – 限制必要的 AWS KMS 動作

IAM 角色相關動作  
+ **刪除 IAM 角色** – AWS IoT Core 無法擔任該角色以存取金鑰
+ **修改角色許可** – 從角色政策移除必要的 AWS KMS 許可
+ **變更信任政策** – 防止 AWS IoT Core 服務擔任該角色
+ **新增限制條件** – AWS IoT Core 防止 使用該角色的條件

帳戶層級動作  
+ **跨帳戶金鑰存取變更** – 修改不同帳戶中金鑰的許可
+ **服務控制政策 SCPs)** – 限制 AWS KMS 存取的組織層級政策
+ **帳戶層級 IAM 政策** – 覆寫金鑰存取或與金鑰存取衝突的政策

**重要**  
對 使用的 AWS KMS 金鑰、IAM 角色或政策的任何變更都 AWS IoT Core 應先在開發環境中進行測試。在進行任何變更後密切監控金鑰運作狀態，以確保 AWS IoT Core 功能不受影響。

#### 更新加密組態
<a name="key-transition"></a>

在 中更新您的加密組態 AWS IoT Core ，以從一個客戶受管金鑰變更為另一個金鑰，或在 AWS 擁有的金鑰和客戶受管金鑰之間進行變更。

若要將組態變更為不同的客戶受管金鑰：

1. 依照中的步驟建立新的客戶受管金鑰[步驟 1：建立客戶受管金鑰](#encryption-at-rest-cmk-create)。

1. 更新您的 IAM 角色政策，以在更新期間同時包含舊金鑰和新金鑰的許可。

1. 更新您的加密組態以使用新的金鑰：

   ```
   aws iot update-encryption-configuration --encryption-type "CUSTOMER_MANAGED_KMS_KEY" \
   --kms-access-role-arn "arn:aws:iam::111122223333:role/myrole" \
   --kms-key-arn "arn:aws:kms:us-west-2:111122223333:key/new-key-id"
   ```

若要將組態從客戶受管金鑰變更回 AWS 擁有的金鑰：

```
aws iot update-encryption-configuration --encryption-type "AWS_OWNED_KMS_KEY"
```

**注意**  
更新新客戶受管金鑰的加密組態時，請確保舊金鑰和新金鑰都保持可存取，以便操作成功。

##### 常見的失敗案例和影響
<a name="failure-scenarios"></a>

下表說明刪除或停用金鑰時的常見失敗案例：


| 案例 | 立即影響 | 長期後果 | 
| --- | --- | --- | 
|  金鑰已停用  |  所有新的加密/解密操作都會立即失敗  |  服務中斷，直到金鑰重新啟用或取代為止  | 
|  排程刪除的金鑰  |  金鑰狀態變更為待刪除，且所有加密/解密操作都將失敗  |  刪除完成時自動服務失敗  | 
|  金鑰已永久刪除  |  所有操作的立即和永久故障  |  永久資料遺失和無法復原加密的資料  | 
|  金鑰政策修改不正確  |  AWS IoT Core 失去對金鑰的存取許可  |  服務失敗，直到政策修正為止  | 
|  已刪除 IAM 角色  |  AWS IoT Core 無法擔任存取金鑰的角色  |  完成加密服務失敗  | 
|  IAM 角色修改不正確  |  AWS IoT Core 無法擔任角色或使用角色來存取金鑰  |   修正 IAM 角色之前的服務失敗  | 

##### 預防和最佳實務
<a name="prevention-best-practices"></a>

若要防止意外刪除或停用金鑰，並將服務失敗的風險降至最低：

實作金鑰生命週期政策  
建立明確的金鑰建立、輪換和淘汰程序。記錄哪些金鑰用於 AWS IoT Core 資源和維護作用中金鑰的清查。

使用 IAM 政策來限制金鑰刪除  
建立 IAM 政策，以防止未經授權的使用者刪除或停用關鍵加密金鑰。使用條件要求金鑰刪除操作的額外核准。

啟用 CloudTrail 記錄  
透過 CloudTrail 監控所有 AWS KMS 金鑰操作，以偵測未經授權或意外的金鑰管理活動。設定金鑰刪除、停用或政策變更的提醒。

測試金鑰取代程序  
在非生產環境中定期測試您的金鑰取代程序，以確保您可以快速從與金鑰相關的故障中復原。

維護金鑰備份  
雖然您無法匯出 AWS KMS 金鑰材料，但請保留金鑰 ARNs、政策和相關 AWS IoT Core 組態的詳細記錄，以便在需要時快速取代金鑰。

監控金鑰運作狀態  
持續監控`CMK.Health`指標，並設定金鑰運作狀態變更的自動提醒。實作自動化回應，以快速解決與金鑰相關的問題。

**重要**  
在生產環境中實作金鑰更新程序之前，請務必在開發環境中測試這些更新程序。制定有文件記錄的轉返計劃，並確保在緊急情況下可以快速執行金鑰替換程序。

### 步驟 6：監控金鑰運作狀態
<a name="health-status-monitoring"></a>

作為定期檢查 AWS IoT Core 執行的一部分，會發出 CloudWatch 指標和日誌，以提供客戶受管金鑰組態運作狀態的可見性

AWS IoT Core 每分鐘至少向 CloudWatch 發出一次`CMK.Health`指標。此指標提供 AWS IoT Core 用來加密和解密資料之客戶受管金鑰的運作狀態相關資訊。

`CMK.Health` 指標可以有下列值：
+ 值為 `1`： AWS IoT Core 能夠成功地使用加密金鑰來加密和解密您的資料。
+ 值為 `0`： AWS IoT Core 無法使用加密金鑰來加密和解密您的資料。

AWS IoT Core 當加密金鑰的運作狀態變更時， 也會發出 AWS IoT V2 日誌。這些日誌提供運作狀態更新的其他詳細資訊。若要檢視這些日誌，您必須啟用 AWS IoT V2 日誌。`HEALTHY` 日誌會在 `INFO` 層級發出，而`UNHEALTHY`日誌會在 `ERROR`層級發出。如需日誌層級的詳細資訊，請參閱[日誌層級](https://docs.aws.amazon.com/iot/latest/developerguide/configure-logging.html#log-level)。

下列範例是 發出的 CloudWatch 日誌項目 AWS IoT Core ，用於指示客戶受管金鑰的運作狀態更新。

若要有效監控和回應關鍵運作狀態變更：

1. 設定 指標的** CloudWatch 警示**： `CMK.Health`

   ```
   aws cloudwatch put-metric-alarm --region us-west-2 \
     --alarm-name "IoTCore-CMK-Health-Alert" \
     --alarm-description "Alert when IoT Core CMK health is unhealthy" \
     --metric-name "CMK.Health" \
     --namespace "AWS/IoT" \
     --statistic "Minimum" \
     --period 300 \
     --evaluation-periods 1 \
     --threshold 1 \
     --comparison-operator "LessThanThreshold" \
     --alarm-actions "arn:aws:sns:us-west-2:111122223333:iot-alerts"
   ```

1. **Enable AWS IoT V2 記錄**功能可擷取詳細的運作狀態變更事件，其中包含錯誤碼和訊息。

1. **檢查組態狀態**以進行故障診斷：

   ```
   aws iot describe-encryption-configuration --region us-west-2
   ```

1. 檢查 `errorCode` 欄位以**調查 UNHEALTHY 狀態**：
   + `KMS_KEY_VALIDATION_ERROR` – AWS KMS 金鑰的問題 （停用、刪除或政策問題）
   + `ROLE_VALIDATION_ERROR` – IAM 角色的問題 （已刪除、政策問題或信任問題）

#### 從不良到健康
<a name="unhealthy-to-healthy"></a>

當加密金鑰的狀態從 更新為 `UNHEALTHY` 時`HEALTHY`， AWS IoT Core 會發出下列格式的 AWS IoT V2 日誌訊息。

```
{
    "timestamp": "2017-08-10 15:37:23.476",
    "logLevel": "INFO",
    "traceId": "8421693b-f4f0-4e4a-9235-0cff8bab897d",
    "accountId": "111122223333",
    "status": "SUCCESS",
    "cmkStatus": "HEALTHY",
    "kmsKeyArn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
    "kmsAccessRoleArn": "arn:aws:iam::111122223333:role/myrole",
    "eventType": "CmkHealthCheck"
}
```

#### 從 HEALTHY 到 UNHEALTHY
<a name="healthy-to-unhealthy"></a>

當加密金鑰的狀態從 更新為 `HEALTHY` 時`UNHEALTHY`， AWS IoT Core 會以下列格式發出 an AWS IoT V2 日誌訊息。

```
{
    "timestamp": "2017-08-10 15:37:23.476",
    "logLevel": "ERROR",
    "traceId": "8421693b-f4f0-4e4a-9235-0cff8bab897d",
    "accountId": "111122223333",
    "status": "FAILURE",
    "cmkStatus": "UNHEALTHY",
    "errorCode": "KMS_KEY_VALIDATION_ERROR / ROLE_VALIDATION_ERROR",
    "errorMessage": "Error message on why there was a failure",
    "kmsKeyArn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
    "kmsAccessRoleArn": "arn:aws:iam::111122223333:role/myrole",
    "eventType": "CmkHealthCheck"
}
```

**警告**  
當金鑰運作狀態變成 時`UNHEALTHY`， AWS IoT Core 操作會立即失敗。如果發生這種情況，請檢閱您的金鑰組態、IAM 角色許可和政策。監控 `CMK.Health` 指標是否有狀態變更。如果在檢閱您的組態後操作仍持續失敗，請聯絡您的客戶經理或[AWS 支援中心](https://console.aws.amazon.com/support/home#/)以取得其他協助。

#### AWS CloudTrail 事件
<a name="aws-cloudtrail-events"></a>

您也可以監控 KMS 金鑰的 AWS IoT Core使用情況，以加密解密操作。 AWS IoT Core 會在您的 KMS 金鑰上建立 `DescribeKey`、`ReEncrypt`、 `Decrypt`和 `GenerateDataKeyWithoutPlaintext`操作，以加密/解密屬於您靜態存放 AWS 帳戶的資料。

`DescribeKey`、、 `Decrypt``ReEncrypt`和 有 CloudTrail 事件`GenerateDataKeyWithoutPlaintext`。這些事件會監控 呼叫 AWS KMS 的操作 AWS IoT Core ，以存取客戶受管金鑰加密的資料。

##### `Decrypt` 範例
<a name="decrypt"></a>

```
{
    "eventVersion": "1.09",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROAIGDTESTANDEXAMPLE:Sampleuser01",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01",
        "accountId": "111122223333",
        "accessKeyId": "*********************",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROAIGDTESTANDEXAMPLE:Sampleuser01",
                "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01",
                "accountId": "111122223333",
                "userName": "*****"
            },
            "attributes": {
                "creationDate": "2024-09-16T20:23:39Z",
                "mfaAuthenticated": "false"
            }
        },
        "invokedBy": "iot.amazonaws.com"
    },
    "eventTime": "2024-09-16T20:32:48Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "Decrypt",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "iot.amazonaws.com",
    "userAgent": "iot.amazonaws.com",
    "requestParameters": {
        "encryptionContext": {
            "kms-arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "aws-crypto-ec:vendor": "iot.amazonaws.com",
            "branch-key-id": "111122223333",
            "type": "branch:ACTIVE"
        },
        "encryptionAlgorithm": "SYMMETRIC_DEFAULT",
        "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
    },
    "responseElements": null,
    "requestID": "1afb6d98-8388-455d-8b48-e62c9e0cf7f4",
    "eventID": "b59a5f16-0d98-46d8-a590-0e040a48b39b",
    "readOnly": true,
    "resources": [
        {
            "accountId": "111122223333",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "111122223333",
    "eventCategory": "Management"
}
```

# 的身分和存取管理 AWS IoT
<a name="security-iam"></a>

AWS Identity and Access Management (IAM) 是一種 AWS 服務 ，可協助管理員安全地控制對 AWS 資源的存取。IAM 管理員可控制誰可以*進行驗證 *（登入） 和*授權* （具有許可） 來使用 AWS IoT 資源。IAM 是您可以免費使用 AWS 服務 的 。

**Topics**
+ [目標對象](#security_iam_audience)
+ [使用 IAM 身分來驗證](#security_iam_authentication)
+ [使用政策管理存取權](#security_iam_access-manage)
+ [AWS IoT 如何使用 IAM](security_iam_service-with-iam.md)
+ [AWS IoT 身分型政策範例](security_iam_id-based-policy-examples.md)
+ [AWS 的 受管政策 AWS IoT](security-iam-awsmanpol.md)
+ [對 AWS IoT 身分和存取進行故障診斷](security_iam_troubleshoot.md)

## 目標對象
<a name="security_iam_audience"></a>

如何使用 AWS Identity and Access Management (IAM) 會因您的角色而有所不同：
+ **服務使用者** — 若無法存取某些功能，請向管理員申請所需許可 (請參閱 [對 AWS IoT 身分和存取進行故障診斷](security_iam_troubleshoot.md))
+ **服務管理員** — 負責設定使用者存取權並提交相關許可請求 (請參閱 [AWS IoT 如何使用 IAM](security_iam_service-with-iam.md))
+ **IAM 管理員** — 撰寫政策以管理存取控制 (請參閱 [AWS IoT 身分型政策範例](security_iam_id-based-policy-examples.md))

## 使用 IAM 身分來驗證
<a name="security_iam_authentication"></a>

身分可以是裝置 AWS IoT (X.509) 憑證、Amazon Cognito 身分或 IAM 使用者或群組。本主題僅討論 IAM 身分。如需 AWS IoT 支援的其他身分的詳細資訊，請參閱 [用戶端身分驗證](client-authentication.md)。

身分驗證是您 AWS 使用身分憑證登入 的方式。您必須以 AWS 帳戶根使用者、IAM 使用者或擔任 IAM 角色身分進行身分驗證。

您可以使用身分來源的登入資料，例如 AWS IAM Identity Center (IAM Identity Center)、單一登入身分驗證或 Google/Facebook 登入資料，以聯合身分的形式登入。如需有關登入的詳細資訊，請參閱《AWS 登入 使用者指南》**中的[如何登入您的 AWS 帳戶](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html)。

對於程式設計存取， AWS 提供 SDK 和 CLI 以密碼編譯方式簽署請求。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [API 請求的AWS 第 4 版簽署程序](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)。

### AWS 帳戶 根使用者
<a name="security_iam_authentication-rootuser"></a>

 當您建立 時 AWS 帳戶，您會從一個名為 AWS 帳戶 *theroot 使用者的*登入身分開始，該身分具有對所有 AWS 服務 和 資源的完整存取權。強烈建議不要使用根使用者來執行日常任務。有關需要根使用者憑證的任務，請參閱《IAM 使用者指南》**中的[需要根使用者憑證的任務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

### IAM 使用者和群組
<a name="security_iam_authentication-iamuser"></a>

*IAM 使用者*[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)是一種身分具備單人或應用程式的特定許可權。建議以臨時憑證取代具備長期憑證的 IAM 使用者。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[要求人類使用者使用聯合身分提供者來 AWS 使用臨時憑證存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp) 。

[IAM 群組](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)**會指定 IAM 使用者集合，使管理大量使用者的許可權更加輕鬆。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 使用者的使用案例](https://docs.aws.amazon.com/IAM/latest/UserGuide/gs-identities-iam-users.html)。

### IAM 角色
<a name="security_iam_authentication-iamrole"></a>

*IAM 角色*[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)的身分具有特定許可權，其可以提供臨時憑證。您可以透過[從使用者切換到 IAM 角色 （主控台） ](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)或呼叫 AWS CLI 或 AWS API 操作來擔任角色。如需詳細資訊，請參閱《IAM 使用者指南》**中的[擔任角色的方法](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage-assume.html)。

IAM 角色適用於聯合身分使用者存取、臨時 IAM 使用者許可、跨帳戶存取權與跨服務存取，以及在 Amazon EC2 執行的應用程式。如需詳細資訊，請參閱《*IAM 使用者指南*》中的 [IAM 中的快帳戶資源存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

## 使用政策管理存取權
<a name="security_iam_access-manage"></a>

您可以透過建立政策並將其連接到身分或資源 AWS 來控制 AWS 中的存取。政策定義與身分或資源相關聯的許可。當委託人提出請求時 AWS ， 會評估這些政策。大多數政策會以 JSON 文件 AWS 形式存放在 中。如需進一步了解 JSON 政策文件，請參閱《*IAM 使用者指南*》中的 [JSON 政策概觀](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policies-json)。

管理員會使用政策，透過定義哪些**主體**可在哪些**條件**下對哪些**資源**執行**動作**，以指定可存取的範圍。

預設情況下，使用者和角色沒有許可。IAM 管理員會建立 IAM 政策並將其新增至角色，供使用者後續擔任。IAM 政策定義動作的許可，無論採用何種方式執行。

### 身分型政策
<a name="security_iam_access-manage-id-based-policies"></a>

身分型政策是附加至身分 (使用者、使用者群組或角色) 的 JSON 許可政策文件。這類政策控制身分可對哪些資源執行哪些動作，以及適用的條件。如需了解如何建立身分型政策，請參閱《*IAM 使用者指南*》中的[透過客戶管理政策定義自訂 IAM 許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

身分型政策可分為*內嵌政策* (直接內嵌於單一身分) 與*受管政策* (可附加至多個身分的獨立政策)。如需了解如何在受管政策及內嵌政策之間做選擇，請參閱《IAM 使用者指南》**中的[在受管政策與內嵌政策之間選擇](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-choosing-managed-or-inline.html)。

### 資源型政策
<a name="security_iam_access-manage-resource-based-policies"></a>

資源型政策是附加到資源的 JSON 政策文件。範例包括 IAM *角色信任政策*與 Amazon S3 *儲存貯體政策*。在支援資源型政策的服務中，服務管理員可以使用它們來控制對特定資源的存取權限。您必須在資源型政策中[指定主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)。

資源型政策是位於該服務中的內嵌政策。您無法在資源型政策中使用來自 IAM 的 AWS 受管政策。

### 存取控制清單 (ACL)
<a name="security_iam_access-manage-acl"></a>

存取控制清單 (ACL) 可控制哪些主體 (帳戶成員、使用者或角色) 擁有存取某資源的許可。ACL 類似於資源型政策，但它們不使用 JSON 政策文件格式。

Amazon S3 AWS WAF和 Amazon VPC 是支援 ACLs的服務範例。如需進一步了解 ACL，請參閱《Amazon Simple Storage Service 開發人員指南》**中的[存取控制清單 (ACL) 概觀](https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html)。

### 其他政策類型
<a name="security_iam_access-manage-other-policies"></a>

AWS 支援其他政策類型，可設定更多常見政策類型授予的最大許可：
+ **許可界限** — 設定身分型政策可授與 IAM 實體的最大許可。如需詳細資訊，請參閱《 IAM 使用者指南》**中的 [IAM 實體許可界限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)。
+ **服務控制政策 (SCP)** — 為 AWS Organizations中的組織或組織單位指定最大許可。如需詳細資訊，請參閱《AWS Organizations 使用者指南》**中的[服務控制政策](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)。
+ **資源控制政策 (RCP)** — 設定您帳戶中資源可用許可的上限。如需詳細資訊，請參閱《AWS Organizations 使用者指南》**中的[資源控制政策 (RCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)。
+ **工作階段政策** — 在以程式設計方式為角色或聯合身分使用者建立臨時工作階段時，以參數形式傳遞的進階政策。如需詳細資訊，請參《*IAM 使用者指南*》中的[工作階段政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)。

### 多種政策類型
<a name="security_iam_access-manage-multiple-policies"></a>

當多種類型的政策適用於請求時，產生的許可會更複雜而無法理解。若要了解如何 AWS 在涉及多種政策類型時決定是否允許請求，請參閱《*IAM 使用者指南*》中的[政策評估邏輯](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)。

# AWS IoT 如何使用 IAM
<a name="security_iam_service-with-iam"></a>

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

**Topics**
+ [AWS IoT 身分型政策](#security_iam_service-with-iam-id-based-policies)
+ [AWS IoT 資源型政策](#security_iam_service-with-iam-resource-based-policies)
+ [以 AWS IoT 標籤為基礎的授權](#security_iam_service-with-iam-tags)
+ [AWS IoT IAM 角色](#security_iam_service-with-iam-roles)

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

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

### 動作
<a name="security_iam_service-with-iam-id-based-policies-actions"></a>

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

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

下表列出 IAM IoT 動作、相關聯的 AWS IoT API，以及動作操作的資源。


****  

| 政策動作 | AWS IoT API | Resources | 
| --- | --- | --- | 
| iot:AcceptCertificateTransfer | AcceptCertificateTransfer |  `arn:aws:iot:region:account-id:cert/cert-id`  ARN 中 AWS 帳戶 指定的 必須是憑證要轉移的目標帳戶。   | 
| iot:AddThingToThingGroup | AddThingToThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:AssociateTargetsWithJob | AssociateTargetsWithJob | 無  | 
| iot:AttachPolicy | AttachPolicy |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 或 `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:AttachPrincipalPolicy | AttachPrincipalPolicy |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:AttachSecurityProfile | AttachSecurityProfile |  `arn:aws:iot:region:account-id:securityprofile/security-profile-name` `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| iot:AttachThingPrincipal | AttachThingPrincipal |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:CancelCertificateTransfer | CancelCertificateTransfer |  `arn:aws:iot:region:account-id:cert/cert-id`  ARN 中 AWS 帳戶 指定的 必須是憑證要轉移的目標帳戶。   | 
| iot:CancelJob | CancelJob |  `arn:aws:iot:region:account-id:job/job-id`  | 
| iot:CancelJobExecution | CancelJobExecution |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:ClearDefaultAuthorizer | ClearDefaultAuthorizer | 無 | 
| iot:CreateAuthorizer | CreateAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-function-name`  | 
| iot:CreateCertificateFromCsr | CreateCertificateFromCsr | \$1 | 
| iot:CreateDimension | CreateDimension | `arn:aws:iot:region:account-id:dimension/dimension-name` | 
| iot:CreateJob | CreateJob |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:thinggroup/thing-group-name` `arn:aws:iot:region:account-id:thing/thing-name` `arn:aws:iot:region:account-id:jobtemplate/job-template-id`  | 
| iot:CreateJobTemplate | CreateJobTemplate |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:jobtemplate/job-template-id`  | 
| iot:CreateKeysAndCertificate | CreateKeysAndCertificate | \$1 | 
| iot:CreatePolicy | CreatePolicy | `arn:aws:iot:region:account-id:policy/policy-name` | 
| iot:CreatePolicyVersion | CreatePolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  這必須是 AWS IoT 政策，而不是 IAM 政策。   | 
| iot:CreateRoleAlias | CreateRoleAlias |  (參數：roleAlias) `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| iot:CreateSecurityProfile | CreateSecurityProfile |  `arn:aws:iot:region:account-id:securityprofile/security-profile-name` `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| iot:CreateThing | CreateThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:CreateThingGroup | CreateThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 適用正在建立的群組和父群組 (若使用)  | 
| iot:CreateThingType | CreateThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| iot:CreateTopicRule | CreateTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:DeleteAuthorizer | DeleteAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-name`  | 
| iot:DeleteCACertificate | DeleteCACertificate |  `arn:aws:iot:region:account-id:cacert/cert-id`  | 
| iot:DeleteCertificate | DeleteCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:DeleteDimension | DeleteDimension |  `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| iot:DeleteJob | DeleteJob |  `arn:aws:iot:region:account-id:job/job-id`  | 
| iot:DeleteJobTemplate | DeleteJobTemplate |  `arn:aws:iot:region:account-id:job/job-template-id`  | 
| iot:DeleteJobExecution | DeleteJobExecution |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:DeletePolicy | DeletePolicy |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:DeletePolicyVersion | DeletePolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:DeleteRegistrationCode | DeleteRegistrationCode | \$1 | 
| iot:DeleteRoleAlias | DeleteRoleAlias |  `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| iot:DeleteSecurityProfile | DeleteSecurityProfile |  `arn:aws:iot:region:account-id:securityprofile/security-profile-name` `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| iot:DeleteThing | DeleteThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:DeleteThingGroup | DeleteThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:DeleteThingType | DeleteThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| iot:DeleteTopicRule | DeleteTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:DeleteV2LoggingLevel | DeleteV2LoggingLevel |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:DeprecateThingType | DeprecateThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| iot:DescribeAuthorizer | DescribeAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-function-name` (參數：authorizerName) 無  | 
| iot:DescribeCACertificate | DescribeCACertificate |  `arn:aws:iot:region:account-id:cacert/cert-id`  | 
| iot:DescribeCertificate | DescribeCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:DescribeDefaultAuthorizer | DescribeDefaultAuthorizer | 無  | 
| iot:DescribeEndpoint | DescribeEndpoint | \$1 | 
| iot:DescribeEventConfigurations | DescribeEventConfigurations | 無  | 
| iot:DescribeIndex | DescribeIndex |  `arn:aws:iot:region:account-id:index/index-name`  | 
| iot:DescribeJob | DescribeJob |  `arn:aws:iot:region:account-id:job/job-id`  | 
| iot:DescribeJobExecution | DescribeJobExecution | 無 | 
| iot:DescribeJobTemplate | DescribeJobTemplate |  `arn:aws:iot:region:account-id:job/job-template-id`  | 
| iot:DescribeRoleAlias | DescribeRoleAlias |  `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| iot:DescribeThing | DescribeThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:DescribeThingGroup | DescribeThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:DescribeThingRegistrationTask | DescribeThingRegistrationTask | 無 | 
| iot:DescribeThingType | DescribeThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| iot:DetachPolicy | DetachPolicy |  `arn:aws:iot:region:account-id:cert/cert-id` 或 `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:DetachPrincipalPolicy | DetachPrincipalPolicy |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:DetachSecurityProfile | DetachSecurityProfile |  `arn:aws:iot:region:account-id:securityprofile/security-profile-name` `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| iot:DetachThingPrincipal | DetachThingPrincipal |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:DisableTopicRule | DisableTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:EnableTopicRule | EnableTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:GetEffectivePolicies | GetEffectivePolicies |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:GetIndexingConfiguration | GetIndexingConfiguration | 無 | 
| iot:GetJobDocument | GetJobDocument |  `arn:aws:iot:region:account-id:job/job-id`  | 
| iot:GetLoggingOptions | GetLoggingOptions | \$1 | 
| iot:GetPolicy | GetPolicy |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:GetPolicyVersion | GetPolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:GetRegistrationCode | GetRegistrationCode | \$1 | 
| iot:GetTopicRule | GetTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:ListAttachedPolicies | ListAttachedPolicies |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 或 `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:ListAuthorizers | ListAuthorizers | 無 | 
| iot:ListCACertificates | ListCACertificates | \$1 | 
| iot:ListCertificates | ListCertificates | \$1 | 
| iot:ListCertificatesByCA | ListCertificatesByCA | \$1 | 
| iot:ListIndices | ListIndices | 無 | 
| iot:ListJobExecutionsForJob | ListJobExecutionsForJob | 無 | 
| iot:ListJobExecutionsForThing | ListJobExecutionsForThing | 無 | 
| iot:ListJobs | ListJobs |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 若使用 thingGroupName 參數  | 
| iot:ListJobTemplates | ListJobs | 無 | 
| iot:ListOutgoingCertificates | ListOutgoingCertificates | \$1 | 
| iot:ListPolicies | ListPolicies | \$1 | 
| iot:ListPolicyPrincipals | ListPolicyPrincipals | \$1 | 
| iot:ListPolicyVersions | ListPolicyVersions |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:ListPrincipalPolicies | ListPrincipalPolicies |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:ListPrincipalThings | ListPrincipalThings |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:ListRoleAliases | ListRoleAliases | 無 | 
| iot:ListTargetsForPolicy | ListTargetsForPolicy |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:ListThingGroups | ListThingGroups | 無 | 
| iot:ListThingGroupsForThing | ListThingGroupsForThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:ListThingPrincipals | ListThingPrincipals |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:ListThingRegistrationTaskReports | ListThingRegistrationTaskReports | 無 | 
| iot:ListThingRegistrationTasks | ListThingRegistrationTasks | 無 | 
| iot:ListThingTypes | ListThingTypes | \$1 | 
| iot:ListThings | ListThings | \$1 | 
| iot:ListThingsInThingGroup | ListThingsInThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:ListTopicRules | ListTopicRules | \$1 | 
| iot:ListV2LoggingLevels | ListV2LoggingLevels | 無 | 
| iot:RegisterCACertificate | RegisterCACertificate | \$1 | 
| iot:RegisterCertificate | RegisterCertificate | \$1 | 
| iot:RegisterThing | RegisterThing | 無 | 
| iot:RejectCertificateTransfer | RejectCertificateTransfer |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:RemoveThingFromThingGroup | RemoveThingFromThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:ReplaceTopicRule | ReplaceTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:SearchIndex | SearchIndex |  `arn:aws:iot:region:account-id:index/index-id`  | 
| iot:SetDefaultAuthorizer | SetDefaultAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-function-name`  | 
| iot:SetDefaultPolicyVersion | SetDefaultPolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:SetLoggingOptions | SetLoggingOptions |  `arn:aws:iot:region:account-id:role/role-name`  | 
| iot:SetV2LoggingLevel | SetV2LoggingLevel |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:SetV2LoggingOptions | SetV2LoggingOptions |  `arn:aws:iot:region:account-id:role/role-name`  | 
| iot:StartThingRegistrationTask | StartThingRegistrationTask | 無 | 
| iot:StopThingRegistrationTask | StopThingRegistrationTask | 無 | 
| iot:TestAuthorization | TestAuthorization |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:TestInvokeAuthorizer | TestInvokeAuthorizer | 無 | 
| iot:TransferCertificate | TransferCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:UpdateAuthorizer | UpdateAuthorizer |  `arn:aws:iot:region:account-id:authorizerfunction/authorizer-function-name`  | 
| iot:UpdateCACertificate | UpdateCACertificate |  `arn:aws:iot:region:account-id:cacert/cert-id`  | 
| iot:UpdateCertificate | UpdateCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:UpdateDimension | UpdateDimension |  `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| iot:UpdateEventConfigurations | UpdateEventConfigurations | 無 | 
| iot:UpdateIndexingConfiguration | UpdateIndexingConfiguration | 無 | 
| iot:UpdateRoleAlias | UpdateRoleAlias |  `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| iot:UpdateSecurityProfile | UpdateSecurityProfile |  `arn:aws:iot:region:account-id:securityprofile/security-profile-name` `arn:aws:iot:region:account-id:dimension/dimension-name`  | 
| iot:UpdateThing | UpdateThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:UpdateThingGroup | UpdateThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:UpdateThingGroupsForThing | UpdateThingGroupsForThing |  `arn:aws:iot:region:account-id:thing/thing-name` `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 

中的政策動作在動作之前 AWS IoT 使用下列字首：`iot:`。例如，若要授予某人許可，以列出在 中 AWS 帳戶 向 `ListThings` API 註冊的所有 IoT 物件，請在其政策中包含 `iot:ListThings`動作。政策陳述式必須包含 `Action`或 `NotAction`元素。 AWS IoT 會定義自己的一組動作，描述您可以使用此服務執行的任務。

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

```
"Action": [
      "ec2:action1",
      "ec2:action2"
```

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

```
"Action": "iot:Describe*"
```

若要查看 AWS IoT 動作清單，請參閱《*IAM 使用者指南*》中的 [定義的動作 AWS IoT](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions)。

#### Device Advisor 動作
<a name="security_iam_service-actions-device-advisor"></a>

下表列出 IAM IoT Device Advisor 動作、相關的 AWS IoT Device Advisor API，以及動作所操控的資源。


****  

| 政策動作 | AWS IoT API | Resources | 
| --- | --- | --- | 
| iotdeviceadvisor:CreateSuiteDefinition | CreateSuiteDefinition |  無  | 
| iotdeviceadvisor:DeleteSuiteDefinition | DeleteSuiteDefinition |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id`  | 
| iotdeviceadvisor:GetSuiteDefinition | GetSuiteDefinition |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id`  | 
| iotdeviceadvisor:GetSuiteRun | GetSuiteRun |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-run-id`  | 
| iotdeviceadvisor:GetSuiteRunReport | GetSuiteRunReport |  `arn:aws:iotdeviceadvisor:region:account-id:suiterun/suite-definition-id/suite-run-id`  | 
| iotdeviceadvisor:ListSuiteDefinitions | ListSuiteDefinitions | 無 | 
| iotdeviceadvisor:ListSuiteRuns | ListSuiteRuns |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id`  | 
| iotdeviceadvisor:ListTagsForResource | ListTagsForResource |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id` `arn:aws:iotdeviceadvisor:region:account-id:suiterun/suite-definition-id/suite-run-id`  | 
| iotdeviceadvisor:StartSuiteRun | StartSuiteRun |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id`  | 
| iotdeviceadvisor:TagResource | TagResource |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id` `arn:aws:iotdeviceadvisor:region:account-id:suiterun/suite-definition-id/suite-run-id`  | 
| iotdeviceadvisor:UntagResource | UntagResource |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id` `arn:aws:iotdeviceadvisor:region:account-id:suiterun/suite-definition-id/suite-run-id`  | 
| iotdeviceadvisor:UpdateSuiteDefinition | UpdateSuiteDefinition |  `arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id`  | 
| iotdeviceadvisor:StopSuiteRun | StopSuiteRun |  `arn:aws:iotdeviceadvisor:region:account-id:suiterun/suite-definition-id/suite-run-id`  | 

 AWS IoT Device Advisor 中的政策動作在動作之前使用以下字首：`iotdeviceadvisor:`。例如，若要授予某人使用 AWS 帳戶 ListSuiteDefinitions API 列出在其中註冊的所有套件定義的許可，請在其政策中包含 `iotdeviceadvisor:ListSuiteDefinitions`動作。

### Resources
<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": "*"
```


**AWS IoT 資源**  

| 政策動作 | AWS IoT API | Resources | 
| --- | --- | --- | 
| iot:AcceptCertificateTransfer | AcceptCertificateTransfer |  `arn:aws:iot:region:account-id:cert/cert-id`  ARN 中 AWS 帳戶 指定的 必須是憑證要轉移的目標帳戶。   | 
| iot:AddThingToThingGroup | AddThingToThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:AssociateTargetsWithJob | AssociateTargetsWithJob | 無  | 
| iot:AttachPolicy | AttachPolicy | `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 或 `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:AttachPrincipalPolicy | AttachPrincipalPolicy |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:AttachThingPrincipal | AttachThingPrincipal |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:CancelCertificateTransfer | CancelCertificateTransfer |  `arn:aws:iot:region:account-id:cert/cert-id`  ARN 中 AWS 帳戶 指定的 必須是憑證要轉移的目標帳戶。   | 
| iot:CancelJob | CancelJob |  `arn:aws:iot:region:account-id:job/job-id`  | 
| iot:CancelJobExecution | CancelJobExecution |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:ClearDefaultAuthorizer | ClearDefaultAuthorizer | 無 | 
| iot:CreateAuthorizer | CreateAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-function-name`  | 
| iot:CreateCertificateFromCsr | CreateCertificateFromCsr | \$1 | 
| iot:CreateJob | CreateJob |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:thinggroup/thing-group-name` `arn:aws:iot:region:account-id:thing/thing-name` `arn:aws:iot:region:account-id:jobtemplate/job-template-id`  | 
| iot:CreateJobTemplate | CreateJobTemplate |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:jobtemplate/job-template-id`  | 
| iot:CreateKeysAndCertificate | CreateKeysAndCertificate | \$1 | 
| iot:CreatePolicy | CreatePolicy | `arn:aws:iot:region:account-id:policy/policy-name` | 
| CreatePolicyVersion | iot:CreatePolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  這必須是 AWS IoT 政策，而不是 IAM 政策。   | 
| iot:CreateRoleAlias | CreateRoleAlias |  (參數：roleAlias) `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| iot:CreateThing | CreateThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:CreateThingGroup | CreateThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 適用正在建立的群組和父群組 (若使用)  | 
| iot:CreateThingType | CreateThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| iot:CreateTopicRule | CreateTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:DeleteAuthorizer | DeleteAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-name`  | 
| iot:DeleteCACertificate | DeleteCACertificate |  `arn:aws:iot:region:account-id:cacert/cert-id`  | 
| iot:DeleteCertificate | DeleteCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:DeleteJob | DeleteJob |  `arn:aws:iot:region:account-id:job/job-id`  | 
| iot:DeleteJobExecution | DeleteJobExecution |  `arn:aws:iot:region:account-id:job/job-id` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:DeleteJobTemplate | DeleteJobTemplate |  `arn:aws:iot:region:account-id:jobtemplate/job-template-id`  | 
| iot:DeletePolicy | DeletePolicy |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:DeletePolicyVersion | DeletePolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:DeleteRegistrationCode | DeleteRegistrationCode | \$1 | 
| iot:DeleteRoleAlias | DeleteRoleAlias |  `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| iot:DeleteThing | DeleteThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:DeleteThingGroup | DeleteThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:DeleteThingType | DeleteThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| iot:DeleteTopicRule | DeleteTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:DeleteV2LoggingLevel | DeleteV2LoggingLevel |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:DeprecateThingType | DeprecateThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| iot:DescribeAuthorizer | DescribeAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-function-name` (參數：authorizerName) 無  | 
| iot:DescribeCACertificate | DescribeCACertificate |  `arn:aws:iot:region:account-id:cacert/cert-id`  | 
| iot:DescribeCertificate | DescribeCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:DescribeDefaultAuthorizer | DescribeDefaultAuthorizer | 無  | 
| iot:DescribeEndpoint | DescribeEndpoint | \$1 | 
| iot:DescribeEventConfigurations | DescribeEventConfigurations | 無  | 
| iot:DescribeIndex | DescribeIndex |  `arn:aws:iot:region:account-id:index/index-name`  | 
| iot:DescribeJob | DescribeJob |  `arn:aws:iot:region:account-id:job/job-id`  | 
| iot:DescribeJobExecution | DescribeJobExecution | 無 | 
| iot:DescribeJobTemplate | DescribeJobTemplate |  `arn:aws:iot:region:account-id:jobtemplate/job-template-id`  | 
| iot:DescribeRoleAlias | DescribeRoleAlias |  `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| iot:DescribeThing | DescribeThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:DescribeThingGroup | DescribeThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:DescribeThingRegistrationTask | DescribeThingRegistrationTask | 無 | 
| iot:DescribeThingType | DescribeThingType |  `arn:aws:iot:region:account-id:thingtype/thing-type-name`  | 
| iot:DetachPolicy | DetachPolicy |  `arn:aws:iot:region:account-id:cert/cert-id` 或 `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:DetachPrincipalPolicy | DetachPrincipalPolicy |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:DetachThingPrincipal | DetachThingPrincipal |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:DisableTopicRule | DisableTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:EnableTopicRule | EnableTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:GetEffectivePolicies | GetEffectivePolicies |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:GetIndexingConfiguration | GetIndexingConfiguration | 無 | 
| iot:GetJobDocument | GetJobDocument |  `arn:aws:iot:region:account-id:job/job-id`  | 
| iot:GetLoggingOptions | GetLoggingOptions | \$1 | 
| iot:GetPolicy | GetPolicy |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:GetPolicyVersion | GetPolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:GetRegistrationCode | GetRegistrationCode | \$1 | 
| iot:GetTopicRule | GetTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:ListAttachedPolicies | ListAttachedPolicies |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 或 `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:ListAuthorizers | ListAuthorizers | 無 | 
| iot:ListCACertificates | ListCACertificates | \$1 | 
| iot:ListCertificates | ListCertificates | \$1 | 
| iot:ListCertificatesByCA | ListCertificatesByCA | \$1 | 
| iot:ListIndices | ListIndices | 無 | 
| iot:ListJobExecutionsForJob | ListJobExecutionsForJob | 無 | 
| iot:ListJobExecutionsForThing | ListJobExecutionsForThing | 無 | 
| iot:ListJobs | ListJobs |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` 若使用 thingGroupName 參數  | 
| iot:ListJobTemplates | ListJobTemplates | 無 | 
| iot:ListOutgoingCertificates | ListOutgoingCertificates | \$1 | 
| iot:ListPolicies | ListPolicies | \$1 | 
| iot:ListPolicyPrincipals | ListPolicyPrincipals |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:ListPolicyVersions | ListPolicyVersions |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:ListPrincipalPolicies | ListPrincipalPolicies |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:ListPrincipalThings | ListPrincipalThings |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:ListRoleAliases | ListRoleAliases | 無 | 
| iot:ListTargetsForPolicy | ListTargetsForPolicy |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:ListThingGroups | ListThingGroups | 無 | 
| iot:ListThingGroupsForThing | ListThingGroupsForThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:ListThingPrincipals | ListThingPrincipals |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:ListThingRegistrationTaskReports | ListThingRegistrationTaskReports | 無 | 
| iot:ListThingRegistrationTasks | ListThingRegistrationTasks | 無 | 
| iot:ListThingTypes | ListThingTypes | \$1 | 
| iot:ListThings | ListThings | \$1 | 
| iot:ListThingsInThingGroup | ListThingsInThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:ListTopicRules | ListTopicRules | \$1 | 
| iot:ListV2LoggingLevels | ListV2LoggingLevels | 無 | 
| iot:RegisterCACertificate | RegisterCACertificate | \$1 | 
| iot:RegisterCertificate | RegisterCertificate | \$1 | 
| iot:RegisterThing | RegisterThing | 無 | 
| iot:RejectCertificateTransfer | RejectCertificateTransfer |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:RemoveThingFromThingGroup | RemoveThingFromThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name` `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:ReplaceTopicRule | ReplaceTopicRule |  `arn:aws:iot:region:account-id:rule/rule-name`  | 
| iot:SearchIndex | SearchIndex |  `arn:aws:iot:region:account-id:index/index-id`  | 
| iot:SetDefaultAuthorizer | SetDefaultAuthorizer |  `arn:aws:iot:region:account-id:authorizer/authorizer-function-name`  | 
| iot:SetDefaultPolicyVersion | SetDefaultPolicyVersion |  `arn:aws:iot:region:account-id:policy/policy-name`  | 
| iot:SetLoggingOptions | SetLoggingOptions | \$1 | 
| iot:SetV2LoggingLevel | SetV2LoggingLevel | \$1 | 
| iot:SetV2LoggingOptions | SetV2LoggingOptions | \$1 | 
| iot:StartThingRegistrationTask | StartThingRegistrationTask | 無 | 
| iot:StopThingRegistrationTask | StopThingRegistrationTask | 無 | 
| iot:TestAuthorization | TestAuthorization |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:TestInvokeAuthorizer | TestInvokeAuthorizer | 無 | 
| iot:TransferCertificate | TransferCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:UpdateAuthorizer | UpdateAuthorizer |  `arn:aws:iot:region:account-id:authorizerfunction/authorizer-function-name`  | 
| iot:UpdateCACertificate | UpdateCACertificate |  `arn:aws:iot:region:account-id:cacert/cert-id`  | 
| iot:UpdateCertificate | UpdateCertificate |  `arn:aws:iot:region:account-id:cert/cert-id`  | 
| iot:UpdateEventConfigurations | UpdateEventConfigurations | 無 | 
| iot:UpdateIndexingConfiguration | UpdateIndexingConfiguration | 無 | 
| iot:UpdateRoleAlias | UpdateRoleAlias |  `arn:aws:iot:region:account-id:rolealias/role-alias-name`  | 
| iot:UpdateThing | UpdateThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 
| iot:UpdateThingGroup | UpdateThingGroup |  `arn:aws:iot:region:account-id:thinggroup/thing-group-name`  | 
| iot:UpdateThingGroupsForThing | UpdateThingGroupsForThing |  `arn:aws:iot:region:account-id:thing/thing-name`  | 

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

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

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

若要查看 AWS IoT 資源類型及其 ARNs的清單，請參閱《*IAM 使用者指南*》中的 [定義的資源 AWS IoT](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-resources-for-iam-policies)。若要了解您可以使用哪些動作指定每個資源的 ARN，請參閱 [AWS IoT定義的動作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions)。

#### Device Advisor 資源
<a name="security_iam_service-device-advisor-resources"></a>

若要定義 AWS IoT Device Advisor IAM 政策的資源層級限制，請針對套件定義和套件執行使用以下資源 ARN 格式。

套件定義資源 ARN 格式  
`arn:aws:iotdeviceadvisor:region:account-id:suitedefinition/suite-definition-id`

套件執行資源 ARN 格式  
`arn:aws:iotdeviceadvisor:region:account-id:suiterun/suite-definition-id/suite-run-id`

### 條件索引鍵
<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)。

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


**AWS IoT 條件索引鍵**  

| AWS IoT 條件索引鍵 | 描述 | Type | 
| --- | --- | --- | 
| aws:RequestTag/\$1\$1tag-key\$1 | 在使用者對 AWS IoT提出的請求中存在的標籤金鑰。 | String | 
| aws:ResourceTag/\$1\$1tag-key\$1 | 連接至 AWS IoT 資源之標籤的標籤索引鍵元件。 | String | 
| aws:TagKeys | 與請求中資源相關聯的所有標籤鍵名稱清單。 | String | 

若要查看 AWS IoT 條件金鑰清單，請參閱《*IAM 使用者指南*》中的 [的條件金鑰 AWS IoT](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-policy-keys)。若要了解您可以使用條件金鑰的動作和資源，請參閱 [定義的動作 AWS IoT](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions)。

### 範例
<a name="security_iam_service-with-iam-id-based-policies-examples"></a>



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

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

以資源為基礎的政策是 JSON 政策文件，指定指定委託人可以在 AWS IoT 資源上執行的動作，以及在哪些條件下執行的動作。

AWS IoT 不支援 IAM 資源型政策。不過，它支援以 AWS IoT 資源為基礎的政策。如需詳細資訊，請參閱[AWS IoT Core 政策](iot-policies.md)。

## 以 AWS IoT 標籤為基礎的授權
<a name="security_iam_service-with-iam-tags"></a>

您可以將標籤連接至 AWS IoT 資源，或將請求中的標籤傳遞至 AWS IoT。如需根據標籤控制存取，請使用 `iot:ResourceTag/key-name`、`aws:RequestTag/key-name` 或 `aws:TagKeys` 條件索引鍵，在政策的[條件元素](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_elements_condition.html)中，提供標籤資訊。如需詳細資訊，請參閱[搭配 IAM 政策使用標籤](tagging-iot-iam.md)。如需標記 AWS IoT 資源的詳細資訊，請參閱 [標記您的 AWS IoT 資源](tagging-iot.md)。

若要檢視身分型原則範例，以根據該資源上的標籤來限制存取資源，請參閱[根據標籤檢視 AWS IoT 資源](security_iam_id-based-policy-examples.md#security_iam_id-based-policy-examples-view-thing-tags)。

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

[IAM 角色](https://docs.aws.amazon.com/service-authorization/latest/reference/id_roles.html)是 中具有特定許可 AWS 帳戶 的實體。

### 搭配 使用臨時登入資料 AWS IoT
<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 操作來取得臨時安全登入資料。

AWS IoT 支援使用臨時登入資料。

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

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

AWS IoT 不支援服務連結角色。

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

此功能可讓服務代表您擔任[服務角色](https://docs.aws.amazon.com/service-authorization/latest/reference/id_roles_terms-and-concepts.html#iam-term-service-role)。此角色可讓服務存取其他服務中的資源，以代表您完成動作。服務角色會出現在您的 IAM 帳戶中，且由該帳戶所擁有。這表示 IAM 管理員可以變更此角色的許可。不過，這樣可能會破壞此服務的功能。

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

根據預設，IAM 使用者和角色不具備建立或修改 AWS IoT 資源的許可。他們也無法使用 AWS 管理主控台 AWS CLI或 AWS API 執行任務。IAM 管理員必須建立 IAM 政策，授予使用者和角色在指定資源上執行特定 API 操作的所需許可。管理員接著必須將這些政策連接至需要這些許可的使用者或群組。

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

**Topics**
+ [政策最佳實務](#security_iam_service-with-iam-policy-best-practices)
+ [使用 AWS IoT 主控台](#security_iam_id-based-policy-examples-console)
+ [允許使用者檢視他們自己的許可](#security_iam_id-based-policy-examples-view-own-permissions)
+ [根據標籤檢視 AWS IoT 資源](#security_iam_id-based-policy-examples-view-thing-tags)
+ [根據標籤檢視 AWS IoT Device Advisor 資源](#security_iam-device-advisor-tags)

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

身分型政策會判斷您帳戶中的某個人員是否可以建立、存取或刪除 AWS IoT 資源。這些動作可能會讓您的 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)。

## 使用 AWS IoT 主控台
<a name="security_iam_id-based-policy-examples-console"></a>

若要存取 AWS IoT 主控台，您必須擁有一組最低的許可。這些許可必須允許您列出和檢視 中 AWS IoT 資源的詳細資訊 AWS 帳戶。如果您建立比最基本必要許可更嚴格的身分型政策，則對於具有該政策的實體 (使用者或角色) 而言，主控台就無法如預期運作。

為了確保這些實體仍然可以使用 AWS IoT 主控台，請將下列 AWS 受管政策連接至實體：`AWSIoTFullAccess`。如需詳細資訊，請參閱《IAM 使用者指南》**中的[新增許可到使用者](https://docs.aws.amazon.com/service-authorization/latest/reference/id_users_change-permissions.html#users_change_permissions-add-console)。

對於僅呼叫 AWS CLI 或 AWS API 的使用者，您不需要允許最低主控台許可。反之，只需允許存取符合您嘗試執行之 API 操作的動作就可以了。

## 允許使用者檢視他們自己的許可
<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": "*"
        }
    ]
}
```

## 根據標籤檢視 AWS IoT 資源
<a name="security_iam_id-based-policy-examples-view-thing-tags"></a>

您可以在身分型政策中使用條件，以根據標籤控制存取 AWS IoT 資源。此範例會示範如何建立政策，允許檢視物件。但是，只有在物件標籤 `Owner` 的值是該使用者的使用者名稱時，才會授予該許可。此政策也會授予在主控台完成此動作的必要許可。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ListBillingGroupsInConsole",
            "Effect": "Allow",
            "Action": "iot:ListBillingGroups",
            "Resource": "*"
        },
        {
            "Sid": "ViewBillingGroupsIfOwner",
            "Effect": "Allow",
           "Action": "iot:DescribeBillingGroup",
            "Resource": "arn:aws:iot:*:*:billinggroup/*",
            "Condition": {
                "StringEquals": {"aws:ResourceTag/Owner": "${aws:username}"}
        }
        }
    ]
}
```

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

## 根據標籤檢視 AWS IoT Device Advisor 資源
<a name="security_iam-device-advisor-tags"></a>

您可以在身分類型政策中使用條件，根據標籤來控制存取 AWS IoT Device Advisor 資源。以下範例顯示如何建立政策，允許檢視特定套件定義。不過，只在套件定義標籤已將 `SuiteType` 設定為值 `MQTT` 時，才會授予許可。此政策也會授予在主控台完成此動作的必要許可。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ViewSuiteDefinition",
            "Effect": "Allow",
            "Action": "iotdeviceadvisor:GetSuiteDefinition",
            "Resource": "arn:aws:iotdeviceadvisor:*:*:suitedefinition/*",
            "Condition": {
                "StringEquals": {"aws:ResourceTag/SuiteType": "MQTT"}
        }
        }
    ]
}
```

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







若要新增許可給使用者、群組和角色，使用 AWS 受管政策比自行撰寫政策更容易。建立 [IAM 客戶受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)需要時間和專業知識，而受管政策可為您的團隊提供其所需的許可。若要快速開始使用，您可以使用我們的 AWS 受管政策。這些政策涵蓋常見的使用案例，並可在您的 AWS 帳戶中使用。如需 AWS 受管政策的詳細資訊，請參閱《*IAM 使用者指南*》中的 [AWS 受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

AWS 服務會維護和更新 AWS 受管政策。您無法變更 AWS 受管政策中的許可。服務偶爾會在 AWS 受管政策中新增其他許可以支援新功能。此類型的更新會影響已連接政策的所有身分識別 (使用者、群組和角色)。當新功能啟動或新操作可用時，服務很可能會更新 AWS 受管政策。服務不會從 AWS 受管政策移除許可，因此政策更新不會破壞您現有的許可。

此外， AWS 支援跨多個 服務之任務函數的受管政策。例如，**ReadOnlyAccess** AWS 受管政策提供所有 AWS 服務和資源的唯讀存取權。當服務啟動新功能時， AWS 會為新的操作和資源新增唯讀許可。如需任務職能政策的清單和說明，請參閱 *IAM 使用者指南*中[有關任務職能的AWS 受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)。

**注意**  
AWS IoT 適用於 AWS IoT 和 IAM 政策。此主題僅討論 IAM 政策，此政策定義控制平面和資料平面 API 操作的政策動作。另請參閱[AWS IoT Core 政策](iot-policies.md)。









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





您可將 `AWSIoTConfigAccess` 政策連接到 IAM 身分。



此政策授予相關的身分許可，允許存取所有 AWS IoT 組態操作。此政策會影響資料處理和儲存。若要在 中檢視此政策 AWS 管理主控台，請參閱 [AWSIoTConfigAccess](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTConfigAccess$jsonEditor?section=permissions)。



**許可詳細資訊**

此政策包含以下許可。




+ `iot` – 擷取 AWS IoT 資料並執行 IoT 組態動作。



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:AcceptCertificateTransfer",
                "iot:AddThingToThingGroup",
                "iot:AssociateTargetsWithJob",
                "iot:AttachPolicy",
                "iot:AttachPrincipalPolicy",
                "iot:AttachThingPrincipal",
                "iot:CancelCertificateTransfer",
                "iot:CancelJob",
                "iot:CancelJobExecution",
                "iot:ClearDefaultAuthorizer",
                "iot:CreateAuthorizer",
                "iot:CreateCertificateFromCsr",
                "iot:CreateJob",
                "iot:CreateKeysAndCertificate",
                "iot:CreateOTAUpdate",
                "iot:CreatePolicy",
                "iot:CreatePolicyVersion",
                "iot:CreateRoleAlias",
                "iot:CreateStream",
                "iot:CreateThing",
                "iot:CreateThingGroup",
                "iot:CreateThingType",
                "iot:CreateTopicRule",
                "iot:DeleteAuthorizer",
                "iot:DeleteCACertificate",
                "iot:DeleteCertificate",
                "iot:DeleteJob",
                "iot:DeleteJobExecution",
                "iot:DeleteOTAUpdate",
                "iot:DeletePolicy",
                "iot:DeletePolicyVersion",
                "iot:DeleteRegistrationCode",
                "iot:DeleteRoleAlias",
                "iot:DeleteStream",
                "iot:DeleteThing",
                "iot:DeleteThingGroup",
                "iot:DeleteThingType",
                "iot:DeleteTopicRule",
                "iot:DeleteV2LoggingLevel",
                "iot:DeprecateThingType",
                "iot:DescribeAuthorizer",
                "iot:DescribeCACertificate",
                "iot:DescribeCertificate",
                "iot:DescribeDefaultAuthorizer",
                "iot:DescribeEndpoint",
                "iot:DescribeEventConfigurations",
                "iot:DescribeIndex",
                "iot:DescribeJob",
                "iot:DescribeJobExecution",
                "iot:DescribeRoleAlias",
                "iot:DescribeStream",
                "iot:DescribeThing",
                "iot:DescribeThingGroup",
                "iot:DescribeThingRegistrationTask",
                "iot:DescribeThingType",
                "iot:DetachPolicy",
                "iot:DetachPrincipalPolicy",
                "iot:DetachThingPrincipal",
                "iot:DisableTopicRule",
                "iot:EnableTopicRule",
                "iot:GetEffectivePolicies",
                "iot:GetIndexingConfiguration",
                "iot:GetJobDocument",
                "iot:GetLoggingOptions",
                "iot:GetOTAUpdate",
                "iot:GetPolicy",
                "iot:GetPolicyVersion",
                "iot:GetRegistrationCode",
                "iot:GetTopicRule",
                "iot:GetV2LoggingOptions",
                "iot:ListAttachedPolicies",
                "iot:ListAuthorizers",
                "iot:ListCACertificates",
                "iot:ListCertificates",
                "iot:ListCertificatesByCA",
                "iot:ListIndices",
                "iot:ListJobExecutionsForJob",
                "iot:ListJobExecutionsForThing",
                "iot:ListJobs",
                "iot:ListOTAUpdates",
                "iot:ListOutgoingCertificates",
                "iot:ListPolicies",
                "iot:ListPolicyPrincipals",
                "iot:ListPolicyVersions",
                "iot:ListPrincipalPolicies",
                "iot:ListPrincipalThings",
                "iot:ListRoleAliases",
                "iot:ListStreams",
                "iot:ListTargetsForPolicy",
                "iot:ListThingGroups",
                "iot:ListThingGroupsForThing",
                "iot:ListThingPrincipals",
                "iot:ListThingRegistrationTaskReports",
                "iot:ListThingRegistrationTasks",
                "iot:ListThings",
                "iot:ListThingsInThingGroup",
                "iot:ListThingTypes",
                "iot:ListTopicRules",
                "iot:ListV2LoggingLevels",
                "iot:RegisterCACertificate",
                "iot:RegisterCertificate",
                "iot:RegisterThing",
                "iot:RejectCertificateTransfer",
                "iot:RemoveThingFromThingGroup",
                "iot:ReplaceTopicRule",
                "iot:SearchIndex",
                "iot:SetDefaultAuthorizer",
                "iot:SetDefaultPolicyVersion",
                "iot:SetLoggingOptions",
                "iot:SetV2LoggingLevel",
                "iot:SetV2LoggingOptions",
                "iot:StartThingRegistrationTask",
                "iot:StopThingRegistrationTask",
                "iot:TestAuthorization",
                "iot:TestInvokeAuthorizer",
                "iot:TransferCertificate",
                "iot:UpdateAuthorizer",
                "iot:UpdateCACertificate",
                "iot:UpdateCertificate",
                "iot:UpdateEventConfigurations",
                "iot:UpdateIndexingConfiguration",
                "iot:UpdateRoleAlias",
                "iot:UpdateStream",
                "iot:UpdateThing",
                "iot:UpdateThingGroup",
                "iot:UpdateThingGroupsForThing",
                "iot:UpdateAccountAuditConfiguration",
                "iot:DescribeAccountAuditConfiguration",
                "iot:DeleteAccountAuditConfiguration",
                "iot:StartOnDemandAuditTask",
                "iot:CancelAuditTask",
                "iot:DescribeAuditTask",
                "iot:ListAuditTasks",
                "iot:CreateScheduledAudit",
                "iot:UpdateScheduledAudit",
                "iot:DeleteScheduledAudit",
                "iot:DescribeScheduledAudit",
                "iot:ListScheduledAudits",
                "iot:ListAuditFindings",
                "iot:CreateSecurityProfile",
                "iot:DescribeSecurityProfile",
                "iot:UpdateSecurityProfile",
                "iot:DeleteSecurityProfile",
                "iot:AttachSecurityProfile",
                "iot:DetachSecurityProfile",
                "iot:ListSecurityProfiles",
                "iot:ListSecurityProfilesForTarget",
                "iot:ListTargetsForSecurityProfile",
                "iot:ListActiveViolations",
                "iot:ListViolationEvents",
                "iot:ValidateSecurityProfileBehaviors"
            ],
            "Resource": "*"
        }
    ]
}
```

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





您可將 `AWSIoTConfigReadOnlyAccess` 政策連接到 IAM 身分。



此政策授予相關的身分許可，允許以唯讀方式存取所有 AWS IoT 組態操作。若要在 中檢視此政策 AWS 管理主控台，請參閱 [AWSIoTConfigReadOnlyAccess](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTConfigReadOnlyAccess$jsonEditor?section=permissions)。



**許可詳細資訊**

此政策包含以下許可。




+ `iot` – 執行 IoT 組態操作的唯獨操作。



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:DescribeAuthorizer",
                "iot:DescribeCACertificate",
                "iot:DescribeCertificate",
                "iot:DescribeDefaultAuthorizer",
                "iot:DescribeEndpoint",
                "iot:DescribeEventConfigurations",
                "iot:DescribeIndex",
                "iot:DescribeJob",
                "iot:DescribeJobExecution",
                "iot:DescribeRoleAlias",
                "iot:DescribeStream",
                "iot:DescribeThing",
                "iot:DescribeThingGroup",
                "iot:DescribeThingRegistrationTask",
                "iot:DescribeThingType",
                "iot:GetEffectivePolicies",
                "iot:GetIndexingConfiguration",
                "iot:GetJobDocument",
                "iot:GetLoggingOptions",
                "iot:GetOTAUpdate",
                "iot:GetPolicy",
                "iot:GetPolicyVersion",
                "iot:GetRegistrationCode",
                "iot:GetTopicRule",
                "iot:GetV2LoggingOptions",
                "iot:ListAttachedPolicies",
                "iot:ListAuthorizers",
                "iot:ListCACertificates",
                "iot:ListCertificates",
                "iot:ListCertificatesByCA",
                "iot:ListIndices",
                "iot:ListJobExecutionsForJob",
                "iot:ListJobExecutionsForThing",
                "iot:ListJobs",
                "iot:ListOTAUpdates",
                "iot:ListOutgoingCertificates",
                "iot:ListPolicies",
                "iot:ListPolicyPrincipals",
                "iot:ListPolicyVersions",
                "iot:ListPrincipalPolicies",
                "iot:ListPrincipalThings",
                "iot:ListRoleAliases",
                "iot:ListStreams",
                "iot:ListTargetsForPolicy",
                "iot:ListThingGroups",
                "iot:ListThingGroupsForThing",
                "iot:ListThingPrincipals",
                "iot:ListThingRegistrationTaskReports",
                "iot:ListThingRegistrationTasks",
                "iot:ListThings",
                "iot:ListThingsInThingGroup",
                "iot:ListThingTypes",
                "iot:ListTopicRules",
                "iot:ListV2LoggingLevels",
                "iot:SearchIndex",
                "iot:TestAuthorization",
                "iot:TestInvokeAuthorizer",
                "iot:DescribeAccountAuditConfiguration",
                "iot:DescribeAuditTask",
                "iot:ListAuditTasks",
                "iot:DescribeScheduledAudit",
                "iot:ListScheduledAudits",
                "iot:ListAuditFindings",
                "iot:DescribeSecurityProfile",
                "iot:ListSecurityProfiles",
                "iot:ListSecurityProfilesForTarget",
                "iot:ListTargetsForSecurityProfile",
                "iot:ListActiveViolations",
                "iot:ListViolationEvents",
                "iot:ValidateSecurityProfileBehaviors"
            ],
            "Resource": "*"
        }
    ]
}
```

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





您可將 `AWSIoTDataAccess` 政策連接到 IAM 身分。



此政策會授予相關的身分許可，以允許存取 AWS IoT 所有資料操作。資料操作則可透過 MQTT 或 HTTP 通訊協定傳送資料。若要在 AWS 管理主控台中檢視此政策，請參閱 [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTDataAccess?section=permissions](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTDataAccess?section=permissions)。



**許可詳細資訊**

此政策包含以下許可。




+ `iot` – 擷取 AWS IoT 資料並允許完整存取 AWS IoT 簡訊動作。



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect",
                "iot:Publish",
                "iot:Subscribe",
                "iot:Receive",
                "iot:GetThingShadow",
                "iot:UpdateThingShadow",
                "iot:DeleteThingShadow",
                "iot:ListNamedShadowsForThing"
            ],
            "Resource": "*"
        }
    ]
}
```

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





您可將 `AWSIoTFullAccess` 政策連接到 IAM 身分。



此政策授予相關的身分許可，允許完整存取所有 AWS IoT 組態和簡訊操作。若要在 中檢視此政策 AWS 管理主控台，請參閱 [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTFullAccess?section=permissions](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTFullAccess?section=permissions)。



**許可詳細資訊**

此政策包含以下許可。




+ `iot` – 擷取 AWS IoT 資料並允許完整存取 AWS IoT 組態和簡訊動作。
+ `iotjobsdata` – 擷取 AWS IoT 任務資料，並允許完整存取 AWS IoT 任務資料平面 API 操作。



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:*",
                "iotjobsdata:*"
            ],
            "Resource": "*"
        }
    ]
}
```

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





您可將 `AWSIoTLogging` 政策連接到 IAM 身分。



此政策授予相關的身分許可，允許建立 Amazon CloudWatch Logs 日誌群組，以及將日誌串流至群組。此政策會連接至您的 CloudWatch 記錄角色。若要在 中檢視此政策 AWS 管理主控台，請參閱 [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTLogging?section=permissions](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTLogging?section=permissions)。



**許可詳細資訊**

此政策包含以下許可。




+ `logs` – 擷取 CloudWatch 日誌。此外，也允許建立 CloudWatch 日誌群組，以及將日誌串流至群組。



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:PutMetricFilter",
                "logs:PutRetentionPolicy",
                "logs:GetLogEvents",
                "logs:DeleteLogStream"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

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





您可將 `AWSIoTOTAUpdate` 政策連接到 IAM 身分。



此政策會授予相關聯的身分許可，允許建立 AWS IoT 任務、 AWS IoT 程式碼簽署任務，以及描述 AWS 程式碼簽署者任務的存取權。若要在 中檢視此政策 AWS 管理主控台，請參閱 [`AWSIoTOTAUpdate`。](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTOTAUpdate?section=permissions)



**許可詳細資訊**

此政策包含以下許可。




+ `iot` – 建立 AWS IoT 任務和程式碼簽署任務。
+ `signer` – 執行 AWS 程式碼簽署者任務的建立。



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Action": [
            "iot:CreateJob",
            "signer:DescribeSigningJob"
        ],
        "Resource": "*"
    }
}
```

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





您可將 `AWSIoTRuleActions` 政策連接到 IAM 身分。



此政策會授予相關聯的身分許可，允許存取 AWS IoT 規則動作中 AWS 服務支援的所有 。若要在 中檢視此政策 AWS 管理主控台，請參閱 [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTRuleActions?section=permissions](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTRuleActions?section=permissions)。



**許可詳細資訊**

此政策包含以下許可。




+ `iot` - 執行發佈規則動作訊息的動作。
+ `dynamodb` - 將訊息插入 DynamoDB 表格，或將訊息拆分至 DynamoDB 表格中多個欄。
+ `s3` - 將物件存放在 Amazon S3 儲存貯體中。
+ `kinesis` - 向 Amazon Kinesis 串流物件發送訊息。
+ `firehose` - 在 Firehose 串流物件中插入記錄。
+ `cloudwatch` - 變更 CloudWatch 警示狀態，或將訊息資料發送到 CloudWatch 指標。
+ `sns` - 執行使用 Amazon SNS 發佈通知的操作。此操作的範圍為 AWS IoT SNS 主題。
+ `sqs` - 插入要新增至 SQS 佇列的訊息。
+ `es` - 向 OpenSearch Service 服務發送訊息。



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Action": [
            "dynamodb:PutItem",
            "kinesis:PutRecord",
            "iot:Publish",
            "s3:PutObject",
            "sns:Publish",
            "sqs:SendMessage*",
            "cloudwatch:SetAlarmState",
            "cloudwatch:PutMetricData",
            "es:ESHttpPut",
            "firehose:PutRecord"
        ],
        "Resource": "*"
    }
}
```

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





您可將 `AWSIoTThingsRegistration` 政策連接到 IAM 身分。



此政策授予相關的身分許可，允許使用 `StartThingRegistrationTask` API 大量註冊物件。此政策會影響資料處理和儲存。若要在 中檢視此政策 AWS 管理主控台，請參閱 [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTThingsRegistration?section=permissions](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTThingsRegistration?section=permissions)。



**許可詳細資訊**

此政策包含以下許可。




+ `iot` - 進行大量註冊時，執行建立物件並附加政策和憑證的動作。



****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:AddThingToThingGroup",
                "iot:AttachPolicy",
                "iot:AttachPrincipalPolicy",
                "iot:AttachThingPrincipal",
                "iot:CreateCertificateFromCsr",
                "iot:CreatePolicy",
                "iot:CreateThing",
                "iot:DescribeCertificate",
                "iot:DescribeThing",
                "iot:DescribeThingGroup",
                "iot:DescribeThingType",
                "iot:DetachPolicy",
                "iot:DetachThingPrincipal",
                "iot:GetPolicy",
                "iot:ListAttachedPolicies",
                "iot:ListPolicyPrincipals",
                "iot:ListPrincipalPolicies",
                "iot:ListPrincipalThings",
                "iot:ListTargetsForPolicy",
                "iot:ListThingGroupsForThing",
                "iot:ListThingPrincipals",
                "iot:RegisterCertificate",
                "iot:RegisterThing",
                "iot:RemoveThingFromThingGroup",
                "iot:UpdateCertificate",
                "iot:UpdateThing",
                "iot:UpdateThingGroupsForThing",
                "iot:AddThingToBillingGroup",
                "iot:DescribeBillingGroup",
                "iot:RemoveThingFromBillingGroup"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```





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



檢視自此服務開始追蹤這些變更 AWS IoT 以來， AWS 受管政策更新的詳細資訊。如需此頁面變更的自動提醒，請訂閱 AWS IoT 文件歷史記錄頁面上的 RSS 摘要。




| 變更 | 描述 | Date | 
| --- | --- | --- | 
|  [AWSIoTFullAccess](#security-iam-awsmanpol-AWSIoTFullAccess) – 更新現有政策  |  AWS IoT 新增了許可，允許使用者使用 HTTP 通訊協定存取 AWS IoT 任務資料平面 API 操作。 新的 IAM 政策字首 `iotjobsdata:`為您提供更精細的存取控制，以存取 AWS IoT 任務資料平面端點。對於控制平面 API 操作，請依舊使用 `iot:` 字首。如需詳細資訊，請參閱[AWS IoT Core HTTPS 通訊協定的 政策](iot-data-plane-jobs.md#iot-jobs-data-http)。  | 2022 年 5 月 11 日 | 
|  AWS IoT 開始追蹤變更  |  AWS IoT 已開始追蹤其 AWS 受管政策的變更。  | 2022 年 5 月 11 日 | 

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

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

**Topics**
+ [我無權在 中執行動作 AWS IoT](#security_iam_troubleshoot-no-permissions)
+ [我未獲得執行 iam:PassRole 的授權](#security_iam_troubleshoot-passrole)
+ [我想要允許 以外的人員 AWS 帳戶 存取我的 AWS IoT 資源](#security_iam_troubleshoot-cross-account-access)

## 我無權在 中執行動作 AWS IoT
<a name="security_iam_troubleshoot-no-permissions"></a>

如果您收到錯誤，告知您未獲授權執行動作，您的政策必須更新，允許您執行動作。

下列範例錯誤會在 IAM 使用者 `mateojackson` 嘗試使用主控台檢視物件資源的詳細資訊，但並無 `iot:DescribeThing` 許可權限時發生。

```
User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: iot:DescribeThing on resource: MyIoTThing
```

於此情況下，必須更新 `mateojackson` 使用者的政策，允許使用 `iot:DescribeThing` 動作存取物件資源。

如果您需要協助，請聯絡您的 AWS 管理員。您的管理員提供您的簽署憑證。

使用 AWS IoT Device Advisor  
如果您使用 AWS IoT Device Advisor，當使用者`mateojackson`嘗試使用主控台檢視套件定義的詳細資訊，但沒有 `iotdeviceadvisor:GetSuiteDefinition`許可時，會發生下列範例錯誤。  

```
User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: iotdeviceadvisor:GetSuiteDefinition on resource: MySuiteDefinition
```
於此情況下，必須更新 `mateojackson` 使用者的政策，允許使用 `iotdeviceadvisor:GetSuiteDefinition` 動作存取 *`MySuiteDefinition`* 資源。

## 我未獲得執行 iam:PassRole 的授權
<a name="security_iam_troubleshoot-passrole"></a>

如果您收到錯誤，告知您未獲授權執行 `iam:PassRole` 動作，您的政策必須更新，允許您將角色傳遞給 AWS IoT。

有些 AWS 服務 可讓您將現有角色傳遞給該服務，而不是建立新的服務角色或服務連結角色。如需執行此作業，您必須擁有將角色傳遞至該服務的許可。

名為 `marymajor` 的 IAM 使用者嘗試使用主控台在 AWS IoT中執行動作時，發生下列範例錯誤。但是，動作要求服務具備服務角色授予的許可。Mary 沒有將角色傳遞給服務的許可。

```
User: arn:aws:iam::123456789012:user/marymajor is not authorized to perform: iam:PassRole
```

在這種情況下，Mary 的政策必須更新，允許她執行 `iam:PassRole` 動作。

如果您需要協助，請聯絡您的 AWS 管理員。您的管理員提供您的簽署憑證。

## 我想要允許 以外的人員 AWS 帳戶 存取我的 AWS IoT 資源
<a name="security_iam_troubleshoot-cross-account-access"></a>

您可以建立一個角色，讓其他帳戶中的使用者或您組織外部的人員存取您的資源。您可以指定要允許哪些信任物件取得該角色。針對支援基於資源的政策或存取控制清單 (ACL) 的服務，您可以使用那些政策來授予人員存取您的資源的許可。

如需進一步了解，請參閱以下內容：
+ 若要了解 是否 AWS IoT 支援這些功能，請參閱 [AWS IoT 如何使用 IAM](security_iam_service-with-iam.md)。
+ 若要了解如何提供您擁有 AWS 帳戶 的資源存取權，請參閱《[IAM 使用者指南》中的在您擁有 AWS 帳戶 的另一個 中為 IAM 使用者提供存取權](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html)。 **
+ 若要了解如何將資源的存取權提供給第三方 AWS 帳戶，請參閱《*IAM 使用者指南*》中的[將存取權提供給第三方 AWS 帳戶 擁有](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html)。
+ 如需了解如何透過聯合身分提供存取權，請參閱《*IAM 使用者指南*》中的[將存取權提供給在外部進行身分驗證的使用者 (聯合身分)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_federated-users.html)。
+ 如需了解使用角色和資源型政策進行跨帳戶存取之間的差異，請參閱《*IAM 使用者指南*》中的 [IAM 中的跨帳戶資源存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

# 記錄和監控
<a name="security-logging"></a>

監控是維護 和 AWS 解決方案的可靠性、可用性 AWS IoT 和效能的重要部分。您應該從 AWS 解決方案的所有部分收集監控資料，以便在發生多點失敗時更輕鬆地偵錯。如需記錄和監視程序的相關資訊，請參閱 [監控 AWS IoT](monitoring_overview.md)

## 監控工具
<a name="monitoring_automated_manual"></a>

AWS 提供可用來監控的工具 AWS IoT。您可設定部分這些工具以為您執行監控工作。部分工具將需要手動操作。建議您盡可能自動化監控任務。

### 自動化監控工具
<a name="monitoring_automated_tools"></a>

您可以使用下列自動化監控工具，在發生錯誤時監看 AWS IoT 和報告 ：
+ **Amazon CloudWatch 警示**：監看指定時段內的單一指標，並根據與多個時段內給定之閾值相對的指標值來執行一或多個動作。此動作是傳送到 Amazon Simple Notification Service (Amazon SNS) 主題或 Amazon EC2 Auto Scaling 政策的通知。CloudWatch 警示不會只因為處於特定狀態而叫用動作。狀態必須已變更，且在指定的期間數內維持此狀態。如需詳細資訊，請參閱[使用 Amazon CloudWatch 監控 AWS IoT 警示和指標](monitoring-cloudwatch.md)。
+ **Amazon CloudWatch Logs** – 從 AWS CloudTrail 或其他來源監控、存放和存取您的日誌檔案。Amazon CloudWatch Logs 也可讓您查看 Device Advisor 測試案例採取的關鍵步驟 AWS IoT 、產生的事件和從裝置或在測試執行 AWS IoT Core 期間傳送的 MQTT 訊息。這些日誌可讓您在裝置上偵錯並採取更正動作。如需詳細資訊，請參閱 [AWS IoT 使用 CloudWatch Logs 進行監控](cloud-watch-logs.md)。如需 Amazon CloudWatch 的詳細資訊，請參閱《Amazon CloudWatch 使用者指南》**中的[監控記錄檔](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatchLogs.html)。
+ **Amazon CloudWatch Events**：匹配事件並將它們路由至一或多個目標函式或串流以進行變更、擷取狀態資訊，以及採取修正動作。如需詳細資訊，請參閱《Amazon CloudWatch 使用者指南》**中的[什麼是 Amazon CloudWatch Events？](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatchEvents.html)。
+ **AWS CloudTrail 日誌監控** – 在帳戶之間共用日誌檔案、透過將日誌檔案傳送到 CloudWatch Logs 來即時監控 CloudTrail 日誌檔案、在 Java 中寫入日誌處理應用程式，以及驗證您的日誌檔案在 CloudTrail 交付後並未變更。如需詳細資訊，請參閱 [使用 記錄 AWS IoT API 呼叫 AWS CloudTrail](iot-using-cloudtrail.md)，亦請參閱《AWS CloudTrail 使用者指南》**中的[使用 CloudTrail 記錄檔案](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-working-with-log-files.html)。

### 手動監控工具
<a name="monitoring_manual_tools"></a>

監控的另一個重要部分 AWS IoT 包括手動監控 CloudWatch 警示未涵蓋的項目。 AWS IoT、CloudWatch 和其他 AWS 服務主控台儀表板可讓您at-a-glance檢視 AWS 環境的狀態。建議您也檢查 上的日誌檔案 AWS IoT。
+ AWS IoT 儀表板會顯示：
  + 憑證授權機構憑證
  + 憑證
  + 政策
  + Rules
  + 物件
+ CloudWatch 首頁顯示：
  + 目前警示與狀態。
  + 警示與資源的圖形。
  + 服務運作狀態。

  您可以使用 CloudWatch 執行下列動作：
  + 建立[自訂儀表板](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/CloudWatch_Dashboards.html)來監控您關心的服務。
  + 用於疑難排解問題以及探索驅勢的圖形指標資料。
  + 搜尋和瀏覽您的所有 AWS 資源指標。
  + 建立與編輯要通知發生問題的警示。

# AWS IoT 核心的合規驗證
<a name="compliance"></a>

若要了解 是否 AWS 服務 在特定合規計劃範圍內，請參閱[AWS 服務 合規計劃範圍內](https://aws.amazon.com/compliance/services-in-scope/)然後選擇您感興趣的合規計劃。如需一般資訊，請參閱[AWS 合規計劃](https://aws.amazon.com/compliance/programs/)。

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

您使用 時的合規責任 AWS 服務 取決於資料的敏感度、您公司的合規目標，以及適用的法律和法規。如需使用 時合規責任的詳細資訊 AWS 服務，請參閱 [AWS 安全文件](https://docs.aws.amazon.com/security/)。

# AWS IoT Core 中的彈性
<a name="disaster-recovery-resiliency"></a>

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

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

AWS IoT Core 會將裝置的相關資訊儲存在裝置登錄檔中。它也會存放憑證授權機構憑證、裝置憑證和裝置影子資料。發生硬體或網路失敗時，此資料會自動跨可用區域複寫，但不會跨區域複寫。

AWS IoT Core 會在裝置登錄檔更新時發佈 MQTT 事件。您可以使用這些訊息來備份您的登錄資料，並將其儲存在某處，例如 DynamoDB 資料表。您負責儲存為您或您自行 AWS IoT Core 建立的憑證。裝置影子會儲存裝置的狀態資料，並在裝置重新上線時重新傳送。 AWS IoT Device Advisor 會儲存測試套件組態的相關資訊。發生硬體或網路失敗時，此資料會自動複寫。

AWS IoT Core 資源是區域特定的，除非您特別這樣做， AWS 區域 否則不會跨 複寫。

如需安全性最佳實務的相關資訊，請參閱 [中的安全最佳實務 AWS IoT Core](security-best-practices.md)。

# AWS IoT Core 搭配界面 VPC 端點使用
<a name="IoTCore-VPC"></a>

透過 AWS IoT Core，您可以使用介面 VPC [端點，在虛擬私有雲端 (VPC) 內建立 IoT 控制平面](https://docs.aws.amazon.com//iot/latest/developerguide/connect-to-iot.html#iot-service-endpoint-intro)端點和 [IoT 資料](https://docs.aws.amazon.com//iot/latest/developerguide/iot-connect-devices.html)端點。 [https://docs.aws.amazon.com//vpc/latest/userguide/vpce-interface.html#create-interface-endpoint](https://docs.aws.amazon.com//vpc/latest/userguide/vpce-interface.html#create-interface-endpoint)介面 VPC 端點採用一種 AWS 技術 AWS PrivateLink，可讓您 AWS 使用私有 IP 地址存取在 上執行的服務。如需詳細資訊，請參閱 [Amazon Virtual Private Cloud](https://docs.aws.amazon.com//AmazonVPC/latest/UserGuide/VPC_Introduction.html)。

若要將遠端網路上 欄位中的裝置，例如公司網路連接至您的 Amazon VPC，請參閱[Network-to-Amazon VPC 連線矩陣](https://docs.aws.amazon.com//whitepapers/latest/aws-vpc-connectivity-options/network-to-amazon-vpc-connectivity-options.html)中列出的選項。

**Topics**
+ [建立 AWS IoT Core 控制平面的 VPC 端點](#Create-VPC-endpoints-CP)
+ [為 AWS IoT Core 資料平面建立 VPC 端點](#Create-VPC-endpoints)
+ [為 AWS IoT Core 登入資料提供者建立 VPC 端點](#Create-VPC-endpoints-credential-provider)
+ [建立 Amazon VPC 介面端點](#Create-VPC-endpoints-core-create-vpc)
+ [設定私有託管區域](#connect-iot-core-create-phz-lns)
+ [透過 VPC AWS IoT Core 端點控制對 的存取](#Control-VPC-access)
+ [限制](#VPC-limitations)
+ [使用 擴展 VPC 端點 AWS IoT Core](#Scaling-VPC-endpoints)
+ [搭配使用自訂網域與 VPC 端點](#VPC-custom-domains)
+ [的 VPC 端點可用性 AWS IoT Core](#VPC-availability)
+ [搭配界面 VPC 端點使用 AWS IoT Device Management 安全通道](IoTCore-ST-VPC.md)

## 建立 AWS IoT Core 控制平面的 VPC 端點
<a name="Create-VPC-endpoints-CP"></a>

您可以為 AWS IoT Core 控制平面 API 建立 VPC 端點，將裝置連線至 AWS IoT 服務和其他 AWS 服務。若要開始使用 VPC 端點，[請建立介面 VPC 端點](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-interface.html#create-interface-endpoint)，然後選取 AWS IoT Core 做為 AWS 服務。如果您使用的是 CLI，請先呼叫 [describe-vpc-endpoint-services](https://docs.aws.amazon.com//cli/latest/reference/ec2/describe-vpc-endpoint-services.html)，以確保您選擇特定 中存在 AWS IoT Core 的可用區域 AWS 區域。例如，在 us-east-1 中，此命令將如下所示：

```
aws ec2 describe-vpc-endpoint-services --service-name com.amazonaws.us-east-1.iot.api
```

請參閱以下詳細說明，為 AWS IoT Core 控制平面[建立 Amazon VPC 介面端點](#Create-VPC-endpoints-core-create-vpc)。

## 為 AWS IoT Core 資料平面建立 VPC 端點
<a name="Create-VPC-endpoints"></a>

您可以為 AWS IoT Core 資料平面 API 建立 VPC 端點，將您的裝置連線至 AWS IoT 服務和其他 AWS 服務。若要開始使用 VPC 端點，[請建立介面 VPC 端點](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-interface.html#create-interface-endpoint)，然後選取 AWS IoT Core 做為 AWS 服務。如果您使用的是 CLI，請先呼叫 [describe-vpc-endpoint-services](https://docs.aws.amazon.com//cli/latest/reference/ec2/describe-vpc-endpoint-services.html)，以確保您選擇特定 中存在 AWS IoT Core 的可用區域 AWS 區域。例如，在 us-east-1 中，此命令將如下所示：

```
aws ec2 describe-vpc-endpoint-services --service-name com.amazonaws.us-east-1.iot.data
```

**注意**  
已停用自動建立 DNS 記錄的 VPC 功能。若要連接這些端點，您必須手動建立私有 DNS 記錄。如需有關私有 VPC DNS 記錄的詳細資訊，請參閱[介面端點的私有 DNS](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-interface.html#vpce-private-dns)。如需 AWS IoT Core VPC 限制的詳細資訊，請參閱 [限制](#VPC-limitations) 。

若要將 MQTT 用戶端連線至 VPC 端點介面：
+ 您必須在連接到 VPC 的私有託管區域中手動建立 DNS 記錄。若要開始使用，請參閱[建立私有託管區域](https://docs.aws.amazon.com//Route53/latest/DeveloperGuide/hosted-zone-private-creating.html)。
+ 在私有託管區域內，為 VPC 端點的每個彈性網路介面 IP 建立別名記錄。如果多個 VPC 端點有多個網路介面 IP，請在所有加權記錄中建立具有相同權重的加權 DNS 記錄。依描述欄位中的 VPC 端點 ID 進行篩選時，可從 [DescribeNetworkInterfaces](https://docs.aws.amazon.com//AWSEC2/latest/APIReference/API_DescribeNetworkInterfaces.html) API 呼叫中取得這些 IP 地址。

請參閱以下詳細說明，以[建立 Amazon VPC 介面端點](#Create-VPC-endpoints-core-create-vpc)和[設定資料平面的私有託管區域](#connect-iot-core-create-phz-lns)。 AWS IoT Core 

## 為 AWS IoT Core 登入資料提供者建立 VPC 端點
<a name="Create-VPC-endpoints-credential-provider"></a>

您可以建立 VPC 端點 AWS IoT Core [登入資料提供者](https://docs.aws.amazon.com//iot/latest/developerguide/authorizing-direct-aws.html)，使用用戶端憑證型身分驗證來連接裝置，並取得 [AWS Signature 第 4 版格式](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_aws-signing.html)的臨時 AWS 登入資料。若要開始使用 AWS IoT Core 登入資料提供者的 VPC 端點，請執行 [create-vpc-endpoint](https://docs.aws.amazon.com//cli/latest/reference/ec2/create-vpc-endpoint.html) CLI 命令來[建立介面 VPC 端點](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-interface.html#create-interface-endpoint)，然後選取 AWS IoT Core 登入資料提供者做為 AWS 服務。為了確保您選擇特定 中存在 AWS IoT Core 的可用區域 AWS 區域，請先執行 [describe-vpc-endpoint-services](https://docs.aws.amazon.com//cli/latest/reference/ec2/describe-vpc-endpoint-services.html) 命令。例如，在 us-east-1 中，此命令將如下所示：

```
aws ec2 describe-vpc-endpoint-services --service-name com.amazonaws.us-east-1.iot.credentials
```

**注意**  
已停用自動建立 DNS 記錄的 VPC 功能。若要連接這些端點，您必須手動建立私有 DNS 記錄。如需有關私有 VPC DNS 記錄的詳細資訊，請參閱[介面端點的私有 DNS](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-interface.html#vpce-private-dns)。如需 AWS IoT Core VPC 限制的詳細資訊，請參閱 [限制](#VPC-limitations) 。

若要將 HTTP 用戶端連線至 VPC 端點介面：
+ 您必須在連接到 VPC 的私有託管區域中手動建立 DNS 記錄。若要開始使用，請參閱[建立私有託管區域](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zone-private-creating.html)。
+ 在私有託管區域內，為 VPC 端點的每個彈性網路介面 IP 建立別名記錄。如果多個 VPC 端點有多個網路介面 IP，請在所有加權記錄中建立具有相同權重的加權 DNS 記錄。依描述欄位中的 VPC 端點 ID 進行篩選時，可從 [DescribeNetworkInterfaces](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInterfaces.html) API 呼叫中取得這些 IP 地址。

請參閱以下詳細說明，以[建立 Amazon VPC 介面端點](#Create-VPC-endpoints-core-create-vpc)和[設定登入資料提供者的私有託管區域](#connect-iot-core-create-phz-lns)。 AWS IoT Core 

## 建立 Amazon VPC 介面端點
<a name="Create-VPC-endpoints-core-create-vpc"></a>

您可以建立介面 VPC 端點，以連線至由 提供支援 AWS 的服務 AWS PrivateLink。使用下列程序來建立連線至 AWS IoT Core 資料平面或 AWS IoT Core 憑證提供者的介面 VPC 端點。如需詳細資訊，請參閱[使用介面 VPC 端點存取 AWS 服務](https://docs.aws.amazon.com//vpc/latest/privatelink/create-interface-endpoint.html)。

**注意**  
為 AWS IoT Core 資料平面和 AWS IoT Core 登入資料提供者建立 Amazon VPC 介面端點的程序類似，但您必須進行端點特定變更，才能使連線正常運作。

 **使用 VPC 端點主控台建立介面 [VPC](https://console.aws.amazon.com/vpc/home#/endpoints) **端點** ** 

1. 導覽至 [VPC](https://console.aws.amazon.com/vpc/home#/endpoints) **端點**主控台，在左側選單的**虛擬私有雲端**下，選擇**端點**，然後選擇**建立端點**。

1. 在**建立端點**頁面中，指定下列資訊。
   + 選擇**服務類別**的 **AWS 服務**。
   + 針對 **Service Name** (服務名稱)，輸入關鍵字 `iot` 進行搜尋。在顯示的 `iot` 服務清單中，選擇端點。

     如果您為 AWS IoT Core 控制平面建立 VPC 端點，請選擇您 的 AWS IoT Core 控制平面 API 端點 AWS 區域。端點的格式為 `com.amazonaws.region.iot.api`。

     如果您為 AWS IoT Core 資料平面建立 VPC 端點，請選擇您區域 AWS IoT Core 的資料平面 API 端點。端點的格式為 `com.amazonaws.region.iot.data`。

     如果您為 AWS IoT Core 登入資料提供者建立 VPC 端點，請選擇您區域的 AWS IoT Core 登入資料提供者端點。端點的格式為 `com.amazonaws.region.iot.credentials`。

     如果您為聯邦資訊處理標準 (FIPS) 區域建立 VPC 端點，請選擇 的 FIPS API 端點 AWS 區域。端點的格式為 `com.amazonaws.region.iot-fips.api`。這僅適用於控制平面。
**注意**  
中國區域中 AWS IoT Core 資料平面的服務名稱格式為 `cn.com.amazonaws.region.iot.data`。中國區域中 AWS IoT Core 控制平面的服務名稱格式為 `com.amazonaws.region.iot.api`。
   + 針對 **VPC** 和 **Subnets** (子網路)，選擇要在其中建立端點的 VPC，以及要在其中建立端點網路的可用區域 (AZ)。
   + 針對**啟用 DNS 名稱**，請確定未針對 AWS IoT Core 資料平面和 AWS IoT Core 憑證提供者選取**此端點的啟用**。 AWS IoT Core 資料平面和 AWS IoT Core 登入資料提供者都不支援私有 DNS 名稱。

     對於 AWS IoT Core 控制平面，預設會選取**啟用 DNS 名稱**。這可確保對控制平面公有 AWS IoT Core 端點的任何請求將改為透過 VPC 端點路由。啟用此功能時，您不需要設定私有託管區域。
   + 針對 **Security group** (安全群組)，選擇要與端點網路介面建立關聯的安全群組。
   + 您可以選擇性地新增或移除標籤。標籤是您用來與端點建立關聯的名稱值對。

1. 若要建立 VPC 端點，請選擇 **Create endpoint** (建立端點)。

建立 AWS PrivateLink 端點之後，您會在端點**的詳細資訊**索引標籤中看到 DNS 名稱清單。您可以使用您在本節中建立的其中一個 DNS 名稱來[設定私有託管區域](#connect-iot-core-create-phz-lns)。如果您使用的是 AWS IoT Core 控制平面，則不需要設定私有託管區域。

## 設定私有託管區域
<a name="connect-iot-core-create-phz-lns"></a>

**注意**  
如果您使用 AWS IoT Core 控制平面並選取**啟用 DNS 名稱**，則不需要設定私有託管區域。如果您停用它，則必須遵循此程序來設定私有託管區域。

您可以使用您在上一節中建立的其中一個 DNS 名稱來設定私有託管區域。

 **對於 AWS IoT Core 資料平面** 

DNS 名稱必須是您的網域組態名稱或`IoT:Data-ATS`端點。DNS 名稱範例可以是：` xxx-ats.data.iot.region.amazonaws.com`。

 **對於 AWS IoT Core 登入資料提供者** 

DNS 名稱必須是您的`iot:CredentialProvider`端點。DNS 名稱範例可以是：` xxxx.credentials.iot.region.amazonaws.com`。

 **對於 AWS IoT Core 控制平面** 

DNS 名稱必須是您的 AWS IoT Core 控制平面端點。 AWS IoT Core 控制平面的範例 DNS 名稱為 ` xxxx.api.iot.region.amazonaws.com`。

**注意**  
為 AWS IoT Core 資料平面和 AWS IoT Core 登入資料提供者設定私有託管區域的程序類似，但您必須進行端點特定變更，才能使連線正常運作。

### 建立私有託管區域
<a name="connect-iot-core-create-phz-lns-private-hosted-zone"></a>

 **使用 Route 53 主控台建立私有託管區域** 

1. 導覽至 [Route 53](https://console.aws.amazon.com/route53/v2/hostedzones#/) **Hosted zones** (託管區域) 主控台，然後選擇 **Create hosted zone** (建立託管區域)。

1. 在 **Create hosted zone** (建立託管區域) 頁面中，指定下列資訊。
   + 針對**網域名稱**，輸入 `iot:Data-ATS`或 端點的`iot:CredentialProvider`端點地址。下列 AWS CLI 命令顯示如何透過公有網路取得端點： `aws iot describe-endpoint --endpoint-type iot:Data-ATS`或 `aws iot describe-endpoint --endpoint-type iot:CredentialProvider`。
**注意**  
如果您使用自訂網域，請參閱[搭配使用自訂網域與 VPC 端點。](https://docs.aws.amazon.com/iot/latest/developerguide/IoTCore-VPC.html#VPC-custom-domains) AWS IoT Core 登入資料提供者不支援自訂網域。
   + 針對 **Type** (類型)，選擇 **Private Hosted Zone** (私有託管區域)。
   + 或者，您可以新增或移除要與託管區域建立關聯的標籤。

1. 若要建立私有託管區域，請選擇 **Create hosted zone** (建立託管區域)。

如需詳細資訊，請參閱[建立私有託管區域](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zone-private-creating.html)。

### 建立記錄
<a name="connect-iot-core-create-phz-lns-create-record"></a>

在建立了私有託管區域之後，您可以建立記錄，告訴 DNS 您想要流量路由至該網域的方式。

 **建立記錄** 

1. 在顯示的託管區域清單，選擇您先前建立的私有託管區域，然後選擇 **Create record** (建立記錄)。

1. 使用精靈方法來建立記錄。如果主控台呈現 **Quick create** (快速建立) 方法，請選擇 **Switch to wizard** (切換至精靈)。

1. 為 **Routing policy** (路由政策) 選擇 **Simple Routing** (簡易路由)，然後選擇 **Next** (下一步)。

1. 在 **Configure records** (設定記錄) 頁面中，選擇 **Define simple record** (定義簡易記錄)。

1. 在 **Define simple record** (定義簡易記錄) 頁面中：
   + 在**記錄名稱**中，輸入`iot:Data-ATS`端點或`iot:CredentialProvider`端點。這必須與私有託管區域名稱相同。
   + 對於**記錄類型**，如果您只想要 IPv4 支援，請將值保留為 `A - Routes traffic to an IPv4 address and some AWS resources`。如果您只想要 IPv6 支援，請將值保留為 `AAAA - Routes traffic to an IPv6 address and some AWS resources`。如果您想要雙堆疊支援 (IPv4 和 IPv6)，請建立兩個記錄 (`A` `AAAA` 在託管區域中，使用相同的**記錄名稱**和**值/路由流量**。
   + 針對 **Value/Route traffic to** (值/路由流量至)，選擇 **Alias to VPC endpoint** (VPC 端點的別名)。接著，選擇您的 **Region** (區域)，然後從顯示的端點清單中選擇您先前建立的端點，如[建立 Amazon VPC 介面端點](#Create-VPC-endpoints-core-create-vpc)所述。

1. 選擇 **Define simple record** (定義簡易記錄) 來建立您的記錄。

## 透過 VPC AWS IoT Core 端點控制對 的存取
<a name="Control-VPC-access"></a>

您可以使用 VPC [條件內容索引鍵](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html)，將裝置存取限制 AWS IoT Core 為僅允許透過 VPC 端點存取 。 AWS IoT Core 支援下列 VPC 相關內容索引鍵：
+  [SourceVpc](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcevpc) 
+  [SourceVpce](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcevpce) 
+  [VPCSourceIp](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-vpcsourceip) 

**注意**  
AWS IoT Core 不支援 [VPC 端點的端點政策](https://docs.aws.amazon.com//vpc/latest/privatelink/vpc-endpoints-access.html#vpc-endpoint-policies)。

例如，以下政策授予許可，以 AWS IoT Core 使用符合物件名稱的用戶端 ID 連線至 ，並發佈至物件名稱前綴的任何主題，條件是連接至具有特定 VPC 端點 ID 之 VPC 端點的裝置。此政策會拒絕與公有 IoT 資料端點的連線嘗試。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:SourceVpce": "vpce-1a2b3c4d"
            }
        }
            
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:Publish"
            ],
            "Resource": [
                "arn:aws:iot:us-east-1:123456789012:topic/${iot:Connection.Thing.ThingName}/*"
            ]
        }
    ]
}
```

## 限制
<a name="VPC-limitations"></a>

[AWS IoT Core 控制平面端點](https://docs.aws.amazon.com//iot/latest/developerguide/connect-to-iot.html#iot-service-endpoint-intro)、[AWS IoT Core 資料端點](https://docs.aws.amazon.com//iot/latest/developerguide/iot-connect-devices.html#iot-connect-device-endpoints)和[AWS IoT Core 登入資料提供者](https://docs.aws.amazon.com//iot/latest/developerguide/authorizing-direct-aws.htm)端點目前支援 VPC 端點。只有在使用 AWS IoT Core 控制平面時[，聯邦資訊處理標準 (FIPS) 端點才支援 VPC 端點](https://docs.aws.amazon.com//iot/latest/developerguide/iot-connect-fips.html)。

### IoT 控制平面 VPC 端點的限制
<a name="VPC-limitations-iot-control"></a>

本節涵蓋 IoT 控制平面 VPC 端點的限制。
+ VPC 端點只會提供 ATS 憑證。
+ 控制平面端點不支援自訂網域。
+ 如需 FIPS 安全政策的相關資訊，請參閱 [FIPS 安全政策](https://docs.aws.amazon.com//elasticloadbalancing/latest/application/describe-ssl-policies.html#fips-security-policies)。

### IoT 資料 VPC 端點的限制
<a name="VPC-limitations-iot-data"></a>

本節涵蓋 IoT 資料 VPC 端點的限制。
+ MQTT 持續作用期間限制為 230 秒。保持存活期間超過自動減少到 230 秒的時間。
+ 每個 VPC 端點支援總共 100,000 個並行連網裝置。如果您需要更多連線，請參閱 [使用 擴展 VPC 端點 AWS IoT Core](#Scaling-VPC-endpoints) 。
+ VPC 端點只會為 [ATS 憑證](https://docs.aws.amazon.com//iot/latest/developerguide/server-authentication.html)提供服務，但自訂網域除外。
+  不支援 [VPC 端點政策](https://docs.aws.amazon.com//vpc/latest/privatelink/vpc-endpoints-access.html)。
+ 對於為 AWS IoT Core 資料平面建立的 VPC 端點， AWS IoT Core 不支援使用區域或區域公有 DNS 記錄。

### 登入資料提供者端點的限制
<a name="VPC-limitations-credential-provider"></a>

本節涵蓋登入資料提供者 VPC 端點的限制。
+ VPC 端點只會提供 [ATS 憑證](https://docs.aws.amazon.com//iot/latest/developerguide/server-authentication.html)。
+  不支援 [VPC 端點政策](https://docs.aws.amazon.com//vpc/latest/privatelink/vpc-endpoints-access.html)。
+ 登入資料提供者端點不支援自訂網域。
+ 對於為 AWS IoT Core 登入資料提供者建立的 VPC 端點， AWS IoT Core 不支援使用區域或區域公有 DNS 記錄。

## 使用 擴展 VPC 端點 AWS IoT Core
<a name="Scaling-VPC-endpoints"></a>

AWS IoT Core 介面 VPC 端點透過單一介面端點限制為 100，000 個連線裝置。如果您的使用案例要求更多並行連線到代理程式，則我們建議使用多個 VPC 端點，並跨您的介面端點手動路由裝置。建立私有 DNS 記錄以將流量路由到 VPC 端點時，請確保建立的加權記錄數量與 VPC 端點數量一樣多，以將流量分配到多個端點。

## 搭配使用自訂網域與 VPC 端點
<a name="VPC-custom-domains"></a>

如果您想要搭配 VPC 端點使用自訂網域，您必須在私有託管區域中建立自訂網域名稱記錄，並在 Route53 中建立路由記錄。如需詳細資訊，請參閱[建立私有託管區域](https://docs.aws.amazon.com//Route53/latest/DeveloperGuide/hosted-zone-private-creating.html)。

**注意**  
只有 AWS IoT Core 資料端點才支援自訂網域。

## 的 VPC 端點可用性 AWS IoT Core
<a name="VPC-availability"></a>

AWS IoT Core 介面 VPC 端點可在所有[AWS IoT Core 支援的區域中](https://aws.amazon.com//about-aws/global-infrastructure/regional-product-services/)使用。中國區域和 不支援憑證提供者的 AWS IoT Core AWS IoT Core 介面 VPC 端點 AWS GovCloud (US) Regions。

# 搭配界面 VPC 端點使用 AWS IoT Device Management 安全通道
<a name="IoTCore-ST-VPC"></a>

AWS IoT Device Management 安全通道支援介面 VPC 端點。您可以使用 VPC 端點來保留 VPC 與 AWS 網路 AWS IoT Secure Tunneling 內的流量，而不需要網際網路閘道、NAT 裝置、VPN 連接或 AWS Direct Connect 連線。

介面 VPC 端點採用 [AWS PrivateLink](https://docs.aws.amazon.com//vpc/latest/privatelink/what-is-privatelink.html)技術，這項技術可讓您使用私有 IP 地址私下存取 服務。如需詳細資訊，請參閱《 AWS PrivateLink 指南》中的[使用介面 VPC 端點存取 AWS 服務](https://docs.aws.amazon.com//vpc/latest/privatelink/create-interface-endpoint.html)。

**Topics**
+ [先決條件](#Create-ST-VPC-endpoints-prereq)
+ [透過 VPC 端點接收通道通知](#ST-VPC-Receive-notifications)
+ [建立 VPC 端點以進行安全通道](#Create-ST-VPC-endpoints-Create)
+ [在 Proxy 伺服器上設定 VPC 端點政策](#Create-ST-VPC-endpoints-Configure)
+ [後續步驟](#Create-ST-VPC-endpoints-Next)

## 先決條件
<a name="Create-ST-VPC-endpoints-prereq"></a>

為 建立 VPC 端點之前 AWS IoT Secure Tunneling，請確認您有下列項目：
+ 具有建立 VPC 端點所需許可 AWS 的帳戶。
+ 您 AWS 帳戶中的 VPC。
+ 了解 AWS IoT Device Management 安全通道概念。
+ 熟悉 VPC 端點政策和 AWS Identity and Access Management (IAM)

## 透過 VPC 端點接收通道通知
<a name="ST-VPC-Receive-notifications"></a>

若要透過 VPC 端點接收通道通知，您的裝置可以透過 VPC 端點連線至 AWS IoT Core 資料平面，並訂閱安全通道預留 MQTT 主題。

如需如何在 AWS IoT Core 資料平面中建立和設定 VPC 端點的指示，請參閱《 AWS IoT 開發人員指南》中的[搭配使用 AWS IoT Core 與介面 VPC 端點](https://docs.aws.amazon.com/iot/latest/developerguide/IoTCore-VPC.html)。

## 建立 VPC 端點以進行安全通道
<a name="Create-ST-VPC-endpoints-Create"></a>

您可以為安全通道控制平面和代理伺服器建立 VPC 端點。

**建立用於安全通道的 VPC 端點**

1. 遵循《Amazon VPC 開發人員指南》中[建立介面端點](https://docs.aws.amazon.com//vpc/latest/privatelink/create-interface-endpoint.html)的步驟

1. 針對**服務名稱**，根據您的端點類型選擇下列其中一個選項：

**控制平面**
   + 標準： `com.amazonaws.<region>.iot.tunneling.api`
   + FIPS （適用於 FIPS 區域）： `com.amazonaws.<region>.iot-fips.tunneling.api`

**代理伺服器**
   + 標準： `com.amazonaws.<region>.iot.tunneling.data`
   + FIPS （適用於 FIPS 區域）： `com.amazonaws.<region>.iot-fips.tunneling.data`

   將 *<region>* 取代為您的 AWS 區域。例如 `us-east-1`。

1. 根據您的網路需求，完成 VPC 端點建立程序中剩餘的步驟。

## 在 Proxy 伺服器上設定 VPC 端點政策
<a name="Create-ST-VPC-endpoints-Configure"></a>

除了用來授權通道連線的用戶端存取字符型授權之外，您還可以使用 VPC 端點政策進一步限制裝置如何使用 VPC 端點連線到安全通道 Proxy Server。VPC 端點政策遵循類似 IAM 的語法，並在 VPC 端點本身上設定。

請注意，代理伺服器 VPC 端點政策唯一支援的 IAM 動作是 `iot:ConnectToTunnel`。

以下是不同 VPC 端點政策的範例。

### Proxy 伺服器 VPC 端點政策範例
<a name="w2aac17c35c31c15b9"></a>

下列範例顯示常見使用案例的 Proxy Server VPC 端點政策組態。

**Example - 預設政策**  
此政策允許 VPC 中的裝置連線到任何帳戶中建立 AWS 端點 AWS 區域 之相同 中的任何通道。  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "*",
            "Resource": "*"
        }
    ]
}
```

**Example - 限制存取特定 AWS 帳戶**  
此政策允許 VPC 端點僅連線到特定 AWS 帳戶中的通道。  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "iot:ConnectToTunnel",
            "Resource": [
                "arn:aws:iot:us-east-1:111122223333:tunnel/*",
                "arn:aws:iot:us-east-1:444455556666:tunnel/*"
            ]
        }
    ]
}
```

**Example - 依通道端點限制連線**  
您可以限制 VPC 端點存取，僅允許裝置連線到通道的來源或目的地端。  
僅限來源：  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "iot:ConnectToTunnel",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iot:ClientMode": "source"
                }
            }
        }
    ]
}
```

僅限目的地：

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "iot:ConnectToTunnel",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iot:ClientMode": "destination"
                }
            }
        }
    ]
}
```

**Example - 根據資源標籤限制存取**  
此政策允許 VPC 端點僅連線到以特定鍵值對標記的通道。  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "iot:ConnectToTunnel",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/Environment": "Production"
                }
            }
        }
    ]
}
```

**Example - 合併政策條件**  
此政策示範結合多個政策元素。它允許連線到特定 AWS 帳戶中的任何通道，但前提是通道已標記為 `AllowConnectionsThroughPrivateLink`且`true`用戶端未連線到通道的目的地端。  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "iot:ConnectToTunnel",
            "Resource": [
                "arn:aws:iot:us-east-1:111122223333:tunnel/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/AllowConnectionsThroughPrivateLink": "true"
                }
            }
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "iot:ConnectToTunnel",
            "Resource": [
                "arn:aws:iot:us-east-1:111122223333:tunnel/*"
            ],
            "Condition": {
                "StringEquals": {
                    "iot:ClientMode": "destination"
                }
            }
        }
    ]
}
```

## 後續步驟
<a name="Create-ST-VPC-endpoints-Next"></a>

為 建立和設定 VPC 端點之後 AWS IoT Secure Tunneling，請考慮下列事項：
+ 透過端點連線裝置，測試您的 VPC 端點組態。
+ 透過 Amazon CloudWatch 指標監控 VPC 端點用量。
+ 根據您的安全需求，視需要檢閱和更新 VPC 端點政策。

如需 AWS IoT Device Management 安全通道的詳細資訊，請參閱[AWS IoT Secure Tunneling](https://docs.aws.amazon.com//iot/latest/developerguide/secure-tunneling.html)。

# 中的基礎設施安全 AWS IoT
<a name="infrastructure-security"></a>

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

您可以使用 AWS 已發佈的 API 呼叫， AWS IoT 透過網路存取 。用戶端必須支援 Transport Layer Security (TLS) 1.2 或更新版本。用戶端也必須支援具備完美轉送私密 (PFS) 的密碼套件，例如臨時 Diffie-Hellman (DHE) 或橢圓曲線臨時 Diffie-Hellman (ECDHE)。現代系統 (如 Java 7 和更新版本) 大多會支援這些模式。如需詳細資訊，請參閱[中的傳輸安全性 AWS IoT Core](transport-security.md)。

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

# 使用 AWS IoT Core 對生產機群或裝置進行安全監控
<a name="security-monitoring"></a>

IoT 機群可由大量的裝置組成具有多樣化的功能、長時間在線上，並且散佈在多個地理位置。這些特點使機群的設定變得複雜且極易出錯。由於裝置通常受限於運算能力、記憶體和儲存功能，因此限制了裝置本身的加密和其他形式的安全性的使用。此外，裝置通常會使用具有已知漏洞的軟體。這些因素讓 IoT 機群成為對駭客極具吸引力的目標，且難以持續保護裝置機群。

AWS IoT Device Defender 透過提供工具來識別安全問題和偏離最佳實務來解決這些挑戰。您可以使用 AWS IoT Device Defender 來分析、稽核和監控連線裝置，以偵測異常行為，並降低安全風險。 AWS IoT Device Defender 可以稽核裝置機群，以確保他們遵守安全最佳實務，並偵測裝置上的異常行為。這可讓您在 AWS IoT 裝置機群中強制執行一致的安全政策，並在裝置遭到入侵時快速回應。如需詳細資訊，請參閱[AWS IoT Device Defender](https://docs.aws.amazon.com/iot-device-defender/latest/devguide/what-is-device-defender.html)。

AWS IoT Device Advisor 會視需要推送更新並修補您的機群。 AWS IoT Device Advisor 會自動更新測試案例。您選取的測試案例一律搭配最新版本。如需詳細資訊，請參閱[Device Advisor](device-advisor.md)。

# 中的安全最佳實務 AWS IoT Core
<a name="security-best-practices"></a>

本節包含 的安全最佳實務相關資訊 AWS IoT Core。如需產業 IoT 解決方案安全規則的相關資訊，請參閱[產業 IoT 解決方案的十大安全黃金法則](https://aws.amazon.com/blogs/iot/ten-security-golden-rules-for-industrial-iot-solutions/)。

## 在 中保護 MQTT 連線 AWS IoT
<a name="secure-mqtt"></a>

[AWS IoT Core](https://aws.amazon.com/iot-core/) 是一種受管雲端服務，可讓連線裝置輕鬆且安全地與雲端應用程式和其他裝置互動。 AWS IoT Core 支援 HTTP、[WebSocket](https://en.wikipedia.org/wiki/WebSocket) 和 [MQTT](https://en.wikipedia.org/wiki/MQTT)，這是一種輕量型通訊協定，專為容忍間歇性連線而設計。如果您 AWS IoT 使用 MQTT 連線至 ，則每個連線都必須與稱為用戶端 ID 的識別符建立關聯。MQTT 用戶端 ID 是獨一無二的，可識別 MQTT 連線。如果使用已針對另一個連線宣告的用戶端 ID 建立新連線， AWS IoT 訊息中介裝置會捨棄舊連線，以允許新連線。每個 AWS 帳戶 和每個 中的用戶端 IDs都必須是唯一的 AWS 區域。這表示您不需要在 外部 AWS 帳戶 或 內跨區域強制執行用戶端 IDs 的全域唯一性 AWS 帳戶。

在您的裝置機群上捨棄 MQTT 連線的影響和嚴重性，取決於多個因素。其中包含：
+ 您的使用案例 （例如，您的裝置傳送的資料 AWS IoT、多少資料，以及傳送資料的頻率）。
+ 您的 MQTT 用戶端組態 (例如，自動重新連線設定、關聯的退避計時，以及 [MQTT 持久性工作階段](mqtt.md#mqtt-persistent-sessions)的使用)。
+ 裝置資源限制。
+ 連線中斷的根本原因，以及其積極性和持久性。

為了避免用戶端 ID 衝突及其潛在的負面影響，請確定每個裝置或行動應用程式都有 AWS IoT 或 IAM 政策，以限制哪些用戶端 IDs 可用於與 AWS IoT 訊息中介裝置的 MQTT 連線。例如，您可以使用 IAM 政策，藉由使用已在使用中的用戶端 ID 來防止裝置意外關閉其他裝置的連線，如需詳細資訊，請參閱[Authorization](iot-authorization.md)。

機群中的所有裝置都必須具有僅授權預期動作權限的登入資料，其中包括 （但不限於） AWS IoT MQTT 動作，例如發佈訊息或訂閱具有特定範圍和內容的主題。特定的許可政策可能因您的使用案例而異。識別最符合您業務和安全性需求的許可政策。

為了簡化許可政策的建立和管理，您可以使用 [AWS IoT Core 政策變數](iot-policy-variables.md) 和 [IAM 政策變數](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html)。政策變數可以放置在政策中，當政策接受評估時，該變數可由來自裝置的請求值取代。透過使用政策變數，您可以建立一個單一政策，以授與許可給多個裝置。您可以根據 AWS IoT 帳戶組態、身分驗證機制和用於連線至 AWS IoT 訊息代理程式的網路通訊協定，來識別使用案例的相關政策變數。不過，若要撰寫最佳的許可政策，您需要考慮您使用案例的特定情形和[威脅模型](https://en.wikipedia.org/wiki/Threat_model)。

例如，如果您在 AWS IoT 登錄檔中註冊裝置，您可以在 AWS IoT 政策中使用[物件政策變數](thing-policy-variables.md)，根據物件名稱、物件類型和物件屬性值等物件屬性來授予或拒絕許可。物件名稱是從物件連線時所傳送的 MQTT 連線訊息中的用戶端 ID 取得 AWS IoT。當物件使用 TLS 交互身分驗證 AWS IoT 透過 MQTT 連線至 ，或使用已驗證的 [Amazon Cognito 身分](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identities.html)透過 WebSocket 通訊協定連線至 MQTT 時，會取代物件政策變數。您可以使用 [AttachThingPrincipal](https://docs.aws.amazon.com/iot/latest/apireference/API_AttachThingPrincipal.html) API，將憑證和驗證的 Amazon Cognito 身分連接到物件。`iot:Connection.Thing.ThingName` 是一種實用的物件政策變數，可強制執行用戶端 ID 限制。下列範例 AWS IoT 政策要求已註冊物件的名稱做為 MQTT 連線至 AWS IoT 訊息代理程式的用戶端 ID：

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": "iot:Connect",
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			]
		}
	]
}
```

如果您想要識別持續的用戶端 ID 衝突，您可以啟用和使用 [CloudWatch Logs AWS IoT](cloud-watch-logs.md)。對於 AWS IoT 訊息中介裝置因用戶端 ID 衝突而中斷連線的每個 MQTT 連線，會產生類似以下的日誌記錄：

```
{
    "timestamp": "2019-04-28 22:05:30.105",
    "logLevel": "ERROR",
    "traceId": "02a04a93-0b3a-b608-a27c-1ae8ebdb032a",
    "accountId": "123456789012",
    "status": "Failure",
    "eventType": "Disconnect",
    "protocol": "MQTT",
    "clientId": "clientId01",
    "principalId": "1670fcf6de55adc1930169142405c4a2493d9eb5487127cd0091ca0193a3d3f6",
    "sourceIp": "203.0.113.1",
    "sourcePort": 21335,
    "reason": "DUPLICATE_CLIENT_ID",
    "details": "A new connection was established with the same client ID"
}
```

您可以使用 [CloudWatch Logs 篩選條件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/MonitoringLogData.html) (例如 `{$.reason= "DUPLICATE_CLIENT_ID" }`) 來搜尋用戶端 ID 衝突的執行個體，或設定 [CloudWatch 指標篩選條件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/MonitoringPolicyExamples.html)與對應的 CloudWatch 警示，以供持續監控和報告。

您可以使用 [AWS IoT Device Defender](https://aws.amazon.com/iot-device-defender/) 來識別過度寬鬆 AWS IoT 和 IAM 政策。 AWS IoT Device Defender 也提供稽核檢查，如果您機群中的多個裝置使用相同的用戶端 ID 連線到 AWS IoT 訊息中介裝置，則會通知您。

您可以使用 AWS IoT Device Advisor 來驗證您的裝置是否可以可靠地連線至 AWS IoT Core 並遵循安全最佳實務。

### 另請參閱
<a name="mqtt-security-see-also"></a>
+ [AWS IoT Core](https://aws.amazon.com/iot-core/)
+ [AWS IoT的安全性功能](authentication.md)
+ [AWS IoT Core 政策變數](iot-policy-variables.md)
+ [IAM 政策變數](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_variables.html)
+ [Amazon Cognito 身分](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identities.html)
+ [AWS IoT Device Defender](https://aws.amazon.com/iot-device-defender/)
+ [的 CloudWatch Logs AWS IoT](cloud-watch-logs.md)

## 讓裝置的時鐘保持同步
<a name="device-clock"></a>

在裝置上保持準確的時間是很重要的。X.509 憑證具到期日期和時間。裝置上的時鐘用來驗證伺服器憑證是否仍然有效。如果您正在建置商用 IoT 裝置，請記住您的產品在售出前可能會長期存放。在這段期間，即時時鐘可能會漂移，電池可能會放電，因此在工廠設定時間並不足夠。

對大多數系統而言，這表示裝置的軟體必須包含網路時間通訊協定 (NTP) 用戶端。裝置應該等到與 NTP 伺服器同步時，才會嘗試連線到 AWS IoT Core。如果無法這麼做，系統應該提供方法讓使用者能夠設定裝置的時間，以便讓後續連線成功。

一旦裝置與 NTP 伺服器同步，就可以開啟與 AWS IoT Core的連線。允許的時脈偏移會取決於您嘗試對連線執行的操作而定。

## 驗證伺服器憑證
<a name="validate-server-cert"></a>

裝置與 互動的第一件事 AWS IoT 是開啟安全連線。當您將裝置連線至 時 AWS IoT，請確定您正在與 交談 AWS IoT ，而不是另一個伺服器模擬 AWS IoT。每個 AWS IoT 伺服器都會佈建為網域發行的憑證`iot.amazonaws.com`。此憑證 AWS IoT 是由信任的憑證授權機構核發給 ，該授權機構會驗證我們網域的身分和擁有權。

當裝置連線時，最先 AWS IoT Core 做的一件事就是將伺服器憑證傳送給裝置。裝置可以驗證其預期連線至 `iot.amazonaws.com`，以及該連線端的伺服器是否擁有來自該網域之受信任授權單位的憑證。

TLS 憑證採用 X.509 格式，並包含各種資訊，例如組織的名稱、位置、網域名稱和有效期間。有效期間以稱為 `notBefore` 和 `notAfter` 的一對時間值來指定。這類服務會對其伺服器憑證 AWS IoT Core 使用有限的有效期間 （例如一年），並在舊憑證過期之前開始提供新的憑證。

## 使用每個裝置單一身分
<a name="cert-per-device"></a>

使用每個用戶端單一身分。裝置通常使用 X.509 用戶端憑證。Web 與行動應用程式使用 Amazon Cognito 身分。這可讓您將精細的許可套用至您的裝置。

例如，您有由行動電話裝置組成的應用程式，該裝置從兩個不同的智慧型家用物件 (燈泡和電熱器) 接收狀態更新。燈泡會傳送其電池的電量狀態，恆溫器會傳送報告溫度的訊息。

AWS IoT 會個別驗證裝置，並個別處理每個連線。您可以使用授權政策套用微調的存取控制。您可以定義電熱器的政策，以允許電熱器發佈至主題空間。您可以為燈泡定義個別的政策，以允許燈泡發佈至不同的主題空間。最後，您可以定義行動應用程式的政策，只允許它連線和訂閱電熱器和燈泡的主題，以接收來自這些裝置的訊息。

盡可能套用最低權限的政策，並盡可能降低每個裝置的許可範圍。所有裝置或使用者在 中都應有一個 AWS IoT 政策 AWS IoT ，只允許它與已知的用戶端 ID 連線，並發佈和訂閱已識別和固定的主題集。

## 使用秒 AWS 區域 作為備份
<a name="use-second-region"></a>

請考慮在一秒內將資料的副本 AWS 區域 儲存為備份。請注意，名為 [的災難復原 AWS IoT](https://aws.amazon.com/solutions/implementations/disaster-recovery-for-aws-iot/) AWS 解決方案不再可用。雖然相關聯的 [GitHub 程式庫](https://github.com/awslabs/disaster-recovery-for-aws-iot)仍可存取，但已於 2023 年 7 月 AWS 棄用，不再提供維護或支援。若要實作您自己的解決方案或探索其他支援選項，請造訪[聯絡 AWS](https://aws.amazon.com/contact-us/)。如果有與您的帳戶相關聯的 AWS 技術客戶經理，請聯絡他們尋求協助。

## 使用及時佈建
<a name="use-jitp"></a>

手動建立和佈建每個裝置可能很耗時。 AWS IoT 提供一種方法來定義範本，以在首次連線時佈建裝置 AWS IoT。如需詳細資訊，請參閱[即時佈建](jit-provisioning.md)。

## 執行 AWS IoT Device Advisor 測試的許可
<a name="device-advisor-perms"></a>

下列政策範本顯示執行 AWS IoT Device Advisor 測試案例所需的最低許可和 IAM 實體。您需要將 *your-device-role-arn* 取代為在[先決條件](https://docs.aws.amazon.com/iot/latest/developerguide/device-advisor-workflow.html#device-advisor-workflow-prereqs)下建立的裝置角色 Amazon Resource Name (ARN)。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iot:us-east-1:123456789012:thinggroup/your-thing-group",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": "iotdeviceadvisor.amazonaws.com"
            }
        }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "execute-api:Invoke*",
                "iam:ListRoles",
                "iot:Connect",
                "iot:CreateJob",
                "iot:DeleteJob",
                "iot:DescribeCertificate",
                "iot:DescribeEndpoint",
                "iotjobsdata:DescribeJobExecution",
                "iot:DescribeJob",
                "iot:DescribeThing",
                "iotjobsdata:GetPendingJobExecutions",
                "iot:GetPolicy",
                "iot:ListAttachedPolicies",
                "iot:ListCertificates",
                "iot:ListPrincipalPolicies",
                "iot:ListThingPrincipals",
                "iot:ListThings",
                "iot:Publish",
                "iotjobsdata:StartNextPendingJobExecution",
                "iotjobsdata:UpdateJobExecution",
                "iot:UpdateThingShadow",
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams",
                "logs:PutLogEvents",
                "logs:PutRetentionPolicy"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "iotdeviceadvisor:*",
            "Resource": "*"
        }
    ]
}
```

## Device Advisor 跨服務預防混淆代理人
<a name="cross-service-confused-deputy-prevention-DA"></a>

混淆代理人問題屬於安全性議題，其中沒有執行動作許可的實體可以強制具有更多權限的實體執行該動作。在 中 AWS，跨服務模擬可能會導致混淆代理人問題。在某個服務 (*呼叫服務*) 呼叫另一個服務 (*被呼叫服務*) 時，可能會發生跨服務模擬。可以操縱呼叫服務來使用其許可，以其不應有存取許可的方式對其他客戶的資源採取動作。為了防止這種情況， AWS 提供工具，協助您保護所有 服務的資料，其服務主體已獲得您帳戶中資源的存取權。

若要限制 Device Advisor 為資源提供另一項服務的許可，我們推薦在資源政策中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全域條件內容索引鍵。如果同時使用全域條件內容金鑰，則在相同政策陳述式中使用 `aws:SourceAccount` 值和 `aws:SourceArn` 值中的帳戶時，必須使用相同的帳戶 ID。

`aws:SourceArn` 值必須是套件定義資源的 ARN。套件定義資源是指使用 Device Advisor 建立的測試套件。

防範混淆代理人問題最有效的方法，是使用 `aws:SourceArn` 全域條件內容金鑰，以及資源的完整 ARN。如果不知道資源的完整 ARN，或者如果您指定了多個資源，請使用 `aws:SourceArn` 全域條件內容金鑰，同時使用萬用字元 (`*`) 表示 ARN 的未知部分。例如 `arn:aws:iotdeviceadvisor:*:account-id:suitedefinition/*` 

下列範例示範如何使用 Device Advisor 中的 `aws:SourceArn` 和 `aws:SourceAccount` 全域條件內容金鑰，來預防混淆代理人問題。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Sid": "ConfusedDeputyPreventionExamplePolicy",
        "Effect": "Allow",
        "Principal": {
            "Service": "iotdeviceadvisor.amazonaws.com"
        },
        "Action": "sts:AssumeRole",
        "Condition": {
            "ArnLike": {
                "aws:SourceArn": "arn:aws:iotdeviceadvisor:us-east-1:123456789012:suitedefinition/ygp6rxa3tzvn"
        },
            "StringEquals": {
                "aws:SourceAccount": "123456789012"
        }
        }
    }
}
```

## AWS 訓練和認證
<a name="iot-security-training"></a>

參加以下課程，了解 AWS IoT 安全的關鍵概念：[AWS IoT Security Primer](https://www.aws.training/Details/Curriculum?id=42304)。