证书配置
> 文档中心 > 文档中心 > INFINI Easysearch > 功能手册 > 安全模块 > 配置说明 > 证书配置

配置 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 后,安全模块将不会验证通信伙伴的主机名是否与证书中的主机名匹配。

主机名取自证书的 subjectSAN 条目。例如,如果节点的主机名为 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 客户端身份验证模式。可以是以下之一:NONEOPTIONAL (默认) 和 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