SAML
Security 插件支持通过 SAML 单点登录进行用户身份验证。Security 插件实现了 SAML 2.0 协议的 Web 浏览器 SSO 配置文件。
此配置文件适用于 Web 浏览器。它不是针对 Security 插件验证用户的通用方法,因此其主要用例是支持 UDB-SX Dashboards 单点登录。
激活 SAML
要使用 SAML 进行身份验证,需要在 config/udbsx-security/config.yml 的 authc 部分配置相应的身份验证域。因为 SAML 仅在 HTTP 层工作,所以不需要任何 authentication_backend,可以将其设置为 noop。将本章中所有 SAML 特定的配置选项放在 SAML HTTP 认证器的 config 部分:
_meta:
type: "config"
config_version: 2
config:
dynamic:
authc:
saml_auth_domain:
http_enabled: true
transport_enabled: false
order: 1
http_authenticator:
type: saml
challenge: true
config:
idp:
metadata_file: okta.xml
...
authentication_backend:
type: noop
在 config.yml 中配置 SAML 后,还必须在 UDB-SX Dashboards 中激活它。
运行多个身份验证域
我们建议至少添加另一个身份验证域,例如 LDAP 或内部用户数据库,以支持不带 SAML 的 UDB-SX API 访问。对于 UDB-SX Dashboards 和内部 UDB-SX Dashboards 服务器用户,还必须添加另一个支持基本身份验证的身份验证域。此身份验证域应放在链的第一个位置,并且必须将 challenge 标志设置为 false:
_meta:
type: "config"
config_version: 2
config:
dynamic:
authc:
basic_internal_auth_domain:
http_enabled: true
transport_enabled: true
order: 0
http_authenticator:
type: basic
challenge: false
authentication_backend:
type: internal
saml_auth_domain:
http_enabled: true
transport_enabled: false
order: 1
http_authenticator:
type: saml
challenge: true
config:
...
authentication_backend:
type: noop
身份提供者元数据
SAML 身份提供者 (IdP) 提供一个 SAML 2.0 元数据文件,描述 IdP 的功能和配置。Security 插件可以从 URL 或文件读取 IdP 元数据。您的选择取决于您的 IdP 和偏好。SAML 2.0 元数据文件是必需的。
| 名称 | 描述 |
|---|---|
idp.metadata_file |
您的 IdP 的 SAML 2.0 元数据文件的路径。将元数据文件放在 UDB-SX 的 config 目录中。路径必须相对于 config 目录指定。如果未设置 idp.metadata_url,则为必需。 |
idp.metadata_url |
您的 IdP 的 SAML 2.0 元数据 URL。如果未设置 idp.metadata_file,则为必需。 |
IdP 和服务提供者实体 ID
实体 ID 是 SAML 实体(IdP 或服务提供者 (SP))的全局唯一名称。IdP 实体 ID 通常由您的 IdP 提供。SP 实体 ID 是您的 IdP 中配置的应用程序或客户端的名称。我们建议为 UDB-SX Dashboards 添加一个新应用程序,并将 UDB-SX Dashboards 安装的 URL 用作 SP 实体 ID。
| 名称 | 描述 |
|---|---|
idp.entity_id |
您的 IdP 的实体 ID。必需。 |
sp.entity_id |
服务提供者的实体 ID。必需。 |
JWT 验证的时间差异补偿
有时您可能会发现身份验证服务器和 UDB-SX 节点之间的时钟时间没有完全同步。在这种情况下,即使只有几秒钟的差异,签发或接收 JSON Web 令牌 (JWT) 的系统可能会尝试验证 nbf(不早于)和 exp(过期)声明,并因时间差异而无法验证用户。
默认情况下,UDB-SX Security 允许有 30 秒的窗口来补偿服务器时钟时间之间可能的错位。要为该功能设置自定义值并覆盖默认值,可以将 jwt_clock_skew_tolerance_seconds 设置添加到 config.yml。
http_authenticator:
type: saml
challenge: true
config:
idp:
metadata_file: okta.xml
jwt_clock_skew_tolerance_seconds: 20
UDB-SX Dashboards 设置
Web 浏览器 SSO 配置文件通过 HTTP GET 或 POST 交换信息。例如,登录到 IdP 后,它会向 UDB-SX Dashboards 发送一个包含 SAML 响应的 HTTP POST。必须配置 UDB-SX Dashboards 安装的基本 URL,HTTP 请求将发送到该 URL。
| 名称 | 描述 |
|---|---|
kibana_url |
UDB-SX Dashboards 基本 URL。必需。 |
用户名和角色属性
主体(例如,用户名)通常存储在 SAML 响应的 NameID 元素中:
<saml2:Subject>
<saml2:NameID>admin</saml2:NameID>
...
</saml2:Subject>
如果您的 IdP 符合 SAML 2.0 规范,则无需设置任何特殊内容。如果您的 IdP 使用不同的元素名称,也可以显式指定其名称。
角色属性是可选的。但是,大多数 IdP 也可以配置为在 SAML 断言中添加角色。如果存在,可以在角色映射中使用这些角色:
<saml2:Attribute Name='Role'>
<saml2:AttributeValue >Everyone</saml2:AttributeValue>
<saml2:AttributeValue >Admins</saml2:AttributeValue>
</saml2:Attribute>
如果要从 SAML 响应中提取角色,需要指定包含角色的元素名称。
| 名称 | 描述 |
|---|---|
subject_key |
SAML 响应中存储主体的属性。可选。如果未配置,则使用 NameID 属性。 |
roles_key |
SAML 响应中存储角色的属性。可选。如果未配置,则不使用任何角色。 |
请求签名
从 Security 插件到 IdP 的请求可以选择性地进行签名。使用以下设置配置请求签名。
| 名称 | 描述 |
|---|---|
sp.signature_private_key |
用于签名请求或解码加密断言的私钥。可选。当设置了 private_key_filepath 时不能使用。 |
sp.signature_private_key_password |
私钥的密码(如果有)。 |
sp.signature_private_key_filepath |
私钥的路径。文件必须放在 UDB-SX config 目录下,路径必须相对于同一目录指定。 |
sp.signature_algorithm |
用于签名请求的算法。参见下表了解可能的值。 |
私钥必须为 PKCS#8 格式。如果要使用加密密钥,必须使用兼容 PKCS#12 的算法 (3DES) 进行加密。
Security 插件支持以下签名算法。
| 算法 | 值 |
|---|---|
| DSA_SHA1 | http://www.w3.org/2000/09/xmldsig#dsa-sha1; |
| RSA_SHA1 | http://www.w3.org/2000/09/xmldsig#rsa-sha1; |
| RSA_SHA256 | http://www.w3.org/2001/04/xmldsig-more#rsa-sha256; |
| RSA_SHA384 | http://www.w3.org/2001/04/xmldsig-more#rsa-sha384; |
| RSA_SHA512 | http://www.w3.org/2001/04/xmldsig-more#rsa-sha512; |
注销
通常,IdP 在其 SAML 2.0 元数据中提供有关其单独注销 URL 的信息。如果是这种情况,Security 插件会使用它们在 UDB-SX Dashboards 中呈现正确的注销链接。如果您的 IdP 不支持显式注销,则可以在用户再次访问 UDB-SX Dashboards 时强制重新登录。
| 名称 | 描述 |
|---|---|
sp.forceAuthn |
即使用户在 IdP 有活动会话,也强制重新登录。 |
目前,Security 插件仅支持 HTTP-Redirect 注销绑定。请确保在您的 IdP 中正确配置。
交换密钥设置
与其他协议不同,SAML 不用于在每个请求中交换用户凭据。Security 插件将 SAML 响应交换为一个轻量级的 JWT,该 JWT 存储经过验证的用户属性。此令牌由您选择的交换密钥签名。请注意,更改此密钥时,所有使用它签名的令牌立即失效。
| 名称 | 描述 |
|---|---|
exchange_key |
用于签名令牌的密钥。算法是 HMACSHA512,因此我们建议使用 64 个字符,例如 9a2h8ajasdfhsdiydfn7dtd6d5ashsd89a2h8ajasdHhsdiyLfn7dtd6d5ashsdI。确保输入 exchange_key 的值,否则会返回错误。 |
TLS 设置
如果从 URL 加载 IdP 元数据,建议使用 SSL/TLS。如果使用像 Okta 或 Auth0 这样使用受信任证书的外部 IdP,通常无需配置任何内容。如果自己托管 IdP 并使用自己的根 CA,可以按如下方式自定义 TLS 设置。这些设置仅用于通过 HTTPS 加载 SAML 元数据。
| 名称 | 描述 |
|---|---|
idp.enable_ssl |
是否启用自定义 TLS 配置。默认为 false(使用 JDK 设置)。 |
idp.verify_hostnames |
是否验证服务器 TLS 证书的主机名。 |
示例:
authc:
saml_auth_domain:
http_enabled: true
transport_enabled: false
order: 1
http_authenticator:
type: saml
challenge: true
config:
idp:
enable_ssl: true
verify_hostnames: true
...
authentication_backend:
type: noop
证书验证
通过设置以下配置选项之一来配置用于验证 IdP TLS 证书的根 CA:
config:
idp:
pemtrustedcas_filepath: path/to/trusted_cas.pem
config:
idp:
pemtrustedcas_content: |-
-----BEGIN CERTIFICATE-----
MIID/jCCAuagAwIBAgIBATANBgkqhkiG9w0BAQUFADCBjzETMBEGCgmSJomT8ixk
ARkWA2NvbTEXMBUGCgmSJomT8ixkARkWB2V4YW1wbGUxGTAXBgNVBAoMEEV4YW1w
bGUgQ29tIEluYy4xITAfBgNVBAsMGEV4YW1wbGUgQ29tIEluYy4gUm9vdCBDQTEh
...
-----END CERTIFICATE-----
| 名称 | 描述 |
|---|---|
idp.pemtrustedcas_filepath |
包含 IdP 根 CA 的 PEM 文件的路径。文件必须放在 UDB-SX config 目录下,并且必须相对于同一目录指定路径。 |
idp.pemtrustedcas_content |
IdP 服务器的根 CA 内容。当设置了 pemtrustedcas_filepath 时不能使用。 |
客户端身份验证
Security 插件在获取 IdP 元数据时可以使用 TLS 客户端身份验证。如果启用,Security 插件会向 IdP 发送 TLS 客户端证书以进行每个元数据请求。使用以下键配置客户端身份验证。
| 名称 | 描述 |
|---|---|
idp.enable_ssl_client_auth |
是否向 IdP 服务器发送客户端证书。默认为 false。 |
idp.pemcert_filepath |
包含客户端证书的 PEM 文件的路径。文件必须放在 UDB-SX config 目录下,路径必须相对于 config 目录指定。 |
idp.pemcert_content |
客户端证书的内容。当设置了 pemcert_filepath 时不能使用。 |
idp.pemkey_filepath |
客户端证书私钥的路径。文件必须放在 UDB-SX config 目录下,路径必须相对于 config 目录指定。 |
idp.pemkey_content |
证书私钥的内容。当设置了 pemkey_filepath 时不能使用。 |
idp.pemkey_password |
私钥的密码(如果有)。 |
启用的密码套件和协议
可以限制 IdP 连接允许的密码套件和 TLS 协议。例如,可以仅启用强密码套件并将 TLS 版本限制为最新版本。
| 名称 | 描述 |
|---|---|
idp.enabled_ssl_ciphers |
启用的 TLS 密码套件数组。仅支持 Java 格式。 |
idp.enabled_ssl_protocols |
启用的 TLS 协议数组。仅支持 Java 格式。 |
最小配置示例
以下示例显示了最小配置:
_meta:
type: "config"
config_version: 2
config:
dynamic:
authc:
saml_auth_domain:
http_enabled: true
transport_enabled: false
order: 1
http_authenticator:
type: saml
challenge: true
config:
idp:
metadata_file: metadata.xml
entity_id: http://idp.example.com/
sp:
entity_id: https://UDB-SX-dashboards.example.com
kibana_url: https://UDB-SX-dashboards.example.com:6601/
roles_key: Role
exchange_key: 'peuvgOLrjzuhXf ...'
authentication_backend:
type: noop
UDB-SX Dashboards 配置
因为大多数 SAML 特定配置是在 Security 插件中完成的,只需在 udbsx_dashboards.yml 中通过添加以下内容激活 SAML:
udbsx_security.auth.type: "saml"
此外,必须将用于验证 SAML 断言的 UDB-SX Dashboards 端点添加到允许列表中:
server.xsrf.allowlist: ["/_opendistro/_security/saml/acs"]
如果使用注销 POST 绑定,还需要将注销端点添加到允许列表中:
server.xsrf.allowlist: ["/_opendistro/_security/saml/acs", "/_opendistro/_security/saml/logout"]
IdP 发起的 SSO
要使用 IdP 发起的 SSO,请将 IdP 的断言消费者服务端点设置为:
/_opendistro/_security/saml/acs/idpinitiated
然后将此端点添加到 udbsx_dashboards.yml 中的 server.xsrf.allowlist:
server.xsrf.allowlist: ["/_opendistro/_security/saml/acs/idpinitiated", "/_opendistro/_security/saml/acs", "/_opendistro/_security/saml/logout"]