Filebeat與Logstash配置SSL加密通信


為了保證應用日志數據的傳輸安全,我們可以使用SSL相互身份驗證來保護Filebeat和Logstash之間的連接。 這可以確保Filebeat僅將加密數據發送到受信任的Logstash服務器,並確保Logstash服務器僅從受信任的Filebeat客戶端接收數據。
下面就講述一下配置Filebeat與Logstash之間進行加密通信的方法。全文是在CentOS7上基於Elastic 7.5.0技術棧所驗證的。

需要一個自簽的CA證書,以及使用該CA證書簽署的兩份數據證書。一份是給Logstash作為server端驗證自己身份時使用,一份是提供給Filebeat客戶端驗證自己身份使用。
直接利用的Elasticsearch隨安裝包提供的數字證書工具elasticsearch-certutil來制作需要的證書.官方地址:https://www.elastic.co/guide/en/elasticsearch/reference/7.5/certutil.html

  • 制作自簽的CA證書
    在Linux下,進入到Elasticsearch程序的部署家目錄中,執行以下命令可以生成一份自簽的CA證書:
    ./bin/elasticsearch-certutil ca

使用默認輸出文件名elastic-stack-ca.p12,並為證書設置訪問口令。

根據證書文件導出一份CA公鑰文件,用於后續各應用配置文件中引用CA公鑰時使用:
openssl pkcs12 -clcerts -nokeys -in elastic-stack-ca.p12 -out ca.pem

或者使用這個:

bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 # elastic-certificates.p12
openssl pkcs12 -in elastic-certificates.p12 -cacerts -nokeys -out out ca.pem

  • 制作Logstash使用的數字證書
    Logstash服務在啟用SSL加密通信支持時,會有一個特殊的問題。因為Logstash在底層是通過集成了Netty來提供的對外服務端口,而Netty在支持數字證書這一功能上面,有一個局限性,即Netty僅支持使用PKCS#8的密鑰格式。
    對於我們使用最多的PEM格式證書,Logstash會毫不留情地打印出以下異常信息:
[ERROR][logstash.inputs.beats    ] Looks like you either have a bad certificate, an invalid key or your private key was not in PKCS8 format.

由於Elastic官網上對於Filebeat和Logstash之間配置SSL加密通信時的說明資料對制作Logstash使用的數字證書的操作一帶而過,只是簡單的說既可以使用elasticsearch自帶的證書工具,也可以使用通用的openssl。所以,按照Elastic技術棧中處理其它工具配置SSL功能支持時的方法,制作和得到PEM格式的證書后,便會遇到Logstash拋出的上面的異常信息了。由於Logstash打印的錯誤信息比較多,分析了很長時間才定位到是由於未使用PKCS8密鑰格式所引發的。

制作Logstash Server證書的正確方法

# --name為制作的證書名稱,--dns為hosts文件解析后的地址,--ip為logstash程序所在主機ip
在生成證書時至少需要提供--dns參數的值,可以使用逗號分隔指定多個,簡單處理的話可以接指定為Filebeat工具所在主機的hostname即可。
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --name logstash --dns logstash --ip 192.168.75.21 --pem --out logstash.zip # 使用自簽的CA簽署生成了一份名為logstash的數字證書
unzip logstash.zip # 解壓后會各有一個.key和.crt后綴的文件
cd logstash
openssl pkcs8 -in logstash.key -topk8 -nocrypt -out logstash.p8 # 使用openssl轉換出一份PKCS#8格式的密鑰文件,即logstash.p8

# 不一定非要使用p8結尾,這樣的也可以:openssl pkcs8 -in config/certs/logstash.key -topk8 -nocrypt -out config/certs/logstash.pkcs8.key

對於制作的logstash.crt的證書,可以使用以下命令查看證書中的信息:
openssl x509 -in logstash.crt -text

將證書文件部署到Logstash配置目錄下
假定我們部署Logstash的路徑為/etc/logstash ,我們創建下面這樣的證書存放目錄certs,並把包括logstash證書和ca證書在內的文件部署於此。

mkdir -p /etc/logstash/certs
# 把ca.pem  logstash.crt  logstash.key  logstash.p8這四個文件拷貝到該目錄下
ll /etc/logstash/certs
ca.pem  logstash.crt  logstash.key  logstash.p8
chmod 600 * # 安全起見,將以上文件權限調整為600 
  • 為Filebeat服務制作和配置數字證書
    回到剛才制作CA證書的地方,繼續為Filebeat生成一份數字證書:
# 在生成證書時至少需要提供--dns參數的值,可以使用逗號分隔指定多個,簡單處理的話可以直接指定為Filebeat工具所在主機的hostname即可。
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --name filebeat  --dns filebeat --ip 192.168.75.20 --pem --out filebeat.zip
unzip filebeat.zip

# 將得到的數字證書和密鑰文件,以及ca證書文件,復制到Filebeat存儲證書的路徑下:
mkdir -p /etc/filebeat/certs
ll /etc/filebeat/certs
filebeat.crt  filebeat.key  ca.pem
chmod 600 * # 安全起見,將以上文件權限調整為600 
  • 配置Filebeat使用SSL
    編輯filebeat.yml文件,參照以下內容進行配置:
# 注意logstash的ip地址,或者使用dns地址代替
output.logstash:
  hosts: ["192.168.75.21:5044"]
  ssl.certificate_authorities: ["/etc/filebeat/certs/ca.pem"]
  ssl.certificate: "/etc/filebeat/certs/filebeat.crt"
  ssl.key: "/etc/filebeat/certs/filebeat.key"
  • 配置Logstash在通過beats接收日志數據時使用SSL
# 在ssl_key參數中,引用的是我們制作的PCKS#8格式的密鑰文件
input {
  beats {
    port => 5044
    codec => plain {
      charset => "UTF-8"
    }
    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服務並觀察日志
    觀察日志輸出,顯示有類似以下信息時表示Filebeat正常連接到Logstash服務且SSL功能工作正常。
Connecting to backoff(async(tcp://log.mytestserver.com:5044))
Connection to backoff(async(tcp://log.mytestserver.com:5044)) established

或者配置output輸出進行查看是否可以收到filebeat傳遞過來的日志信息

output {
  stdout {
     codec => rubydebug
  }
}

官方說明


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM