配置 TLS 证书 #
Easysearch 可以通过启用 TLS 传输加密来保护您数据的网络传输安全。
TLS 的相关设置要在配置文件 easysearch.yml
里面进行。主要包括两个部分的配置:传输层和 HTTP 层。传输层的 TLS 是必需的,HTTP 层的 TLS 的配置是可选的。
默认的配置如下:
security.ssl.transport.cert_file: instance.crt
security.ssl.transport.key_file: instance.key
security.ssl.transport.ca_file: ca.crt
security.ssl.http.enabled: true
security.ssl.http.cert_file: instance.crt
security.ssl.http.key_file: instance.key
security.ssl.http.ca_file: ca.crt
一键生成证书 #
启用 TLS 需要设置证书才能工作,通过执行命令 ./bin/initialize.sh
可以一键生成 TLS 证书,如下:
➜ ./bin/initialize.sh
Generating RSA private key, 2048 bit long modulus
.......................+++
...............................+++
e is 65537 (0x10001)
Generating RSA private key, 2048 bit long modulus
.......................................................................................................................................................................................+++
......................................................+++
e is 65537 (0x10001)
Signature ok
subject=/C=IN/ST=FI/L=NI/O=ORG/OU=UNIT/CN=infini.cloud
Getting CA Private Key
DNS:infini.cloud, DNS:*.infini.cloud
➜ ls config
ca.crt easysearch.yml instance.key log4j2.properties
ca.key easysearch.yml.example jvm.options security
easysearch.keystore instance.crt jvm.options.d
X.509 PEM 证书和 PKCS#8 密钥 #
下面是 Easysearch 用于配置基于 PEM 证书和私钥的详细参数说明。
传输层 TLS #
名称 | 说明 |
---|---|
security.ssl.transport.key_file | 证书密钥文件 (PKCS #8) 的路径(PEM 格式),该文件必须位于 config 目录下,使用相对路径指定。必填。 |
security.ssl.transport.key_secret | 密钥文件的密码。如果密钥没有密码,请忽略此设置。选填。 |
security.ssl.transport.cert_file | 证书公钥文件路径(PEM 格式),必须位于 config 目录下,使用相对路径指定。必填。 |
security.ssl.transport.ca_file | 根证书(CA)的路径(PEM 格式),必须位于 config 目录下,使用相对路径指定。必填。 |
HTTP 层 TLS #
名称 | 说明 |
---|---|
security.ssl.http.key_file | 证书密钥文件 (PKCS #8) 的路径(PEM 格式),该文件必须位于 config 目录下,使用相对路径指定。必填。 |
security.ssl.http.key_secret | 密钥文件的密码。如果密钥没有密码,请忽略此设置。选填。 |
security.ssl.http.cert_file | 证书公钥文件路径(PEM 格式),必须位于 config 目录下,使用相对路径指定。必填。 |
security.ssl.http.ca_file | 根证书(CA)的路径(PEM 格式),必须位于 config 目录下,使用相对路径指定。必填。 |
配置节点证书 #
安全模块需要识别集群节点间的请求(即节点之间的通信)。配置节点证书的最简单方法是在 easysearch.yml
中列出这些证书的可分辨名称 (DN)。所有 DN 都必须包含在所有节点上的 easysearch.yml
中。安全模块支持通配符和正则表达式:
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 标识符,则可以省略此配置。
配置管理证书 #
管理员证书是具有执行管理任务的提升权限的常规客户端证书。您需要管理员证书才能使用 HTTP API 更改安全配置。管理员证书在 easysearch.yml
中通过声明其 DN 进行配置:
security.authcz.admin_dn:
- CN=admin,OU=SSL,O=Test,L=Test,C=DE
出于安全原因,您不能在此处使用通配符或正则表达式。
主机名验证和 DNS 查找 #
除了根据根 CA 和/或中间 CA 验证 TLS 证书外,安全插件还可以对传输层应用其他检查。
禁用 skip_domain_verify
后,安全模块将不会验证通信伙伴的主机名是否与证书中的主机名匹配。
主机名取自证书的 subject
或 SAN
条目。例如,如果节点的主机名为 node-0.example.com
,则 TLS 证书中的主机名也必须设置为 node-0.example.com
。否则,将引发错误:
[ERROR][c.a.o.s.s.t.SecuritySSLNettyTransport] [WX6omJY] SSL Problem No name matching <hostname> found
[ERROR][c.a.o.s.s.t.SecuritySSLNettyTransport] [WX6omJY] SSL Problem Received fatal alert: certificate_unknown
此外,启用 resolve_hostnames
后,安全模块会根据您的 DNS 解析(经过验证的)主机名。如果主机名未解析,则会引发错误:
名称 | 描述 |
---|---|
security.ssl.transport.skip_domain_verify | 是否跳过验证传输层上的主机名。默认为 true 。 |
security.ssl.transport.resolve_hostname | 是否在传输层上根据 DNS 解析主机名。默认为 true 。仅在同时启用主机名验证时才有效。 |
客户端认证 #
启用 TLS 客户端身份验证后,HTTP 客户端可以将 TLS 证书与 HTTP 请求一起发送,以向安全模块提供身份信息。 TLS 客户端认证主要有 3 种使用场景:
- 在使用 HTTP 管理 API 时提供管理员证书。
- 根据客户端证书配置角色和权限。
- 为 Kibana、Logstash 或 Beats 等工具提供身份信息。
TLS 客户端认证有三种模式:
NONE
: 安全模块不接受 TLS 客户端证书。如果发送了一个,则将其丢弃。OPTIONAL
: 安全模块接受 TLS 客户端证书(如果已发送),但不需要它们。REQUIRE
: 安全模块仅在发送有效的客户端 TLS 证书时接受 HTTP 请求。
对于 HTTP 管理 API,客户端身份验证模式至少必须是 OPTIONAL
。
可以使用以下设置配置客户端身份验证模式:
名称 | 说明 |
---|---|
security.ssl.http.clientauth_mode | 要使用的 TLS 客户端身份验证模式。可以是以下之一:NONE 、 OPTIONAL (默认) 和 REQUIRE 。可选参数。 |
样例 #
curl -k --cert config/instance.crt --key config/instance.key -XDELETE 'https://localhost:9200/.infini-*/' -u admin:admin
加密算法和协议 #
您可以限制 HTTP 层允许的加密算法和 TLS 协议。例如,您只能允许强密码,并将 TLS 版本限制为最新版本。
如果未启用此设置,密码和 TLS 版本将在浏览器和安全插件之间自动协商,这在某些情况下会导致使用较弱的密码套件。您可以使用以下设置配置密码和协议。
名称 | 说明 |
---|---|
security.ssl.http.enabled_ciphers | 数组,HTTP 层启用的 TLS 密码套件。仅支持 Java 格式。 |
security.ssl.http.enabled_protocols | 数组,HTTP 层启用的 TLS 协议。仅支持 Java 格式。 |
security.ssl.transport.enabled_ciphers | 数组,为传输层启用了 TLS 密码套件。仅支持 Java 格式。 |
security.ssl.transport.enabled_protocols | 数组,为传输层启用了 TLS 协议。仅支持 Java 格式。 |
样例 #
security.ssl.http.enabled_ciphers:
- "TLS_AES_128_GCM_SHA256"
- "TLS_AES_256_GCM_SHA384"
- "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"
- "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"
- "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
- "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA"
- "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384"
- "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
security.ssl.http.enabled_protocols:
- "TLSv1.1"
- "TLSv1.2"
- "TLSv1.3"
安全模块默认禁用了不安全的 TLSv1
协议。如果您需要使用 TLSv1
并接受潜在的风险,您仍然可以启用它:
security.ssl.http.enabled_protocols:
- "TLSv1"
- "TLSv1.1"
- "TLSv1.2"
配置 Kibana #
如果 Easysearch 开启了 TLS,Kibana 也需要进行相应的调整,您有两个选项:禁用 SSL 验证或添加 CA 根证书到 Kibana 配置。
- 直接禁用 SSL 校验:
easysearch.ssl.verificationMode: none
- 添加 CA 证书信息:
根据您在 kibana.yml
中的设置,将 ca.crt
添加到您的 Kibana 节点。
easysearch.ssl.certificateAuthorities: ["/usr/share/kibana/config/ca.crt"]
easysearch.ssl.verificationMode: full