

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

# 預防跨服務混淆代理人
<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`請求。

具有下列信任政策的角色只能由 AWS IoT Core 登入資料提供者 (`credentials.iot.amazonaws.com`) 的主體擔任 中指定的 roleAlias`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}}"
        }
      }
    }
  ]
}
```