Filebeat日志加密实践
一、先明确加密目标
- 传输加密:保障日志在Filebeat → Logstash/Elasticsearch链路上的机密性与完整性,推荐启用TLS/SSL,必要时做双向认证(mTLS)。
- 内容加密:对日志正文或敏感字段做字段级加密,即使存储或中间环节被访问,内容仍受保护。
- 静态加密:对落盘日志文件本身加密,通常由操作系统/磁盘加密承担,Filebeat不直接提供该功能。
二、传输加密 TLS/SSL(最常用且优先)
- 证书准备
- 使用Elasticsearch 证书工具 elasticsearch-certutil生成CA与节点证书,或自行用OpenSSL生成;为便于浏览器/客户端校验,证书中应包含SAN(DNS/IP)。示例:
- 生成CA:bin/elasticsearch-certutil ca
- 生成服务器证书(含SAN):bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --name logstash --dns logstash --ip 192.168.75.21 --pem --out logstash.zip
- 解压后将ca.pem、logstash.crt、logstash.key部署到Logstash;注意Logstash的Beats输入要求私钥为PKCS#8,可用命令转换:openssl pkcs8 -in logstash.key -topk8 -nocrypt -out logstash.p8
- Filebeat 输出到 Logstash(开启TLS)
- 示例 filebeat.yml:
- output.logstash:
- hosts: [“192.168.75.21:5044”]
- ssl.enabled: true
- ssl.certificate_authorities: [“/etc/filebeat/certs/ca.pem”]
- ssl.certificate: “/etc/filebeat/certs/filebeat.crt”
- ssl.key: “/etc/filebeat/certs/filebeat.key”
- ssl.verification_mode: certificate(或开启更严格的校验)
- Logstash 接收端(Beats 输入启用SSL)
- 示例 input.beats:
- input {
- beats {
- port => 5044
- ssl => true
- ssl_certificate_authorities => [“/etc/logstash/certs/ca.pem”]
- ssl_certificate => “/etc/logstash/certs/logstash.crt”
- ssl_key => “/etc/logstash/certs/logstash.p8”
- ssl_verify_mode => “force_peer”
- }
- }
- Filebeat 直连 Elasticsearch(HTTPS)
- 示例 filebeat.yml:
- output.elasticsearch:
- hosts: [“https://es-host:9200”]
- ssl.certificate_authorities: [“/etc/filebeat/certs/ca.crt”]
- ssl.certificate: “/etc/filebeat/certs/client.crt”
- ssl.key: “/etc/filebeat/certs/client.key”
- ssl.verification_mode: certificate
- 关键要点
- 证书需包含访问地址的DNS/IP SAN,否则会出现证书校验失败(如“doesn’t contain any IP SANs”)。
- 私钥权限建议600,仅属主可读写;证书定期轮换。
三、内容加密 字段级保护(在写入前对敏感字段加密)
- 推荐在Logstash或业务侧对指定字段做加密,Filebeat侧不做内置字段加密。
- 方案示例(Logstash 使用 ruby 过滤器进行对称加密)
- 思路:在Logstash配置中加载密钥,对事件中的敏感字段(如message、user)进行加密后再写入ES。
- 示例(需先在Logstash安装支持的加密插件,如 logstash-filter-encrypt 或自定义ruby脚本):
- filter {
- ruby {
- code => "
- require ‘openssl’
- key = ENV[‘ENC_KEY_32BYTE’] # 32字节用于AES-256
- iv = ENV[‘ENC_IV_16BYTE’] # 16字节IV
- cipher = OpenSSL::Cipher.new(‘AES-256-CBC’)
- cipher.encrypt
- cipher.key = key
- cipher.iv = iv
- event.get(‘message’).to_s.each_byte { |b| event.set(‘message’, event.get(‘message’) + b.chr) } # 简化示意
- encrypted = cipher.update(event.get(‘message’)) + cipher.final
- event.set(‘message_encrypted’, [encrypted].pack(‘m0’)) # Base64
- event.remove(‘message’)
- "
- }
- }
- 安全建议
- 使用KMS/HSM管理密钥,避免明文配置;为每条日志使用随机IV并随密文存储;记录密钥版本以便轮换与回溯。
- 若需字段级解密检索,考虑可搜索加密(Searchable Encryption)或确定性加密+安全索引,但会牺牲部分功能与性能。
四、常见误区与排错
- 证书未包含访问地址的SAN(DNS/IP)导致校验失败;重新签发证书并在SAN中加入IP/DNS。
- Logstash Beats 输入私钥非 PKCS#8导致启动报错;使用命令转换:openssl pkcs8 -in server.key -topk8 -nocrypt -out server.p8。
- 自签名证书未被信任;在客户端配置ssl.certificate_authorities指向CA证书,或将CA导入受信根。
- 权限与路径错误;证书与私钥建议权限600,路径使用绝对路径并确认Filebeat运行用户可读。
五、快速选择建议
- 仅需链路安全:启用TLS/SSL直连或经Logstash转发,必要时开启mTLS。
- 需保护敏感内容:在Logstash侧对敏感字段做对称加密,密钥交由KMS管理,保留IV与版本。
- 需保护落盘文件:使用磁盘/文件系统加密(如LUKS、BitLocker)与最小权限访问控制。