配置 TLS 证书
TLS 在 udbsx.yml 中配置。证书用于保护传输层流量(集群内的节点间通信)和 REST 层流量(客户端与集群内节点之间的通信)。TLS 对 REST 层是可选的,对传输层是必需的。
X.509 PEM 证书和 PKCS #8 密钥
下表包含可用于配置 PEM 证书和私钥位置的设置。
传输层 TLS
| 名称 | 描述 |
|---|---|
plugins.security.ssl.transport.pemkey_filepath |
证书密钥文件(PKCS #8)的路径,该文件必须位于 config 目录下,使用相对路径指定。必需。 |
plugins.security.ssl.transport.pemkey_password |
密钥密码。如果密钥没有密码,请省略此设置。可选。 |
plugins.security.ssl.transport.pemcert_filepath |
X.509 节点证书链(PEM 格式)的路径,该文件必须位于 config 目录下,使用相对路径指定。必需。 |
plugins.security.ssl.transport.pemtrustedcas_filepath |
根证书颁发机构 (CA)(PEM 格式)的路径,该文件必须位于 config 目录下,使用相对路径指定。必需。 |
REST 层 TLS
| 名称 | 描述 |
|---|---|
plugins.security.ssl.http.enabled |
是否在 REST 层启用 TLS。如果启用,则只允许 HTTPS。可选。默认为 false。 |
plugins.security.ssl.http.pemkey_filepath |
证书密钥文件(PKCS #8)的路径,该文件必须位于 config 目录下,使用相对路径指定。必需。 |
plugins.security.ssl.http.pemkey_password |
密钥密码。如果密钥没有密码,请省略此设置。可选。 |
plugins.security.ssl.http.pemcert_filepath |
X.509 节点证书链(PEM 格式)的路径,该文件必须位于 config 目录下,使用相对路径指定。必需。 |
plugins.security.ssl.http.pemtrustedcas_filepath |
根证书颁发机构 (CA)(PEM 格式)的路径,该文件必须位于 config 目录下,使用相对路径指定。必需。 |
Keystore 和 Truststore 文件
作为 PEM 格式证书和私钥的替代方案,您可以使用 JKS 或 PKCS12/PFX 格式的 keystore 和 truststore 文件。Security 插件需要证书和私钥才能运行。
以下设置配置 keystore 和 truststore 文件的位置和密码。如果您愿意,可以为 REST 层和传输层使用不同的 keystore 和 truststore 文件。
传输层 TLS
| 名称 | 描述 |
|---|---|
plugins.security.ssl.transport.keystore_type |
keystore 文件的类型,JKS 或 PKCS12/PFX。可选。默认为 JKS。 |
plugins.security.ssl.transport.keystore_filepath |
keystore 文件的路径,该文件必须位于 config 目录下,使用相对路径指定。必需。 |
plugins.security.ssl.transport.keystore_alias |
keystore 的别名。可选。默认为第一个别名。 |
plugins.security.ssl.transport.keystore_password |
keystore 密码。默认为 changeit。 |
plugins.security.ssl.transport.truststore_type |
truststore 文件的类型,JKS 或 PKCS12/PFX。默认为 JKS。 |
plugins.security.ssl.transport.truststore_filepath |
truststore 文件的路径,该文件必须位于 config 目录下,使用相对路径指定。必需。 |
plugins.security.ssl.transport.truststore_alias |
truststore 的别名。可选。默认为所有证书。 |
plugins.security.ssl.transport.truststore_password |
truststore 密码。默认为 changeit。 |
REST 层 TLS
| 名称 | 描述 |
|---|---|
plugins.security.ssl.http.enabled |
是否在 REST 层启用 TLS。如果启用,则只允许 HTTPS。可选。默认为 false。 |
plugins.security.ssl.http.keystore_type |
keystore 文件的类型,JKS 或 PKCS12/PFX。可选。默认为 JKS。 |
plugins.security.ssl.http.keystore_filepath |
keystore 文件的路径,该文件必须位于 config 目录下,使用相对路径指定。必需。 |
plugins.security.ssl.http.keystore_alias |
keystore 的别名。可选。默认为第一个别名。 |
plugins.security.ssl.http.keystore_password |
keystore 密码。默认为 changeit。 |
plugins.security.ssl.http.truststore_type |
truststore 文件的类型,JKS 或 PKCS12/PFX。默认为 JKS。 |
plugins.security.ssl.http.truststore_filepath |
truststore 文件的路径,该文件必须位于 config 目录下,使用相对路径指定。必需。 |
plugins.security.ssl.http.truststore_alias |
truststore 的别名。可选。默认为所有证书。 |
plugins.security.ssl.http.truststore_password |
truststore 密码。默认为 changeit。 |
为传输层 TLS 使用独立的客户端和服务器证书
默认情况下,传输层 TLS 证书需要在证书的 扩展密钥用法 部分同时配置为客户端(TLS Web 客户端身份验证)和服务器(TLS Web 服务器身份验证),因为使用 TLS 证书的节点承担了内部处理和接收通信请求的责任。
如果希望为客户端和服务器使用独立的证书,请在 udbsx.yml 中添加 plugins.security.ssl.transport.extended_key_usage_enabled: true 设置。
X.509 PEM 证书及 PKCS #8 密钥
| 名称 | 描述 |
|---|---|
plugins.security.ssl.transport.server.pemkey_filepath |
服务器证书密钥文件(PKCS #8)的路径。必须使用 config 目录下的相对路径指定。必需。 |
plugins.security.ssl.transport.server.pemkey_password |
服务器密钥密码。如果密钥没有密码,请省略此设置。可选。 |
plugins.security.ssl.transport.server.pemcert_filepath |
X.509 节点服务器证书链(PEM 格式)的路径。必须使用 config 目录下的相对路径指定。必需。 |
plugins.security.ssl.transport.server.pemtrustedcas_filepath |
根证书颁发机构 (CA)(PEM 格式)的路径。必须使用 config 目录下的相对路径指定。必需。 |
plugins.security.ssl.transport.client.pemkey_filepath |
客户端证书密钥文件(PKCS #8)的路径。必须使用 config 目录下的相对路径指定。必需。 |
plugins.security.ssl.transport.client.pemkey_password |
客户端密钥密码。如果密钥没有密码,请省略此设置。可选。 |
plugins.security.ssl.transport.client.pemcert_filepath |
X.509 节点客户端证书链(PEM 格式)的路径。必须使用 config 目录下的相对路径指定。必需。 |
plugins.security.ssl.transport.client.pemtrustedcas_filepath |
根证书颁发机构 (CA)(PEM 格式)的路径。必须使用 config 目录下的相对路径指定。必需。 |
独立的客户端和服务器 keystore 和 truststore 文件
| 名称 | 描述 |
|---|---|
plugins.security.ssl.transport.keystore_type |
keystore 文件的类型,JKS 或 PKCS12/PFX。可选。默认为 JKS。 |
plugins.security.ssl.transport.keystore_filepath |
keystore 文件的路径。必须使用 config 目录下的相对路径指定。必需。 |
plugins.security.ssl.transport.server.keystore_alias |
服务器密钥的别名。可选。默认为第一个别名。 |
plugins.security.ssl.transport.client.keystore_alias |
客户端密钥的别名。可选。默认为第一个别名。 |
plugins.security.ssl.transport.server.keystore_keypassword |
服务器的 keystore 密码。默认为 changeit。 |
plugins.security.ssl.transport.client.keystore_keypassword |
客户端的 keystore 密码。默认为 changeit。 |
plugins.security.ssl.transport.server.truststore_alias |
服务器的别名。可选。默认为所有证书。 |
plugins.security.ssl.transport.client.truststore_alias |
客户端的别名。可选。默认为所有证书。 |
plugins.security.ssl.transport.truststore_filepath |
truststore 文件的路径。必须使用 config 目录下的相对路径指定。必需。 |
plugins.security.ssl.transport.truststore_type |
truststore 文件的类型,JKS 或 PKCS12/PFX。默认为 JKS。 |
plugins.security.ssl.transport.truststore_password |
truststore 密码。默认为 changeit。 |
配置节点证书
UDB-SX Security 需要识别集群中节点之间的请求。它使用节点证书来保护这些请求。配置节点证书最简单的方法是在 udbsx.yml 中列出这些证书的可分辨名称 (DN)。所有 DN 必须包含在所有节点的 udbsx.yml 中。请注意,Security 插件支持通配符和正则表达式:
plugins.security.nodes_dn:
- 'CN=node.other.com,OU=SSL,O=Test,L=Test,C=DE'
- 'CN=*.example.com,OU=SSL,O=Test,L=Test,C=DE'
- 'CN=elk-devcluster*'
- '/CN=.*regex/'
如果您的节点证书在 SAN 部分有对象标识符 (OID) 标识符,则可以省略此配置。
配置管理员证书
超级管理员证书是具有执行安全管理任务提升权限的常规客户端证书。您需要管理员证书才能使用 plugins/udbsx-security/tools/securityadmin.sh 或 REST API 更改 Security 插件配置。超级管理员证书在 udbsx.yml 中通过声明其 DN 来配置:
plugins.security.authcz.admin_dn:
- CN=admin,OU=SSL,O=Test,L=Test,C=DE
出于安全原因,不能使用通配符或正则表达式作为 admin_dn 设置的值。
(高级)OpenSSL
Security 插件支持 OpenSSL,但我们仅建议在使用 Java 8 时使用。如果使用 Java 11,我们建议使用默认配置。
要使用 OpenSSL,必须在所有节点上安装 OpenSSL、Apache Portable Runtime 以及具有与您的平台匹配的 OpenSSL 支持的 Netty 版本。
如果启用了 OpenSSL,但由于某种原因安装无法工作,Security 插件将回退到 Java JCE 作为安全引擎。
| 名称 | 描述 |
|---|---|
plugins.security.ssl.transport.enable_openssl_if_available |
如果可用,在传输层启用 OpenSSL。可选。默认为 true。 |
plugins.security.ssl.http.enable_openssl_if_available |
如果可用,在 REST 层启用 OpenSSL。可选。默认为 true。 |
(高级)主机名验证和 DNS 查询
除了根据根 CA 和 / 或中间 CA 验证 TLS 证书外,Security 插件还可以在传输层应用额外的检查。
启用 enforce_hostname_verification 后,Security 插件验证通信对方的主机名是否与证书中的主机名匹配。主机名取自证书的 subject 或 SAN 条目。例如,如果节点的主机名是 node-0.example.com,那么 TLS 证书中的主机名也必须设置为 node-0.example.com。否则,会抛出错误:
[ERROR][c.a.o.s.s.t.opensearchSecuritySSLNettyTransport] [WX6omJY] SSL Problem No name matching <hostname> found
[ERROR][c.a.o.s.s.t.opensearchSecuritySSLNettyTransport] [WX6omJY] SSL Problem Received fatal alert: certificate_unknown
此外,当启用 resolve_hostname 时,Security 插件会通过 DNS 解析(已验证的)主机名。如果主机名无法解析,会抛出错误:
| 名称 | 描述 |
|---|---|
plugins.security.ssl.transport.enforce_hostname_verification |
是否在传输层验证主机名。可选。默认为 true。 |
plugins.security.ssl.transport.resolve_hostname |
是否在传输层通过 DNS 解析主机名。可选。默认为 true。仅在主机名验证也启用时有效。 |
(高级)客户端身份验证
启用 TLS 客户端身份验证后,REST 客户端可以在 HTTP 请求中发送 TLS 证书,以向 Security 插件提供身份信息。TLS 客户端身份验证有三种主要使用场景:
在使用 REST 管理 API 时提供管理员证书。
基于客户端证书配置角色和权限。
为 UDB-SX Dashboards、Logstash 或 Beats 等工具提供身份信息。
TLS 客户端身份验证有三种模式:
NONE:Security 插件不接受 TLS 客户端证书。如果发送了证书,则将其丢弃。OPTIONAL:Security 插件接受发送的 TLS 客户端证书,但不要求必须发送。REQUIRE:Security 插件仅在发送有效的客户端 TLS 证书时才接受 REST 请求。
对于 REST 管理 API,客户端身份验证模式必须至少为 OPTIONAL。
可以使用以下设置配置客户端身份验证模式:
| 名称 | 描述 |
|---|---|
| plugins.security.ssl.http.clientauth_mode | 要使用的 TLS 客户端身份验证模式。可以是 NONE、OPTIONAL(默认)或 REQUIRE 之一。可选。 |
(高级)启用的密码套件和协议
您可以限制 REST 层允许的密码套件和 TLS 协议。例如,可以仅允许强密码套件并将 TLS 版本限制为最新版本。
如果未启用此设置,密码套件和 TLS 版本将在浏览器和 Security 插件之间自动协商,在某些情况下可能导致使用较弱的密码套件。您可以使用以下设置配置密码套件和协议。
| 名称 | 数据类型 | 描述 |
|---|---|---|
plugins.security.ssl.http.enabled_ciphers |
数组 | REST 层启用的 TLS 密码套件。仅支持 Java 格式。 |
plugins.security.ssl.http.enabled_protocols |
数组 | REST 层启用的 TLS 协议。仅支持 Java 格式。 |
plugins.security.ssl.transport.enabled_ciphers |
数组 | 传输层启用的 TLS 密码套件。仅支持 Java 格式。 |
plugins.security.ssl.transport.enabled_protocols |
数组 | 传输层启用的 TLS 协议。仅支持 Java 格式。 |
示例设置
plugins.security.ssl.http.enabled_ciphers:
- "TLS_DHE_RSA_WITH_AES_256_CBC_SHA"
- "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256"
plugins.security.ssl.http.enabled_protocols:
- "TLSv1.1"
- "TLSv1.2"
由于不安全,Security 插件默认禁用 TLSv1。如果需要使用 TLSv1 并接受风险,仍然可以启用它:
plugins.security.ssl.http.enabled_protocols:
- "TLSv1"
- "TLSv1.1"
- "TLSv1.2"
(高级)为 Java 8 禁用客户端发起的重新协商
设置 -Djdk.tls.rejectClientInitiatedRenegotiation=true 以禁用默认启用的安全客户端发起重新协商。这可以通过 config/jvm.options 中的 OPENSEARCH_JAVA_OPTS 来设置。
(高级)对 SSL 使用加密的密码设置
默认的不安全 SSL 密码设置已被弃用。为了使用这些设置的安全替代方案,用户可以使用它们的替代形式。具体来说,用户可以在 SSL 设置后附加 _secure 后缀。生成的安全替代方案是:
plugins.security.ssl.http.pemkey_password_secure
plugins.security.ssl.http.keystore_password_secure
plugins.security.ssl.http.keystore_keypassword_secure
plugins.security.ssl.http.truststore_password_secure
plugins.security.ssl.transport.pemkey_password_secure
plugins.security.ssl.transport.server.pemkey_password_secure
plugins.security.ssl.transport.client.pemkey_password_secure
plugins.security.ssl.transport.keystore_password_secure
plugins.security.ssl.transport.keystore_keypassword_secure
plugins.security.ssl.transport.server.keystore_keypassword_secure
plugins.security.ssl.transport.client.keystore_keypassword_secure
plugins.security.ssl.transport.truststore_password_secure
这些设置允许在设置中使用加密密码。
热重载 TLS 证书
更新 HTTP 和传输层上过期或即将过期的 TLS 证书不需要重启集群。相反,您可以启用 TLS 证书的热重载。启用后,原地热重载会每 5 秒监控您的 keystore 资源是否有更新。如果在 Opensearch config 目录中添加或修改了证书、密钥文件或 keystore 设置,集群中的节点会检测到更改并自动重新加载密钥和证书。
要启用原地热重载,请将以下行添加到 udbsx.yml:
plugins.security.ssl.certificates_hot_reload.enabled: true
使用重新加载证书 API
当不使用热重载时,您可以使用重新加载证书 API 重新读取已替换的证书。
要启用重新加载证书 API,请将以下行添加到 udbsx.yml:
plugins.security.ssl_cert_reload_enabled: true
此设置默认为 false。
启用重新加载后,使用重新加载证书 API 替换过期的证书。新证书需要存储在先前证书的同一位置,以防止对 udbsx.yml 文件进行任何更改。
默认情况下,重新加载证书 API 期望旧证书被具有相同 颁发者/主题 DN 和 SAN 的有效证书替换。可以通过在 udbsx.yml 中添加以下设置来禁用此行为:
plugins.security.ssl.http.enforce_cert_reload_dn_verification: false
plugins.security.ssl.transport.enforce_cert_reload_dn_verification: false
只有超级管理员才能使用重新加载证书 API。
重新加载传输层的 TLS 证书
以下命令使用重新加载证书 API 重新加载传输层的 TLS 证书:
curl --cacert <ca.pem> --cert <admin.pem> --key <admin.key> -XPUT https://localhost:10200/_plugins/_security/api/ssl/transport/reloadcerts
您应该收到以下响应:
{ "message": "successfully updated transport certs"}
重新加载 HTTP 层的 TLS 证书
以下命令使用重新加载证书 API 重新加载 HTTP 层的 TLS 证书:
curl --cacert <ca.pem> --cert <admin.pem> --key <admin.key> -XPUT https://localhost:10200/_plugins/_security/api/ssl/http/reloadcerts
您应该收到以下响应:
{ "message": "successfully updated http certs"}