

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 防止跨服务混淆座席
<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。

防止混淆代理问题最有效的方法是使用具有资源完整 Amazon 资源名称（ARN）的 `aws:SourceArn` 全局条件上下文键。对于 AWS IoT，您`aws:SourceArn`必须遵守以下格式：`arn:aws:iot:region:account-id:resource-type/resource-id`资源特定权限或`arn:aws:iot:region:account-id:*`。resource-id 可以是允许资源的名称或 ID，也可以是允许资源的通配符语句。 IDs确保*region*与您的 AWS IoT 地区相匹配，并且与您的客户账户 ID *account-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 安全令牌服务（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` 请求的资源。

使用以下信任策略的角色只能由 `SourceArn` 中指定的预调配模板的物联网主体 (`iot.amazonaws.com`) 担任。

****  

```
{
   "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）在创建时未知，您可以使用通配符。

使用以下信任策略的角色只能由 `SourceArn` 中指定的 CA 证书的物联网主体 (`iot.amazonaws.com`) 担任。

****  

```
{
   "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` 来限制该角色可以担任的资源。[但是，在最初的 Register CACertificate 调用以注册 CA 证书期间，您无法在条件中指定 CA 证书的 ARN。](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCACertificate.html) `aws:SourceArn`

要解决此问题，即为注册的特定 CA 证书指定配置角色信任策略 AWS IoT Core，您可以执行以下操作：
+ 首先，在CACertificate不提供`RegistrationConfig`参数的情况下调用 [Re](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCACertificate.html) gister。
+ 注册 CA 证书后 AWS IoT Core，对其调用 [Up CACertificate date](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateCACertificate.html)。

  在更新CACertificate 调用中，提供`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`创建供 AWS IoT Core 凭证提供商使用的 IAM 角色时，您必须在`aws:SourceArn`条件中包含可能需要担任该角色的任何角色别名，从而授权跨服务请求。 ARNs `sts:AssumeRole`

使用以下信任策略的角色只能由 `SourceArn` 中指定角色别名的 AWS IoT Core 凭证提供者主体 (`credentials.iot.amazonaws.com`) 担任。如果主体尝试检索 `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"
        }
      }
    }
  ]
}
```