前言
參考上一篇文章: [Elasticsearch] 使用 Elasticsearch + Kibana 實現中文全文檢索 開始使用 Elasticsearch 和 Kibana 之後就會發現一個問題: 沒有使用者帳號密碼嗎? 因為像是 MySQL、MongoDB 等許多資料庫都有使用者認證的機制,需要有帳號密碼才可存取資料庫,但 Elasticsearch 和 Kibana 本身是沒有提供使用者驗證的機制,如果希望是內部使用,只能透過設定防火牆的方式限制特定網域使用,但是如果我們希望讓外部也能夠存取資源,綁定 IP 之後,任何人只要知道 IP 和 port 就都可以存取資料,這樣非常不安全,因此我們希望能夠設定使用者認證。
雖然 Elasticsearch 和 Kibana 本身沒有提供使用者認證機制,但 Elastic 有提供 X-Pack 工具,它可以用來做 Elasticsearch 和 Kibana 的安全防護、即時監控和產生報表等等,但是它是要付費的,試用期過了之後就無法使用。如果除了安全防護之外,也需要有即時監控、報表紀錄等等功能,也是可以考慮這個方案,詳細設定方式可以參考 Elastic 官網。
因為我們主要的需求是希望讓外部也能夠存取資源,但需要有使用者驗證機制,不要讓任何人都能夠存取資料,所以我們選擇使用 Nginx 作為 proxy,接收外部的請求,再透過 Nginx 轉發給 Elasticsearch 或 Kibana, 將 Elasticsearch 和 Kibana 設定為只能本機存取 (host 設為 127.0.0.1
),並針對 Nginx 設定 HTTP Basic Auth, 這樣就能夠達到需要輸入使用者帳號密碼才能夠存取 Elasticsearch 和 Kibana 的需求。
安裝
首先,我們先來安裝所需要的套件:
安裝 Nginx 相依套件
PCRE: Supports regular expressions. Required by the NGINX Core and Rewrite modules.
1 | $ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.43.tar.gz |
zlib: Supports header compression. Required by the NGINX Gzip module.
1 | $ wget http://zlib.net/zlib-1.2.11.tar.gz |
OpenSSL: Supports the HTTPS protocol. Required by the NGINX SSL module and others
1 | $ wget https://www.openssl.org/source/openssl-1.0.2r.tar.gz |
安裝 Nginx
1 | $ wget http://nginx.org/download/nginx-1.16.0.tar.gz |
接下來設定 Nginx 路徑, 這裡我們把路徑設定在 ~/nginx/
:
1 | $ ./configure --prefix=/home/<user>/nginx # DEFAULT: /usr/local/nginx |
Make & Install:
1 | $ make |
安裝 Apache 工具
後面步驟會使用到此工具來建立密碼檔,因此我們先安裝 apache2-utils
:
1 | $ sudo apt-get install apache2-utils |
設定
設定 Elasticsearch
將 Elasticsearch 設定為只能本機存取, 修改 <ES_DIR>/config/elasticsearch.yml
:
1 | network.host: 127.0.0.1 |
設定 Kibana
將 Kibana 設定為只能本機存取, 修改 <Kibana_DIR>/config/kibana.yml
:
1 | server.port: 5601 |
並設定 Elasticsearch url:
1 | elasticsearch.url: "http://127.0.0.1:9200" |
如果 Elasticsearch 和 Kibana 在不同台機器上,則需要設定為:
1 | elasticsearch.url: "http://<nginx_host>:<nginx_es_port>" |
設定 Nginx Server
接著設定 Nginx, 修改 <NGINX_DIR>/conf/nginx.conf
, 將原本的 http server 註解, 並加上:
1 | http { |
讓 Nginx 可以接收外部請求,轉發到內部指定的 port,並使用 HTTP Basic Auth 做基本的登入限制。
建立密碼檔
再來我們來建立密碼檔:
1 | $ htpasswd -c ./passwd/elasticsearch.passwd <username> |
-c
代表 create, 如果要建立多組帳號密碼,把 -c
拿掉即可。
完成後重新啟動 Nginx ,就可以來測試有沒有設定成功了!
啟動 Nginx:
1 | $ ./sbin/nginx |
連線到 Elasticsearch 可以使用此指令格式:
1 | $ curl -u <username> 'http://<nginx_host>:<nginx_es_port>' |
連線到 Kibana 的部分,用瀏覽器開啟 http://<nginx_host>:<nginx_kibana_port
就會看到詢問帳號密碼的畫面,輸入後才能繼續操作:
這樣我們就完成設定 Elasticsearch 和 Kibana 的使用者驗證囉!