如何通过Filebeat进行日志加密
小樊
42
2025-11-25 01:57:49
Filebeat日志加密实践指南
一、加密目标与总体思路
- 传输加密:保障日志在Filebeat → Logstash/Elasticsearch链路上的机密性与完整性,常用TLS/SSL。
- 内容加密:对事件中的敏感字段做加密,即使存储或中间环节被访问,敏感内容仍受保护。
- 落地顺序建议:先启用传输加密,再按需对敏感字段做内容加密,并配套证书管理、最小权限与密钥轮换策略。
二、传输加密 TLS/SSL 配置
- Filebeat → Logstash(推荐双向认证)
- 准备证书(可用elasticsearch-certutil或OpenSSL自建CA)
- 生成CA:elasticsearch-certutil ca --pem --out /opt/certs/ca.pem
- 为Logstash签发:elasticsearch-certutil cert --ca /opt/certs/ca.pem --name logstash --dns logstash --ip 192.0.2.10 --pem --out logstash.zip
- 为Filebeat签发:elasticsearch-certutil cert --ca /opt/certs/ca.pem --name filebeat --dns filebeat --ip 192.0.2.20 --pem --out filebeat.zip
- 解压后将证书分发至各节点,注意Logstash的Beats输入插件要求PKCS#8私钥:
unzip logstash.zip && cd logstash && openssl pkcs8 -in logstash.key -topk8 -nocrypt -out logstash.p8
- Logstash 输入(/etc/logstash/conf.d/beats-ssl.conf)
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 输出(/etc/filebeat/filebeat.yml)
output.logstash:
hosts: [“logstash.example.com:5044”]
ssl.certificate_authorities: [“/etc/filebeat/certs/ca.pem”]
ssl.certificate: “/etc/filebeat/certs/filebeat.crt”
ssl.key: “/etc/filebeat/certs/filebeat.key”
- 验证与重启
filebeat test output -e
systemctl restart filebeat
- Filebeat → Elasticsearch(HTTPS)
- Elasticsearch 启用安全与TLS(示例)
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
- Filebeat 输出
output.elasticsearch:
hosts: [“https://es.example.com:9200”]
username: “elastic”
password: “<your_password>”
ssl.certificate_authorities: [“/etc/filebeat/certs/ca.pem”]
如为自签名或私有CA,建议同时配置客户端证书
ssl.certificate: “/etc/filebeat/certs/filebeat.crt”
ssl.key: “/etc/filebeat/certs/filebeat.key”
- 验证与重启
filebeat test output -e
systemctl restart filebeat
- 证书与连通性要点
- 为服务器证书添加SAN(DNS/IP),避免证书校验失败(如“doesn’t contain any IP SANs”)。
- 文件权限建议:证书与私钥600,仅属主可读写。
- 自签名或私有CA场景,务必在客户端配置ssl.certificate_authorities以完成信任链校验。
三、内容加密 对敏感字段进行加密
- 何时使用:需要在存储层或跨团队共享时保护如身份证号、手机号、邮箱、令牌等字段。
- 实现思路
- 方案A(推荐):在Logstash使用ruby filter或外部脚本/插件对指定字段进行对称加密(如AES-256-GCM),密钥通过KMS/Secrets Manager或环境变量注入,避免硬编码。
- 方案B:在Elasticsearch Ingest Pipeline使用ingest-attachment/ingest-crypto-processor(社区插件)或在索引前由应用侧加密。
- 示例(Logstash ruby filter,示意)
filter {
ruby {
code => "
require ‘openssl’
key = ENV[‘FIELD_ENC_KEY’] || ‘32byteslongkeyforaes256gcm!!!’
iv = OpenSSL::Random.random_bytes(12)
cipher = OpenSSL::Cipher.new(‘aes-256-gcm’)
cipher.encrypt
cipher.key = key
cipher.iv = iv
payload = event.get(‘message’)
encrypted = cipher.update(payload) + cipher.final
tag = cipher.auth_tag
event.set(‘message_encrypted’, [iv, encrypted, tag].pack(‘A12ANA’))
event.remove(‘message’) # 视需求决定是否移除明文
"
}
}
- 重要注意
- 对称密钥需安全分发与轮换;GCM模式需妥善保存IV与认证标签。
- 一旦加密,Kibana聚合/检索将受限,通常需保留明文副本或只加密必要字段,并建立解密/脱敏视图供分析。
四、常见问题与排查
- 证书校验失败(IP访问报错或域名不匹配)
- 证书需包含访问用的IP SAN或正确DNS SAN;重新签发并在客户端配置ssl.certificate_authorities指向CA。
- Logstash Beats输入无法启动或握手失败
- 确认使用PKCS#8格式私钥(.p8),权限600,证书路径正确;使用filebeat test output与Logstash --config.test_and_exit先做语法与连通性校验。
- 自签名证书被拒绝
- 在Filebeat输出中设置ssl.verification_mode: certificate或full,并提供ca.crt;必要时同时配置客户端证书以完成双向认证。
- 性能与资源
- TLS会引入CPU开销;在高吞吐场景建议启用硬件加速、合理设置批量大小与工作者数,并复用连接。