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 | # 格式 |
可以使用 IP
或者 域名
来做验证地址,我个人建议使用 域名
,原因有二:
- ELK(Logstash) 服务器总有需要切换的时刻,如果发送端 Filebeat 是以域名来配置,那么服务器要切换的时候,只要配置好 DNS,那么发送端是不需要任何操作,就能无缝切换到新的服务器。
- 配置域名,对于外部,IP 是不可见,能够相应的提高一丢丢安全性。
综上,本文基于配置 域名
做验证地址来展开后续的文章,如果希望使用 IP
的,只要注意这个配置项的前缀注意修改就好。
所以我在这里则假设 logstash 服务器的域名是 log1.logstash.com
,并配置文件如下:
1 | [ v3_ca ] |
2.3. 生成 SSL 的证书与密钥
以 root
权限执行以下命令生成。
1 | # openssl req -x509 -batch -nodes -days 365 -newkey rsa:2048 \ |
执行后,会生成在以下路径中:
- 密钥:
/etc/logstash/logstash.key
- 证书:
/etc/logstash/logstash.crt
如果是 docker 的话,缺失了
openssl
,可以先安装后执行上述命令。
1 | # yum install -y openssl |
3. 配置 ELK 的 Logstash 端
接下来,配置 Logstash 端的证书认证用于与 Filebeat 的通信。
3.1. 给证书改上正确的权限
执行以下命令
1 | # chmod 644 /etc/logstash/logstash.crt |
3.2. 配置对应的 Logstash Conf 文件
一个正常的 conf 文件,接收 beat 的数据应该看起来是如下格式的
1 | input { |
那么 SSL 的配置就是在 port 下面,加入关于 SSL 的配置项,形如以下:
1 | input { |
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 | ... |
那么 SSL 的配置就是在 hosts 下面,加入关于 SSL 的配置项,形如以下:
1 | ... |
请注意,
filebeat.yml
文件是需要遵循 YAML 格式的,请不要因为格式问题导致配置错误。
4.4. 重启 Filebeat
重启使其生效。