跨账户混淆代理人

跨账户混淆代理人问题是一个安全问题,它涉及到一个受信任的实体(比如第三方服务提供商)被恶意实体欺骗或误导,从而执行了未经授权的操作。这个问题通常出现在企业需要使用第三方服务来管理其云环境时,例如日志审计、成本管理、安全监控等场景。在这些情况下,企业会给予第三方供应商访问其云上资源的权限,如果处理不当,就容易被攻击者利用,伪装成其他客户,实施恶意行为。

攻击复现

1-假设背景

假设您决定聘请一家名为 Example Corp 的第三方公司来监控您的 AWS 账户 并帮助优化成本。为跟踪您的日常开支,Example Corp 需要访问您的 AWS 资源。Example Corp 也可监控其他客户的很多其他 AWS 账户。

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

你向 Example Corp 提供 AWS1:ExampleRole 的 ARN。

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

2-恶意攻击

另外一个客户知道了Example Corp 使用的AWS1:ExampleRole 的 ARN,然后使用你的ARN要求Example Corp 访问你账户中的资源。

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

还有一种情况是攻击者获取到第三方代理的权限,并且通过分析日志查到这个权限可以代入你的AWS1:ExampleRole 的 ARN,以第三方代理的身份访问到你的账号中。

解决办法

Example Corp 可以通过在角色信任策略中加入 ExternalId 条件检查来解决混淆的代理问题。Example Corp 为每个客户生成唯一的 ExternalId 值,并在其请求中使用该值来承担该角色。在 Example Corp 的客户中,ExternalId 值必须是独一无二的,并由 Example Corp 而不是其客户控制。这就是您从 Example Corp 获取该 ID 且不能自行提供该 ID 的原因。这可以防止 Example Corp 成为一个混淆代理人,以及授予对非授权的 AWS 资源的访问权。

假设 Example Corp 为您提供的唯一标识符是 12345,而为另一个客户提供的标识符是 67890。这些标识符已针对此方案进行简化。通常,这些标识符为 GUID。假定这些标识符在 Example Corp 的客户之间是唯一的。

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

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

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

ExternalId 的主要作用

包括:

  1. 防止跨账户混淆代理人问题:当多个账户信任同一个角色时,使用 ExternalId 可以帮助区分请求者的身份,防止攻击者冒充其他账户访问资源。

  2. 增强角色扮演的安全性:当一个 AWS 账户需要扮演另一个账户的角色以访问资源时,ExternalId 作为信任策略的一部分,确保只有具有正确 ExternalId 的请求者才能成功扮演角色。

  3. 提供额外的验证层:在角色的信任策略中,除了指定允许扮演角色的账户外,还可以要求请求者提供 ExternalId。这样,即使攻击者获取了访问密钥,没有正确的 ExternalId,他们也无法扮演角色。

  4. 支持细粒度的访问控制:ExternalId 允许您为不同的第三方服务或用户定义不同的角色扮演策略,从而实现更细粒度的访问控制。

  5. 简化管理和审计:使用 ExternalId 可以帮助您更清晰地追踪和审计哪些第三方服务或用户扮演了您的角色,以及它们对资源的访问情况。

资料来源:https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/confused-deputy.html#mitigate-confused-deputy

最后更新于