如果我們希望為 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 沒有 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 有擺放一些機敏資料的公司應該是划算的。