公號:碼農充電站pro
主頁:https://codeshellme.github.io
在安裝完 ES 后,ES 默認是沒有任何安全防護的。
ES 的安全管理主要包括以下內容:
這里有一些免費的安全方案:
- 設置 Nginx 方向代理。
- 安裝免費的安全插件,比如:
- Search Guard:一個安全和報警的 ES 插件,分收費版和免費版。
- Readonly REST
- X-Pack 的 Basic 版:可參考這里。
1,身份認證
ES 中提供的認證叫做 Realms,有以下幾種方式,可分為兩類:
- 內部的:不需要與 ES 外部方通信。
- 外部的:需要與 ES 外部組件通信。
- ldap(收費)
- active_directory(收費)
- pki(收費)
- saml(收費)
- kerberos(收費)
2,用戶鑒權
用戶鑒權通過定義一個角色,並分配一組權限;然后將角色分配給用戶,使得用戶擁有這些權限。
ES 中的權限有不同的級別,包括集群級別(30 多種)和索引級別(不到 20 種)。
ES 中提供了很多內置角色(不到 30 種)可供使用。
ES 中提供了很多關於用戶與角色的 API:
- 關於用戶:
- Change passwords:修改密碼。
- Create or update users:創建更新用戶。
- Delete users:刪除用戶。
- Enable users:打開用戶。
- Disable users:禁止用戶。
- Get users:查看用戶信息。
- 關於角色:
- Create or update roles:創建更新角色。
- Delete roles:刪除角色。
- Get roles:查看角色信息。
3,啟動 ES 安全功能
下面演示如何使用 ES 的安全功能。
啟動 ES 並通過 xpack.security.enabled 參數打開安全功能:
bin\elasticsearch -E node.name=node0 -E cluster.name=mycluster -E path.data=node0_data -E http.port=9200 -E xpack.security.enabled=true
使用 elasticsearch-setup-passwords 命令啟用 ES內置用戶及初始 6 位密碼(需要手動輸入,比如是 111111
):
bin\elasticsearch-setup-passwords interactive
該命令會啟用下面這些用戶:
- elastic:超級用戶。
- kibana:用於 ES 與 Kibana 之間的通信。
- kibana_system:用於 ES 與 Kibana 之間的通信。
- apm_system
- logstash_system
- beats_system
- remote_monitoring_user
啟用 ES 的安全功能后,訪問 ES 就需要輸入用戶名和密碼:
也可以通過 curl 命令(並指定用戶)來訪問 ES:
curl -u elastic 'localhost:9200'
更多內容可參考這里。
4,啟動 Kibana 安全功能
打開 Kibana 的配置文件 kibana.yml
,寫入下面內容:
elasticsearch.username: "kibana_system" # 用戶名
elasticsearch.password: "111111" # 密碼
然后使用 bin\kibana
命令啟動 Kibana。
訪問 Kibana 也需要用戶和密碼(這里使用的是超級用戶):
5,使用 Kibana 創建角色和用戶
下面演示如何使用 Kibana 創建角色和用戶。登錄 Kibana 之后進行如下操作:
點擊 Stack Management
后進入下面頁面:
5.1,創建角色
點擊 Create role
創建角色:
創建角色需要填寫如下內容:
- 角色名稱
- 角色對哪些索引有權限及索引的權限級別
- 添加一個 Kibana 權限
- 最后創建角色
經過上面的操作,創建的角色名為 test_role
,該角色對 test_index
索引有只讀權限;如果進行超越范圍的操作,將發生錯誤。
5.2,創建用戶
進入到創建用戶的界面,點擊 Create user
創建用戶:
填寫用戶名和密碼,並將角色 test_role
賦予該用戶。
5.3,使用用戶
使用新創建的用戶登錄 Kibana:
該用戶只對 test_index
索引有只讀權限;如果進行超越范圍的操作,將發生錯誤。
6,傳輸加密
傳輸加密指的是在數據的傳輸過程中,對數據進行加密(可防止數據被抓包)。
傳輸加密分為集群內加密和集群間加密:
- 集群內加密指的是 ES 集群內部各節點之間的數據傳輸時的加密。
- 通過 TLS 協議完成。
- 集群間加密指的是外部客戶訪問 ES 時,數據傳輸的加密。
- 通過 HTTPS 協議完成。
更多的內容可參考這里。
6.1,集群內部傳輸加密
在 ES 中可以使用 TLS 協議對數據進行加密,需要進行以下步驟:
- 創建 CA
- 為 ES 節點創建證書和私鑰
- 配置證書
1,創建 CA 證書
使用如下命令創建 CA:
bin\elasticsearch-certutil ca
成功后,可以看到當前文件夾下多了一個文件:
elastic-stack-ca.p12
2,生成證書和私鑰
使用如下命令為 ES 中的節點生成證書和私鑰
bin\elasticsearch-certutil cert --ca elastic-stack-ca.p12
成功后,可以看到當前文件夾下多了一個文件:
elastic-certificates.p12
3,配置證書
將創建好的證書 elastic-certificates.p12
放在 config/certs
目錄下。
4,啟動集群
# 啟動第一個節點
bin\elasticsearch
-E node.name=node0
-E cluster.name=mycluster
-E path.data=node0_data
-E http.port=9200
-E xpack.security.enabled=true
-E xpack.security.transport.ssl.enabled=true
-E xpack.security.transport.ssl.verification_mode=certificate
-E xpack.security.transport.ssl.keystore.path=certs\elastic-certificates.p12
-E xpack.security.transport.ssl.truststore.path=certs\elastic-certificates.p12
# 啟動第二個節點
bin\elasticsearch
-E node.name=node1
-E cluster.name=mycluster
-E path.data=node1_data
-E http.port=9201
-E xpack.security.enabled=true
-E xpack.security.transport.ssl.enabled=true
-E xpack.security.transport.ssl.verification_mode=certificate
-E xpack.security.transport.ssl.keystore.path=certs\elastic-certificates.p12
-E xpack.security.transport.ssl.truststore.path=certs\elastic-certificates.p12
不提供證書的節點將無法加入集群:
bin\elasticsearch
-E node.name=node2
-E cluster.name=mycluster
-E path.data=node2_data
-E http.port=9202
-E xpack.security.enabled=true
-E xpack.security.transport.ssl.enabled=true
-E xpack.security.transport.ssl.verification_mode=certificate
# 加入失敗
也可以將配置寫在配置文件 elasticsearch.yml
中,如下:
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
6.2,集群外部傳輸加密
通過配置如下三個參數,使得 ES 支持 HTTPS:
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.http.ssl.truststore.path: certs/elastic-certificates.p12
在命令行啟動:
bin\elasticsearch
-E node.name=node0
-E cluster.name=mycluster
-E path.data=node0_data
-E http.port=9200
-E xpack.security.enabled=true
-E xpack.security.transport.ssl.enabled=true
-E xpack.security.transport.ssl.verification_mode=certificate
-E xpack.security.transport.ssl.keystore.path=certs\elastic-certificates.p12
-E xpack.security.transport.ssl.truststore.path=certs\elastic-certificates.p12
-E xpack.security.http.ssl.enabled=true
-E xpack.security.http.ssl.keystore.path=certs\elastic-certificates.p12
-E xpack.security.http.ssl.truststore.path=certs\elastic-certificates.p12
啟動成功后,可以通過 HTTPS 協議訪問 ES:
https://localhost:5601/
6.3,配置 Kibana 鏈接 ES HTTPS
1,為 Kibana 生成 pem 文件
首先用 openssl
為 kibana 生成 pem:
openssl pkcs12 -in elastic-certificates.p12 -cacerts -nokeys -out elastic-ca.pem
成功后會生成如下文件:
elastic-ca.pem
將該文件放在 config\certs
目錄下。
2,配置 kibana.yml
在 Kibana 的配置文件 kibana.yml
中配置如下參數:
elasticsearch.hosts: ["https://localhost:9200"]
elasticsearch.ssl.certificateAuthorities: ["C:\\elasticsearch-7.10.1\\config\\certs\\elastic-ca.pem"]
elasticsearch.ssl.verificationMode: certificate
3,運行 Kibana
bin\kibana
6.4,配置 Kibana 支持 HTTPS
1,為 Kibana 生成 pem
bin/elasticsearch-certutil ca --pem
上面命令執行成功后會生成如下 zip 文件:
elastic-stack-ca.zip
將該文件解壓,會有兩個文件:
ca.crt
ca.key
將這兩個文件放到 Kibana 的配置文件目錄 config\certs
。
2,配置 kibana.yml
在 Kibana 的配置文件 kibana.yml
中配置如下參數:
server.ssl.enabled: true
server.ssl.certificate: config\\certs\\ca.crt
server.ssl.key: config\\certs\\ca.key
3,運行 Kibana
bin\kibana
啟動成功后,可以通過 HTTPS 協議訪問 Kibana:
https://localhost:5601/
(本節完。)
推薦閱讀:
歡迎關注作者公眾號,獲取更多技術干貨。