本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用基于角色的访问控制
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-roles
API。例如,如果用户无法写入 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 身份池(联合身份)将按以下方式选择角色:
-
如果GetCredentialsForIdentity
CustomRoleArn
参数已设置并且与cognito:roles
声明中的角色匹配,则使用该参数。如果此参数与cognito:roles
中的角色不匹配,则拒绝访问。 -
如果
cognito:preferred_role
声明已设置,请使用它。 -
如果未设置
cognito:preferred_role
声明,则cognito:roles
声明已设置,CustomRoleArn
且未在调用中指定GetCredentialsForIdentity
,则使用控制台中的角色解析设置或AmbiguousRoleResolution
字段(在的RoleMappings
参数中 SetIdentityPoolRolesAPI)来确定要分配的角色。
使用基于规则的映射向用户分配角色
规则允许您将身份提供商令牌中的声明映射到IAM角色。
每条规则都指定了令牌声明(例如 Amazon Cognito 用户池中的 ID 令牌中的用户属性)、匹配类型、值和角色。IAM匹配类型可以是 Equals
、NotEqual
、StartsWith
或 Contains
。如果用户拥有声明的匹配值,则该用户可在获取凭证后担任该角色。例如,您可以创建一个规则,为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。令牌包含有关经过身份验证的用户的身份声明,例如 name
、family_name
和 phone_number
。有关标准声明的更多信息,请参阅 OpenID Connect 规范
-
cognito:groups
-
cognito:roles
-
cognito:preferred_role
Amazon
以下声明以及这些声明可能的值可与 Login with Amazon 配合使用:
-
iss
:www.amazon.com -
aud
:应用程序 ID -
sub
:Login with Amazon 令牌中的sub
以下声明以及这些声明可能的值可与 Facebook 配合使用:
-
iss
:graph.facebook.com -
aud
:应用程序 ID -
sub
:Facebook 令牌中的sub
Google 令牌包含 OpenID Connect 规范
Apple
Apple 令牌包含 OpenID Connect 规范email
。
OpenID
OpenID 令牌中的所有声明均可用于基于规则的映射。有关标准声明的更多信息,请参阅 OpenID Connect 规范
SAML
索赔是从收到的SAML断言中解析出来的。SAML断言中可用的所有声明都可以在基于规则的映射中使用。
基于角色的访问控制的最佳实践
重要
如果最终用户可修改您映射到角色的声明,则任何最终用户均可担任您的角色并相应地设置策略。仅将无法由最终用户直接设置的声明映射到具有提升的权限的角色。在 Amazon Cognito 用户池中,您可以为每个用户属性设置每个应用程序的读取和写入权限。
重要
如果您在 Amazon Cognito 用户池中为组设置角色,这些角色将通过用户的 ID 令牌进行传递。要使用这些角色,您还必须为身份池中选择的通过身份验证的角色设置 Choose role from token(使用令牌选择角色)。
您可以使用控制台中的角色解析设置和的RoleMappings
参数SetIdentityPoolRolesAPI来指定无法通过令牌确定正确的角色时的默认行为。