如何使用 Kerberos 確保您 Elasticsearch 集羣的安全

1. 希臘神話中的三頭猛犬保護您的數據

Elasticsearch 6.4 針對白金級訂閱新增了 Kerberos 身份驗證支持,在轉型爲完全 KerberosElastic 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 身份驗證:

  1. Alice ([email protected]) 使用她自己的憑據登錄客戶端設備 (client.demo.local)。
  2. 客戶端設備申請從 KDC 服務器 (kdc.demo.local) 獲得“授予票據的票據”(TGT)。
  3. 客戶端訪問 Elasticsearch 服務 https://es.demo.local:9200,隨後會返回一條包括 HTTP 狀態代碼 Unauthorized(401) 的響應,並且其中包括 WWW-Authenticate: Negotiate 標頭。
  4. 客戶端會爲 Elasticsearch 服務主體HTTP/[email protected] 從票據授予服務器 (TGS) 申請一個會話票據。Elasticsearch 服務主體的名稱來自訪問服務時所用的 URL
  5. 客戶端將此票據出示給 Elasticsearch 服務進行身份驗證。
  6. Elasticsearch 服務會驗證 Kerberos 票據並授予訪問權限(如果票據有效)。

3. 如何配置 Kerberos Realm

如要啓用 Elasticsearch Kerberos Realm,您需要擁有 Kerberos 基礎架構:

  • 域中所有參與設備的時鐘已進行同步
  • 所有參與設備均有一個有效的 DNS
  • 一個 KDC 服務器
  • 已安裝 Kerberos 庫和配置文件(例如 kinitklist)的客戶端節點

假設您已擁有 Kerberos 基礎架構,您還需要提供下列信息:

  • Kerberos 配置文件krb5.conf
    此文件包含您的 Kerberos 環境的必要詳情,例如默認 RealmKDC 服務器,以及網絡域和 Kerberos Realm 之間的對應關係。在 Linux 系統中,此文件通常位於 /etc 目錄中。應該將 JVM 系統屬性 java.security.krb5.conf 設置爲此配置文件的完整路徑。JVM 將加載此配置文件,並在必要時用其來尋找所需信息。
  • Elasticsearch HTTP 服務keytab
    密鑰表 (keytab) 是一個存儲主體和加密密鑰對的文件。Elasticsearch HTTP 服務將會使用此密鑰表來驗證來自客戶端的輸入票據。通常服務主體的名稱爲此格式:HTTP/[email protected],其中服務類別爲 HTTPes.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 組件的支持,敬請關注!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章