SAML OpenSearch 仪表板的身份验证 - 亚马逊 OpenSearch 服务

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

SAML OpenSearch 仪表板的身份验证

SAML OpenSearch 控制面板身份验证允许您使用现有的身份提供商为运行 OpenSearch 或 Elasticsearch 6.7 或更高版本的亚马逊 OpenSearch 服务域上的控制面板提供单点登录 (SSO)。要使用SAML身份验证,必须启用精细的访问控制

控制面板的身份验证允许您使用第三方身份提供商登录控制面板SAML、管理精细访问控制、搜索数据和构建可视化效果,而不是通过 Amazon Cognito 或内部用户数据库进行身份验证 OpenSearch 。 OpenSearch 服务支持使用 SAML 2.0 标准的提供商,例如 Okta、Keycloak、Active Directory 联合服务 (ADFS)、Auth0 和。 AWS IAM Identity Center

SAML仪表板的身份验证仅适用于通过 Web 浏览器访问 OpenSearch 仪表板。您的SAML凭据允许您直接向 OpenSearch 或控制面板HTTP发出请求APIs。

SAML配置概述

本文档假定您有现有的身份提供程序并且熟悉它。我们无法为您的确切提供商提供详细的配置步骤,只能为您的 OpenSearch 服务域提供详细的配置步骤。

