温馨提示×

Filebeat如何进行日志加密

小樊
46
2025-11-21 04:00:57
栏目: 网络安全

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)与最小权限访问控制。

0