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

时间:2016-11-28 23:33:33

标签: saml amazon-iam aws-api-gateway auth0

我目前正在进行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}"
        ]
    }
]

}

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

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

auth0|429

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

在IAM政策中有办法解决这个问题吗? 在Auth0方面是否有可能为$ {saml:sub}分配不同的值?

3 个答案:

答案 0 :(得分:1)

欣赏上述所有潜在的解决方案!最终,我最终放弃了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" ] } ] }

这允许动态访问端点,并仅返回特定于登录用户的数据。

答案 1 :(得分:0)

在我看来,您所描述的问题应该在AWS Policy配置中解决/处理,但由于我对此不了解,我会从避免潜在麻烦角色的角度为您提供解决方法。

您可以配置和覆盖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

答案 2 :(得分:0)

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未根据客户端/浏览器编码进行规范化。我必须测试一下。但只要您的后端处理/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}语法。

相关问题