[料理佳餚] 為 Elasticsearch 加上 Shield 身份驗證的安全防護

如果我們希望為 Elasticsearch 加上登入的身份驗證,透過帳號密碼來控制存取服務的權限的話,有一個 Plugin 可以用 - Shield,裝起來之後不用做太多設定它就能運作了,而且還可以做 IP 的過濾、整合 AD,如果角色不夠用還可以自訂角色,做更彈性的權限控制。

安裝 Shield Plugin

要使用 Shield,需要安裝兩個 Plugin,我們就依照下列指令把這兩個 Plugin 安裝起來。

cd /usr/share/elasticsearch/bin
./plugin install license
./plugin install shield

安裝完之後,重啟 Elasticsearch 服務。

systemctl restart elasticsearch

這時候我們到瀏覽器存取 Elasticsearch 服務,就需要我們輸入帳號密碼。

要使用 Shield Plugin 的話,Cluster 內的每台 Node 都必須安裝 Shield Plugin。

新增一個帳號

Shield Plugin 沒有 GUI,我們必須下指令來建立帳號,指令很簡單,就像下面這樣。

shield/./esusers useradd 你想要帳號名稱 -r 帳號的角色

執行建立帳號的指令後,接著輸入帳號的密碼,就可以建立成功了。

預設的帳號角色有三個,這三個就已經很夠用了。

  • admin: 管理者
  • power_user: 可以監看 cluster、管理 index。
  • user: 只有對 index 唯讀的權限。

建完帳號後,回到瀏覽器輸入剛剛建立的帳號密碼,就可以存取 Elasticsearch 服務了。

限制存取 IP

有時候我們不想讓網路上的任意裝置都可以來存取 Elasticsearch,我們可以做 IP Filtering,只要在 elasticsearch.yml 中加入下列設定,就可以達到只允許某幾台網路上的裝置存取 Elasticsearch。

shield.transport.filter.allow: ["192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4"]
shield.transport.filter.deny: _all

如果 DNS Lookup 功能是可以用的話,還支援用 Domain Name 來做設定,而且還可以用萬用字元 *

shield.transport.filter.allow: ["host1.softkitchen.com.tw", "computer*.softkitchen.com.tw"]
shield.transport.filter.deny: _all

不在允許名單就無法連上 Elasticsearch 服務。

匿名存取

限制存取的 IP 之後,可能就會被要求既然都有白名單了,那能不能不要每次登入都要輸入帳號密碼?這個需求我 們可以設定匿名存取來達到,只要在 elasticsearch.yml 加上下面的設定就可以了,roles 的設定值一定要給,我們必須指定想要給匿名存取的角色權限。

shield.authc:
  anonymous:
    username: _es_anonymous_user_
    roles: user
    authz_exception: true

記錄登入資訊

預設 Shield 是沒有去記錄有誰登入進來,我們可以透過在 elasticsearch.yml 加上下面這行設定來開啟 Log 機制。

shield.audit.enabled: true

開啟這個設定之後,我們可以在 /var/log/elasticsearch 找到 *-access.log 這個檔案,打開之後你就可以看到登入操作的訊息。

記錄是一直寫進來的,檔案的增加速度很快,要留意檔案的大小與可用的磁碟空間。

最重要的小事

Shield 是要收費的,初次安裝只能用 30 天,不過個人認為對於在 Elasticsearch 有擺放一些機敏資料的公司應該是划算的。

參考資料

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學