OpenSearch 仪表板登录流程可以采用以下两种形式之一:

  • 已启动服务提供程序 (SP):导航到控制面板(例如 https://my-domain.us-east-1.es.amazonaws.com/_dashboards),它会将您重定向到登录屏幕。登录后,身份提供程序会将您重定向到控制面板。

  • 身份提供者 (IdP) 已启动:您导航到您的身份提供商,登录,然后从应用程序目录中选择 Dash OpenSearch boards。

OpenSearch 服务提供两种单点登录URLs,SP 启动和 IDP 启动,但您只需要与所需控制面板登录流程相匹配的单点登录。 OpenSearch

无论您使用哪种身份验证类型,目标都是通过您的身份提供商登录并收到包含您的用户名(必填)和任何后端角色(可选,但建议使用)的SAML断言。这些信息允许精细的访问控制来为用户分配权限。SAML在外部身份提供程序中,后端角色通常称为“角色”或“组”。

注意事项

配置SAML身份验证时,请考虑以下几点:

  • 由于 IdP 元数据文件的大小,我们强烈建议使用 AWS 控制台配置SAML身份验证。

  • 域一次只支持一种控制面板身份验证方法。如果您启用了 OpenSearch 控制面板的 Amazon Cognito 身份验证,则必须先将其禁用,然后才能启用SAML身份验证。

  • 如果您将网络负载均衡器与配合使用SAML,则必须先创建自定义终端节点。有关更多信息,请参阅 为 Amazon OpenSearch Service 服务创建自定义终端节点

  • 对于非IAM身份SCP(例如在 Amazon OpenSearch Serverless SAML 和亚马逊服务的基本内部用户授权SAML中), OpenSearch 服务控制策略 () 将不适用或评估。

SAMLVPC域名认证

SAML不需要您的身份提供商和服务提供商之间进行直接通信。因此,即使您的 OpenSearch 域名托管在私有域中VPC,SAML只要您的浏览器可以与 OpenSearch 集群和身份提供商通信,您仍然可以使用。您的浏览器基本上充当身份提供商和服务提供商之间的中间人。有关解释SAML身份验证流程的有用图表,请参阅 Okta 文档

修改域访问策略

在配置SAML身份验证之前,必须更新域访问策略以允许SAML用户访问该域。否则,会显示拒绝访问的错误。

我们建议使用以下域访问策略,它将提供针对域上子资源 (/*) 的完全访问权限:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:ESHttp*", "Resource": "domain-arn/*" } ] }

要使策略的限制更为严格,可以在策略中添加 IP 地址条件。此条件将仅允许访问指定的 IP 地址范围或子网。例如,以下策略仅允许从 192.0.2.0/24 子网进行访问:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "es:ESHttp*" ], "Condition": { "IpAddress": { "aws:SourceIp": [ "192.0.2.0/24" ] } }, "Resource": "domain-arn/*" } ] }
注意

开放域访问策略要求在域上启用精细访问控制,否则您会看到以下错误:

To protect domains with public access, a restrictive policy or fine-grained access control is required.

如果您的主用户或内部用户配置了强健密码,则从安全角度来看,在使用精细访问控制的同时保持策略开放也许是可以接受的。有关更多信息,请参阅 在 Amazon OpenSearch Service 中进行精细访问控制

配置 SP 或 IdP 发起的身份验证

这些步骤说明了如何使用由 SP 启动 IDP 启动的SAML身份验证为仪表板启用身份验证。 OpenSearch 有关同时启用这两种身份验证所需的额外步骤,请参阅配置 SP 和 IdP 发起的身份验证

步骤 1:启用SAML身份验证

您可以在创建域时启用SAML身份验证,也可以通过选择操作编辑现有域上的安全配置来启用身份验证。根据您的选择,以下步骤略有不同。

在域配置中,在 D OpenSearch ashboards/Kibana 的SAML身份验证下,选择启用身份验证。SAML

步骤 2:配置身份提供程序

根据配置SAML身份验证的时间,执行以下步骤。

如果正在创建新域

如果您正在创建新域,则服务还无法生成 OpenSearch 服务提供商实体 ID 或SSOURLs。您的身份提供商需要这些值才能正确启用SAML身份验证,但它们只能在创建域之后生成。要在域创建期间解决这种相互依赖关系,您可以在 IdP 配置中提供临时值以生成所需的元数据,然后在域处于活动状态后对其进行更新。

如果您使用的是自定义终端节点,则可以推断出URLs将是什么。例如,如果您的自定义终端节点是www.custom-endpoint.com,则服务提供商实体 ID 将是www.custom-endpoint.com,IDP 启动的SSOURL将是www.custom-endpoint.com/_dashboards/_opendistro/_security/saml/acs/idpinitiated,S SSO URL P 启动的将是。www.custom-endpoint.com/_dashboards/_opendistro/_security/saml/acs在创建域之前,您可以使用这些值来配置身份提供程序。有关示例,请参阅下一节。

注意

您无法使用双堆栈端点登录,因为HTTP请求FQDN的与SAML请求FQDN的不同。如果您想使用双堆栈端点登录,则 OpenSearch管理员需要设置自定义终端节点并将该CNAME值设置为双堆栈端点。

如果您没有使用自定义端点,则可以在 IdP 中输入临时值以生成所需的元数据,然后在域处于活动状态后对其进行更新。

例如,在 Okta https://temp-endpoint.amazonaws.com 中,您可以在 “单点登录” URL 和 “受众URI(SP 实体 ID)” 字段中输入,这样您就可以生成元数据。然后,在域名处于活动状态后,您可以从 S OpenSearch ervice 中检索正确的值并在 Okta 中对其进行更新。有关说明,请参阅 第 6 步:更新你的 IdP URLs

如果您正在编辑现有域

如果您要在现有域上启用SAML身份验证,请复制服务提供商实体 ID 和其中一个SSOURLs。有关使用哪种方法URL的指导,请参阅SAML配置概述

Service provider entity ID and SSO URLs for SAML authentication configuration.

使用这些值配置您的身份提供程序。这是过程中最复杂的部分,不幸的是,术语和步骤因提供程序而异。请参阅提供程序的文档。

例如,在 Okta 中,你创建了一个 SAML 2.0 的 Web 应用程序。对于单点登录 URL,请指定SSOURL。对于受众URI(SP 实体 ID),请指定 SP 实体 ID。

Okta 拥有用户和组,而不是用户和后端角色。对于 Group Attribute Statements(组属性语句),建议将 role 添加到 Name(名称)字段,并将正则表达式 .+ 添加到 Filter(筛选条件)字段。此语句告诉 Okta 身份提供者在用户进行身份验证后将所有用户组包含在SAML断言role字段下。

在 IAM Identity Center 中,您可以将 SP 实体 ID 指定为应用程序SAML受众。您还需要指定以下属性映射Subject=${user:subject}:format=unspecifiedRole=${user:groups}:format=uri

在 Auth0 中,您可以创建一个常规 Web 应用程序并启用 SAML 2.0 插件。在 Keycloak 中,创建客户端。

步骤 3:导入 IdP 元数据

配置了身份提供程序后,它会生成 IdP 元数据文件。此XML文件包含有关提供商的信息,例如TLS证书、单点登录端点和身份提供者的实体 ID。

复制 IdP 元数据文件的内容并将其粘贴到服务控制台的 “来自 IdP 的元数据” 字段中。 OpenSearch 或者,选择从XML文件导入并上传文件。元数据文件应如下所示:

<?xml version="1.0" encoding="UTF-8"?> <md:EntityDescriptor entityID="entity-id" xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"> <md:IDPSSODescriptor WantAuthnRequestsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"> <md:KeyDescriptor use="signing"> <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:X509Data> <ds:X509Certificate>tls-certificate</ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </md:KeyDescriptor> <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat> <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</md:NameIDFormat> <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="idp-sso-url"/> <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="idp-sso-url"/> </md:IDPSSODescriptor> </md:EntityDescriptor>

步骤 4:配置SAML字段

输入 IdP 元数据后,请在 OpenSearch 服务控制台中配置以下其他字段:

  • IdP entity ID(IdP 实体 ID):从元数据文件中复制 entityID 属性值粘贴到此字段。许多身份提供程序还将此值显示为配置后摘要的一部分。有些提供程序称之为 “发行人”。

  • SAML主用户名SAML主后端角色-您指定的用户和/或后端角色获得集群的完全权限,相当于新的主用户,但只能在 OpenSearch 控制面板中使用这些权限。

    例如,在 Okta 中,您可能有属于群组 admins 的用户 jdoe。如果jdoe添加到SAML主用户名字段,则只有该用户获得完全权限。如果您admins添加到SAML主后端角色字段,则属于该admins组的任何用户都将获得完全权限。

    注意

    SAML断言的内容必须与您用于SAML主用户名和SAML主角色的字符串完全匹配。一些身份提供商在其用户名前添加前缀,这可能会导致 hard-to-diagnose不匹配。在身份提供商用户界面中,您可能会看到jdoe,但SAML断言可能包含auth0|jdoe。始终使用SAML断言中的字符串。

许多身份提供者允许您在配置过程中查看示例断言,而诸如 SAML-tracer 之类的工具可以帮助您检查实际断言的内容并对其进行故障排除。断言如下所示:

<?xml version="1.0" encoding="UTF-8"?> <saml2:Assertion ID="id67229299299259351343340162" IssueInstant="2020-09-22T22:03:08.633Z" Version="2.0" xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"> <saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">idp-issuer</saml2:Issuer> <saml2:Subject> <saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">username</saml2:NameID> <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"> <saml2:SubjectConfirmationData NotOnOrAfter="2020-09-22T22:08:08.816Z" Recipient="domain-endpoint/_dashboards/_opendistro/_security/saml/acs"/> </saml2:SubjectConfirmation> </saml2:Subject> <saml2:Conditions NotBefore="2020-09-22T21:58:08.816Z" NotOnOrAfter="2020-09-22T22:08:08.816Z"> <saml2:AudienceRestriction> <saml2:Audience>domain-endpoint</saml2:Audience> </saml2:AudienceRestriction> </saml2:Conditions> <saml2:AuthnStatement AuthnInstant="2020-09-22T19:54:37.274Z"> <saml2:AuthnContext> <saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml2:AuthnContextClassRef> </saml2:AuthnContext> </saml2:AuthnStatement> <saml2:AttributeStatement> <saml2:Attribute Name="role" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified"> <saml2:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">GroupName Match Matches regex ".+" (case-sensitive) </saml2:AttributeValue> </saml2:Attribute> </saml2:AttributeStatement> </saml2:Assertion>

步骤 5:(可选)配置其他设置

Additional settings(其他设置)下,配置以下可选字段:

  • Subject key — 您可以将此字段留空,以便使用SAML断言NameID元素作为用户名。如果您的断言不使用此标准元素,而是将用户名作为自定义属性,请在此处指定该属性。

  • Roles key(角色密钥):如果要使用后端角色(推荐),请在此字段指定断言的属性,例如 rolegroup。这是像 SAML-tracer 这样的工具可以提供帮助的另一种情况。

  • 会话上线时间-默认情况下, OpenSearch 控制面板会在 24 小时后将用户注销。通过指定新值,可以将此值配置为 60 到 1440(24 小时)之间的任何数字。

配置好后,请保存域。

第 6 步:更新你的 IdP URLs

如果您在创建域时启用了SAML身份验证,则必须在 IdP 中指定临时URLs身份才能生成XML元数据文件。在域名状态更改为后Active,您可以获取正确的域名URLs并修改您的 IdP。

要检索URLs,请选择域并选择操作编辑安全配置。在 OpenSearch Dashboards/Kibana 的SAML身份验证下,您可以找到正确的服务提供商实体 ID 和。SSO URLs复制这些值并使用它们来配置您的身份提供商,替换您在步骤 2 中提供的临时URLs身份提供商。

步骤 7:将SAML用户映射到角色

当您的域名状态为 “激活” 且您的 IdP 配置正确后,请导航至 OpenSearch 控制面板。

  • 如果您选择了 SP 启动的URL,请导航至。domain-endpoint/_dashboards要直接登录到特定租户,可以附加?security_tenant=tenant-name到。URL

  • 如果您选择 IdP 启动的URL,请导航到身份提供商的应用程序目录。

在这两种情况下,都要以SAML主用户或属于SAML主后端角色的用户身份登录。要继续执行步骤 7 中的示例,请以 jdoeadmins 组中 成员录入)。

OpenSearch 仪表板加载后,选择安全角色。然后,映射角色以允许其他用户访问 OpenSearch 仪表板。

例如,您可能将受信任的同事 jroe 映射添加到 all_accesssecurity_manager 角色。您还可以将后端角色 analysts 映射添加到 readallopensearch_dashboards_user 角色。

如果您更喜欢使用 OpenSearch 仪表板API而不是控制面板,请参阅以下示例请求:

PATCH _plugins/_security/api/rolesmapping [ { "op": "add", "path": "/security_manager", "value": { "users": ["master-user", "jdoe", "jroe"], "backend_roles": ["admins"] } }, { "op": "add", "path": "/all_access", "value": { "users": ["master-user", "jdoe", "jroe"], "backend_roles": ["admins"] } }, { "op": "add", "path": "/readall", "value": { "backend_roles": ["analysts"] } }, { "op": "add", "path": "/opensearch_dashboards_user", "value": { "backend_roles": ["analysts"] } } ]

配置 SP 和 IdP 发起的身份验证

如果要配置 SP 和 IDP 启动的身份验证,则必须通过身份提供程序执行此操作。例如,在 Okta 中,您可以执行以下步骤:

  1. 在SAML应用程序中,前往常规SAML设置

  2. 对于单点登录 URL,请提供您的 IdP 启动版。SSO URL例如,https://search-domain-hash/_dashboards/_opendistro/_security/saml/acs/idpinitiated

  3. 启用 “允许此应用请求其他” SSO URLs。

  4. 在 “可申请” 下 SSOURLs,添加一个或多个 S SSO URLs P 启动的。例如,https://search-domain-hash/_dashboards/_opendistro/_security/saml/acs

配置SAML身份验证 (AWS CLI)

以下 AWS CLI 命令为现有域上的 OpenSearch 仪表板启用SAML身份验证:

aws opensearch update-domain-config \ --domain-name my-domain \ --advanced-security-options '{"SAMLOptions":{"Enabled":true,"MasterUserName":"my-idp-user","MasterBackendRole":"my-idp-group-or-role","Idp":{"EntityId":"entity-id","MetadataContent":"metadata-content-with-quotes-escaped"},"RolesKey":"optional-roles-key","SessionTimeoutMinutes":180,"SubjectKey":"optional-subject-key"}}'

必须对元数据XML中的所有引号和换行符进行转义。例如,使用 <KeyDescriptor use=\"signing\">\n 而不是 <KeyDescriptor use="signing"> 和换行符。有关使用的详细信息 AWS CLI,请参阅AWS CLI 命令参考

配置SAML身份验证(配置API)

以下配置请求API允许在现有域上对 OpenSearch 仪表板进行SAML身份验证:

POST https://es.us-east-1.amazonaws.com/2021-01-01/opensearch/domain/my-domain/config { "AdvancedSecurityOptions": { "SAMLOptions": { "Enabled": true, "MasterUserName": "my-idp-user", "MasterBackendRole": "my-idp-group-or-role", "Idp": { "EntityId": "entity-id", "MetadataContent": "metadata-content-with-quotes-escaped" }, "RolesKey": "optional-roles-key", "SessionTimeoutMinutes": 180, "SubjectKey": "optional-subject-key" } } }

必须对元数据XML中的所有引号和换行符进行转义。例如,使用 <KeyDescriptor use=\"signing\">\n 而不是 <KeyDescriptor use="signing"> 和换行符。有关使用配置的详细信息API,请参阅OpenSearch 服务参API考

SAML故障排除

错误 详细信息

你的请求:'/some/path'不允许。

确认您向身份提供商提供了正确的信息 SSOURL(步骤 3)。

请提供有效的身份提供者元数据文档以启用SAML。

您的 IdP 元数据文件不符合 SAML 2.0 标准。使用验证工具检查错误。

SAML配置选项在控制台中不可见。

更新到最新服务软件

SAML配置错误:检索SAML配置时出错,请检查您的设置。

出现这种通用错误的原因很多。

  • 请检查您是否向身份提供商提供了正确的 SP 实体 ID 和SSOURL。

  • 重新生成 IdP 元数据文件,并验证 IdP 实体 ID。将任何更新的元数据添加到 AWS 控制台。

  • 验证您的域访问策略是否允许访问 OpenSearch 仪表板和_plugins/_security/*。通常,我们建议对使用精细访问控制的域采用开放访问策略。

  • 有关配置步骤,请参阅身份提供商的文档SAML。

缺少角色:此用户没有可用的角色,请与您的系统管理员联系。

您成功进行了身份验证,但是SAML断言中的用户名和任何后端角色都未映射到任何角色,因此没有权限。这些映射区分大小写。

您的系统管理员可以使用诸如 SAML-tracer 之类的工具验证您的SAML断言内容,然后使用以下请求检查您的角色映射:

GET _plugins/_security/api/rolesmapping

尝试访问 OpenSearch 仪表板时,您的浏览器会持续重定向或收到 HTTP 500 个错误。

如果您的SAML断言包含大量角色,总共约为 1,500 个字符,则可能会发生这些错误。例如,如果您传递 80 个角色(其平均长度为 20 个字符),则可能会超过 Web 浏览器中 Cookie 的大小限制。从 2.7 OpenSearch 版开始,SAML断言支持最多 5000 个字符的角色。

您无法登出ADFS。

ADFS需要对所有注销请求进行签名,但 OpenSearch 服务不支持。<SingleLogoutService />从 IdP 元数据文件中移除以强制 OpenSearch 服务使用自己的内部注销机制。

Could not find entity descriptor for __PATH__.

在元数据中提供XML给 OpenSearch 服务的 IdP 的实体 ID 与响应中的实体 ID 不同。SAML要解决这个问题,请确保二者匹配。在您的域上启用 CW 应用程序错误日志,查找错误消息以调试SAML集成问题。

Signature validation failed. SAML response rejected.

OpenSearch 服务无法使用元数据中提供的 IdP 证书验证SAML响应中的签名。XML可能是手动错误,也可能是 IdP 已轮换证书。在通过XML提供给 OpenSearch 服务的元数据中更新来自您的 IdP 的最新证书。 AWS Management Console

__PATH__ is not a valid audience for this response.

SAML响应中的受众字段与域端点不匹配。要修复此错误,请更新 SP 受众字段,使其与域端点相符。如果已启用自定义端点,则受众字段应与自定义端点匹配。在您的域上启用 CW 应用程序错误日志,查找错误消息以调试SAML集成问题。

您的浏览器在响应Invalid Request Id中收到 HTTP 400 错误。

如果您将 IdP 启动URL的格式配置为该格式,通常会发生此错误。<DashboardsURL>/_opendistro/_security/saml/acs相反,请URL使用格式配置<DashboardsURL>/_opendistro/_security/saml/acs/idpinitiated

通过 __PATH__(而不是 __PATH__)接收响应。

SAML响应中的目标字段与以下URL格式之一不匹配:

  • <DashboardsURL>/_opendistro/_security/saml/acs

  • <DashboardsURL>/_opendistro/_security/saml/acs/idpinitiated.

根据您使用的登录流程(SP 启动或 IDP 发起的),在与其中一个匹配的目标字段中输入。 OpenSearch URLs

响应具有 InResponseTo 属性,但没有 InResponseTo

您正在使用 IDP 启动的 SP 启动URL的登录流程。改用 SP 启动的URL。

禁用SAML身份验证

禁用 OpenSearch 仪表板的SAML身份验证(控制台)
  1. 选择域、Actions(操作)Edit security configuration(编辑安全配置)

  2. 取消选中启用SAML身份验证

  3. 选择 Save changes(保存更改)

  4. 域完成处理后,请使用以下请求验证精细访问控制角色映射:

    GET _plugins/_security/api/rolesmapping

    禁用仪表板的SAML身份验证不会删除SAML主用户名和/或SAML主后端角色的映射。如果要移除这些映射,请使用内部用户数据库(如果启用)登录控制面板,或者使用API将其删除:

    PUT _plugins/_security/api/rolesmapping/all_access { "users": [ "master-user" ] }