Logstash to ES 開啓權限認證 (x-pack)

應用場景闡述:
本文記錄一次解決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在這裏插入圖片描述

相關文章
相關標籤/搜索