配置 TLS 证书
TLS 在 opensearch.yml
中配置。证书用于保护传输层流量(集群内的节点间通信)和 REST 层流量(客户端与集群内节点间的通信)。TLS 对于 REST 层是可选的,对于传输层是强制性的。
您可以在 GitHub 上找到包含所有选项的示例配置模板。
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 目录下,使用相对路径指定。必需。 |
密钥库和信任库文件
作为 PEM 格式证书和私钥的替代方案,您可以使用 JKS 或 PKCS12/PFX 格式的密钥库和信任库文件。要使安全插件正常运行,您需要证书和私钥。
以下设置配置密钥库和信任库文件的位置和密码。如果需要,您可以为 REST 层和传输层使用不同的密钥库和信任库文件。
传输层 TLS
名称 | 描述 |
---|---|
plugins.security.ssl.transport.keystore_type | 密钥库文件类型,JKS 或 PKCS12/PFX 。可选。默认值为 JKS 。 |
plugins.security.ssl.transport.keystore_filepath | 密钥库文件的路径,必须位于 config 目录下,使用相对路径指定。必需。 |
plugins.security.ssl.transport.keystore_alias | 密钥库的别名。可选。默认为第一个别名。 |
plugins.security.ssl.transport.keystore_password | 密钥库密码。默认值为 changeit 。 |
plugins.security.ssl.transport.truststore_type | 信任库文件类型,JKS 或 PKCS12/PFX 。默认值为 JKS 。 |
plugins.security.ssl.transport.truststore_filepath | 信任库文件的路径,必须位于 config 目录下,使用相对路径指定。必需。 |
plugins.security.ssl.transport.truststore_alias | 信任库的别名。可选。默认为所有证书。 |
plugins.security.ssl.transport.truststore_password | 信任库密码。默认值为 changeit 。 |
REST 层 TLS
名称 | 描述 |
---|---|
plugins.security.ssl.http.enabled | 是否在 REST 层启用 TLS。如果启用,只允许 HTTPS。可选。默认值为 false 。 |
plugins.security.ssl.http.keystore_type | 密钥库文件类型,JKS 或 PKCS12/PFX。可选。默认值为 JKS。 |
plugins.security.ssl.http.keystore_filepath | 密钥库文件的路径,必须位于 config 目录下,使用相对路径指定。必需。 |
plugins.security.ssl.http.keystore_alias | 密钥库的别名。可选。默认为第一个别名。 |
plugins.security.ssl.http.keystore_password | 密钥库密码。默认值为 changeit 。 |
plugins.security.ssl.http.truststore_type | 信任库文件类型,JKS 或 PKCS12/PFX。默认值为 JKS。 |
plugins.security.ssl.http.truststore_filepath | 信任库文件的路径,必须位于 config 目录下,使用相对路径指定。必需。 |
plugins.security.ssl.http.truststore_alias | 信任库的别名。可选。默认为所有证书。 |
plugins.security.ssl.http.truststore_password | 信任库密码。默认值为 changeit 。 |
为传输层 TLS 分离客户端和服务器证书
默认情况下,传输层 TLS 证书需要在证书的 扩展密钥用法
部分中同时配置为客户端(TLS Web 客户端身份验证
)和服务器(TLS Web 服务器身份验证
),因为使用 TLS 证书的节点承担内部服务和接收通信请求的责任。如果您想为客户端和服务器使用单独的证书,请将 plugins.security.ssl.transport.extended_key_usage_enabled: true
设置添加到 opensearch.yml
。接下来,配置单独的客户端和服务器 X.509 PEM 证书和 PKCS #8 密钥或单独的客户端和服务器密钥库和信任库文件部分中概述的设置。
单独的客户端和服务器 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 目录下的相对路径指定。必需。 |
单独的客户端和服务器密钥库和信任库文件
名称 | 描述 |
---|---|
plugins.security.ssl.transport.keystore_type | 密钥库文件类型,可以是 JKS 或 PKCS12/PFX 。可选。默认值为 JKS 。 |
plugins.security.ssl.transport.keystore_filepath | 密钥库文件的路径。必须使用 config 目录下的相对路径指定。必需。 |
plugins.security.ssl.transport.server.keystore_alias | 服务器密钥的别名。可选。默认为第一个别名。 |
plugins.security.ssl.transport.client.keystore_alias | 客户端密钥的别名。可选。默认为第一个别名。 |
plugins.security.ssl.transport.server.keystore_keypassword | 服务器的密钥库密码。默认值为 changeit 。 |
plugins.security.ssl.transport.client.keystore_keypassword | 客户端的密钥库密码。默认值为 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 。 |
配置节点证书
OpenSearch Security 需要识别集群中节点之间的请求。它使用节点证书来保护这些请求。配置节点证书最简单的方法是在 opensearch.yml
中列出这些证书的判别名 (DN)。所有节点上的 opensearch.yml
中都必须包含所有 DN。请记住,安全插件支持通配符和正则表达式。
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 部分具有对象 ID (OID) 标识符,则可以省略此配置。
配置管理员证书
超级管理员证书是具有提升权限以执行管理安全任务的常规客户端证书。您需要管理员证书才能使用 plugins/opensearch-security/tools/securityadmin.sh
或 REST API 更改安全插件配置。超级管理员证书通过在其 DN 中声明来在 opensearch.yml
中配置。
plugins.security.authcz.admin_dn:
- CN=admin,OU=SSL,O=Test,L=Test,C=DE
出于安全原因,您不能使用通配符或正则表达式作为 admin_dn
设置的值。
有关管理员和超级管理员用户角色的更多信息,请参阅管理员和超级管理员角色。
(高级)主机名验证和 DNS 查找
除了根据根 CA 和/或中间 CA 验证 TLS 证书外,安全插件还可以在传输层上应用额外的检查。
启用 enforce_hostname_verification
后,安全插件会验证通信伙伴的主机名是否与证书中的主机名匹配。主机名取自证书的 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
时,安全插件将解析(已验证的)主机名与您的 DNS。如果主机名无法解析,将抛出错误。
名称 | 描述 |
---|---|
plugins.security.ssl.transport.enforce_hostname_verification | 是否在传输层验证主机名。可选。默认值为 true 。 |
plugins.security.ssl.transport.resolve_hostname | 是否在传输层将主机名解析为 DNS。可选。默认值为 true 。仅当主机名验证也启用时才有效。 |
(高级)客户端身份验证
启用 TLS 客户端身份验证后,REST 客户端可以随 HTTP 请求发送 TLS 证书,以向安全插件提供身份信息。TLS 客户端身份验证有三种主要使用场景:
- 在使用 REST 管理 API 时提供管理员证书。
- 根据客户端证书配置角色和权限。
- 为 OpenSearch Dashboards、Logstash 或 Beats 等工具提供身份信息。
TLS 客户端身份验证有三种模式:
NONE
:安全插件不接受 TLS 客户端证书。如果发送了证书,它将被丢弃。OPTIONAL
:安全插件接受 TLS 客户端证书(如果发送),但不强制要求。REQUIRE
:安全插件仅在发送有效客户端 TLS 证书时接受 REST 请求。
对于 REST 管理 API,客户端身份验证模式必须至少为 OPTIONAL。
您可以使用以下设置配置客户端身份验证模式:
名称 | 描述 |
---|---|
plugins.security.ssl.http.clientauth_mode | 要使用的 TLS 客户端身份验证模式。可以是 NONE 、OPTIONAL (默认)或 REQUIRE 之一。可选。 |
(高级)启用的密码套件和协议
您可以限制 REST 层允许的密码套件和 TLS 协议。例如,您只能允许强密码套件并将 TLS 版本限制为最新版本。
如果此设置未启用,则密码套件和 TLS 版本将在浏览器和安全插件之间自动协商,这在某些情况下可能导致使用较弱的密码套件。您可以使用以下设置配置密码套件和协议。
名称 | 数据类型 | 描述 |
---|---|---|
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"
由于不安全,安全插件默认禁用 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 密码设置已被弃用。为了使用这些设置的安全替代方案,用户可以使用它们的替代形式。具体来说,用户可以将 _secure
后缀附加到 SSL 设置。由此产生的安全替代方案是:
- 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 秒监控您的密钥库资源是否有更新。如果在 Opensearch config
目录中添加或修改了证书、密钥文件或密钥库设置,集群中的节点将检测到更改并自动重新加载密钥和证书。
要启用原地热重载,请将以下行添加到 opensearch.yml
plugins.security.ssl.certificates_hot_reload.enabled: true
使用重载证书 API
当不使用热重载时,您可以使用重载证书 API 来重新读取替换的证书。
要启用重载证书 API,请将以下行添加到 opensearch.yml
plugins.security.ssl_cert_reload_enabled: true
此设置默认为 false
。
启用重载后,使用重载证书 API 替换过期证书。新证书需要存储在与旧证书相同的位置,以防止对 opensearch.yml
文件进行任何更改。
默认情况下,重载证书 API 要求旧证书被替换为具有相同 Issuer/Subject DN
和 SAN
颁发的有效证书。可以通过在 opensearch.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://:9200/_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://:9200/_plugins/_security/api/ssl/http/reloadcerts
您应该会收到以下响应
{ "message": "successfully updated http certs"}