在 Elasticsearch 节点之间启用 HTTPS 连接

在本教程中,您将学习如何在 Elasticsearch 节点之间启用 HTTPS 连接。 Elastic 安全功能之一是使用 HTTPS 连接在 Elasticsearch 集群节点之间启用加密。

如果您想了解如何配置和设置 Elasticsearch 集群,请通过以下链接查看我们之前的指南;

配置多节点 Elasticsearch 集群

也可以看看;

启用 Kibana HTTPS 连接

在 Elasticsearch 节点之间启用 HTTPS 连接

集群中的 Elasticsearch 节点通过使用 TCP 端口 9300 的传输协议进行通信。请注意,Elasticsearch 和 REST 客户端(例如 Kibana、Filebeat)之间的 HTTP 连接通过 TCP 端口 9200 进行通信。

假设您已经有一个正在运行的 Elasticsearch 集群,请按照以下步骤启用 Elasticsearch 节点之间的 HTTPS 连接。

检查我们的集群节点;

curl -XGET es-node-01.kifarunix-demo.com:9200/_cat/nodes?v
ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role  master name 192.168.59.19           29          84   1    1.90    1.31     1.06 cdhilmrstw *      es-node-03 192.168.59.17           48          86   2    1.49    1.46     1.17 cdhilmrstw -      es-node-01 192.168.59.18           22          84   1    1.61    1.35     1.14 cdhilmrstw -      es-node-02

生成 Elasticsearch TLS/SSL 证书

您需要生成 x509 TLS/SSL 证书才能对节点之间的通信进行加密。

您可以使用生成 TLS 证书和密钥 elasticsearch-certutil 工具。

使用 elasticsearch-certutil 生成 elasticsearch 自签名 TLS 证书

使用以下命令生成 Elasticsearch TLS 证书 elasticsearch-certutil 工具:

  • 创建目录来存储证书文件;
mkdir /etc/elasticsearch/certs/
  • 以 PKCS#12 格式生成 CA

下面的命令生成一个 CA 证书和私钥,并将其存储在上面创建的目录下的名称下 elk-cluster-ca.p12. 该命令还将提示您输入用于保护 CA 文件的密码。 我们只需在此设置中按 ENTER 即可使用空密码.

/usr/share/elasticsearch/bin/elasticsearch-certutil ca --out /etc/elasticsearch/certs/elk-cluster-ca.p12 --days 3650
  • 生成 PEM 格式的 CA

如果要以 PEM 格式生成 CA,请运行以下命令。 该命令会生成一个 zip 文件,其中包含 CA 证书和私钥的各个文件。

/usr/share/elasticsearch/bin/elasticsearch-certutil ca --pem --out /etc/elasticsearch/certs/elk-cluster-ca.zip --days 3650
  • 生成 PKCS#12 格式的证书:

默认情况下,该命令生成单个输出文件,其中包含:证书、私钥和 CA 证书。 如果您在上面设置了密码,它还会提示输入 CA 密码和证书密码。

/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca /etc/elasticsearch/certs/elk-cluster-ca.p12 --out /etc/elasticsearch/certs/elk-cluster-cert.p12 --days 3650
  • 生成 PEM 格式的证书:

解压 CA 证书和密钥文件;

unzip /etc/elasticsearch/certs/elk-cluster-ca.zip -d /etc/elasticsearch/certs/

接下来,生成 PEM 格式的证书;

/usr/share/elasticsearch/bin/elasticsearch-certutil cert --pem --ca-cert /etc/elasticsearch/certs/ca/ca.crt --ca-key /etc/elasticsearch/certs/ca/ca.key --days 3650 --out /etc/elasticsearch/certs/elk-cluster-cert.zip

解压文件;

unzip /etc/elasticsearch/certs/elk-cluster-cert.zip  -d /etc/elasticsearch/certs/

将证书文件的所有权设置为 弹性搜索 用户。

chown -R elasticsearch: /etc/elasticsearch/certs/

启用 Elasticsearch 安全功能

Elasticsearch 的默认安装使用基本许可证,默认情况下禁用安全功能。

要启用 Elasticsearch 安全功能,请将值设置为 xpack.security.enabled真的 通过在下面运行命令 每个节点 在 Elasticsearch 集群中。

echo "xpack.security.enabled: true" >> /etc/elasticsearch/elasticsearch.yml

同样,您需要启用 Elasticsearch 节点传输 SSL/TLS 设置;

echo "xpack.security.transport.ssl.enabled: true" >> /etc/elasticsearch/elasticsearch.yml

在 Elasticsearch 节点之间启用 HTTPS 连接

完成上述操作后,您需要指定上面生成的证书文件的路径。

如果你使用了 PKCS#12 格式, 在中输入以下几行 elasticsearch.yml Elasticsearch 中每个节点上的文件。

xpack.security.transport.ssl.verification_mode: certificate  xpack.security.transport.ssl.keystore.path: certs/elk-cluster-cert.p12  xpack.security.transport.ssl.truststore.path: certs/elk-cluster-cert.p12

如果您使用的是 PEM文件,然后输入下面的行 elasticsearch.yml Elasticsearch 中每个节点上的文件。

xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.key: certs/instance/instance.key xpack.security.transport.ssl.certificate: certs/instance/instance.crt xpack.security.transport.ssl.certificate_authorities: certs/ca/ca.crt

将证书密码添加到 Elasticsearch Keystore

