使用基于角色的访问控制 - Amazon Cognito

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用基于角色的访问控制

Amazon Cognito 身份池为您的经过身份验证的用户分配一组临时的、权限有限的凭证,以访问您的资源。 AWS 每个用户的权限均通过您创建的IAM角色进行控制。您可以定义规则,以便基于用户 ID 令牌中的声明为每个用户选择角色。您可以为经过身份验证的用户定义一个默认角色。您也可以为未经身份验证的访客用户定义一个具有有限权限的单独IAM角色。

为角色映射创建角色

请务必为每个角色添加适当的信任策略,这样只能由 Amazon Cognito 针对您的身份池中经过身份验证的用户担任。下面是此类信任策略的示例:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "us-east-1:12345678-corner-cafe-123456790ab" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } } ] }

此策略允许来自 cognito-identity.amazonaws.com (OpenID Connect 令牌的发布者) 的联合身份用户担任该角色。此外,策略限制令牌的 aud (在此示例中为身份池 ID) 匹配身份池。最后,该策略规定,Amazon Co GetOpenIdToken API gnito 操作发行的代币的多值amr声明中的一个数组成员具有该值。authenticated

授予传递角色权限

要允许用户设置的角色的权限超过该用户在身份池上的现有权限,请向他们授予将角色传递给的iam:PassRole权限set-identity-pool-rolesAPI。例如,如果用户无法写入 Amazon S3,但用户在身份池中设置的IAM角色向 Amazon S3 授予写入权限,则只有在为该角色授予iam:PassRole权限后,用户才能设置此角色。以下示例策略介绍了如何提供 iam:PassRole 权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::123456789012:role/myS3WriteAccessRole" ] } ] }

在此策略示例中,将 iam:PassRole 权限授予了角色 myS3WriteAccessRole。该角色使用角色的 Amazon 资源名称 (ARN) 指定。您必须将此策略附加到您的用户。有关更多信息,请参阅使用管理的策略

注意

Lambda 函数使用基于资源的策略,该策略直接附加至 Lambda 函数本身。创建调用 Lambda 函数的规则时,您未传递角色,因此创建规则的用户无需 iam:PassRole 权限。有关 Lambda 函数授权的更多信息,请参阅管理权限:使用 Lambda 函数策略

使用令牌向用户分配角色

对于通过 Amazon Cognito 用户池登录的用户,角色可在用户池分配的 ID 令牌中进行传递。角色将显示在 ID 令牌的以下声明中:

  • cognito:preferred_role张就是角色ARN。

  • cognito:roles声明是一个以逗号分隔的字符串,其中包含一组允许的角色。ARNs

声明按如下方式设置:

  • cognito:preferred_role 声明设置为组中具有最大 (最小) Precedence 值的角色。如果只有一个允许的角色,则 cognito:preferred_role 设置为该角色。如果存在多个角色且没有一个角色具有最高优先级,则此声明未设置。

  • 如果至少存在一个角色,则 cognito:roles 声明已设置。

使用令牌分配角色时,如果存在多个可向用户分配的角色,Amazon Cognito 身份池(联合身份)将按以下方式选择角色:

  • 如果GetCredentialsForIdentityCustomRoleArn参数已设置并且与cognito:roles声明中的角色匹配,则使用该参数。如果此参数与 cognito:roles 中的角色不匹配,则拒绝访问。

  • 如果 cognito:preferred_role 声明已设置,请使用它。

  • 如果未设置cognito:preferred_role声明,则cognito:roles声明已设置,CustomRoleArn且未在调用中指定GetCredentialsForIdentity,则使用控制台中的角色解析设置或AmbiguousRoleResolution字段(在的RoleMappings参数中 SetIdentityPoolRolesAPI)来确定要分配的角色。

使用基于规则的映射向用户分配角色

规则允许您将身份提供商令牌中的声明映射到IAM角色。

每条规则都指定了令牌声明(例如 Amazon Cognito 用户池中的 ID 令牌中的用户属性)、匹配类型、值和角色。IAM匹配类型可以是 EqualsNotEqualStartsWithContains。如果用户拥有声明的匹配值,则该用户可在获取凭证后担任该角色。例如,您可以创建一个规则,为custom:dept自定义属性值为的用户分配特定IAM角色。Sales

注意

在规则设置中,自定义属性需要使用 custom: 前缀,以便将它们与标准属性区分开来。

按顺序评估规则,并使用第一个匹配规则的IAM角色,除非指定CustomRoleArn为覆盖顺序。有关 Amazon Cognito 用户池中用户属性的更多信息,请参阅使用用户属性

