教程:使用 IAM 主用户和 Amazon Cognito 身份验证配置域 - 亚马逊 OpenSearch 服务

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

教程:使用 IAM 主用户和 Amazon Cognito 身份验证配置域

本教程介绍了一个用于精细访问控制的常见亚马逊 OpenSearch 服务用例:对控制面板采用 Amazon Cognito 身份验证的 IAM 主用户。 OpenSearch

在本教程中,我们将配置一个 IAM 角色和一个受限 IAM 角色,然后将其与 Amazon Cognito 中的用户关联。然后,主用户可以登录控制 OpenSearch 面板,将受限用户映射到角色,并使用精细的访问控制来限制用户的权限。

IAM roles and Amazon Cognito integration with OpenSearch Dashboards access control.

尽管这些步骤使用 Amazon Cognito 用户池进行身份验证,但相同的基本流程适用于任何 Cognito 身份验证提供商,从而允许您将不同的 IAM 角色分配给不同的用户。

在本教程中,您将完成以下步骤:

步骤 1:创建主 IAM 角色和受限 IAM 角色

导航到 AWS Identity and Access Management (IAM) 控制台并创建两个单独的角色:

  • MasterUserRole:主用户,它将拥有针对集群的完全权限,并可管理角色和角色映射。

  • LimitedUserRole:更受限制的角色,您将以主用户身份为其授予有限访问权限。

有关创建角色的说明,请参阅使用自定义信任策略创建角色

这两个角色都必须具有以下信任策略,允许您的 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" } } }] }
注意

identity-pool-id 替换为您的 Amazon Cognito 身份池的唯一标识符。例如,us-east-1:0c6cdba7-3c3c-443b-a958-fb9feb207aa6

步骤 2:使用 Cognito 身份验证创建域

通过 https://console.aws.amazon.com/aos/home/ 导航到亚马逊 OpenSearch 服务控制台,然后使用以下设置创建一个域名

  • OpenSearch 1.0 或更高版本,或 Elasticsearch 7.8 或更高版本

  • 公有访问权限

  • 以主用户(在上一步中创建)身份借助 MasterUserRole 启用的精细访问控制

  • 控制面板启用了 Amazon Cognito 身份验证。 OpenSearch 有关启用 Cognito 身份验证以及选择用户和身份池的说明,请参阅 将域配置为使用 Amazon Cognito 身份验证

  • 以下域访问策略:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::{account-id}:root" }, "Action": [ "es:ESHttp*" ], "Resource": "arn:aws:es:{region}:{account-id}:domain/{domain-name}/*" } ] }
  • 所有到达域的流量所需的 HTTPS

  • N ode-to-node 加密

  • 静态数据加密

步骤 3:配置 Cognito 用户

创建域时,请按照 Amazon Cognito开发人员指南中的创建用户池配置 Amazon Cognito 的主用户和受限用户。最后,按照在 Amazon Cognito 中创建身份池中的步骤配置您的身份池。用户池和身份池必须在同一个 AWS 区域中。

步骤 4:在 OpenSearch 仪表板中映射角色

现在,您的用户已配置完毕,您可以以主用户身份登录 OpenSearch 仪表板并将用户映射到角色。

  1. 返回 OpenSearch 服务控制台并导航到您创建的域名的控制 OpenSearch 面板 URL。URL 遵循此格式:domain-endpoint/_dashboards/

  2. 使用 master-user 凭证登录。

  3. 选择 Add sample data(添加示例数据),然后添加示例飞行数据。

  4. 在左侧导航窗格中,选择 Security(安全性)、Roles(角色)、Create role(创建角色)。

  5. 将角色命名为 new-role

  6. 对于 Index(索引),指定 opensearch_dashboards_sample_data_fli*(Elasticsearch 域上的 kibana_sample_data_fli*)。

  7. 对于 Index permissions(索引权限),选择 read(读取)。

  8. 对于 Document Level Security Query (文档级安全查询),请指定以下查询:

    { "match": { "FlightDelay": true } }
  9. 对于字段级安全性,请选择 Exclude(不包括)并指定 FlightNum

  10. 对于匿名,指定 Dest

  11. 选择创建

  12. 选择映射的用户管理映射。为 LimitedUserRole 添加 Amazon 资源名称(ARN)作为外部标识,然后选择 Map(映射)。

  13. 返回角色列表,然后选择 opensearch_dashboards_user。选择映射的用户管理映射。为 LimitedUserRole 添加 ARN 作为后端角色,然后选择映射

步骤 5:测试权限

角色正确映射后,您可以以受限用户身份登录并测试权限。

  1. 在新的私有浏览器窗口中,导航到该域的 OpenSearch 仪表板网址,使用limited-user凭据登录,然后选择自己浏览

  2. 转到 Dev Tools (开发人员工具),然后运行原定设置搜索:

    GET _search { "query": { "match_all": {} } }

    请注意权限错误。limited-user 没有运行集群范围内搜索的权限。

  3. 运行另一个搜索:

    GET opensearch_dashboards_sample_data_flights/_search { "query": { "match_all": {} } }

    请注意,在所有匹配的文档中,有一个为 trueFlightDelay 字段,一个匿名化的 Dest 字段,但没有 FlightNum 字段。

  4. 在原始浏览器窗口中,以 master-user 身份登录,选择 Dev Tools (开发人员工具),然后执行相同的搜索。请注意权限、命中数、匹配文档和包含字段的差异。