如果您使用密码保护您的证书,则需要将密码添加到 Elasticsearch 密钥库 在所有集群节点上。

如果您使用 PKCS#12 格式的证书,请运行以下命令将证书密码添加到密钥库:

/usr/share/elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
/usr/share/elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password

如果您使用 PEM 格式的证书,请使用以下命令将证书密钥添加到密钥库:

/usr/share/elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.secure_key_passphrase

重启 Elasticsearch

接下来,重新启动 Elasticsearch 服务以使更改生效;

systemctl restart elasticsearch

为内置弹性用户创建密码

当您启用基本的 Elastic 安全功能时,您需要为内置的 Elasticsearch 用户设置密码,尤其是 松紧带kibana_system 用户使您能够运行 REST 查询。

举个例子,你想通过运行命令查看集群中的节点;

curl -XGET es-node-01.kifarunix-demo.com:9200/_cat/nodes?pretty --cacert /etc/elasticsearch/certs/elk-cluster-ca.p12

样本输出;

{   "error" : {     "root_cause" : [       {         "type" : "security_exception",         "reason" : "missing authentication credentials for REST request [/_cat/nodes?pretty]",         "header" : {           "WWW-Authenticate" : "Basic realm="security" charset="UTF-8""         }       }     ],     "type" : "security_exception",     "reason" : "missing authentication credentials for REST request [/_cat/nodes?pretty]",     "header" : {       "WWW-Authenticate" : "Basic realm="security" charset="UTF-8""     }   },   "status" : 401 }

密码可以随机生成,也可以使用手动设置 elasticsearch-setup-passwords 公用事业。

您只能在集群中的任何节点上运行密码创建一次.

为内置弹性用户自动生成随机密码,运行命令;

/usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto

当命令运行时,确认该过程。

样本输出;

Changed password for user apm_system PASSWORD apm_system = eXvv3x7zs9O7qbYgMvLW  Changed password for user kibana_system PASSWORD kibana_system = mLhDnalWA8yPpPuE0GFB  Changed password for user kibana PASSWORD kibana = mLhDnalWA8yPpPuE0GFB  Changed password for user logstash_system PASSWORD logstash_system = p4nAxkl1MGss7VU18TzT  Changed password for user beats_system PASSWORD beats_system = L1Xm8xnUM7yKAfBAR3Nx  Changed password for user remote_monitoring_user PASSWORD remote_monitoring_user = uNHAxTVX0LSXwnX54hzr  Changed password for user elastic PASSWORD elastic = o8u1zQm93o5Py3huqqt1

Save 将密码放在一个您可以在需要时轻松检索的地方。

在大多数情况下,我们将使用密码 松紧带kibana_system 用户。

  • 松紧带 是弹性堆栈中的内置超级用户。
  • kibana_system 是 Kibana 用来连接 Elasticsearch 并与之通信的用户。

例如,您现在可以在 curl 命令在上面运行。

curl -XGET es-node-01.kifarunix-demo.com:9200/_cat/nodes?pretty --cacert /etc/elasticsearch/certs/elk-cluster-ca.p12 -u elastic

Enter 上面生成的密码 松紧带 用户。

样本输出;

192.168.59.17 19 75 1 0.23 0.37 0.58 cdhilmrstw - es-node-01 192.168.59.18 53 73 0 0.01 0.26 0.62 cdhilmrstw * es-node-02 192.168.59.19 42 73 0 0.04 0.28 0.62 cdhilmrstw - es-node-03

在 Kibana 中配置安全性

Kibana 向 Elasticsearch 提出了一些内部请求。 由于您启用了 HTTPS Elasticsearch 身份验证,因此 Kibana 发出的此类请求也需要进行身份验证。 证书 kibana_system 在这种情况下可以使用 used 广告,因此您需要将它们添加到 Kibana。

用户凭据可以在 Kibana 配置文件中以纯文本形式定义, kibana.yml 或者可以添加到 Kibana 密钥库。

凭据是在上面生成的。

要在 Kibana 配置文件中添加凭据,请在 kibana.yml.

vim /etc/kibana/kibana.yml
elasticsearch.username: "kibana_system" elasticsearch.password: "mLhDnalWA8yPpPuE0GFB"

将凭据添加到密钥库而不是将它们放在 /etc/kibana/kibana.yml, 创建 Kibana 密钥库并添加它们,如下所示;

chmod g+w /etc/kibana/
sudo -u kibana /usr/share/kibana/bin/kibana-keystore create

添加用户 kibana_system:

sudo -u kibana /usr/share/kibana/bin/kibana-keystore add elasticsearch.username

添加密码:

sudo -u kibana /usr/share/kibana/bin/kibana-keystore add elasticsearch.password

重启 Kibana 服务

接下来,重启 Kibana 服务;

systemctl restart kibana

您还可以查看我们关于如何启用 Kibana HTTPS 连接的指南。

启用 Kibana HTTPS 连接的快速方法

向 Kibana Web 界面进行身份验证

启用安全功能后,您将需要向有效用户进行身份验证,然后才能访问 Kibana Web 界面。

在此设置中,您可以使用上面创建的 Elastic 超级用户, 松紧带.

这标志着我们关于如何在 Elasticsearch 节点之间启用 HTTPS 连接的指南。

参考

在 Elasticsearch 中配置 TLS

将 Wazuh Manager 与 ELK Stack 集成

使用 ElastAlert 配置 ELK 堆栈警报

使用 ELK Stack 监控 Linux 系统指标