
創作人:劉曉國
Elastic Stack 的元件是不安全的,因為它沒有内置的固有安全性。 這意味着任何人都可以通路它。 在生産環境中運作 Elastic Stack 時,這會帶來安全風險。 為了防止生産中未經授權的通路,采用了不同的機制來施加安全性,例如在防火牆後運作Elastic Stack并通過反向代理(例如 nginx,HAProxy 等)進行保護。 Elastic提供商業産品來保護 Elastic Stack。 此産品是 X-Pack 的一部分,子產品稱為安全性。
本文中将介紹如何為我們的 Elastic 索引設定字段級的安全。這樣有的字段對有些使用者是可見的,而對另外一些使用者是不可見的。我們也可以通過對使用者安全的設定,使得不同的使用者有不同的權限。
User authentication
在 X-Pack 安全性中,安全資源是基于使用者的安全性的基礎。 安全資源是需要通路以執行 Elasticsearch 叢集操作的資源,例如索引,文檔或字段。 X-Pack 安全性通過配置設定給使用者的角色的權限來實作。 權限是針對受保護資源的一項或多項特權。 特權是一個命名的組,代表使用者可以針對安全資源執行的一個或多個操作。 使用者可以具有一個或多個角色,并且使用者擁有的總權限集定義為其所有角色的權限的并集,如下圖所示:
從上面的圖上可以看出來:一個使用者可以用多個 role,而每個 role 可以對應多個 permission (權限)。在接下來的練習中,我們來展示如何建立使用者,role(角色)以及把permission 配置設定到每個 role。通過這樣的組合,我們可以實作對字段級的安全控制。
為 Elastic 設定安全及建立使用者
當我們設定完我們的安全賬戶後,最開始我們使用最原始的 Elastic 的賬号進行登入。
請注意這裡的密碼是我們設定 Elastic 賬号的密碼
等登入進去之後,現在我們去 Manage/Sercurity/Users 頁面
我們來建立一個新的賬号。針對我的情況,我想建立一個叫做 liuxg 的使用者名。點選目前頁面的 Create User 按鈕:
然後填入我們所需要的資訊:
點選 Create User 按鈕,這樣我們就建立了我們的使用者。
按照同樣的步驟,我們來建立另外一個叫做 user1 的使用者。
準備實驗資料
在我們還沒退出 elastic 使用者的情況下,我們使用 bulk API 來把如下的文檔輸入到 Elasticsearch 中。
POST employee/_bulk
{"index":{"_index":"employee"}}
{"name":"user1","email":"[email protected]","salary":5000,"gender":"M","address1":"312 Main St","address2":"Walthill","state":"NE"}
{"index":{"_index":"employee"}}
{"name":"user2","email":"[email protected]","salary":10000,"gender":"F","address1":"5658 N Denver Ave","address2":"Portland","state":"OR"}
{"index":{"_index":"employee"}}
{"name":"user3","email":"[email protected]","salary":7000,"gender":"F","address1":"300 Quinterra Ln","address2":"Danville","state":"CA"}
這樣我們把三個文檔存入到 employee 的索引之中。
建立新的 role
由于字段級安全是白金版特有的功能,在一下的字段級安全配置中,我們需要啟動白金版試用。更多有關關于訂閱的資訊,請參閱連結
https://www.elastic.co/cn/subscriptions.對于不想使用字段級安全的使用者來說,請忽略下面啟動白金版試用的步驟。下面展示如何啟動白金版試用:
請注意:如下的操作是在 elastic 使用者登入的情況下進行操作的。要建立新使用者,請導航到 Stack Management 并在 “Security” 部分中選擇 “role”,或者如果您目前在 “Users” 螢幕上,請單擊 “Roles” 選項。 角色螢幕顯示所有已定義/可用的角色:
當我們點選 roles 後:
我們點選 Create role 按鈕。
在這裡,我們定義了一個叫做 monitor_role,它具有 monitor 的權限
把 role 賦予給使用者
我們打開我們的使用者清單。針對我的情況,我們打開 liuxg 使用者:
我們修改 liuxg 賬号的 Roles。把剛才建立的 monitor_role 賦予給liuxg使用者。點選 Update User 按鈕。這樣我們的設定就好了。設定好的賬号是這樣的:
從上面,我們可以看出來liuxg賬号是有 monitor_role 的,而 user1 賬号是沒有的。
下面我們來做一些基本的測試。我們在一個 terminal 中打入如下的指令:
curl -u liuxg:123456 "http://localhost:9200/_cluster/health?pretty"
注意這裡的 123456 是 liuxg 的賬号密碼。執行上面的顯示結果是:
我們顯然看到了結果。那麼我們同樣地對 User1 賬号來進行實驗:
curl -u user1:123456 "http://localhost:9200/_cluster/health?pretty"
顯示的結果是:
顯然,user1 賬号沒有得到任何結果。這個根本的原因是因為這個賬号沒有相應的權限。
文檔級或字段級安全
現在,我們知道了如何建立新使用者,建立新角色以及将角色配置設定給使用者,讓我們探讨如何針對給定的索引/文檔對文檔和字段施加安全性。接下來,我們使用我之前給大家輸入進的 employee 索引來展示。
案例1
當使用者搜尋員工詳細資訊時,該使用者不允許包含在屬于員工索引的文檔中的薪水/位址詳細資訊。這就是我們所說的字段級安全。首先,讓我們來建立一個叫做 employee_read 的role。這個 role 隻具有 employee 索引的 read 權限。為了限制字段,我們可以在設定裡做相應的配置:
我們隻允許這個 employee_read role 通路 gender,state 及 email 字段,而且隻有 read 權限。
運用我們剛才設定的 employee_read role,我們賦予給我們的 user1 使用者:
設定好的使用者界面為:
上面顯示我們的 user1 具有 employ_read 的 role。
在我們的一個 terminal 裡打入如下的指令:
curl -u user1:123456 "http://localhost:9200/employee/_search?pretty"
請注意:這裡的 123456 是 user1 使用者的密碼。上面指令顯示的結果為:
顯然,user1 隻能通路在 employee_read 中的三個字段。
案例2
我們想定義一個 role。這個 role 具有 read 的權限,并且隻能通路 state 為 OR 的那些文檔。我們做一下的設定:
我們建立了一個叫做 OR_state 的 role。它通過一個 query:
{"match": {"state.keyword":"OR"}}
來比對項對應的文檔。我們接着把這個 role 賦予給 liuxg 使用者:
在我們設定完後,我們接着在一個 terminal 中打入如下的指令:
curl -u liuxg:123456 "http://localhost:9200/employee/_search?pretty"
顯示的結果:
我們可以看出來這次的顯示的結果隻有一個,而且這個文檔的 state 是 OR。