ELK Stack:通过ssl/tls启用https和安全的Elasticsearch集群

时间:2020-01-09 10:38:15  来源:igfitidea点击:

Elasticsearch教程:

  • 安装和配置带有3个节点的ElasticSearh Cluster 7.5

  • 启用HTTPS并配置SSS/TLS以保护Elasticsearch集群

  • 为Elasticsearch Cluster安装和配置带有SSL/TLS的Kibana 7.5

  • 配置Metricbeat 7.5以通过HTTPS监视Elasticsearch群集设置

  • 使用Elasticsearch安装和配置Logstash 7.5

配置SSL/TLS加密

为具有基本许可证或者生产许可证的集群启用Elasticsearch安全性时,必须使用TLS/SSL进行传输通信,因此我们必须配置SSL/TLS加密。
此外,一旦启用了安全性以保护Elasticsearch,就必须对与Elasticsearch集群的所有通信进行身份验证,包括来自Kibana和/或者应用服务器的通信。

Elasticsearch有两个通信级别,

  • Transport Communications:传输协议用于Elasticsearch节点之间的内部通信,

  • HTTP通信:HTTP协议用于从客户端到Elasticsearch集群的通信。

Elasticsearch带有一个名为" elasticsearch-certutil"的实用程序,可用于生成自签名证书,该证书可用于保护Elasticsearch来加密Elasticsearch集群中的内部通信。

创建输入yml文件

我们将使用yml文件作为输入来生成自签名证书,以启用https配置并保护Elasticsearch。

我们可以根据环境添加更多节点

[root@server1 ~]# cat /tmp/instance.yml
instances:
  - name: 'server1'
    dns: [ 'server1.example.com' ]
    ip: [ '192.168.0.11' ]
  - name: "server2"
    dns: [ 'server2.example.com' ]
    ip: [ '192.168.0.12' ]
  - name: 'server3'
    dns: [ 'server3.example.com' ]
    ip: [ '192.168.0.13' ]
  - name: 'centos-8'
    dns: [ 'centos-8.example.com' ]
    ip: [ '192.168.0.14' ]

生成自签名证书

" elasticsearch-certutil"命令简化了为弹性堆栈生成自签名证书的过程,以启用HTTPS配置并保护elasticsearch。
它负责生成CA并与CA签署证书。

浏览/usr/share/elasticsearch /内的所有弹性搜索工具

[root@server3 ~]# cd /usr/share/elasticsearch/

其中我们将使用" elasticsearch-certutil"来生成我们自己的自签名证书,以保护Elasticsearch。
我们将这些证书存储在/tmp/certs下。
如果输出目录不存在,elasticsearch-certutil工具将创建相同的目录。

[root@server3 elasticsearch]# bin/elasticsearch-certutil cert --keep-ca-key ca --pem --in /tmp/instance.yml --out /tmp/certs/certs.zip
<Output trimmed>
If you specify any of the following options:
    * -pem (PEM formatted output)
    * -keep-ca-key (retain generated CA key)
    * -multiple (generate multiple certificates)
    * -in (generate certificates from an input file)
then the output will be be a zip file containing individual certificate/key files
Directory /tmp/certs does not exist. Do you want to create it? [Y/n]Y
Certificates written to /tmp/certs/certs.zip
<Output trimmed>

接下来浏览输出目录/tmp/certs

[root@server3 elasticsearch]# cd /tmp/certs/
[root@server3 certs]# ls
certs.zip

提取证书。
我们将需要unzip实用程序来提取证书文件

[root@server1 certs]# unzip certs.zip
Archive:  certs.zip
   creating: ca/
  inflating: ca/ca.crt
  inflating: ca/ca.key
   creating: server1/
  inflating: server1/server1.crt
  inflating: server1/server1.key
   creating: server2/
  inflating: server2/server2.crt
  inflating: server2/server2.key
   creating: server3/
  inflating: server3/server3.crt
  inflating: server3/server3.key
   creating: centos-8/
  inflating: centos-8/centos-8.crt
  inflating: centos-8/centos-8.key

放置证书

接下来要启用HTTPS配置,我们将在所有集群节点上的/etc/elasticsearch /中创建certs目录,以存储自签名证书

[root@server1 ~]# mkdir -p /etc/elasticsearch/certs
[root@server2 ~]# mkdir -p /etc/elasticsearch/certs
[root@server3 ~]# mkdir -p /etc/elasticsearch/certs
[root@centos-8 ~]# mkdir -p /etc/kibana/certs

将适用的证书文件复制到" localhost"上的"/etc/elasticsearch/certs"目录中,在本例中为" server1"

[root@server1 ~]# cp /tmp/certs/ca/ca.crt /tmp/certs/server1/* /etc/elasticsearch/certs

验证文件列表和这些证书文件的权限

[root@server1 certs]# ls -l /etc/elasticsearch/certs
total 20
-rw-r--r--. 1 root elasticsearch 1200 Dec 24 22:25 ca.crt
-rw-r--r--. 1 root elasticsearch 1196 Dec 24 22:24 server1.crt
-rw-r--r--. 1 root elasticsearch 1675 Dec 24 22:24 server1.key

接下来,将这些证书复制到相同位置中/etc/elasticsearch/certs下和centos-8上/etc/kibana/certs下相同位置的所有Elasticsearch群集节点中。

[root@server1 ~]# scp -r /tmp/certs/ca/ca.crt /tmp/certs/server2/* server2:/etc/elasticsearch/certs/
[root@server1 ~]# scp -r /tmp/certs/ca/ca.crt /tmp/certs/server3/* server3:/etc/elasticsearch/certs/
[root@server1 ~]# scp -r /tmp/certs/ca/ca.crt /tmp/certs/centos-8/centos-8.* centos-8:/etc/kibana/certs/

启用身份验证以保护Elasticsearch

在所有elasticsearch集群节点的elasticsearch.yml中将xpack.security.enabled设置为true,以保护Elasticsearch并强制执行自定义用户身份验证以处理任何请求。

xpack.security.enabled: true

为了获得对受限资源的访问权限,用户必须通过密码,凭据或者其他某种方式(通常称为身份验证令牌)证明其身份。
Elastic Stack通过识别命中群集的请求背后的用户并验证他们是否是声称的身份来对用户进行身份验证。

认证过程由一个或者多个称为"领域"的认证服务处理。

启用SSL/TLS加密群集节点之间的通信

传输协议用于节点之间的通信,以保护Elasticsearch集群。
由于Elasticsearch集群中的每个节点都是集群中其他节点的客户端和服务器,因此所有传输证书必须同时是客户端和服务器证书。

xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.key: certs/server1.key
xpack.security.transport.ssl.certificate: certs/server1.crt
xpack.security.transport.ssl.certificate_authorities: [ "certs/ca.crt" ]

提示:

将此内容添加到所有群集节点的" elasticsearch.yml"中,并相应地更改证书路径和文件名。

启用HTTPS配置以加密HTTP客户端通信

启用安全功能后,可以选择使用TLS启用HTTPS配置,并确保HTTP客户端与群集之间的通信已加密。

说明:

强烈建议在HTTP层上启用TLS,但这不是必需的。
如果在Elasticsearch的HTTP层上启用TLS,则可能需要在Elastic Stack的其他部分以及我们使用的任何Elasticsearch客户端中进行配置更改

xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.key: certs/server1.key
xpack.security.http.ssl.certificate: certs/server1.crt
xpack.security.http.ssl.certificate_authorities: certs/ca.crt

提示:

将此内容添加到所有群集节点的" elasticsearch.yml"中,并相应地更改证书路径和文件名。

重新启动Elasticsearch Cluster服务

我们必须执行完全集群重启才能启用HTTPS配置并保护Elasticsearch集群。
配置为使用TLS的节点无法与使用未加密网络的节点通信(反之亦然)。
启用TLS之后,我们必须重新启动所有节点,以维护整个群集之间的通信。

