混淆代理人问题 - Amazon Identity and Access Management
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

混淆代理人问题

为了继续上一个示例,Example Corp 需要访问您的 Amazon 账户中的某些资源。但除了您之外,Example Corp 还有很多其他客户,因此它需要一种方法来访问每个客户的 Amazon 资源。Example Corp 请求来自每个客户的角色 ARN,而不是要求其客户提供其 Amazon 账户访问密钥 (这些密钥是永不应共享的机密信息)。但是,另一个 Example Corp 客户可能能够猜测或获取您的角色 ARN。该客户可通过 Example Corp 使用您的角色 ARN 来获取对您的 Amazon 资源的访问权限。这种形式的权限提升称为“混淆代理人”问题。

下图阐明了混淆代理人问题。


            混淆代理人问题的描述。

此场景假定:

  • Amazon1 是您的 Amazon 账户 ID。

  • Amazon1:ExampleRole 是您账户中的一个角色。该角色的信任策略通过将 Example Corp 的 Amazon 账户指定为可担任该角色的账户来信任 Example Corp。

将发生以下情况:

  1. 在您开始使用 Example Corp 的服务时,您将向 Example Corp 提供 Amazon1:ExampleRole 的 ARN。

  2. Example Corp 使用该角色 ARN 获取临时安全凭证以访问您的 Amazon 账户中的资源。这样一来,您将信任 Example Corp 作为可代表您执行操作的“代理人”。

  3. 另一个 Amazon 客户也开始使用 Example Corp 的服务,而且此客户还为 Example Corp 提供了 Amazon1:ExampleRole 的 ARN 以供其使用。另一个客户可能已了解或猜到已不是机密信息的 Amazon1:ExampleRole

  4. 当另一个客户要求 Example Corp 访问(它声称的)其账户中的 Amazon 资源时,Example Corp 使用 Amazon1:ExampleRole 访问您的账户中的资源。

这就是其他客户可对您的资源进行未授权访问的方式。由于此客户能够诱使 Example Corp 无意中操作您的资源,因此 Example Corp 现在是一个“混淆代理人”。

外部 ID 如何防止责任混淆问题?

您通过在角色的信任策略中包含 ExternalId 条件检查来解决混淆代理人问题。“代理人”公司会将每个客户的唯一外部 ID 值插入 Amazon 凭证的请求中。该外部 ID 是一个客户 ID 值,该值在 Example Corp 的客户中必须唯一,且不受 Example Corp 客户的控制。这就是您从 Example Corp 获取该 ID 且不能自行提供该 ID 的原因。这有助于防止一个客户成功模仿另一个客户。Example Corp 始终插入客户的已分配外部 ID,因此您绝不会看到来自 Example Corp 的带有您的外部 ID 以外的任何外部 ID 的请求。

在我们的方案中,假设 Example Corp 为您提供的唯一标识符是“12345”,而为另一个客户提供的标识符是“67890”。这些标识符已针对此方案进行简化。通常,这些标识符为 GUID。假定这些标识符在 Example Corp 的客户之间是唯一的,它们将是用于外部 ID 的有意义的值。

Example Corp 将向您提供外部 ID 值“12345”。然后,您必须将一个 Condition 元素添加到角色的信任策略,该策略要求 sts:ExternalId 值为 12345,如下所示:

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": {"AWS": "Example Corp's Amazon Account ID"}, "Condition": {"StringEquals": {"sts:ExternalId": "12345"}} } }

此策略中的 Condition 元素允许 Example Corp 仅在 AssumeRole API 调用包括外部 ID 值“12345”时担任该角色。Example Corp 确保,只要它代表客户担任角色,就会始终在 AssumeRole 调用中包括客户的外部 ID。即使另一个客户向 Example Corp 提供您的 ARN,也无法控制 Example Corp 包括在其发送给 Amazon 的请求中的外部 ID。这有助于防止未经授权的客户获取对您的资源的访问权限。

下图阐明了此过程。


                如何缓解混淆代理人问题。
  1. 和之前一样,在您开始使用 Example Corp 的服务时,您将向 Example Corp 提供 Amazon1:ExampleRole 的 ARN。

  2. 在 Example Corp 使用该角色 ARN 来担任角色 Amazon1:ExampleRole 时,Example Corp 将在 AssumeRole API 调用中包含您的外部 ID(“12345”)。该外部 ID 与角色的信任策略匹配,因此 AssumeRole API 调用将成功,并且 Example Corp 将获取用于访问您的 Amazon 账户中的资源的临时安全凭证。

  3. 另一个 Amazon 客户也开始使用 Example Corp 的服务,而且如之前一样,此客户还为 Example Corp 提供了 Amazon1:ExampleRole 的 ARN 以供其使用。

  4. 但这一次,在 Example Corp 尝试担任角色 Amazon1:ExampleRole 时,它提供了与另一个客户关联的外部 ID(“67890”)。另一个客户无法更改此外部 ID。Example Corp 这样做是因为另一个客户请求使用该角色,因此“67890”表示 Example Corp 正在其中操作的环境。由于您已将具有您自己的外部 ID(“12345”)的条件添加到 Amazon1:ExampleRole 的信任策略,因此 AssumeRole API 调用将失败。而且将阻止另一个客户对您账户中的资源进行未经授权的访问(由图中的红色“X”表示)。

该外部 ID 帮助阻止任何其他客户诱使 Example Corp 无意中访问您的资源 - 它缓解了混淆代理人问题。