應用場景闡述:
本文記錄一次解決ElasticSearch開啓x-pack安全認證後,logstash沒法發送數據至 ES 存儲的解決方法。
版本爲 logstash-6.8.0、elasticsearch-6.8.0
node
1、先決條件
首先咱們須要 logstash 和 es集羣環境,且配置好了 hosts文件映射主機名
例如:vim etc/hosts
#es三個節點
pc1 10.20.10.1
pc2 10.20.10.2
pc3 10.20.10.3
logstash-node-1 10.20.10.4
2、開啓安全認證
在es主節點的配置文件中(elasticsearch.yml)加入如下一行配置,並重啓es,目的是開啓安全認證
vim
xpack.security.enabled: true
作完這一步,最基本的安全認證,用戶名、密碼驗證 就配置好了,瀏覽器訪問 http://pc1:9200/ 就會要求輸入用戶名密碼來訪問es了跨域
3、設置ES內置用戶及密碼瀏覽器
一、在Elasticsearch安裝目錄中運行命令: ./bin/elasticsearch-setup-passwords interactive, 回車以後爲每個用戶設置獨立的密碼。前提是 ES必須爲啓動狀態。 二、你須要在後續步驟中使用這些內置用戶,所以務必牢記前面設置的密碼!
4、生成咱們所需的證書
ca證書:咱們須要PKCS#12類型的證書
安全
*注意:這裏說明一下 參數 --dns 是指定 爲哪個 節點 生成證書 --name 是 爲生成的證書 指定名字* 第一條命令:bin/elasticsearch-certutil ca 第二條命令:bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --dns pc1 一、執行下面的第一條命令生成根證書,一路回車!會獲得elastic-stack-ca.p12 二、執行第二條命令,一路回車!會獲得節點 pc1 的節點證書 pc1.p12 bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --dns pc1 --name pc1 同理:執行 bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --dns pc2 --name pc2 會獲得 pc2 節點的 證書 pc2.p12 bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --dns pc3 --name pc3 會獲得 pc3 節點的 證書 pc3.p12 bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --dns logstash-node-1 --name logstash-node-1 會獲得 logstash-node-1 節點的 證書 logstash-node-1.p12
重點1:
logstash 不可以直接使用 PKCS#12類型的證書!
logstash 不可以直接使用 PKCS#12類型的證書!
logstash 不可以直接使用 PKCS#12類型的證書!
因此咱們須要 第三種命令,去 logstash-node-1.p12 的證書中提取 pem證書
ruby
openssl pkcs12 -in logstash-node-1.p12 -clcerts -nokeys -chain -out ca.pem 執行後會獲得logstash使用的pem證書,名爲 ca.pem
將各自節點的證書 放置在 es的 config 路徑下,我這裏是在每個節點的 config/ 建立了 一個文件夾 叫 xp , 證書放置在 xp 文件夾下。
重點2
修改 證書 的 權限,確保 es 節點 能夠訪問 本身的 證書
cors
chown -R es:es ./xp/
重點3
將logstash 所需 的 證書 ca.pem 放置在 logstash的安裝目錄中的 config 下 ,並修改 其權限爲 600,也是爲了保證logstash對其有操做權限,我這裏 也是 在 config下 建立了 一個文件夾 叫 xp,將ca放到 xp 下。
elasticsearch
chmod 600 ./ca.pem
5、配置es的 SSL/TLS (在各個es節點的 elasticsearch.yml 文件中)
es主節點 pc1 的配置: 用咱們生成的 pc1 節點的 證書
測試
#跨域 http.cors.enabled: true http.cors.allow-origin: "*" #開啓權限認證後,es-head-master訪問es 須要的配置 http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type #開啓權限認證,上面咱們配置過了 xpack.security.enabled: true # SSL/TLS 節點間通信,xp 爲 es的安裝目錄 config下 新建的一個文件夾 xpack.security.transport.ssl.enabled: true xpack.ssl.keystore.path: xp/pc1.p12 xpack.ssl.truststore.path: xp/pc1.p12 #mode設置爲 certificate 當設置爲 full的時候 會驗證 dns 和 ip 沒有設置dns和ip 會報錯client did not trust this server’s certificate xpack.ssl.verification_mode: certificate xpack.ssl.client_authentication: required #用HTTPS方式訪問es,即logstash 發送數據至 es 的 方式 xpack.security.http.ssl.enabled: true xpack.security.http.ssl.keystore.path: xp/pc1.p12 xpack.security.http.ssl.truststore.path: xp/pc1.p12 xpack.security.http.ssl.verification_mode: certificate
es從節點 pc2 的配置: 用咱們生成的 pc2 節點的 證書ui
# SSL/TLS 節點間通信,xp 爲 es的安裝目錄 config下 新建的一個文件夾 xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.keystore.path: xp/pc2.p12 xpack.security.transport.ssl.truststore.path: xp/pc2.p12 #用HTTPS方式訪問es,即logstash 發送數據至 es 的 方式 xpack.security.http.ssl.enabled: true xpack.security.http.ssl.keystore.path: xp/pc2.p12 xpack.security.http.ssl.truststore.path: xp/pc2.p12 xpack.security.http.ssl.verification_mode: certificate
es從節點 pc3 的配置: 用咱們生成的 pc3 節點的 證書
# SSL/TLS 節點間通信,xp 爲 es的安裝目錄 config下 新建的一個文件夾 xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.keystore.path: xp/pc3.p12 xpack.security.transport.ssl.truststore.path: xp/pc3.p12 #用HTTPS方式訪問es,即logstash 發送數據至 es 的 方式 xpack.security.http.ssl.enabled: true xpack.security.http.ssl.keystore.path: xp/pc3.p12 xpack.security.http.ssl.truststore.path: xp/pc3.p12 xpack.security.http.ssl.verification_mode: certificate
重啓es集羣后, 此時用 http請求去訪問 es 將會失效,應改成https方式去訪問:https://pc1:9200/_cat/nodes
若是能夠看到 集羣的全部節點信息,說明咱們的 節點間通信配置正確!
6、配置logstash
logstash的配置包括兩部分:
一、logstash.yml
xpack.monitoring.enabled: true xpack.monitoring.elasticsearch.username: logstash_system xpack.monitoring.elasticsearch.password: 你以前設置的password #這裏必須用 https 這裏必須用 https 這裏必須用 https xpack.monitoring.elasticsearch.hosts: "https://pc1:9200" #你的ca.pem 的所在路徑 xpack.monitoring.elasticsearch.ssl.certificate_authority: "/opt/logstash-6.8.0/config/xp/ca.pem" xpack.monitoring.elasticsearch.ssl.verification_mode: certificate # 探嗅 es節點,設置爲 false xpack.monitoring.elasticsearch.sniffing: false
二、logstash.conf
output { stdout {codec => rubydebug} elasticsearch{ template_name => "xxx-alarm" hosts => ["pc1:9200"] #document_type => "alarm" 這裏我爲了測試方便,沒有設置模板 #不配置模板 es 會自動分配 logstash 模板給用 ,這裏只要能區分出來 數據是否流入 就能夠了 #index => "<xxx-alarm-{now/d}>" user => "logstash_system" password => "你的密碼" ssl => true #pem 證書的 所在路徑 cacert => '/opt/logstash-6.8.0/config/xp/ca.pem' } }
7、開啓x-pack後,es-head-master訪問方式:
http://headIP:9100/?base_uri=https://ESIP:9200&auth_user=elastic&auth_password=yourPwd
上圖:數據已經成功輸出到 es