检查集群状态

现在,让我们尝试使用HTTPS上的API请求来检查集群状态

[root@server1 ~]# curl --cacert /etc/elasticsearch/certs/ca.crt -XGET https://server1.example.com:9200/_cat/nodes?pretty
{
  "error" : {
    "root_cause" : [
      {
        "type" : "security_exception",
        "reason" : "missing authentication credentials for REST request [/_cat/nodes?pretty]",
        "header" : {
          "WWW-Authenticate" : [
            "Bearer realm="security"",
            "ApiKey",
            "Basic realm="security" charset="UTF-8""
          ]
        }
      }
    ],

提示:

其中我使用--cacert明确定义了CA证书的路径,以避免在使用自签名证书时出现任何与证书相关的警告。
如果我们使用的是来自注册CA的证书,则可以避免使用--cacert指令

如我们所见,由于缺少身份验证,集群API请求失败。
由于我们启用了安全性功能来保护Elasticsearch,因此我们将使用任何内置用户或者文件用户的用户名密码来授权API请求。
尽管还有其他方法可以验证请求的身份,但这不在本文的讨论范围之内。

更改内置用户的密码

默认情况下,我们不知道内置用户的默认密码。
因此,我们将使用" elasticsearch-setup-passwords"更改所有内置用户的密码。
该工具位于/usr/share/elasticsearch下。
在此路径下导航并执行命令bin/elasticsearch-setup-passwords auto
这将为各个内部堆栈用户生成随机密码。

警告:

确保记下或者记住这些密码,就像我们忘记了这些密码一样,然后我们可能必须执行很多步骤才能进一步重置密码,这可能并不容易。

我们也可以跳过" auto"参数,并使用" interactive"参数手动定义密码。
跟踪这些密码,我们很快将再次需要它们。

[root@server1 ~]# /usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y

Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana]:
Reenter password for [kibana]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]

其中我为所有内置用户提供了自定义密码。

检查Elasticsearch集群的健康状况

现在,我可以使用"弹性"用户来检查集群的运行状况

[root@server1 ~]# curl --cacert /etc/elasticsearch/certs/ca.crt -u elastic -XGET https://server1.example.com:9200/_cat/nodes?pretty
Enter host password for user 'elastic':
192.168.0.12  8 96 0 1.00 1.01 1.05 dim   - server2
192.168.0.13 21 93 2 1.02 1.03 1.05 dim   * server3
192.168.0.11 29 83 1 1.00 1.01 1.05 dim   - server1

如我们所见,我们能够使用自签名证书启用https配置,以保护Elasticsearch集群。

解决错误消息

以下是尝试配置ELK堆栈时遇到的一些错误情况

错误:初始化SSL TrustManager失败

Caused by: org.elasticsearch.ElasticsearchException: failed to initialize SSL TrustManager - access to read truststore file [/some/path/certs/elastic-stack-ca.p12] is blocked; SSL resources should be placed in the [/etc/elasticsearch] directory

解释:根据官方的弹性指南,我们可以将证书放置在任何位置以启用https配置并保护Elasticsearch,但是由于某些原因,当使用Elasticsearch 7.5时,将证书放置在主文件夹下时出现上述错误。

解决方案:这里的建议是将证书放在/etc/elasticsearch下。
我们可以创建一个" certs"目录,并将证书放置在该目录中。

错误:无法解密安全内容条目

Caused by: java.security.UnrecoverableKeyException: failed to decrypt safe contents entry: javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.

解释:如果我们提供了CA和其他证书的密码,则需要将它们添加到各自的密钥库中,因为我们正在为Elasticsearch集群配置SSL/TLS,因此必须将这些密码添加到elasticsearch密钥库中。

如何解决:我们可以按照此指南获取更多详细信息,以将密码添加到PEM和PKCS#12格式的elasticsearch密钥库中