ELK Stack:使用SSL/TLS加密配置kibana 7.x

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

Elasticsearch ELK Stack教程:

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

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

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

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

  • 使用Elasticsearch安装和配置Logstash 7.5

Kibana概述

Kibana是Elastic Stack的UI,主要用于数据分析和可视化。
Kibana还提供了开发人员工具,对于运行Elasticsearch查询非常方便。
Kibana监视功能可用于两个单独的目的

  • 可视化来自Elastic Stack的监视数据。
    我们可以实时查看Elasticsearch,Logstash和Beats的运行状况和性能数据,以及分析过去的性能。
    监视Kibana本身并将该数据路由到监视集群。

  • 如果启用跨Elastic Stack的监视,则基于其持久性UUID,每个Elasticsearch节点,Logstash节点,Kibana实例和Beat都被认为是唯一的,当节点或者实例启动时,UUID会写入到path.data目录中。

重要的提示:

确保我们安装的Kibana版本与Elasticsearch兼容非常重要。
在elasticsearch页面上检查兼容性

安装Kibana

使用RPM软件包,我们可以在openSUSE,CentOS或者基于Red Hat的系统上安装Kibana。
我们可以从Elastic或者apt存储库下载RPM软件包。

我们可以免费使用Elastic许可下的RPM软件包。

提示:

如果Elasticsearch集群中有多个节点,则在节点之间分配Kibana请求的最简单方法是在仅Elasticsearch协调节点上配置Kibana。
要将elasticsearch配置为协调节点,请使用elasticsearch.yml中的以下值。
在本文中,我们使用一个单独的节点来安装和配置带有SSL/TLS的Kibana7.x。

node.master: false
node.data: false
node.ingest: false

目前,在撰写本文时,Kibana 7.5.1是以下链接上可用的最新可用版本,我们已将其用于安装目的

[root@centos-8 ~]# rpm -Uvh https://artifacts.elastic.co/downloads/kibana/kibana-7.5.1-x86_64.rpm
[root@centos-8 ~]# rpm -q kibana
kibana-7.5.1-1.x86_64

如果我们尝试在未启用安全性的情况下启动kibana服务,则很可能会遇到以下错误(取决于我们使用的许可证类型)

Security must be explicitly enabled when using a [basic] license. Enable security by setting [xpack.security.enabled] to [true] in the elasticsearch.yml file and restart the node.
Transport SSL must be enabled if security is enabled on a [basic] license. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security by setting [xpack.security.enabled] to [false]

我在上一篇文章中介绍了实现安全性的这一部分

监控Elasticsearch集群

要监视Elasticsearch集群并控制如何从Elasticsearch节点收集数据,请在所有集群节点的" elasticsearch.yml"中配置" xpack.monitoring.collection"设置。

xpack.monitoring.collection.enabled: true
xpack.monitoring.elasticsearch.collection.enabled: false

配置Kibana

修改/etc/kibana/kibana.yml文件中的以下指令以配置kibana并在Elastic Stack中启用监视

  • server.port:默认值:5601 Kibana由后端服务器提供服务。
    此设置指定要使用的端口。

  • server.host:此设置指定后端服务器的主机。
    要允许远程用户连接,请将值设置为Kibana服务器的IP地址或者DNS名称。

  • server.name:易于识别的显示名称,用于标识此Kibana实例。

  • elasticsearch.hosts:用于所有查询的Elasticsearch实例的URL。
    此处列出的所有节点必须位于同一群集上。

  • elasticsearch.usernameelasticsearch.password:如果Elasticsearch受基本身份验证保护,则这些设置将提供Kibana服务器在启动时用于对Kibana索引进行维护的用户名和密码。
    Kibana用户仍然需要通过Elasticsearch进行身份验证,该令牌通过Kibana服务器代理。

修改/etc/kibana/kibana.yml文件以配置Kibana并监视elasticsearch集群。
以下是我的示例配置文件:

