目錄
對Elasticsearch和Active Directory之間的通信進行加密
為了保護發(fā)送給身份驗證的用戶憑據(jù)痊剖,強烈建議對Elasticsearch和Active Directory服務(wù)器之間的通信進行加密。通過SSL/TLS連接可以確保Active Directory服務(wù)器的身份在X-Pack安全傳輸用戶憑據(jù)之前得到驗證,并在傳輸過程中對用戶名和密碼進行加密余掖。
通過SSL/TLS連接到Active Directory服務(wù)器的客戶機和節(jié)點需要將Active Directory服務(wù)器的證書或服務(wù)器的根CA證書安裝在它們的密鑰存儲庫或信任存儲庫中田篇。
1、在elasticsearch.yml文件中為xpack.security.authc.realms命名空間創(chuàng)建域配置兴革。參見 Configuring an Active Directory realm绎晃。
2、在領(lǐng)域配置中設(shè)置url屬性杂曲,以指定LDAPS協(xié)議和安全端口號庶艾。例如,url: ldaps://ad.example.com:636
3擎勘、將每個節(jié)點配置為信任證書頒發(fā)機構(gòu)(CA)簽署的證書落竹,該證書簽署了Active Directory server證書。
下面的示例演示如何信任位于配置目錄中的CA證書(cacer .pem):
xpack:
security:
authc:
realms:
active_directory:
type: active_directory
order: 0
domain_name: ad.example.com
url: ldaps://ad.example.com:636
ssl:
certificate_authorities: [ "ES_PATH_CONF/cacert.pem" ]
CA證書必須是PEM編碼的證書货抄。
有關(guān)這些設(shè)置的更多信息述召,參見Active Directory realm settings
4、重啟Elasticsearch
注意:默認情況下蟹地,當您使用SSL/TLS配置X-Pack安全性以連接到Active Directory時积暖,X-Pack安全性嘗試使用證書中的值驗證域配置中的url屬性指定的主機名或IP地址。如果證書和域配置中的值不匹配怪与,X-Pack安全性不允許連接到Active Directory服務(wù)器夺刑。這樣做是為了防止中間人的攻擊。如果需要分别,可以通過設(shè)置ssl.verification_mode屬性為certificate禁用此行為遍愿。
對Elasticsearch和LDAP之間的通信進行加密
為了保護發(fā)送到LDAP域中進行身份驗證的用戶憑據(jù),強烈建議加密Elasticsearch和LDAP服務(wù)器之間的通信耘斩。通過SSL/TLS連接可以確保在X-Pack安全傳輸用戶憑證和加密連接內(nèi)容之前驗證LDAP服務(wù)器的身份沼填。通過TLS連接到LDAP服務(wù)器的客戶機和節(jié)點需要將LDAP服務(wù)器的證書或服務(wù)器的根CA證書安裝在它們的密鑰存儲庫或信任存儲庫中。
更多信息括授,參見Configuring an LDAP realm
1坞笙、在每個節(jié)點上配置域的TLS設(shè)置岩饼,以信任由簽署LDAP服務(wù)器證書的CA簽名的證書。下面的示例演示如何信任位于X-Pack配置目錄中CA證書cacert.pem:
xpack:
security:
authc:
realms:
ldap1:
type: ldap
order: 0
url: "ldaps://ldap.example.com:636"
ssl:
certificate_authorities: [ "ES_PATH_CONF/cacert.pem" ]
CA證書必須是PEM編碼的薛夜。
*注意:您還可以指定單個服務(wù)器證書籍茧,而不是CA證書,但是只有在您擁有單個LDAP服務(wù)器或證書是自簽名的情況下梯澜,才建議這樣做寞冯。
2、在領(lǐng)域配置中設(shè)置url屬性晚伙,以指定LDAPS協(xié)議和安全端口號吮龄。例如,url: ldaps://ldap.example.com:636
3撬腾、重啟Elasticsearch螟蝙。
注意:默認情況下,當您使用SSL/TLS配置X-Pack安全性以連接到LDAP服務(wù)器時民傻,X-Pack安全性嘗試使用證書中的值驗證域配置中的url屬性指定的主機名或IP地址胰默。如果證書和領(lǐng)域配置中的值不匹配,X-Pack安全性不允許連接到LDAP服務(wù)器漓踢。這樣做是為了防止中間人的攻擊牵署。如果需要,可以通過設(shè)置ssl.verification_mode屬性為certificate禁用此行為喧半。
在一個ELasticsearch Docker容器中加密通信
從版本6.0.0開始奴迅,X-Pack安全性(黃金用戶、白金用戶或企業(yè)訂閱)要求傳輸網(wǎng)絡(luò)層使用SSL/TLS加密挺据。
本節(jié)演示了一個使用Elasticsearch Docker映像為HTTPS和傳輸啟動SSL/TLS的簡單方法取具。該示例使用Docker組合來管理容器。
更多細節(jié)扁耐,請參考Encrypting Communications和available subscriptions
準備環(huán)境
Install Elasticsearch with Docker
在一個新的空目錄中暇检,創(chuàng)建以下四個文件:
instances.yml:
instances:
- name: es01
dns:
- es01#1
- localhost
ip:
- 127.0.0.1
- name: es02
dns:
- es01
- localhost
ip:
- 127.0.0.1
#1
:允許使用嵌入式Docker DNS服務(wù)器名稱
.env:
CERTS_DIR=/usr/share/elasticsearch/config/certificates
#1
ELASTIC_PASSWORD=PleaseChangeMe#2
#1
:Docker映像中的路徑,希望在其中找到證書婉称。
#2
:elastic用戶的初始密碼块仆。
create-certs.yml:
version: '2.2'
services:
create_certs:
container_name: create_certs
image: docker.elastic.co/elasticsearch/elasticsearch:6.5.3
command: >
bash -c '
if [[ ! -d config/certificates/certs ]]; then
mkdir config/certificates/certs;
fi;
if [[ ! -f /local/certs/bundle.zip ]]; then
bin/elasticsearch-certgen --silent --in config/certificates/instances.yml --out config/certificates/certs/bundle.zip;
unzip config/certificates/certs/bundle.zip -d config/certificates/certs;#1
fi;
chgrp -R 0 config/certificates/certs
'
user: ${UID:-1000}
working_dir: /usr/share/elasticsearch
volumes: ['.:/usr/share/elasticsearch/config/certificates']
#1
:新的節(jié)點證書和CA證書+密鑰放在本地目錄certs下。
docker-compose.yml:
version: '2.2'
services:
es01:
container_name: es01
image: docker.elastic.co/elasticsearch/elasticsearch:6.5.3
environment:
- node.name=es01
- discovery.zen.minimum_master_nodes=2
- ELASTIC_PASSWORD=$ELASTIC_PASSWORD `#1`
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- xpack.license.self_generated.type=trial `#2`
- xpack.security.enabled=true
- xpack.security.http.ssl.enabled=true
- xpack.security.transport.ssl.enabled=true
- xpack.security.transport.ssl.verification_mode=certificate `#3`
- xpack.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.ssl.certificate=$CERTS_DIR/es01/es01.crt
- xpack.ssl.key=$CERTS_DIR/es01/es01.key
volumes: ['esdata_01:/usr/share/elasticsearch/data', './certs:$CERTS_DIR']
ports:
- 9200:9200
healthcheck:
test: curl --cacert $CERTS_DIR/ca/ca.crt -s https://localhost:9200 >/dev/null; if [[ $$? == 52 ]]; then echo 0; else echo 1; fi
interval: 30s
timeout: 10s
retries: 5
es02:
container_name: es02
image: docker.elastic.co/elasticsearch/elasticsearch:6.5.3
environment:
- node.name=es02
- discovery.zen.minimum_master_nodes=2
- ELASTIC_PASSWORD=$ELASTIC_PASSWORD
- discovery.zen.ping.unicast.hosts=es01
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- xpack.license.self_generated.type=trial
- xpack.security.enabled=true
- xpack.security.http.ssl.enabled=true
- xpack.security.transport.ssl.enabled=true
- xpack.security.transport.ssl.verification_mode=certificate
- xpack.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.ssl.certificate=$CERTS_DIR/es02/es02.crt
- xpack.ssl.key=$CERTS_DIR/es02/es02.key
volumes: ['esdata_02:/usr/share/elasticsearch/data', './certs:$CERTS_DIR']
wait_until_ready:
image: docker.elastic.co/elasticsearch/elasticsearch:6.5.3
command: /usr/bin/true
depends_on: {"es01": {"condition": "service_healthy"}}
volumes: {"esdata_01": {"driver": "local"}, "esdata_02": {"driver": "local"}}
#1
:用.env中的密碼引導elastic王暗。參見 the Elastic Bootstrap Password
#2
:自動生成和應(yīng)用試用版訂閱悔据,以啟用X-Pack安全性。
#3
:禁用節(jié)點間通信的真實性驗證俗壹。允許創(chuàng)建自簽名證書科汗,而無需固定特定的內(nèi)部IP地址。
運行這個例子
1策肝、生成證書(只需要一次):
docker-compose -f create-certs.yml up
2肛捍、啟動為SSL/TLS配置的兩個Elasticsearch節(jié)點:
docker-compose up -d
3隐绵、通過SSL/TLS使用引導密碼訪問Elasticsearch API:
curl --cacert certs/ca/ca.crt -u elastic:PleaseChangeMe https://localhost:9200
4之众、elasticsearch-setup-passwords工具可以用來為所有用戶生成隨機密碼:
警告:不運行PowerShell的Windows用戶需要刪除下面代碼片段中的\
和連接線拙毫。
docker exec es01 /bin/bash -c "bin/elasticsearch-setup-passwords
auto --batch
-Expack.ssl.certificate=certificates/es01/es01.crt
-Expack.ssl.certificate_authorities=certificates/ca/ca.crt
-Expack.ssl.key=certificates/es01/es01.key
--url https://localhost:9200"
為更強的加密啟用密碼套件
TLS和SSL協(xié)議使用一個密碼套件來確定用于保護數(shù)據(jù)的加密強度。您可能希望在使用Oracle JVM時增強加密的強度棺禾;IcedTea OpenJDK沒有這些限制缀蹄。成功使用加密通信此步驟不是必須的。
Java加密擴展(JCE)無限制強度管轄策略文件允許在需要添加到Java安裝中的單獨JAR文件中為Java使用額外的密碼套件膘婶。您可以從Oracle的下載頁面下載這個JAR文件缺前。密鑰長度大于128位的加密需要JCE無限強度管轄策略文件,如256位AES加密悬襟。
安裝之后衅码,JCE中的所有密碼套件都可以使用,但是需要配置才能使用它們脊岳。要啟用具有X-Pack安全性的更強的密碼套件逝段,請配置cipher_suites參數(shù)。具體參數(shù)信息割捅,參見 Default TLS/SSL settingsedit奶躯。
注意:必須在集群中的所有節(jié)點上安裝JCE Unlimited Strength管轄策略文件,以提高加密強度亿驾。
分離節(jié)點到節(jié)點和客戶端流量編輯
Elasticsearch具有所謂TCP傳輸配置文件的特性嘹黔,允許它綁定到多個端口和地址。X-Pack安全性擴展了這個功能莫瞬,通過支持節(jié)點到節(jié)點的傳輸流與客戶機傳輸流的分離儡蔓,增強集群的安全性。如果客戶機傳輸流量不受信任疼邀,并且可能是惡意的喂江,那么這一點非常重要。要將節(jié)點到節(jié)點的流量與客戶端流量分離檩小,請將以下內(nèi)容添加到elasticsearch.yml:
transport.profiles.client:
#1
port: 9500-9600#2
xpack.security:
type:client#3
#1
:client是這個示例概要文件的名字
#2
:端口范圍將用于傳輸客戶機與此集群的通信
#3
:將概要文件分類為client开呐。通過拒絕來自該概要文件的內(nèi)部集群操作(例如,碎片級動作和ping請求)的請求嘗試规求,這可以解釋額外的安全篩選筐付。
如果您的環(huán)境支持,可以通過向elasticsearch.yml中添加以下內(nèi)容阻肿,將內(nèi)部網(wǎng)絡(luò)用于節(jié)點到節(jié)點的流量瓦戚,并將公共網(wǎng)絡(luò)用于客戶端流量:
transport.profiles.default.bind_host: 10.0.0.1
#1
transport.profiles.client.bind_host: 1.1.1.1#2
#1
:用于節(jié)點到節(jié)點通信的網(wǎng)絡(luò)的綁定地址
#2
:用于客戶端通信的網(wǎng)絡(luò)的綁定地址
如果沒有獨立的網(wǎng)絡(luò),則可以啟用IP過濾來限制對概要文件的訪問丛塌。
當使用SSL進行傳輸時较解,還可以通過向elasticsearch.yml中添加以下內(nèi)容來為客戶機通信使用另一組證書:
transport.profiles.client.xpack.security.ssl.truststore:
path: /path/to/another/truststore#1
password: x-pack-test-password#2
transport.profiles.client.xpack.security.ssl.keystore:
path: /path/to/another/keystore#3
password: x-pack-test-password#4
#1
:另一個信任存儲庫的路徑
#2
:其對應(yīng)的密碼
#3
:另一個秘鑰存儲庫路徑
#4
:其對應(yīng)的密碼
要更改傳輸客戶機需要證書的默認行為畜疾,請在elasticsearch.yml文件中設(shè)置以下值:
transport.profiles.client.xpack.security.ssl.client_authentication: none
此設(shè)置使證書身份驗證對于節(jié)點到節(jié)點的通信保持活動狀態(tài),但是取消了向傳輸客戶機分發(fā)簽名證書的要求印衔。更多信息啡捶,參見Configuring the Transport Client to work with a Secured Cluster。
配置Active Directory域
您可以配置X-Pack安全性來與Active Directory通信以驗證用戶奸焙。要與Active Directory集成瞎暑,需要配置active_directory領(lǐng)域,并將Active Directory用戶和組映射到角色映射文件中的X-Pack安全角色与帆。
有關(guān)Active Directory領(lǐng)域的更多信息了赌,參見 Active Directory User Authentication。
1.在elasticsearch.yml文件中在xpack.security.authc.realms命名空間下玄糟,增加active_directory類型的域配置勿她。在最低限度上, 你必須設(shè)置域的type為active_directory并且指定Active Directory的domain_name阵翎。如果你正在配置多個域逢并,您還應(yīng)該顯式地設(shè)置order屬性,以控制在身份驗證期間查詢領(lǐng)域的順序贮喧。
參考 Active Directory realm settings查看你可以為active_directory域設(shè)置的所有選項筒狠。
注意: 如果域名沒有映射到DNS中,則綁定到Active Directory失敗箱沦。如果Windows DNS服務(wù)器不提供DNS辩恼,請在本地/etc/hosts文件中添加該域的映射。
例如谓形,以下領(lǐng)域配置配置X-Pack security連接ldaps://example.com:636灶伊,通過Active Directory對用戶進行身份驗證:
xpack:
security:
authc:
realms:
active_directory:
type: active_directory
order: 0#1
domain_name: ad.example.com
url: ldaps://ad.example.com#2
#1
:領(lǐng)域順序控制在對用戶進行身份驗證時檢查配置的領(lǐng)域的順序。
#2
:如果不指定URL寒跳,默認為ladp:<domain_name>:389.
重要當您在elasticsearch.yml中配置領(lǐng)域時聘萨,只有您指定的領(lǐng)域用于身份驗證。如果您還想使用本機或文件領(lǐng)域童太,則必須在領(lǐng)域鏈中包含它們米辐。
2、如果在一個林中跨多個域?qū)τ脩暨M行身份驗證书释,則需要額外的步驟翘贮。在配置和用戶身份驗證方式方面有一些細微的差異。
將設(shè)置domain_name設(shè)置項為森林根域名爆惧。
您還必須設(shè)置url設(shè)置狸页,因為您必須根據(jù)全局編錄進行身份驗證,全局編錄使用不同的端口扯再,可能不會在每個域控制器上運行芍耘。
例如址遇,以下領(lǐng)域配置配置X-Pack安全性,以連接到全局編錄端口上的特定域控制器斋竞,域名設(shè)置為forest根:
xpack:
security:
authc:
realms:
active_directory:
type: active_directory
order: 0
domain_name: example.com#1
url: ladps://dc1.ad.example.com:3269, ldaps://dc2.ad.example.com:3269#2
load_balance:
type: "round_robin"#3
#1
:domain_name設(shè)置為林中根域的名稱倔约。
#2
:本例中使用的url值包含兩個不同域控制器的url,這兩個域控制器也是全局編錄服務(wù)器窃页。端口3268是與全局編錄進行未加密通信的默認端口;端口3269是SSL連接的默認端口跺株。正在連接的服務(wù)器可以位于林中的任何域复濒,只要它們也是全局編錄服務(wù)器脖卖。
#3
:在選擇要連接的服務(wù)器時,提供了負載平衡設(shè)置來指示所需的行為巧颈。
在此配置中畦木,用戶需要使用完整用戶主體名稱(UPN)或低級登錄名稱。UPN通常是用戶名與@<DOMAIN_NAME>的連接例如johndoe@ad.example.com砸泛。下一級登錄名是NetBIOS域名十籍,后面是一個**和用戶名,如AD\johndoe
唇礁。使用低級登錄名需要連接到常規(guī)LDAP端口(389或636)勾栗,以便查詢配置容器以從NetBIOS名稱檢索域名。
3盏筐、(可選的)配置X-Pack安全性應(yīng)該如何與多個Active Directory服務(wù)器交互围俘。
load_balance.type設(shè)置可以在領(lǐng)域級別使用。支持兩種操作模式:故障轉(zhuǎn)移和負載平衡琢融。參見:Active Directory realm settings
4界牡、(可選的)保護密碼,參見encrypt communications between Elasticsearch and the Active Directory server
5漾抬、重啟Elasticsearch
6宿亡、配置綁定用戶。
Active Directory領(lǐng)域使用LDAP綁定請求對用戶進行身份驗證纳令。默認情況下挽荠,所有LDAP操作都由X-Pack安全性正在驗證的用戶運行。在某些情況下平绩,普通用戶可能無法訪問Active Directory中的所有必需項圈匆,需要綁定用戶。綁定用戶可以配置馒过,并用于執(zhí)行LDAP綁定請求之外的所有操作臭脓,LDAP綁定請求是對用戶提供的憑據(jù)進行身份驗證所必需的。
綁定用戶的使用使run as特性能夠與Active Directory領(lǐng)域一起使用腹忽,并能夠維護到Active Directory的一組池連接来累。這些池連接減少了每次用戶身份驗證必須創(chuàng)建和銷毀的資源數(shù)量砚作。
下面的示例通過bind_dn和secure_bind_password設(shè)置的用戶顯示綁定用戶的配置:
xpack:
security:
authc:
realms:
active_directory:
type: active_directory
order: 0
domain_name: ad.example.com
url: ldaps://ad.example.com:636
bind_dn: es_svc_user@ad.example.com#1
#1
:這是執(zhí)行所有Active Directory搜索請求的用戶。在沒有配置綁定用戶的情況下嘹锁,所有請求都作為使用Elasticsearch進行身份驗證的用戶運行葫录。
bind_dn用戶的密碼應(yīng)該通過向Elasticsearch密鑰存儲區(qū)添加適當?shù)?em>secure_bind_password設(shè)置來配置。下面的命令為上面的示例域添加密碼:
bin/elasticsearch-keystore add
xpack.security.authc.realms.active_directory.secure_bind_password
在配置綁定用戶時领猾,默認情況下啟用連接池米同。可以使用user_search.pool.enabled設(shè)置禁用連接池摔竿。
7面粮、將Active Directory用戶和組映射到角色。
領(lǐng)域身份驗證過程的一個重要部分是解析與經(jīng)過身份驗證的用戶關(guān)聯(lián)的角色继低。角色定義用戶在集群中的特權(quán)熬苍。
因為使用active_directory領(lǐng)域,用戶在Active Directory服務(wù)器中進行外部管理袁翁,所以期望他們的角色也在那里進行管理柴底。事實上,Active Directory支持組的概念粱胜,組通常表示組織中不同系統(tǒng)的用戶角色柄驻。
active_directory域允許您通過Active Directory組或其他元數(shù)據(jù)將Active Directory用戶映射到角色”貉梗可以通過角色映射api或使用存儲在每個節(jié)點上的文件配置此角色映射鸿脓。當用戶根據(jù)Active Directory域進行身份驗證時,該用戶的特權(quán)是由用戶映射到的角色定義的所有特權(quán)的聯(lián)合冗恨。
在映射定義中答憔,可以使用組的專有名稱指定組。例如掀抹,下面的映射配置將Active Directory admins組映射到監(jiān)視和用戶角色虐拓,將用戶組映射到用戶角色,并將John Doe用戶映射到用戶角色傲武。
通過角色映射API配置:
curl -X PUT "localhost:9200/_xpack/security/role_mapping/admins" -H 'Content-Type: application/json' -d'
{
"roles" : [ "monitoring" , "user" ],
"rules" : { "field" : {
"groups" : "cn=admins,dc=example,dc=com"#1
} },
"enabled": true
}
'
#1
:管理員組的活動目錄專有名稱(DN)蓉驹。
curl -X PUT "localhost:9200/_xpack/security/role_mapping/basic_users" -H 'Content-Type: application/json' -d'
{
"roles" : [ "user" ],
"rules" : { "any": [
{ "field" : {
"groups" : "cn=users,dc=example,dc=com"#1
} },
{ "field" : {
"dn" : "cn=John Doe,cn=contractors,dc=example,dc=com"#2
} }
] },
"enabled": true
}
'
#1
:用戶組的活動目錄專有名稱(DN)。
#2
:用戶John Doe的活動目錄專有名稱(DN)揪利。
或者态兴,也可以通過角色映射文件配置:
monitoring:
#1
- "cn=admins,dc=example,dc=com"#2
user:
- "cn=users,dc=example,dc=com"#3
- "cn=admins,dc=example,dc=com"
- "cn=John Doe,cn=contractors,dc=example,dc=com"#4
#1
:角色的名稱。
#2
:管理員組的活動目錄專有名稱(DN)疟位。
#3
:用戶組的活動目錄專有名稱(DN)瞻润。
#4
:用戶John Doe的活動目錄專有名稱(DN)。
更多信息,參見Mapping users and groups to roles绍撞。
8正勒、(可選)在Active Directory域中配置metadata設(shè)置,以便在用戶的元數(shù)據(jù)中包含額外的屬性傻铣。
默認情況下章贞,ldap_dn和ldap_groups填充在用戶的元數(shù)據(jù)中。更多信息非洲,參見 User Metadata in Active Directory Realms鸭限。