1. 前言
在之前的例子中,我們都是直接輸入地址訪問的,系統也沒有提示我們要輸入用戶名密碼。但是,在實際使用過程中不大可能所有人都是超級管理員可以做任何操作,一定是有權限控制的,這里我們借助X-Pack插件來實現(PS:X-Pack是收費的,可以申請試用30天。)
2. 安裝X-Pack
用下列命令安裝插件:
bin/kibana-plugin install <package name or URL>
例如:
bin/kibana-plugin install x-pack
事實上,我們無需再次安裝X-Pack插件,因為在安裝Kibana的時候默認已經安裝了。
By default, when you install Elasticsearch, X-Pack is installed.
By default, when you install Kibana, X-Pack is installed.
3. 在Elasticsearch中配置Security
X-Pack安全性使你能夠輕松地保護集群。通過X-Pack安全性,你可以對數據進行密碼保護,並實現更高級的安全措施,如加密通信、基於角色的訪問控制、IP過濾和審計。
第1步:檢查你的license中是否包含X-Pack安全特性
如果你想嘗試所有的X-Pack特性,你可以開始一個30天的試用。在試用期結束時,你可以購買以繼續使用X-Pack組件的全部功能。
這里,我們先試用30天再說
可以看到,試用以后我們的license從“Basic”變成“Trial”。而且,從控制台日志中我們可以看到這個變化:
log [03:49:03.965] [info][license][xpack] Imported license information from Elasticsearch for the [monitoring] cluster: mode: basic | status: active log [03:55:25.049] [info][license][xpack] Imported changed license information from Elasticsearch for the [data] cluster: mode: trial | status: active | expiry date: 2018-09-18T11:55:25+08:00
第2步:檢查你的集群中的每個節點配置中xpack.security.enabled是否設置為true。如果你用的是一個trail license,這個配置項默認是false。
xpack.security.enabled: true
配置項
xpack.security.enabled
設置為true則在節點上啟用X-Pack安全特性,false表示禁用X-Pack安全特性。(PS:推薦明確設置這個值)
xpack.security.authc.accept_default_password
在elasticsearch.yml中,將其設置為false,以禁用默認密碼。默認密碼是“changeme”。
xpack.security.authc.anonymous.username
配置匿名用戶
xpack.security.authc.anonymous.roles
匿名用戶關聯的角色
例如:
xpack.security.authc: anonymous: username: anonymous_user roles: role1, role2 authz_exception: true
xpack.security.dls_fls.enabled
設置為false表示阻止文檔和字段級別的訪問控制。默認是true。
xpack.security.authc.token.enabled
設置為false表示禁用token服務。默認true。
xpack.security.authc.realms
配置realms,例如:
xpack.security.authc.realms: realm1: type: native order: 0 ... realm2: type: ldap order: 1 ... realm3: type: active_directory order: 2 ... ...
- type:可選值有native, ldap, active_directory, pki, file
- order:realm在realm鏈中的優先級,數值越小,優先級越高
- enabled:默認true,表示啟用這個realm
第3步:為內部節點通信配置TSL/SSL
這需要你的集群中至少有兩個節點。如果你的集群中只有一個節點,那么可以忽略這一步。
更多參見
https://www.elastic.co/guide/en/elasticsearch/reference/6.3/configuring-tls.html#node-certificates
https://www.elastic.co/guide/en/elasticsearch/reference/6.3/configuring-tls.html
第4步:啟動Elasticsearch
第5步:為所有內置用戶設置密碼
X-Pack安全性提供了內置的用戶來幫助你啟動和運行。elasticsearch-setup-password命令是首次設置內置用戶密碼的最簡單方法。
內置用戶有4個,如下:
- elastic 超級用戶
- Kibana 用於連接並且和Elasticsearch通信的
- logstash_system 用於在Elasticsearch中存儲監控信息
- beats_system 用於在Elasticsearch中存儲監控信息
例如,你可以以交互模式運行命令,依次為這些用戶設置新密碼:
bin/elasticsearch-setup-passwords interactive
(畫外音:elasticsearch-setup-passwords命令只能運行一次,不能再運行第二次。此后如果你想修改密碼的話,可以在Kibana UI界面中通Management --> Users 或者通過API的方式來修改密碼)
第6步:選擇你想要用來認證用戶的realms類型
例如:https://www.elastic.co/guide/en/elasticsearch/reference/6.3/configuring-native-realm.html
第7步:設置用於訪問Elasticsearch的角色和用戶。例如:
curl -XPOST -u elastic 'localhost:9200/_xpack/security/role/events_admin' -H "Content-Type: application/json" -d '{ "indices" : [ { "names" : [ "events*" ], "privileges" : [ "all" ] }, { "names" : [ ".kibana*" ], "privileges" : [ "manage", "read", "index" ] } ] }' curl -XPOST -u elastic 'localhost:9200/_xpack/security/user/johndoe' -H "Content-Type: application/json" -d '{ "password" : "userpassword", "full_name" : "John Doe", "email" : "john.doe@anony.mous", "roles" : [ "events_admin" ] }'
第8步:啟用審計
xpack.security.audit.enabled: true
3.1. 用戶管理API
3.1.1. 查看用戶
# 查看所有用戶 curl -X GET -u elastic "localhost:9200/_xpack/security/user" # 查看指定用戶 curl -X GET -u elastic "localhost:9200/_xpack/security/user/jacknich"
例如:
3.1.2. 創建用戶
例如:
curl -X POST -u elastic "localhost:9200/_xpack/security/user/jacknich" -H 'Content-Type: application/json' -d' { "password" : "j@rV1s", "roles" : [ "admin", "other_role1" ], "full_name" : "Jack Nicholson", "email" : "jacknich@example.com", "metadata" : { "intelligence" : 7 } } '
在這些參數中,password 和 roles 是必須的。
(畫外音:加上“-u elastic”是因為只有elastic用戶有管理用戶權限,另外,請求參數后面可以帶上?pretty,這樣返回的格式會好看一點兒)
3.1.3. 修改密碼
curl -X POST "localhost:9200/_xpack/security/user/jacknich/_password" -H 'Content-Type: application/json' -d' { "password" : "s3cr3t" } '
3.1.4. 禁用/啟用/刪除用戶
curl -X PUT "localhost:9200/_xpack/security/user/jacknich/_disable" curl -X PUT "localhost:9200/_xpack/security/user/jacknich/_enable" curl -X DELETE "localhost:9200/_xpack/security/user/jacknich"
3.2. 角色管理API
curl -X GET "localhost:9200/_xpack/security/role" curl -X GET "localhost:9200/_xpack/security/role/my_admin_role" curl -X DELETE "localhost:9200/_xpack/security/role/my_admin_role" curl -X POST "localhost:9200/_xpack/security/role/my_admin_role" -H 'Content-Type: application/json' -d' { "cluster": ["all"], "indices": [ { "names": [ "index1", "index2" ], "privileges": ["all"], "field_security" : { // 可選 "grant" : [ "title", "body" ] }, "query": "{\"match\": {\"title\": \"foo\"}}" // 可選 } ], "run_as": [ "other_user" ], // 可選 "metadata" : { // 可選 "version" : 1 } } '
3.3. 基於角色的訪問控制(RBAC)
X-Pack安全性提供了一種基於角色的訪問控制(RBAC)機制,它使你能夠通過向角色分配特權和向用戶或組分配角色來授權用戶。
4. 在Kibana中配置Security
當在你的集群上啟用X-Pack時,Kibana用戶必須登錄成功后才可以訪問。你可以為Kibana用戶配置X-Pack安全角色,以控制用戶可以訪問哪些數據。
通過Kibana向Elasticsearch發出的大多數請求都通過登錄用戶的憑證進行認證的。然而,Kibana服務器需要向Elasticsearch集群發出一些內部請求。因此,你必須為Kibana服務器配置用於這些請求的憑證。
啟用了X-Pack安全性之后,如果你加載一個Kibana指示板,該指示板訪問你沒有權限查看的索引中的數據,那么你將得到一個索引不存在的錯誤。X-Pack安全性目前還沒有提供一種方法來控制哪些用戶可以加載哪些儀表板。
為了在Kibana中應用X-Pack安全特性:
第1步:在Elasticsearch中配置security
第2步:配置Kibana使用內置賬戶,例如:
第3步:在kibana.yml配置文件中指定xpack.security.encryptionKey,例如:
第4步:可選的:更改默認的session過期時間,例如:
xpack.security.sessionTimeout: 600000
第5步:可選的:配置Kibana加密通信
第6步:重啟Kibana
第7步:現在一個用戶身份認證機制,並授予用戶所需的權限
你可以在Kibana中管理權限(Management / Security / Roles 頁面)
如果你用native realm with Basic Authentication,你可以在Management / Security / Users 頁面指定角色或者用APIs。
第8步:授權用戶用Kibana工作的時候可以訪問哪些索引
(畫外音:你可以根據需要為Kibana用戶定義許多不同的角色)
第9步:檢查用戶是否可以正常登錄 http://localhost:5601
4.1. 配置項
xpack.security.enabled
設置為true(默認)以啟用X-Pack安全特性
xpack.security.cookieName
cookie的名字。默認是“sid”。
xpack.security.encryptionKey
用於加密cookie中的憑證的32個或更多字符的任意字符串。關鍵是這個密鑰不向Kibana的用戶公開。默認情況下,在內存中會自動生成一個值。如果使用這種默認行為,當Kibana重新啟動時,所有會話都將失效。
xpack.security.sessionTimeout
設置會話持續時間(以毫秒為單位)。默認情況下,會話保持活動狀態,直到瀏覽器關閉。
4.2. Kibana用戶身份認證
Kibana支持兩種認證機制:
- Basic Authentication
- SAML Single Sign-On
4.2.1. Basic Authentication
Basic Authentication在登錄Kibana時需要一個用戶名和密碼。默認它是啟用的,並且是基於Elasticsearch提供的 native realm
4.2.2. SAML Single Sign-On
SAML身份驗證允許用戶使用外部身份提供者(如Okta或Auth0)登錄Kibana。在Kibana中設置SAML之前,請確保在Elasticsearch中啟用和配置SAML。
更多參見 https://www.elastic.co/guide/en/kibana/current/kibana-authentication.html
4.3. User authentication(用戶認證)
為了訪問受保護的資源,一個用戶必須通過密碼、憑證、或者其它方式(通常是token)來證明他們的身份標識。
認證過程由一個或多個被稱為“realms”的認證服務來處理。
你可以用本機支持管理和認證用戶,或者集成外部的用戶管理系統(比如:LDAP 和 Active Directory)。
X-Pack安全特性提供了內置的realms,比如:native,ldap,active_directory,pki,file 和 saml。如果沒有一個內置realms滿足你的需求,你還可以構建自己的realm。
當啟用X-Pack安全特性時,根據你配置的realms,你必須將用戶憑證附加到發送到Elasticsearch的請求中。例如,當使用支持用戶名和密碼的realms時,你可以簡單的將basic auth頭信息添加到請求中。
4.4. 在Kibana管理后台界面中取管理用戶
5. 演示
5.1. kibana.yml
server.port: 5601 server.host: "192.168.101.5" elasticsearch.url: "http://localhost:9200" elasticsearch.username: "kibana" elasticsearch.password: "123456" xpack.security.enabled: true xpack.security.encryptionKey: "4297f44b13955235245b2497399d7a93"
5.2. elasticsearch.yml
xpack.security.enabled: true
5.3. 登錄
6. 其它相關鏈接
《Logstash》
《Filebeat》
《Kibana》