Shield是Elastic公司推出的商業權限管理插件,它能夠保護Elasticsearch中的數據,採用加密的通信密碼,基於角色的訪問控制,IP過濾和審計等。node
Shield是以Elasticsearch插件的形式存在的。安裝過程以下:數據庫
1) 在Elasticsearch中安裝Shield插件。安全
bin/plugin install license服務器
bin/plugin install shield網絡
2) 啓動Elasticsearch。app
bin/elasticsearchdom
3) 添加管理員帳號elasticsearch
bin/shield/esusers useradd es_admin -r admin測試
4) 測試是否生效加密
在頁面訪問數據的時候,會顯示如圖9.4所示的界面:
圖9.4 Shield登陸頁面
當輸入正確的帳戶和密碼的時候,才能夠訪問數據。
Shield是Elasticsearch的一個插件,一旦安裝完成,插件將會攔截全部API請求,而後對請求進行認證和受權的校驗。該插件同時提供SSL安全協議來傳輸網絡數據,該插件提供了審計日誌記錄的能力,用來進行驗證和審計。
Shield定義了一組已知的用戶,以便對請求的用戶進行身份驗證。這些用戶的集合被定義爲一個抽象的領域。這個抽象的領域能夠是數據庫,本地文件,LDAP,活動目錄或者KPI。
Shield的訪問受權的數據模型由如下幾個因素構成:
l 資源,包括集羣,索引,別名等。
l 權限,對資源的一個或者多個操做。
l 許可,對應安全資源的一個或者多個權限。有2種類型的許可:集羣和索引。
l 角色,權限的集合。
l 用戶,准許訪問資源的對象。
Shield可使用SSL / TLS包進行內部通訊。當SSL / TLS啓用,節點相互驗證的證書,創建節點之間的信任,驗證防止未經身份驗證的節點加入集羣,經過驗證後,內部通訊是通過加密的。
Shield提供基於IP的針對節點的訪問控制。經過IP控制能夠限制其餘機器訪問Elasticsearch服務器,能夠設置白名單或者黑名單進行過濾,能夠設置IP或者網段。
安全審計功能提供了訪問Elasticsearch特定事件或者活動的記錄,包括登陸,受權,拒絕訪問等。
系統支持如下幾種方式的用戶認證:
Native:一個內置的本地認證系統,默承認用。
File:一種內置的基於文件的認證系統,默承認用。
LDAP:經過外部輕量級目錄協議進行身份驗證。
AD:經過外部活動目錄服務的身份驗證。
PKI:經過使用可信的X.509證書的認證。
native, file, LDAP, AD這四種方式是用用戶密碼進行認證的。系統也支持自定義用戶認證方式,能夠多種認證方式同時存在,它本質上是一個配置的認證方式的優先列表。列表的順序決定了將要認證的順序。在認證過程當中,系統將嘗試一次驗證一個認證方式的請求。一旦一種認證方式認證成功,經過身份認證的用戶將與請求相關聯的(下一步繼續受權階段)。若是一個認證方式沒法對請求進行身份驗證,則將認證鏈中的下一個認證方式。若是鏈中全部服務器沒法驗證的要求,認證就失敗了,將返回錯誤(HTTP狀態代碼401)。
例以下面的代碼片斷配置認證鏈包含文件認證和本地服務器認證,以及兩個LDAP和Active Directory域服務器認證。
shield.authc:
realms:
native:
type: native
order: 0
file:
type: file
order: 1
ldap1:
type: ldap
order: 2
enabled: false
url: 'url_to_ldap1'
...
ldap2:
type: ldap
order: 3
url: 'url_to_ldap2'
...
ad1:
type: active_directory
order: 4
url: 'url_to_ad'
認證過程能夠分爲兩個階段:令牌提取和用戶認證。在第一階段(令牌提取階段),配置的服務器將請求嘗試從傳入的請求中提取/解析身份驗證令牌。找到身份驗證的令牌,而後將令牌用於認證。在沒有任何身份驗證令牌的狀況下,傳入的請求被認爲是匿名的。
默認狀況下,匿名請求被拒絕,並返回一個身份驗證錯誤碼(狀態代碼401)。能夠經過配置改變這種行爲,能夠經過在elasticsearch.yml文件中配置下面的內容:
shield.authc:
anonymous:
username: anonymous_user
roles: role1, role2
authz_exception: true
本地認證配置以下:
shield:
authc:
realms:
native1:
type: native
order: 0
能夠經過 Users API來完成本地認證用戶的管理。
l 增長本地用戶
POST /_shield/user/ironman
{
"password" : "j@rV1s",
"roles" : [ "admin", "other_role1" ],
"full_name" : "Tony Stark",
"email" : "tony@starkcorp.co",
"metadata" : {
"intelligence" : 7
}
}
l 查詢本地用戶列表
GET /_shield/user
返回的值:
{
"found" : true,
"users" : [
{
"username" : "ironman",
"roles" : [ "admin", "other_role1" ],
"full_name" : "Tony Stark",
"email" : "tony@starkcorp.co",
"metadata" : {
"intelligence" : 7
}
}
}
]
}
l 刪除本地用戶
DELETE /_shield/user/ironman
本文由賽克 藍德(secisland)原創,轉載請標明做者和出處。
能夠經過配置使用目錄訪問協議(LDAP)進行用戶認證。須要配置LDAP域和指定LDAP的角色在角色映射文件中。爲了保護密碼,和LDAP服務器之間的通訊必須使用SSL / TLS加密。客戶節點經過SSL / TLS鏈接到LDAP服務器須要LDAP服務器的證書或服務器的根CA證書安裝在本身的密鑰庫和信任存儲區中。在elasticsearch.yml中添加shield.authc.realms命名空間來進行配置,例如,下面的代碼片斷顯示了在LDAP中配置用戶認證:
shield:
authc:
realms:
ldap1:
type: ldap
order: 0
url: "ldaps://ldap.example.com:636"
bind_dn: "cn=ldapuser, ou=users, o=services, dc=example, dc=com"
bind_password: changeme
user_search:
base_dn: "dc=example,dc=com"
attribute: cn
group_search:
base_dn: "dc=example,dc=com"
files:
role_mapping: "CONFIG_DIR/shield/role_mapping.yml"
unmapped_groups_as_roles: false
配置用戶DN模板來進行LDAP認證
若是你的LDAP環境使用一些特定的標準命名條件的用戶,可使用用戶DN模板來配置。這種方法的優勢是搜索不必定是要找出用戶的DN。但多個綁定操做可能須要找到正確的用戶DN。例如:
shield:
authc:
realms:
ldap1:
type: ldap
order: 0
url: "ldaps://ldap.example.com:636"
user_dn_templates:
- "cn={0}, ou=users, o=marketing, dc=example, dc=com"
- "cn={0}, ou=users, o=engineering, dc=example, dc=com"
group_search:
base_dn: "dc=example,dc=com"
files:
role_mapping: "/mnt/elasticsearch/group_to_role_mapping.yml"
unmapped_groups_as_roles: false
配置LDAP組
存儲在每一個節點的角色映射文件指定了LDAP組。當一個用戶使用LDAP認證時,用戶所屬的組的角色定義了用戶的權限。例如,下面的映射配置指定了LDAP管理員組和普通用戶組:
monitoring:
- "cn=admins,dc=example,dc=com"
user:
- "cn=users,dc=example,dc=com"
- "cn=admins,dc=example,dc=com"
SSL / TLS加密配置
一、首先要生成證書:
cd CONFIG_DIR/shield
keytool -importcert -keystore node01.jks -file cacert.pem -alias ldap_ca
二、在elasticsearch.yml配置文件中配置SSL / TLS加密:
shield.ssl.keystore.path: /home/es/config/shield/node01.jks
shield.ssl.keystore.password: myPass
shield.ssl.keystore.key_password: myKeyPass
三、配置LDAPS協議指定的URL屬性和端口號。例如,url: ldaps://ldap.example.com:636。
四、重啓Elasticsearch使elasticsearch.yml生效。
能夠經過配置使用活動目錄(LDAP)進行用戶認證。須要配置LDAP域和指定LDAP的角色在角色映射文件中。爲了保護密碼,和LDAP服務器之間的通訊必須使用SSL / TLS加密。客戶節點經過SSL / TLS鏈接到LDAP服務器須要LDAP服務器的證書或服務器的根CA證書安裝在本身的密鑰庫和信任存儲區中。在elasticsearch.yml中添加shield.authc.realms命名空間來進行配置,例如,下面的代碼片斷顯示了在AD中配置用戶認證
shield:
authc:
realms:
active_directory:
type: active_directory
order: 0
domain_name: ad.example.com
url: ldaps://ad.example.com:636
unmapped_groups_as_roles: true
AD認證的不少內容和上一節的LDAP基本同樣,其餘內容請參考上一節。
您以配置使用公共密鑰基礎設施(PKI)證書對用戶進行身份驗證。這要求客戶提供X.509證書。能夠結合使用PKI認證和用戶名/密碼認證。例如,能夠啓用SSL / TLS在傳輸層上使用一個PKI驗證的X.509證書,同時還驗證HTTP協議使用的用戶名和密碼。還能夠設置shield.transport.ssl.client.auth容許客戶無證書認證等。在elasticsearch.yml中添加shield.authc.realms命名空間來進行配置,例如:
shield:
authc:
realms:
pki1:
type: pki
爲PKI用戶分配角色
分配給PKI用戶的角色映射文件存儲在每一個節點。在證書中能夠區分不一樣的用戶。例如,下面的映射配置指定John Doe的用戶角色:
user:
- "cn=John Doe,ou=example,o=com"
能夠管理和認證基於文件的認證,它是系統內容的認證方式,能夠經過esusers控制檯命令來增長和刪除用戶,分配用戶角色,管理用戶密碼。在elasticsearch.yml中添加shield.authc.realms命名空間來進行配置,例如:
shield:
authc:
realms:
file1:
type: file
order: 0
用戶管理命令在ES_HOME/bin/shield目錄下:
l 增長用戶
增長用戶:esusers useradd <username>
增長用戶同時設置密碼:esusers useradd <username> -p <secret>
增長用戶同時設置角色:esusers useradd <username> -r <comma-separated list of role names>
l 查詢用戶
esusers list
l 管理密碼
esusers passwd <username> -p <password>
l 用戶分配角色
用-a增長角色,-r刪除角色。
esusers roles <username> -a <commma-separate list of roles> -r <commma-separate list of roles>
l 刪除用戶
userdel <username>
賽克藍德(secisland)後續會逐步對Elasticsearch的最新版本的各項功能進行分析,近請期待。也歡迎加入secisland公衆號進行關注。