ELK 专题:5. Filebeat 与 Logstash 进行 SSL 连接

1. 几个方案

1.1. 使用 Nginx 反向代理

Filebeat 与 Logstash 的通信基于 TCP 而非 HTTP,所以无法通过 Nginx 进行反向代理。而且 Filebeat 和 Logstash 也原生的有建立互相 SSL 连接的配置与方法。

1.2. 用公网泛域名证书

最先想到的就是用现有的公网域名证书,但是实际上使用公网有效的证书,会在请求中多增加了一个 CA 验证角色,同时需要机器具备连通公网 CA,对于内网或者说通信并没有那么便捷。

1.3. 自签名证书

采取自签名的证书,直接把 CA 验证角色指定为 ELK 的地址,则等于实际上,Filebeat 与 ELK 的连接只有双方服务器在沟通,减少了引入新角色的一系列麻烦,当然,这也会相应的降低了安全性,不过权衡下,这个方式是性价比最高的。故以下文档基于「自签名证书」的验证形式来展开。

官方实际上,还支持客户端与服务器的双向 SSL 认证,可以在这里了解更多


2. 构建自签名证书

要以 Logstash 所在的机器来创建/签署证书(因为后续是该机器进行校验的)。

2.1. 获取一个 openSSL 的 示例配置文件

如果是 Debian / Ubuntu:

1
# cp /etc/ssl/openssl.cnf custom_openssl.cnf

如果是 CentOS / Redhat / MacOS:

1
# cp /etc/pki/tls/openssl.cnf custom_openssl.cnf

2.2. 修改文件里面的鉴权服务器地址(CA)

找到 [ v3_ca ] 字段,底下加一行 subjectAltName

1
2
3
4
# 格式
[ v3_ca ]
subjectAltName = IP: LOGSTASH_SERVER_IP // 要以 IP 形式来做验证
subjectAltName = DNS: LOGSTASH_DOMAIN // 要以域名形式来做验证

可以使用 IP 或者 域名 来做验证地址,我个人建议使用 域名,原因有二:

  • ELK(Logstash) 服务器总有需要切换的时刻,如果发送端 Filebeat 是以域名来配置,那么服务器要切换的时候,只要配置好 DNS,那么发送端是不需要任何操作,就能无缝切换到新的服务器。
  • 配置域名,对于外部,IP 是不可见,能够相应的提高一丢丢安全性。

综上,本文基于配置 域名 做验证地址来展开后续的文章,如果希望使用 IP 的,只要注意这个配置项的前缀注意修改就好。

所以我在这里则假设 logstash 服务器的域名是 log1.logstash.com,并配置文件如下:

1
2
[ v3_ca ]
subjectAltName = DNS: log1.logstash.com

2.3. 生成 SSL 的证书与密钥

root 权限执行以下命令生成。

1
2
3
4
# openssl req -x509 -batch -nodes -days 365 -newkey rsa:2048 \ 
-keyout /etc/logstash/logstash.key \
-out /etc/logstash/logstash.crt \
-config custom_openssl.cnf

执行后,会生成在以下路径中:

  • 密钥: /etc/logstash/logstash.key
  • 证书: /etc/logstash/logstash.crt

如果是 docker 的话,缺失了 openssl,可以先安装后执行上述命令。

1
# yum install -y openssl

3. 配置 ELK 的 Logstash 端

接下来,配置 Logstash 端的证书认证用于与 Filebeat 的通信。

3.1. 给证书改上正确的权限

执行以下命令

1
2
# chmod 644 /etc/logstash/logstash.crt
# chmod 644 /etc/logstash/logstash.key

3.2. 配置对应的 Logstash Conf 文件

一个正常的 conf 文件,接收 beat 的数据应该看起来是如下格式的

1
2
3
4
5
6
input {
beats {
port => 5044
}
}
...

那么 SSL 的配置就是在 port 下面,加入关于 SSL 的配置项,形如以下:

1
2
3
4
5
6
7
8
9
input {
beats {
port => 5044
ssl => true
ssl_certificate => "/etc/logstash/logstash.crt"
ssl_key => "/etc/logstash/logstash.key"
}
}
...

3.3. 重启 Logstash

重启使其生效。


4. 配置 Filebeat

4.1. 把 Logstash 的证书传输到 Filebeat 所在服务器

如果是同一个服务器,使用的时候直接调用就好。如果是跨服务器,那么使用 scp, ftp, rsync 之类的工具,把 logstash.crt 转移到 Filebeat 所在服务器。这里我们假设,把证书传到 Filebeat 服务器的路径如下

1
/etc/filebeat/logstash.crt

请注意,Filebeat 的版本需要与 ELK 的 Logstash 的版本相配套,比如本文在 ELK 6.4.2 & Filebeat 6.4.2 下测试通过。不配套可能会引发一些未知的错误。

4.2. 给证书改上正确的权限

同样,要使证书能够正常工作,需要给证书配上正确的 644 权限。

1
# chmod 644 /etc/filebeat/logstash.crt

4.3. 配置 Filebeat Conf 文件

修改 filebeat 的配置文件 filebeat.yml,一个正常的 yml 文件应该看起来是如下格式的

1
2
3
4
5
6
...
output:
logstash:
hosts: ["log1.logstash.com"]

...

那么 SSL 的配置就是在 hosts 下面,加入关于 SSL 的配置项,形如以下:

1
2
3
4
5
6
7
...
output:
logstash:
hosts: ["log1.logstash.com"]
ssl:
certificate_authorities: ["/etc/filebeat/logstash.crt"]
...

请注意, filebeat.yml 文件是需要遵循 YAML 格式的,请不要因为格式问题导致配置错误。

4.4. 重启 Filebeat

重启使其生效。


参考与致谢

  1. Setting up SSL for Filebeat and Logstash
  2. Secure communication with Logstash by using SSL