将属性用于访问控制 - Amazon Cognito

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

将属性用于访问控制

访问控制的属性是 Amazon Cognito 身份池实现的基于属性的访问控制 ()。ABAC您可以使用IAM策略根据用户属性控制通过 Amazon Cognito 身份池访问 AWS 资源。可以从社交和企业身份提供商那里获得这些属性。您可以将提供商的访问权限和 ID 令牌或SAML断言中的属性映射到可在IAM权限策略中引用的标签。

您可以选择默认映射或在 Amazon Cognito 身份池中创建自己的自定义映射。默认映射允许您根据一组固定的用户属性编写IAM策略。自定义映射允许您选择IAM权限策略中引用的一组自定义用户属性。Amazon Cognito 控制台中的属性名称映射到主体的标签密钥,即IAM权限策略中引用的标签。

例如,假设您拥有一个具有免费和付费会员资格的媒体流式传输服务。您可以将媒体文件存储在 Amazon S3 中,并使用免费或高级标签对其贴标签。您可以将属性用于访问控制,以允许访问基于用户会员级别(这是用户配置文件的一部分)的免费和付费内容。您可以将成员资格属性映射到标签密钥,以便委托人传递给IAM权限策略。通过这种方式,您可以创建单个权限策略,并根据会员级别的值和内容文件上的标签有条件地允许对高级内容的访问。

使用属性来控制访问有若干优势:

  • 使用属性进行访问控制时,权限管理会更高效。您可以创建使用用户属性的基本权限策略,而不必为不同的任务功能创建多个策略。

  • 不管您何时为应用程序添加或删除资源或用户,都无需更新策略。权限策略只向具有匹配用户属性的用户授予访问权限。例如,您可能需要根据用户的任务标题控制对某些 S3 存储桶的访问权限。在这种情况下,您可以创建权限策略,以便仅允许定义的任务标题中的用户访问这些文件。有关更多信息,请参阅IAM教程:使用SAML会话标签ABAC

  • 属性可以作为委托人标签传递给策略,该策略基于这些属性的值允许或拒绝权限。

使用属性对 Amazon Cognito 身份池进行访问控制

使用属性进行访问控制之前,请确保满足以下先决条件:

要使用属性进行访问控制,您设置为数据来源的声明将设置您选择的标签键的值。Amazon Cognito 会将标签键和值应用于您的用户会话。您的IAM策略可以根据${aws:PrincipalTag/tagkey}条件评估用户的访问权限。IAM根据策略评估用户标签的值。

您必须准备要将证书传递给用户的IAM角色。这些角色的信任策略必须允许 Amazon Cognito 为您的用户代入该角色。对于用于访问控制的属性,您还必须允许 Amazon Cognito 将主体标签应用于用户的临时会话。授予通过操作代入角色的权限AssumeRoleWithWebIdentity。授予使用仅限权限操作 sts:TagSession 标记用户会话的权限。有关更多信息,请参阅《AWS Identity and Access Management 用户指南》中的在 AWS Security Token Service中传递会话标签。有关向 Amazon Cognito 服务主体 cognito-identity.amazonaws.com 授予 sts:AssumeRoleWithWebIdentitysts:TagSession 权限的示例信任策略,请参阅示例:将属性用于访问控制策略

在控制台中配置访问控制属性
  1. 登录 Amazon Cognito 控制台并选择身份池。选择身份池。

  2. 选择用户访问选项卡。

  3. 找到身份提供者。选择要编辑的身份提供者。如果要添加新的 IdP,请选择添加身份提供者

  4. 要更改 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时分配的主体标签,请在访问控制属性中选择编辑

    1. 如果不应用主体标签,请选择非活动

    2. 要基于 subaud 声明应用主体标签,请选择使用原定设置映射

    3. 要为主体标签创建自己的自定义属性模式,请选择使用自定义映射。然后,对于您要在标签中表示的每个声明,输入要从该声明中获取的标签键

  5. 选择保存更改

示例:将属性用于访问控制策略

考虑这样一种场景:某公司法律部门的员工需要列出存储桶中属于其部门并按其安全级别分类的所有文件。假定此员工从身份提供商获得的令牌包含以下陈述。

