仪表板的 SAML 身份验证 OpenSearch - 亚马逊 OpenSearch 服务
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

仪表板的 SAML 身份验证 OpenSearch

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

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

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

SAML 配置概述

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

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

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

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

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

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

注意事项

在配置 SAML 身份验证时,请考虑以下事项:

用于 VPC 域的 SAML 身份验证

SAML 不要求身份提供程序和服务提供程序之间直接进行通信。因此,即使您的 OpenSearch 域托管在私有 VPC 中,只要您的浏览器可以与 OpenSearch 集群和身份提供商通信,您仍然可以使用 SAML。您的浏览器基本上充当身份提供商和服务提供商之间的中间人。有关解释 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

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

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

步骤 1:启用 SAML 身份验证

您可以在域创建期间启用 SAML 身份验证,也可以在现有域上选择 Actions(操作),Edit security configuration(编辑安全配置)。根据您的选择,以下步骤略有不同。

在域配置中,在 “ OpenSearch 仪表板/Kibana 的 SAML 身份验证” 下,选择 “启用 SAML 身份验证”。

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

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

如果正在创建新域

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

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

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

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

如果您正在编辑现有域

如果您正在现有域上启用 SAML 身份验证,请复制服务提供程序实体 ID 和其中一个 SSO URL。有关使用哪个 URL 的指南,请参阅 SAML 配置概述

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

例如,在 Okta 中,您创建一个 SAML 2.0 Web 应用程序。为 Single sign on URL(单一登录 URL)指定 SSO URL。对于受众 URI(SP 实体 ID)中,指定 SP 实体 ID。

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

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

在 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 跟踪可以帮助您检查和排除真实断言的内容。断言如下所示:

<?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 跟踪可以提供帮助。

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

配置好后,请保存域。

步骤 6:更新您的 IdP URL

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

要检索 URL,请选择域,然后选择 Actions(操作)、Edit security configuration(编辑安全配置)。在 OpenSearch Dashboards/Kibana 的 SAML 身份验证下,您可以找到正确的服务提供商实体 ID 和 SSO 网址。复制这些值用于配置身份提供程序,替换您在步骤 2 中提供的临时 URL。

步骤 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 角色。

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

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 应用程序中,转到 General(通用)、SAML settings(SAML 设置)。

  2. 对于 Single sign on URL(单点登录 URL),提供您的 IdP 发起的 SSO URL。例如,https://search-domain-hash/_dashboards/_opendistro/_security/saml/acs/idpinitiated

  3. 启用 Allow this app to request other SSO URLs(允许此应用程序请求其他 SSO URL)。

  4. Requestable SSO URLs(可请求的 SSO URL)下,添加一个或多个 SP 发起的 SSO URL。例如,https://search-domain-hash/_dashboards/_opendistro/_security/saml/acs

配置 SAML 身份验证 (Amazon CLI)

以下 Amazon 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"> 和换行符。有关使用的详细信息 Amazon CLI,请参阅《Amazon 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'不允许。

验证您提供了正确的 SSO URL (步骤 3)发送给您的身份提供程序。

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

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

SAML 配置选项不显示在控制台中。

更新到最新服务软件

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

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

  • 检查是否为身份提供商提供了正确的 SP 实体 ID 和 SSO URL。

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

  • 验证您的域访问策略是否允许访问 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__.

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

Signature validation failed. SAML response rejected.

OpenSearch 服务无法使用元数据 XML 中提供的 IdP 证书验证 SAML 响应中的签名。可能是手动错误,也可能是 IdP 已轮换证书。在通过提供给 OpenSearch 服务的元数据 XML 中更新来自您的 IdP 的最新证书。 Amazon Web Services 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 格式,通常会发生此错误。相反,改用 <DashboardsURL>/_opendistro/_security/saml/acs/idpinitiated 格式配置 URL。

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

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

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

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

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

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

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

禁用 SAML 身份验证

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

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

  3. 选择 ‬保存更改

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

    GET _plugins/_security/api/rolesmapping

    禁用控制面板的 SAML 身份验证删除 SAML 主用户名和/或 SAML 主后端角色的映射。如果要删除这些映射,请使用内部用户数据库(如果已启用)登录到控制面板,或使用 API 删除它们:

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