如何在 IAM 角色的信任策略中检查自定义 OpenID 声明?
Posted
技术标签:
【中文标题】如何在 IAM 角色的信任策略中检查自定义 OpenID 声明?【英文标题】:How to check for custom OpenID claim in an IAM role's trust policy? 【发布时间】:2018-07-07 15:42:01 【问题描述】:我正在使用 auth0 对用户进行身份验证,以接收包含以下声明的 id 令牌
"http://myapp.com/scope": "write"
使用带有 OpenID 身份验证提供程序(即 auth0)的 Cognito 身份池,我能够成功获取临时凭证来访问 aws 服务。但是,我想根据上面的自定义声明限制对这些服务的访问。我认为执行此操作的正确方法是编辑与我的身份池关联的信任策略,但我不确定如何添加条件来检查我的信任策略中的上述声明。
当前默认的信任策略是
"Version": "2012-10-17",
"Statement": [
"Effect": "Allow",
"Principal":
"Federated": "cognito-identity.amazonaws.com"
,
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition":
"StringEquals":
"cognito-identity.amazonaws.com:aud": "us-east-2:078855cf-aa9b-400e-a762-dfcf27ec495c"
,
"ForAnyValue:StringLike":
"cognito-identity.amazonaws.com:amr": "authenticated"
]
如何确保只有具有 auth0 "write" 范围的用户才能写入我的 s3 服务?
更新:
通过避开 cognito 身份池,我能够将原始 id_token 传递给 aws。但是,auth0 强制我的自定义声明使用"http://mywebsite.com"
命名。这是一个问题,因为 IAM 在我的情况下不允许使用多个冒号。我需要添加条件
"ForAnyValue:StringLike":
"food-flick.auth0.com/:https://foodflick.com/scope": "write:rests"
但 IAM 不允许这样做,并且 Auth0 会强制我为我的声明命名。我能做些什么?我可以将我的范围存储在标准声明中,但这会产生误导。我可以将我的访问令牌而不是我的 id_token 传递给 IAM 吗?如果是这样,当给定一组值时,我将如何更改信任策略以检查适当的 aud 值?
【问题讨论】:
您找到解决方案了吗? 不,我没有。我选择了firebase,使用了signInWithCustomToken。我的 auth0 服务器在其 idToken 中返回一个 firebase 令牌 找到解决办法了吗? 【参考方案1】:联合声明不会传播到 AWS 会话中,并且无法在信任策略中访问。前进的道路可能是使用RoleMappings 将您的自定义声明映射到特定角色。不幸的是,此时,我认为有一个突出的问题阻止角色映射与 OIDC 一起使用。如果问题得到解决,我会更新这篇文章。
【讨论】:
这是否意味着我不能使用 cognito?我在哪里可以从 cognito 控制台找到角色映射?我可以通过docs.aws.amazon.com/IAM/latest/UserGuide/… 的步骤实现我的用例吗? 9 个月后这仍然是一个问题吗? 我们刚刚修复了对 OIDC 和角色映射的支持,您现在可以试试吗? 有什么解决办法吗?我们现在可以使用 RoleMappings 将自定义声明映射到角色吗?我没有使用 cognito,我使用的是自定义 Provider。以上是关于如何在 IAM 角色的信任策略中检查自定义 OpenID 声明?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Terraform 创建没有代入角色策略的 AWS IAM 角色?
创建附加到用户的 IAM 策略,限制用户使用某些操作创建自定义托管策略