0%

[Elasticsearch] Elasticsearch + Kibana 設定使用者認證

前言

參考上一篇文章: [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
2
3
4
5
6
$ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.43.tar.gz
$ tar -zxf pcre-8.43.tar.gz
$ cd pcre-8.43
$ ./configure
$ make
$ sudo make install

zlib: Supports header compression. Required by the NGINX Gzip module.

1
2
3
4
5
6
$ wget http://zlib.net/zlib-1.2.11.tar.gz
$ tar -zxf zlib-1.2.11.tar.gz
$ cd zlib-1.2.11
$ ./configure
$ make
$ sudo make install

OpenSSL: Supports the HTTPS protocol. Required by the NGINX SSL module and others

1
2
3
4
5
6
$ wget https://www.openssl.org/source/openssl-1.0.2r.tar.gz
$ tar -zxf openssl-1.0.2r.tar.gz
$ cd openssl-1.0.2r
$ ./Configure darwin64-x86_64-cc --prefix=/usr
$ make
$ sudo make install

安裝 Nginx

1
2
3
$ wget http://nginx.org/download/nginx-1.16.0.tar.gz
$ tar zxf nginx-1.16.0.tar.gz
$ cd nginx-1.16.0

接下來設定 Nginx 路徑, 這裡我們把路徑設定在 ~/nginx/:

1
$ ./configure --prefix=/home/<user>/nginx       # DEFAULT:  /usr/local/nginx

Make & Install:

1
2
$ make
$ make install

安裝 Apache 工具

後面步驟會使用到此工具來建立密碼檔,因此我們先安裝 apache2-utils:

1
$ sudo apt-get install apache2-utils

設定

設定 Elasticsearch

將 Elasticsearch 設定為只能本機存取, 修改 <ES_DIR>/config/elasticsearch.yml:

1
2
network.host: 127.0.0.1
http.port: 9200

設定 Kibana

將 Kibana 設定為只能本機存取, 修改 <Kibana_DIR>/config/kibana.yml:

1
2
server.port: 5601
server.host: "127.0.0.1"

並設定 Elasticsearch url:

1
elasticsearch.url: "http://127.0.0.1:9200"

如果 Elasticsearch 和 Kibana 在不同台機器上,則需要設定為:

1
2
3
4
elasticsearch.url: "http://<nginx_host>:<nginx_es_port>"

elasticsearch.username: "username"
elasticsearch.password: "password"

設定 Nginx Server

接著設定 Nginx, 修改 <NGINX_DIR>/conf/nginx.conf, 將原本的 http server 註解, 並加上:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
http {
# Elasticsearch
server {
listen 9201;
server_name localhost;

# Authorize
auth_basic "ES Auth";
auth_basic_user_file /home/<user>/nginx/passwd/elasticsearch.passwd;

location / {
# Proxy
proxy_pass http://127.0.0.1:9200;
proxy_redirect off;
proxy_http_version 1.1;

proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}

# Kibana
server {
listen 5602;
server_name localhost;

# Authorize
auth_basic "Kibana Auth";
auth_basic_user_file /home/<user>/nginx/passwd/kibana.passwd;

location / {
# Proxy
proxy_pass http://127.0.0.1:5601;
proxy_redirect off;

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
}

讓 Nginx 可以接收外部請求,轉發到內部指定的 port,並使用 HTTP Basic Auth 做基本的登入限制。

建立密碼檔

再來我們來建立密碼檔:

1
2
$ htpasswd -c ./passwd/elasticsearch.passwd <username>
$ htpasswd -c ./passwd/kibana.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 就會看到詢問帳號密碼的畫面,輸入後才能繼續操作:

Kibana Login

這樣我們就完成設定 Elasticsearch 和 Kibana 的使用者驗證囉!

參考資料