主要配置文件
searchguard 主要有5個配置文件,在plugins/search-guard-2/sgconfig 下:
1、sg_config.yml:主配置文件不需要做改動。
2、sg_internal_users.yml:本地用戶文件,定義用戶密碼以及對應的權限。
3、sg_roles.yml:權限配置文件
4、sg_roles_mapping.yml:定義用戶的映射關系
5、sg_action_groups.yml:定義權限
使用sgadmin配置SearchGuard
Searchguard配置(包括用戶、權限與角色)是存儲在Elasticsearch集群的索引中的。這允許配置熱加載,更新配置后不需要重啟Elasticsearch節點,并且不需要在每個節點上放置配置文件。
使用sgadmin工具將配置文件中的配置信息加載到searchguard配置索引中。sgadmin需要通過管理員證書來執行命令。管理員證書授予對集群的完全訪問權限,包括更改Search Guard配置索引。
需要在elasticsearch.yml中配置管理員證書DN,如:
searchguard.authcz.admin_dn:
- CN=kirk,OU=client,O=client,L=test, C=DE
- CN=spock,OU=client,O=client,L=test, C=DE
注意:不要使用節點證書作為管理員證書,不然可能導致意外的結果。
使用命令如下:
./sgadmin.sh -ts <path/to/truststore> -tspass <truststore password> \
-ks <path/to/keystore> -kspass <keystore password> \
-cd ../sgconfig -icl -nhnv
這樣將sgconfig目錄中的所有配置信息推送到集群。由于生成密鑰庫和信任庫具有默認密碼changeit,所以我們可以省略-kspass并-tspass。
讓配置立即生效
searchguard默認將通過身份認證的用戶、角色及權限緩存一個小時,若更新配置后想立即生效,可使用如下命令:
./sgadmin.sh -rl -ts ... -tspass ... -ks ... -kspass ...
命令行詳細參數請參考:http://floragunncom.github.io/search-guard-docs/sgadmin.html
配置認證和授權
searchguard配有可插拔的認證和授權模塊。根據用例和基礎架構,您可以使用一個或多個身份驗證和授權模塊,如:
Search Guard內部用戶數據庫
LDAP和Active Directory
Kerberos
JSON Web令牌
代理驗證
認證和授權模塊的主要配置文件是sg_config.yml。詳細配置請參考:http://floragunncom.github.io/search-guard-docs/configuration_auth.html
配置內部用戶與角色
searchguard配置有內部用戶數據庫。如果我們沒有任何外部認證系統(如LDAP或Active Directory),則可以使用此用戶數據庫。用戶、密碼hash和角色等存儲在集群內部searchguard配置索引中。內部用戶配置文件為:sg_internal_users.yml
語法如下:
<username>:
hash: <hashed password>
roles:
- <rolename>
- <rolename>
如:
admin:
hash: $2a$12$xZOcnwYPYQ3zIadnlQIJ0eNhX1ngwMkTN.oMwkKxoGvDVPn4/6XtO
roles:
- readall
- writeall
analyst:
hash: $2a$12$ae4ycwzwvLtZxwZ82RmiEunBbIPiAmGZduBAjKN0TXdwQFtCwARz2
roles:
- readall
請注意,用戶名不能包含“.”,如果需要帶“.”的用戶名,請使用如下username屬性:
<username>:
username: username.with.dots
hash: ...
使用plugins/search-guard-5/tools/hash.sh生成密碼hash值,格式如下:
./hash.sh -p passwd
實例:
[root@localhost tools]$ ./hash.sh -p 123456
$2a$12$BUflGkOD5bpHePu1uTTTh.wXYJ8fLRku05zFqDHdglNgqekNWITK2
詳細參考:http://floragunncom.github.io/search-guard-docs/configuration_internalusers.html
將用戶、后端角色與主機映射到searchguard角色
根據配置,可以使用以下數據將請求分配給一個或多個searchguard角色:
username
已驗證用戶的名稱
backend roles
由授權后端(如LDAP,JWT或內部用戶數據庫)獲取的角色
hostname / IP
請求源自的主機名或IP
Common name
發送的客戶端證書DN
配置文件為sg_roles_mapping.yml,配置格式如下:
<Search Guard role name>:
users:
- <username>
- ...
backendroles:
- <rolename>
- ...
hosts:
- <hostname>
- ...
實例:
sg_read_write:
users:
- janedoe
- johndoe
backendroles:
- management
- operations
- 'cn=ldaprole,ou=groups,dc=example,dc=com'
hosts:
- "*.devops.company.com"
一個請求可以分配給一個或多個Search Guard角色。如果一個請求被映射到多個角色,這些角色的權限被組合。
角色與權限
searchguard角色與權限在sg_roles.xml文件中定義。我們可以根據需要定義角色,并將權限與其關聯,格式如下:
<sg_role_name>:
cluster:
- '<action group or single permission>'
- ...
indices:
'<indexname or alias>':
'<document type>':
- '<action group or single permission>'
- ...
'<document type>':
- '<action group or single permission>'
- ...
_dls_: '<Document level security query>'
_fls_:
- '<field level security fiels>'
- ...
tenants:
<tenantname>: <RW|RO>
<tenantname>: <RW|RO>
dls與fls用于配置文檔和字段級別權限,詳情參考:http://floragunncom.github.io/search-guard-docs/dlsfls.html
tenants用于配置Kibana多租戶模式,詳情參考:http://floragunncom.github.io/search-guard-docs/multitenancy.html
集群級權限
cluster用于定義集群級權限。集群級權限用于允許/不允許影響整個集群的操作,例如查詢集群運行狀況或節點統計信息。它也可以用來允許/禁用影響多個索引的操作,如mget、msearch、bulk請求。
實例:
sg_finance:
cluster:
- CLUSTER_COMPOSITE_OPS_RO
indices:
...
索引級權限
indices項用于設置允許/不允許單個索引的操作。也可以分別為索引中的每個文檔類型定義權限。
配置索引名稱與文檔類型名稱時都支持通配符的形式:
- 星號(*)將匹配任意字符序列,包括空序列,如:logstash-*將匹配logstash-20170822、logstash-等
- 問號(?)將匹配任何單個字符(但不是空字符),如:?kibana將匹配.kibana
- 正則表達式,格式'/<java regex>/',如:'/ \ S * /'將匹配任何非空格字符
注意:索引名稱不能包含點。而是使用?通配符,如同?kibana。
實例:
sg_kibana:
cluster:
- CLUSTER_COMPOSITE_OPS_RO
indices:
'?kibana':
'*':
- INDICES_ALL
用戶名替換
對于索引名及別名<indexname or alias>允許引用用戶名${user_name},用戶名為已認證用戶用戶名。實例:
sg_own_index:
cluster:
- CLUSTER_COMPOSITE_OPS
indices:
'${user_name}':
'*':
- INDICES_ALL
使用權限組分配權限
searchguard具有權限組的功能,且為給角色分配權限的首選方式。searchguard預定義了一批權限組,覆蓋了絕大部分用例。實例:
myrole:
cluster:
- CLUSTER_COMPOSITE_OPS_RO
indices:
'index1':
'*':
- SEARCH
'index2':
'*':
- CRUD
使用單一權限
如果您需要應用更細粒度的權限模式,searchguard還支持為角色分配單個權限。
單一權限以cluster:或indices:開始,后跟REST風格的路徑,進一步定義權限授權訪問的確切操作。
例如,此權限將授予在索引上執行搜索的權限:
indices:data/read/search
如下限授予寫入索引的權限:
indices:data/write/index
如下在集群上授予顯示集群運行狀況的權限:
cluster:monitor/health
單一權限也支持通配符,如下授予索引上所有管理操作權限:
indices:admin/*
Elasticsearch詳細權限定義請參考:https://www.elastic.co/guide/en/shield/2.1/reference.html#ref-actions-list
預定義角色請參考:http://floragunncom.github.io/search-guard-docs/configuration_roles_permissions.html
使用與定義權限組
一個權限組是一個具有明確命名的權限集合,在文件sg_action_group.xml中定義。權限組可以嵌套定義。格式如下:
<action group name>:
- '<permission or action groups>'
- '<permission or action group>'
- ...
預定義權限組請參考:http://floragunncom.github.io/search-guard-docs/configuration_action_groups.html