为 API 网关权限转义 AWS IAM 策略变量

Escaping AWS IAM Policy Variable for API Gateway Permissions

我目前有 SAML 集成设置,并且在我的身份验证提供程序 (auth0) 和 AWS/AWS API 网关之间按预期工作。 然而,当使用 ${saml:sub} 变量定义 AWS 策略时,问题就出现了。

这是我的配置示例:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "execute-api:*"
        ],
        "Resource": [
            "arn:aws:execute-api:us-west-2:[removed]/*/GET/customers/${saml:sub}"
        ]
    }
]

}

基本上我想确保这个端点只能由当前授权的用户访问(基于他们的saml:sub)。当前授权的用户不应该能够访问另一个客户记录。看起来这应该是一个潜在的常见用例。

Auth0 自动分配 saml:sub id 的格式是这样的

auth0|429

我假设问题目前在于管道字符存在,并且当通过浏览器向 API 网关 URL 发出请求时,它将它与自动转义的值进行比较。因此,我假设资源访问被拒绝,因为 auth0|429 != auth0%7C429

IAM 策略中是否有解决此问题的方法? Auth0 端是否有可能的解决方法来为 ${saml:sub} 分配不同的值?

在我看来,您描述的问题应该 solved/handled 来自 AWS 策略配置,但由于我对此不了解,我将从避免潜在麻烦字符的角度为您提供解决方法.

您可以配置和覆盖 Auth0 用于输出用户信息的默认 SAML 映射,并因此控制用于每个输出声明和 SAML 主题的属性。

查看 SAML attributes mapping 了解如何执行此操作的概述。

此外,检查 SAML configuration via rules 以获得所有可用选项的详细视图。

默认情况下,Auth0 将检查以下声明,以确定用作 SAML 主题的声明:

  1. http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier
  2. http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
  3. http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name

IAM 策略将无法识别实际资源 ARN 中的 ${saml:sub}。除此之外,API GW 不会自动理解 SAML 断言。

您是否使用自定义授权方 Lambda 函数来解析 SAML 断言?如果是这样,您可能希望解析出 'sub' 字段并将其直接插入到授权方返回的策略中,就像这样

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "execute-api:*"
        ],
        "Resource": [
            "arn:aws:execute-api:us-west-2:[removed]/*/GET/customers/auth0|429"
        ]
    }
  ]
}

如果您已经到此为止但仍未按预期工作,那么您是对的,可能是 URI 未根据 client/browser 编码进行规范化。我必须测试一下。但只要您的后端处理 /customers/auth0|429 == /customers/auth0%7C429,您就可以安全地构建一个允许资源的未编码和编码版本的策略:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "execute-api:*"
        ],
        "Resource": [
            "arn:aws:execute-api:us-west-2:[removed]/*/GET/customers/auth0|429",
            "arn:aws:execute-api:us-west-2:[removed]/*/GET/customers/auth0%7C429"
        ]
    }
  ]
}

如果您不使用自定义授权方,请详细说明您的设置。但无论哪种方式,不幸的是 IAM 策略将永远无法评估资源块中的 ${var} 语法。

感谢以上所有可能的解决方案!最终,我最终放弃了 Auth0 和 AWS 之间的 SAML 集成,并通过 API 网关内的 lambda 函数选择了自定义授权方。这允许更灵活的设置。

对于其他面临类似情况的人,我遇到了这个 GitHub 项目,该项目到目前为止运行良好: https://github.com/jghaines/lambda-auth0-authorizer

我出于自己的目的对项目进行了一些修改,但基本上我们所做的是将我们的内部用户 ID 映射到 AWS principalId。

在 API 网关端,我们设置了一个 /customers/me 资源,然后在集成请求中修改了 URL 路径参数,如下所示: Integration Request Screenshot

我们在 lambda 函数中的策略是这样设置的

{ "Version": "2012-10-17", "Statement": [ { "Sid": "324342", "Effect": "Allow", "Action": [ "execute-api:Invoke" ], "Resource": [ "arn:aws:execute-api:us-west-2:[removed]/*/GET/customers/me" ] } ] }

这允许动态访问端点和仅 returns 登录用户特定的数据。