您可以在身份池(联合身份)控制台中为身份验证提供商设置多条规则。按顺序应用规则。您可以拖动规则以更改其顺序。第一条匹配规则优先。如果匹配类型为 NotEqual 且声明不存在,则不会对规则进行评估。如果没有规则匹配,则角色解析设置应用到使用经过身份验证的原定设置角色拒绝请求

在API和中CLI,您可以指定在RoleMapping类型的字段中没有匹配规则时要分配的角色,该AmbiguousRoleResolution字段在的RoleMappings参数中指定SetIdentityPoolRolesAPI。

您可以在 AWS CLI 或的类型RulesConfiguration字段中为 OpenID Connect (OIDC) 和SAML身份提供者设置基于规则API的映射。RoleMapping您可以在的RoleMappings参数中指定此字段SetIdentityPoolRolesAPI。 AWS Management Console 目前不允许您为OIDC或SAML提供者添加规则。

例如,以下 AWS CLI 命令添加了一条规则,该规则将角色分配arn:aws:iam::123456789012:role/Sacramento_team_S3_admin给萨克拉曼多所在地经过 Id OIDC P arn:aws:iam::123456789012:oidc-provider/myOIDCIdP 身份验证的用户:

aws cognito-identity set-identity-pool-roles --region us-east-1 --cli-input-json file://role-mapping.json

role-mapping.json 的内容

{ "IdentityPoolId": "us-east-1:12345678-corner-cafe-123456790ab", "Roles": { "authenticated": "arn:aws:iam::123456789012:role/myS3WriteAccessRole", "unauthenticated": "arn:aws:iam::123456789012:role/myS3ReadAccessRole" }, "RoleMappings": { "arn:aws:iam::123456789012:oidc-provider/myOIDCIdP": { "Type": "Rules", "AmbiguousRoleResolution": "AuthenticatedRole", "RulesConfiguration": { "Rules": [ { "Claim": "locale", "MatchType": "Equals", "Value": "Sacramento", "RoleARN": "arn:aws:iam::123456789012:role/Sacramento_team_S3_admin" } ] } } } }

对于每个用户池或为某个身份池配置的其他身份验证提供商,您可以创建最多 25 条规则。此限制不可调整。有关更多信息,请参阅 Amazon Cognito 中的配额

基于规则的映射中使用的令牌声明

Amazon Cognito

亚马逊 Cognito ID 令牌表示为JSON网络令牌 () JWT。令牌包含有关经过身份验证的用户的身份声明,例如 namefamily_namephone_number。有关标准声明的更多信息,请参阅 OpenID Connect 规范。除了标准声明之外,以下是特定于 Amazon Cognito 的额外声明:

  • cognito:groups

  • cognito:roles

  • cognito:preferred_role

Amazon

以下声明以及这些声明可能的值可与 Login with Amazon 配合使用:

  • iss:www.amazon.com

  • aud:应用程序 ID

  • sub:Login with Amazon 令牌中的 sub

Facebook

以下声明以及这些声明可能的值可与 Facebook 配合使用:

  • iss:graph.facebook.com

  • aud:应用程序 ID

  • sub:Facebook 令牌中的 sub

Google

Google 令牌包含 OpenID Connect 规范中的标准声明。OpenID 令牌中的所有声明均可用于基于规则的映射。请参阅 Google 的 OpenID Connect 网站,了解 Google 令牌中包含的声明。

Apple

Apple 令牌包含 OpenID Connect 规范中的标准声明。请参阅 Apple 文档中的使用 Sign in with Apple 对用户进行身份验证,详细了解有关 Apple 令牌提供的声明。Apple 的令牌并不总是包含 email

OpenID

OpenID 令牌中的所有声明均可用于基于规则的映射。有关标准声明的更多信息,请参阅 OpenID Connect 规范。请参阅您的 OpenID 提供商文档,了解其中包含的任何额外声明。

SAML

索赔是从收到的SAML断言中解析出来的。SAML断言中可用的所有声明都可以在基于规则的映射中使用。

基于角色的访问控制的最佳实践

重要

如果最终用户可修改您映射到角色的声明,则任何最终用户均可担任您的角色并相应地设置策略。仅将无法由最终用户直接设置的声明映射到具有提升的权限的角色。在 Amazon Cognito 用户池中,您可以为每个用户属性设置每个应用程序的读取和写入权限。

重要

如果您在 Amazon Cognito 用户池中为组设置角色,这些角色将通过用户的 ID 令牌进行传递。要使用这些角色,您还必须为身份池中选择的通过身份验证的角色设置 Choose role from token(使用令牌选择角色)。

您可以使用控制台中的角色解析设置和的RoleMappings参数SetIdentityPoolRolesAPI来指定无法通过令牌确定正确的角色时的默认行为。