1. 希臘神話中的三頭猛犬保護您的數據
Elasticsearch 6.4
針對白金級
訂閱新增了 Kerberos
身份驗證支持,在轉型爲完全 Kerberos
式 Elastic Stack
的道路上邁出了第一步。Kerberos
是一項成熟的技術,能夠允許在分佈式系統中進行安全身份驗證。Kerberos
可讓用戶通過單點登錄方式訪問不同服務,無需用戶重複提供用戶名和密碼。本篇博文講解了如何對 Elasticsearch
進行配置,從而支持對 HTTP
流量進行 Kerberos
身份驗證。
2. 部署概述
我們考慮一個簡單情境,假設用戶 Alice(愛麗絲)擁有一個單節點 Elasticsearch 集羣。Alice 已有一個 Kerberos Realm(demo.local)
,她現在希望通過 Kerberos
身份驗證確保 Elasticsearch 集羣的安全。Kerberos 身份驗證服務器有權對 Realm
內的用戶、主機或服務進行身份驗證。本文中使用的命令參考了 MIT Kerberos
實施版本。有關更多詳情,請參閱 MIT Kerberos 文檔。
在這一簡單情境中,共有三臺主機設備:
主機 1 (kdc.demo.local)
:這是 Kerberos 密鑰分發中心 (KDC),通常包括身份驗證服務器和票據授予服務器。主機 2 (es.demo.local)
:Elasticsearch 單節點集羣便位於這裏。主機 3 (client.demo.local)
:Elasticsearch 客戶端便位於這裏。
需要完成下列步驟,才能成功完成 Kerberos
身份驗證:
- Alice ([email protected]) 使用她自己的憑據登錄客戶端設備 (
client.demo.local
)。 - 客戶端設備申請從
KDC 服務器 (kdc.demo.local)
獲得“授予票據的票據”(TGT
)。 - 客戶端訪問 Elasticsearch 服務
https://es.demo.local:9200
,隨後會返回一條包括HTTP
狀態代碼Unauthorized(401)
的響應,並且其中包括WWW-Authenticate: Negotiate
標頭。 - 客戶端會爲 Elasticsearch 服務主體
HTTP/[email protected]
從票據授予服務器 (TGS
) 申請一個會話票據。Elasticsearch 服務主體的名稱來自訪問服務時所用的URL
。 - 客戶端將此票據出示給 Elasticsearch 服務進行身份驗證。
- Elasticsearch 服務會驗證
Kerberos
票據並授予訪問權限(如果票據有效)。
3. 如何配置 Kerberos Realm
如要啓用 Elasticsearch Kerberos Realm
,您需要擁有 Kerberos
基礎架構:
- 域中所有參與設備的時鐘已進行同步
- 所有參與設備均有一個有效的
DNS
域 - 一個
KDC
服務器 - 已安裝
Kerberos
庫和配置文件(例如kinit
、klist
)的客戶端節點
假設您已擁有 Kerberos
基礎架構,您還需要提供下列信息:
Kerberos
配置文件krb5.conf
此文件包含您的Kerberos
環境的必要詳情,例如默認 Realm
、KDC 服務器
,以及網絡域和 Kerberos Realm 之間的對應關係
。在 Linux 系統中,此文件通常位於/etc
目錄中。應該將JVM
系統屬性java.security.krb5.conf
設置爲此配置文件的完整路徑。JVM
將加載此配置文件,並在必要時用其來尋找所需信息。- Elasticsearch
HTTP
服務keytab
密鑰表 (keytab)
是一個存儲主體和加密密鑰對的文件。Elasticsearch HTTP 服務將會使用此密鑰表來驗證來自客戶端的輸入票據。通常服務主體的名稱爲此格式:HTTP/[email protected]
,其中服務類別爲HTTP
,es.demo.local
則是 Elasticsearch 主機完全符合要求的域名,而DEMO.LOCAL
則是Kerberos Realm
。需要將此文件放置到 Elasticsearch 配置目錄中。由於此文件包含憑據,所以爲確保此文件的安全,請僅向運行Elasticsearch
的用戶授予只讀權限。Kerberos 系統管理員可爲您提供您的服務中所用到的密鑰表文件。
有了這兩個文件之後,我們現在便可以繼續在 Elasticsearch 中配置 Kerberos Realm
了。
3.1 配置 JVM
選項
首先,我們需要編輯 JVM
選項文件 (jvm.options
),來爲 Kerberos
配置文件配置 JVM
系統屬性:
# Kerberos configuration
-Djava.security.krb5.conf=/etc/krb5.conf
3.2 針對 Kerberos 配置 Elasticsearch
接下來,我們需要在 elasticsearch.yml
文件中添加一個 Kerberos Realm
:
# Kerberos realm
xpack.security.authc.realms.kerb1:
type: kerberos
order: 1
keytab.path: es.keytab
這會將 Kerberos Realm (kerb1)
的類型配置爲 kerberos
,將 Realm
順序配置爲 1
,並將 keytab.path
配置爲指向配置目錄中的 Elasticsearch 服務密鑰表文件 (es.keytab
)。有關更多信息,請參閱配置 Kerberos Realm 文檔。
3.3 重新啓動 Elasticsearch
配置完成後,需要重新啓動 Elasticsearch 節點。
3.4 將 Kerberos
用戶映射至角色
Kerberos
是一項身份驗證協議,但是其並不提供授權詳細信息。爲完成授權,我們可以使用映射 API
來將用戶映射至角色。下面這些代碼便會創建一個名爲 kerbrolemapping
的角色映射,該映射會將 monitoring_user
角色分配給用戶 [email protected]
:
$ curl -u elastic -H "Content-Type: application/json" -XPOST http://es.demo.local:9200/_xpack/security/role_mapping/kerbrolemapping -d
{
"roles" : [ "monitoring_user" ],
"enabled": true,
"rules" : {
"field" : { "username" : "[email protected]" }
}
}
有關角色映射的更多詳細信息,請參閱我們的相關文檔:將用戶和羣組映射至角色。
4. 噢耶,成功啦!
如要驗證是否能夠在客戶端設備上進行身份驗證,我們需要發出一條 kinit
命令以獲得一張“授予票據的票據”:
$ kinit [email protected]
Password for [email protected]:
$ klist
Ticket cache: KEYRING:persistent:1000:krb_ccache_NvNtNgS
Default principal: [email protected]
Valid starting Expires Service principal
31/08/18 02:20:07 01/09/18 02:20:04 krbtgt/[email protected]
Then invoke curl
with the negotiate
parameter so that Kerberos authentication over HTTP can be performed:
$ curl --negotiate -u : -XGET http://es.demo.local:9200/
然後就大功告成啦!
{
"name" : "Lw7K29R",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "qd3iafXORLy0VCfVD_Hp9w",
"version" : {
"number" : "6.4.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "595516e",
"build_date" : "2018-08-17T23:18:47.308994Z",
"build_snapshot" : true,
"lucene_version" : "7.4.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
5. 結論
如上面所講,如果您能訪問服務主體密鑰表
和 Kerberos 配置文件
,則配置 Kerberos Realm
是一件很簡單的事情;僅需針對 Elasticsearch 編寫幾行 Kerberos Realm
配置命令即可。在 Elasticsearch 中支持 Kerberos
僅僅是一個開始,我們將會在未來的更新中繼續推出針對其他 Elastic Stack 組件的支持,敬請關注!