教程:IAM 主用户和 Amazon Cognito
本教程介绍了一个常见的精细访问控制用例:具有针对 OpenSearch 控制面板的 Amazon Cognito 身份验证的 IAM 主用户。尽管这些步骤使用 Amazon Cognito 用户池进行身份验证,但相同的基本流程适用于任何 Cognito 身份验证提供商,从而允许您将不同的 IAM 角色分配给不同的用户。
本教程假定您有两个现有 IAM 角色,一个用于主用户,另一个用于更受限的用户。如果您没有两个角色,请创建它们。
开始使用精细访问控制
-
使用以下设置创建域:
-
OpenSearch 1.0 或更高版本,或 Elasticsearch 7.8 或更高版本
-
公有访问权限
-
已启用精细访问控制,并将 IAM 角色作为主用户(在本教程的其余内容中,为
IAMMasterUserRole
) -
为 OpenSearch 控制面板启用了 Amazon Cognito 身份验证。有关启用 Cognito 身份验证以及选择用户和身份池的说明,请参阅 将域配置为使用 Amazon Cognito。
-
以下访问策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "es:ESHttp*" ], "Resource": "arn:aws:es:
region
:account
:domain/domain-name
/*" } ] } -
所有到达域的流量所需的 HTTPS
-
节点到节点加密
-
静态数据加密
-
导航到 IAM 控制台,然后选择 Roles (角色)。
-
选择
IAMMasterUserRole
并转到 Trust relationships (信任关系)选项卡。 -
选择 Edit trust relationship (编辑信任关系),并确保 Amazon Cognito 身份池可代入该角色。您应看到以下语句:
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "
identity-pool-id
" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } }] } -
选择 Update Trust Policy(更新信任策略)。
-
将相同的信任策略添加到第二个 IAM 角色(对于本教程的其余部分,为
IAMLimitedUserRole
)。 -
导航到 Amazon Cognito 控制台,选择管理用户池。
-
选择您的用户池,然后选择 Users and groups (用户和组)。
-
选择 Create user (创建用户),指定用户名
master-user
和密码,然后选择 Create user (创建用户)。 -
创建另一个名为
limited-user
的用户。 -
转到 Groups (组)选项卡,然后选择 Create group (创建组)。
-
命名组
master-user-group
,选择IAMMasterUserRole
中的IAM 角色下拉列表,然后选择创建组。 -
创建另一个名为
limited-user-group
的组,该组使用IAMLimitedUserRole
。 -
选择
master-user-group
,再选择 Add users (添加用户),然后添加master-user
。 -
选择
limited-user-group
,再选择 Add users (添加用户),然后添加limited-user
。 -
选择 App client settings (应用程序客户端设置),并记下域的应用程序客户端 ID。
-
选择 Federated Identities (联合身份),再选择您的身份池,然后选择 Edit identity pool (编辑身份池)。
-
展开 Authentication providers (身份验证提供商),查找域的用户池 ID 和应用程序客户端 ID,然后将 Use default role (使用默认角色) 更改为 Choose role from token (从令牌中选择角色)。
-
对于 Role resolution (角色解析),选择 DENY (拒绝)。在使用此设置时,用户必须位于组中才能在身份验证后接收 IAM 角色。
-
选择 Save Changes。
-
导航到OpenSearch 控制面板。
-
使用
master-user
进行登录。 -
选择 Add sample data(添加示例数据)并添加一些示例飞行数据。
-
选择安全、角色、创建角色。
-
将角色命名为
new-role
。 -
对于索引权限,为索引模式指定
opensearch_dashboards_sample_data_fli*
(Elasticsearch 域上的kibana_sample_data_fli*
)。 -
对于操作组,请选择读取。
-
对于 Document Level Security Query (文档级安全查询),请指定以下查询:
{ "match": { "FlightDelay": true } }
-
对于字段级安全性,请选择 Exclude(不包括)并指定
FlightNum
。 -
对于匿名,指定
Dest
。 -
选择 Create (创建) 。
-
选择映射的用户、管理映射。然后为
IAMLimitedUserRole
添加 ARN 作为外部标识,然后选择映射。 -
返回角色列表,然后选择 opensearch_dashboards_user。选择映射的用户、管理映射。为
IAMLimitedUserRole
添加 ARN 作为后端角色,然后选择映射。 -
在新的私有浏览器窗口中,导航到控制面板,使用
limited-user
进行登录,然后选择 Explore on my own (自行浏览)。 -
转到 Dev Tools (开发人员工具),然后运行原定设置搜索:
GET _search { "query": { "match_all": {} } }
请注意权限错误。
limited-user
没有运行集群范围内搜索的权限。 -
运行另一个搜索:
GET opensearch_dashboards_sample_data_flights/_search { "query": { "match_all": {} } }
请注意,在所有匹配的文档中,有一个为
true
的FlightDelay
字段,一个匿名化的Dest
字段,但没有FlightNum
字段。 -
在原始浏览器窗口中,以
master-user
身份登录,选择 Dev Tools (开发人员工具),然后执行相同的搜索。请注意权限、命中数、匹配文档和包含字段的差异。