为 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 主题的声明:
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
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 登录用户特定的数据。
我目前有 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 主题的声明:
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
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 登录用户特定的数据。