[root@centos-8 elasticsearch]# sed  '/^#/d' /etc/kibana/kibana.yml | sed '/^$/d'
server.port: 5601
server.host: "192.168.0.14"
server.name: "centos-8.example.com"
elasticsearch.username: "kibana"
elasticsearch.password: "Passw0rd"

(可选)如果我们不想在配置Kibana时将用户ID和密码放在kibana.yml文件中,请改为将其存储在密钥库中。
运行以下命令来创建Kibanakeystore并添加安全设置:

[root@centos-8 ~]# /usr/share/kibana/bin/kibana-keystore create --allow-root
Created Kibana keystore in /var/lib/kibana/kibana.keystore
[root@centos-8 ~]# /usr/share/kibana/bin/kibana-keystore add elasticsearch.username --allow-root
Enter value for elasticsearch.username: ** ****
[root@centos-8 ~]# /usr/share/kibana/bin/kibana-keystore add elasticsearch.password --allow-root
Enter value for elasticsearch.password: ** ****

出现提示时,为这些设置值指定kibana内置用户及其密码。
当我们启动Kibana时,设置将自动应用。

对于基本许可证和生产许可证,重要的是要启用安全性以配置Kibana仪表板。

启用HTTPS通信(可选)

提示:

我们可以选择避免此步骤,但是建议通过在HTTPS上传递流量来增强安全性。
用于PKI身份验证的证书必须与用于加密HTTP通信的证书由同一CA签名。

通常,这些文件将由组织内的官方CA签署。
但是,由于我们已经创建了CA和其他证书,因此我们将使用它们来为Kibana启用https通信。

