由於在版本7開始,x-pack可以免費使用了,但是許可權控制免費的不夠細,但是控制到索引級別都基本夠用了。付費的可以體驗更細緻的許可權控制。本文的基礎是已經有了es叢集的基礎上進行的。
官網:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/secure-cluster.html
一、叢集許可權配置
假設你已經安裝了elasticsearch7.8的叢集,並且能夠正常的執行。接下就是來配置許可權;
在elasticsearch.yml配置檔案中新增(每個節點):
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
然後在一臺節點上執行:
注意:如下操作都統一使用預設的命名:如下內容可參考官網:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/configuring-tls.html
- ./bin/elasticsearch-certutil ca #建立叢集認證機構,需要互動輸入密碼
- ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 #為節點頒發證書,與上面密碼一樣
- 執行./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password 並輸入第一步輸入的密碼
- 執行./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password 並輸入第一步輸入的密碼
- 將生成的elastic-certificates.p12、elastic-stack-ca.p12檔案移動到config目錄下
最後把elastic-certificates.p12、elastic-stack-ca.p12、elasticsearch.keystore三個檔案複製到其他的節點的config目錄下,啟動es。然後去登陸es的時候就需要密碼了。接下設定內建使用者的密碼:
設定內建密碼可參考官網:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/setup-passwords.html
然後./bin/elasticsearch-setup-passwords interactive 配置預設使用者的密碼:(有如下的互動),可以使用auto自動生成
[test@lgh01 elasticsearch-7.8.1]$ ./bin/elasticsearch-setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]yes
Did not understand answer 'yes'
Please confirm that you would like to continue [y/N]y
Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana_system]:
Reenter password for [kibana_system]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]
做完如上的操作就完成了一些特定賬號的密碼設定:比如elastic超級管理員的密碼,這樣就可以對許可權進行管理了,到這裡為止,就可以去通過elastic使用者去登陸es叢集了,elastic使用者時超級使用者,在開發的過程中不建議使用,所以需要自己管理和配置角色和使用者,請繼續看下文
二、使用者和角色管理
許可權控制:主要是先把許可權賦給角色,該角色就擁有了賦有的許可權了,然後指定使用者為該角色,這樣該使用者也就有了該角色的許可權。大概可以理解為,許可權和使用者之間的橋樑就是角色,把不同的許可權賦給角色,然後把使用者對應什麼樣子的角色就有該角色的許可權。
2.1、Security privileges(許可權管理)
可參考官網:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/security-privileges.html
許可權這裡分為叢集的許可權和索引的許可權,叢集許可權有所有的許可權,有快照的許可權,管理許可權,監控許可權等。索引許可權有建立,刪除,讀,寫等許可權。這裡我大概列一些出來,更具體還是檢視官網比較合適:
部分叢集許可權如下:
叢集許可權 |
描述 |
all |
所有群集管理操作,例如快照,節點關閉/重新啟動,設定更新,重新路由或管理使用者和角色 |
create_snapshot |
為現有儲存庫建立快照的特權。也可以列出和檢視有關現有儲存庫和快照的詳細資訊 |
manage |
建立monitor並新增更改群集中值的群集操作。這包括快照,更新設定和重新路由。它還包括獲取快照和還原狀態。此特權不包括管理安全性的能力 |
monitor |
所有群集只讀操作,例如群集執行狀況和狀態,熱執行緒,節點資訊,節點和群集統計資訊以及待處理的群集任務 |
部分索引許可權如下:
all |
對索引的任何操作 |
create |
索引檔案的許可權。還授予對更新對映操作的訪問許可權。 |
delete |
刪除檔案的許可權 |
create_index |
建立索引的許可權。建立索引請求可能包含要在建立索引後新增到索引的別名 |
delete_index |
刪除索引的許可權 |
manage |
所有monitor特權以及索引管理(別名,分析,快取清除,關閉,刪除,存在,重新整理,對映,開啟,強制合併,重新整理,設定,搜尋分片,模板,驗證) |
monitor |
監視所需的所有操作(恢復,段資訊,索引統計資訊和狀態) |
read |
對後面這些操作只讀訪問(計數,解釋,獲取,管理,獲取索引指令碼,諸如此類,多過濾/搜尋/術語向量,過濾,滾動,clear_scroll,搜尋) |
write |
具有對文件執行所有寫操作的特權,包括對文件進行索引,更新和刪除以及執行批量操作的許可權。還授予對更新對映操作的訪問許可權。 |
2.2、role(角色)介紹和操作
elasticsearch7內建了很多角色,可以檢視官網:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/built-in-roles.html
但是很多內建角色都不是我們想要的,每個公司的需求都是不一樣,如果叢集很小,則可以簡單控制許可權就可以,如果叢集大,使用者多,則需要比較細粒度的控制許可權,所以我們要根據自己的需求定義自己的所要的角色 。角色的配置有兩種方式,一種是介面的操作(kibana方式),這樣就傻瓜式的操作,很簡單。還有就是通過API的方式控制許可權,這樣的話需要花點時間熟悉下,操作相對來說複雜點,但是不需要額外的kibana。這裡兩種方式都簡單介紹下。
方式一(kibana方式):
1、登入kibana
2、點選role
3、點選新建
4、配置許可權
到這裡為止通過kibana方式配置role的步驟就完了,很簡單的,下面介紹API的方式
方式二(API)
可參考官網:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/security-api-put-role.html
配置語法:
{
"run_as": [ ... ],
"cluster": [ ... ],
"global": { ... },
"indices": [ ... ],
"applications": [ ... ]
}
其實使用基本的配置就可以了,這裡我們只用到cluster和indices這兩種,其他的可參考官網的配置方式,根據需求配置即可。
例如配置一個名為testb的role,叢集許可權為monitor,索引只有對test-開頭的索引有隻讀許可權:
post _security/role/testb
{
"cluster": [ "monitor" ],
"indices": [
{
"names": [ "test-*" ],
"privileges": [ "read" ]
}
]
}
其實多去試試,也很簡單的。
2.3、user(使用者)介紹和操作
elasticsearch7內建了很多使用者,還記得前面那步設定密碼就是給裡面的內建使用者配置密碼,詳細的內建使用者參考官網:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/built-in-users.html
在日常es開發中,內建使用者基本不使用,所以主要自定義使用者,自定義使用者也同樣有兩種方式,同樣是kibana和API方式,這兩種方式也很簡單。
方式一(kibana方式)
1、登入kibana,點選users,然後點選新建
2、配置使用者的基本資訊和指定配置的角色
傻瓜式的操作,是真的很簡單,不過還是要熟悉裡面的role到底有什麼樣子的許可權
方式二(API方式)
詳情可參考官網:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/security-api-put-user.html
put _security/user/tony
{
"password": "j@rV1s",
"roles": [
"test1"
],
"full_name": "tony",
"email": "jacknich@example.com",
"metadata": {
"intelligence": 7
}
}
到這裡,role和user的基本建立就介紹完了,如果想知道更多role和user相關的操作請見官網:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/security-api.html
三、簡單許可權規劃
話說知道了叢集許可權配置、role和user的基本用法,那如何根據需求控制許可權呢?這些都是根據實際情況確定的,因為使用者配置有很多,也支援ldap,這裡只是用了最簡單的方式,若想超級細粒度或者ldap方式或者其他方式對許可權進行控制,最好去研究下官網,本文說的很簡單,只是對基本的許可權的控制。設計都是基於現有的業務場景或者使用者的數量,或者是叢集的規模確定許可權是否細粒度。所以這裡僅提供下個人的思考。
背景:這裡是一個比較小的叢集,10+個資料節點,使用者數量很少,也沒有多種業務,一個叢集就一種,所以控制起來也很簡單,這裡對索引做了一個強制的命名規範:{開頭:固定的寫方}-{業務種類}-{業務名稱}-{版本},這些都可以體現在許可權控制裡面。
根據如上情況,相關角色規劃如下:
角色 |
描述 |
超級管理員角色(superuser) |
叢集索引全部許可權 |
索引管理角色(indexrole) |
只負責test開頭的索引全部許可權,還有叢集的讀許可權 |
讀寫角色(writerole) |
只有讀寫test開頭的全部索引許可權,還有叢集的讀許可權 |
只讀角色(readrole) |
只讀test開頭的全部索引許可權,還有叢集的讀許可權 |
備份角色(snapshotrole) |
負責所有索引的快照建立,進行備份 |
相關使用者規劃如下:
使用者 |
角色 |
描述 |
elastic |
superuser |
超級管理員:正常情況下不允許使用 |
snapshot |
snapshotrole |
負責所有索引的快照備份 |
es_index |
indexrole |
只負責test開頭的索引全部許可權,還有叢集的讀許可權 |
es_write |
writerole |
只有讀寫test開頭的全部索引許可權,還有叢集的讀許可權 |
es_read |
readrole |
只讀test開頭的全部索引許可權,還有叢集的讀許可權 |
建議大家多去看官網,畢竟那裡才是更全更詳細的,寫部落格很難面面俱到,只能說僅供參考