声明

{ . . "sub" : "57e7b692-4f66-480d-98b8-45a6729b4c88", "department" : "legal", "clearance" : "confidential", . . }

这些属性可以映射到标签,并在IAM权限策略中作为委托人标签引用。现在,您可以通过更改身份提供商端的用户配置文件来管理访问权限。或者,您可以使用名称或标签来更改资源端的属性,而无需更改策略本身。

以下权限策略有两个作用:

  • 允许列表访问以与用户部门名称匹配的前缀结尾的所有 S3 桶。

  • 允许对这些存储桶中的文件进行读取访问,只要文件上的清理标签与用户的清理属性匹配。

权限策略

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:List*", "Resource": "arn:aws:s3:::*-${aws:PrincipalTag/department}" }, { "Effect": "Allow", "Action": "s3:GetObject*", "Resource": "arn:aws:s3:::*-${aws:PrincipalTag/department}/*", "Condition": { "StringEquals": { "s3:ExistingObjectTag/clearance": "${aws:PrincipalTag/clearance}" } } } ] }

信任策略决定谁可担任此角色。信任关系策略允许使用 sts:AssumeRoleWithWebIdentitysts:TagSession 来允许访问。它添加了一部分条件,以将策略限制为您创建的身份池,并确保该策略适用于经身份验证的角色。

信任策略

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": [ "sts:AssumeRoleWithWebIdentity", "sts:TagSession" ], "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "IDENTITY-POOL-ID" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } } ] }

关闭访问控制属性(控制台)

按照以下操作步骤来停用访问控制属性。

在控制台中停用访问控制属性
  1. 登录 Amazon Cognito 控制台并选择身份池。选择身份池。

  2. 选择用户访问选项卡。

  3. 找到身份提供者。选择要编辑的身份提供者。

  4. 访问控制属性中选择编辑

  5. 如果不应用主体标签,请选择非活动

  6. 选择保存更改

默认提供商映射

下表提供 Amazon Cognito 支持的身份验证提供商的默认映射信息。

提供商 令牌类型 委托人标签值 示例

Amazon Cognito 用户池

ID 令牌

aud(客户端 ID)和 sub(用户 ID)

"6jk8ltokc7ac9es6jrtg9q572f","57e7b692-4f66-480d-98b8-45a6729b4c88"

Facebook

访问令牌

aud(app_id),sub(user_id)

“492844718097981”,“112177216992379”

Google

ID 令牌

aud(客户端 ID)和 sub(用户 ID)

“620493171733-eebk7c0hcp5lj3e1tlqp1gntt3k0rncv.apps.googleusercontent.com”,“109220063452404746097”

SAML

断言

“http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier”,“http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name”

"auth0|5e28d196f8f55a0eaaa95de3","user123@gmail.com"

Apple

ID 令牌

aud(客户端 ID)和 sub(用户 ID)

“com.amazonaws.ec2-54-80-172-243.compute-1.client”,“001968.a6ca34e9c1e742458a26cf8005854be9.0733”

Amazon

访问令牌

aud(Amzn Dev Ac 上的客户端 ID),user_id(用户 ID)

“amzn1.application-oa2-client.9d70d9382d3446108aaee3dd763a0fa6”,“amzn1.account。 AGHNIFJQMFSBG3G6XCPVB35ORQAA”

标准OIDC提供商

ID 令牌和访问令牌

aud(作为 client_id)和 sub(作为用户 ID)

“620493171733-eebk7c0hcp5lj3e1tlqp1gntt3k0rncv.apps.googleusercontent.com”,“109220063452404746097”

Twitter

访问令牌

aud(应用程序 ID;应用程序密钥),sub(用户 ID)

"DfwifTtKEX1FiIBRnOTlR0CFK;Xgj5xb8xIrIVCPjXgLIdkW7fXmwcJJrFvnoK9gwZkLexo1y5z1",

DevAuth

Map

不适用

"tag1", "tag2"

注意

Tag Key for Principal (委托人的标签密钥)Attribute (属性) 名称的默认属性映射选项会自动填充。您无法更改默认映射。