由于我们要在centos-8.example.com上安装kibana,因此我们将使用为centos-8创建的密钥。
创建/etc/kibana/config/certs /目录,我们将其中存储启用`https'所需的密钥

[root@centos-8 ~]# ls -l /etc/kibana/certs/
total 12
-rw-r--r-- 1 root root 1200 Dec 27 18:52 ca.crt
-rw-r--r-- 1 root root 1200 Dec 27 18:52 centos-8.crt
-rw-r--r-- 1 root root 1679 Dec 27 18:52 centos-8.key

设置server.ssl.enabledserver.ssl.keyserver.ssl.certificate属性。
以下是我的kibana.yml中的内容。

server.ssl.enabled: true
server.ssl.certificate: /etc/kibana/certs/centos-8.crt
server.ssl.key: /etc/kibana/certs/centos-8.key

配置Kibana以通过HTTPS连接到Elasticsearch

要执行此步骤,我们必须启用Elasticsearch安全功能,或者必须具有为Elasticsearch提供HTTPS端点的代理。

在Kibana配置文件kibana.ymlelasticsearch.hosts设置中指定HTTPS协议:

elasticsearch.hosts: ["https://192.168.0.11:9200", "https://192.168.0.12:9200", "https://192.168.0.13:9200"]

如果我们使用自己的CA为Elasticsearch签名证书,请在" kibana.yml"中设置" elasticsearch.ssl.certificateAuthorities"设置以指定PEM文件的位置。

elasticsearch.ssl.certificateAuthorities: [ "/etc/kibana/certs/ca.crt" ]

设置certificateAuthorities属性可让我们使用默认的verificationMode选项full。

elasticsearch.ssl.verificationMode: 'full'

其中

  • server.ssl.enabled:为从Kibana服务器到浏览器的传出请求启用SSL。
    设置为true时,需要server.ssl.certificateserver.ssl.key

  • server.ssl.certificateserver.ssl.key:分别是PEM格式的SSL证书和SSL密钥文件的路径。

  • elasticsearch.ssl.certificateAuthorities:可选设置,使我们可以为Elasticsearch实例的证书颁发机构指定PEM文件的路径列表。

  • elasticsearch.ssl.verificationMode:控制Elasticsearch提供的证书的验证。
    有效值为none,certificate和full。
    完全执行主机名验证,而证书不执行。

配置防火墙

Kibana使用5601 TCP端口,因此我们可以在防火墙中启用该端口。

[root@centos-8 ~]# firewall-cmd --add-port=5601/tcp --permanent
success
[root@centos-8 ~]# firewall-cmd --reload
success

启动Kibana服务器

我们已经完成了通过HTTPS配置Kibana的步骤,我们可以使用systemctl启动kibana服务。
此命令将启动服务,并使更改在重新引导后永久存在。

[root@centos-8 ~]# systemctl enable kibana --now

检查Kibana服务器上的端口5601端口是否处于LISTEN状态

[root@centos-8 ~]# netstat -ntlp | grep node
tcp        0      0 0.0.0.0:5601            0.0.0.0:*               LISTEN      4464/node

检查服务状态

[root@centos-8 ~]# systemctl status kibana
● kibana.service - Kibana
   Loaded: loaded (/etc/systemd/system/kibana.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-12-24 23:03:15 IST; 27s ago
 Main PID: 12928 (node)
   CGroup: /system.slice/kibana.service
           └─12928 /usr/share/kibana/bin/../node/bin/node /usr/share/kibana/bin/../src/cli -c /etc/kibana/kibana.yml
Dec 24 23:03:18 centos-8.example.com kibana[12928]: {"type":"log","@timestamp":"2019-12-24T17:33:18Z","tags":["info","plugins","data"],...lugin"}
Dec 24 23:03:38 centos-8.example.com kibana[12928]: {"type":"log","@timestamp":"2019-12-24T17:33:38Z","tags":["info","plugins","licensi...ctive"}

等待几秒钟,并检查来自kibana的最新日志,以确保没有报告任何错误,并且我们还没有获得" Kibana服务器尚未准备好"的信息。

[root@centos-8 ~]# journalctl -u kibana.service

或者使用journalctl监视实时日志

[root@centos-8 ~]# journalctl -u kibana.service -f

登录Kibana UI

从浏览器访问" https://192.168.0.14:5601/"。
使用"弹性"用户和我们在本文中使用" elasticsearch-setup-passwords"创建的"密码"登录。

提示:

启动kibana服务后几秒钟,我们可能会收到Kibana服务器尚未就绪的消息。
等待几分钟,然后刷新浏览器。
但是,如果我们继续在GUI上收到Kibana服务器尚未就绪的消息,请检查journalctl -u kibana.service以获取任何错误消息。
我们可以使用journalctl从Kibana Server查看实时日志。

对错误消息进行故障排除:

以下是在Kibana服务器配置中可以看到的一些常见错误消息

错误:ElasticsearchException:无法初始化SSL KeyManager-不允许读取密钥库文件

Caused by: java.security.AccessControlException: access denied ("java.io.FilePermission" "/etc/kibana/certs/ca.crt" "read")
ElasticsearchException: failed to initialize SSL KeyManager - not permitted to read keystore file [/etc/elasticsearch/config/certs/elastic-stack-ca.p12]

解决方案:这里的错误本身很明显,请检查证书文件上的文件许可权,并且该文件应可由相应用户读取。

错误:Kibana服务器尚未准备好

Kibana server is not ready yet

说明:可能有很多可能的原因导致KIbana dasboard无法加载,并显示错误消息" Kibana服务器尚未准备好"。
基本上,这意味着Kibana服务存在一些错误,必须在访问仪表板之前进行纠正。
因此,我们必须检查在/var/log/messages中可用的Kibana服务日志。

解决方案:例如在Kibana服务器上尚未准备好,我在/var/log/messages中遇到了以下错误。

Elasticsearch Unreachable: [https://logstash_system:[email protected]:9200/][Manticore::SocketException] No route to host (Host unreachable)"}

当我的Elasticsearch集群不可访问时,Kibana仪表板无法加载,并显示错误" Kibana服务器尚未准备好"。
因此,一旦我的Elasticsearch群集启动,仪表板便启动并开始运行。