Elasticsearch:使用 Nginx 來保護 Elastic Stack

在我之前的文章 “反向代理及負載均衡在 Elasticsearch 中的應用” 中,我已經詳述瞭如何使用 Nginx 來作爲一個反向代理來訪問 Elastic Stack。在今天的文章中,我將詳述如何使用 Nginx 來保護 Elastic Stack。基於 Elastic Stack Basic 許可以上,我們都可以使用 Elastic Stack 所提供的安全方案來對 Elastic Stack 進行保護。針對 OSS 的用戶來說,我們可以使用 Nginx 所提供的安全措施來對我們的 Elastic Stack 進行保護。在本文中,我想解釋一下如何實現保護 Elastic Stack 的一種更常見,更簡單的方法-在 Elasticsearch 和 Kibana 的前面部署 nginx 作爲反向代理。

 

在今天的實驗中,我將使用一個 Ubuntu 20.04 的機器來做演示。

 

安裝

Elastic Stack

針對我們的實驗,我們需要安裝 Elasticsearch 已經 Kibana。請參閱我之前的文章 “Elastic:菜鳥上手指南” 進行安裝。我都使用默認的配置。等 Elasticsearch 以及 Kibana 都起來之後,我們可以看到如下的畫面:

Elasticsearch 運用於 localhost:9200 上,而 Kibana 運行於 localhost:5601 上。

Nginx

參考我之前的文章 “Beats:使用Elastic Stack對Nginx Web服務器監控” 來進行安裝。我們可以通過如下的方式來進行安裝 Nginx:

sudo apt-get install nginx

我們還將安裝 apache2-utils 來幫助我們創建用於基本身份驗證的帳戶:

sudo apt-get install apache2-utils

接下來,我們將創建一個用於基本身份驗證的用戶帳戶(我選擇了kibanauser,但你當然可以將其替換爲您想要的任何用戶帳戶):

sudo htpasswd -c /etc/nginx/htpasswd.users kibanauser

按下 Enter 鍵後,系統會提示我們輸入並驗證用戶密碼。

$ sudo htpasswd -c /etc/nginx/htpasswd.users kibanauser
New password: 
Re-type new password: 
Adding password for user kibanauser

爲了方便,我使用了 1234 作爲 kibanauser 用戶的密碼。

接下來,我們將創建一個nginx配置文件:

sudo vi /etc/nginx/conf.d/kibana.conf

輸入以下配置:

/etc/nginx/conf.d/kibana.conf
  upstream elasticsearch {
    server 127.0.0.1:9200;
    keepalive 15;
  }

  upstream kibana {
    server 127.0.0.1:5601;
    keepalive 15;
  }

  server {
    listen 8881;

    location / {
      auth_basic "Restricted Access";
      auth_basic_user_file /etc/nginx/htpasswd.users;


      proxy_pass http://elasticsearch;
      proxy_redirect off;
      proxy_buffering off;

      proxy_http_version 1.1;
      proxy_set_header Connection "Keep-Alive";
      proxy_set_header Proxy-Connection "Keep-Alive";
    }

  }

  server {
    listen 8882;

    location / {
      auth_basic "Restricted Access";
      auth_basic_user_file /etc/nginx/htpasswd.users;

      proxy_pass http://kibana;
      proxy_redirect off;
      proxy_buffering off;

      proxy_http_version 1.1;
      proxy_set_header Connection "Keep-Alive";
      proxy_set_header Proxy-Connection "Keep-Alive";
    }
  }

我們要求 nginx 使用通過 htpasswd 創建的帳戶進行基本身份驗證,以偵聽端口 8881 與 Elasticsearch 的連接以及端口 8882 與 Kibana 的連接。這就是我們所有需要配置的東西。

重新啓動 nginx:

sudo service nginx restart

 

驗證身份證

現在,Elasticsearch 和 Kibana 都已通過基本身份驗證進行了門控。 我們可以使用一些 cURL 命令來驗證這一點。

對於 Elasticsearch,使用:

curl --verbose http://127.0.0.1:8881

上面的輸出爲:

$ curl --verbose http://127.0.0.1:8881
*   Trying 127.0.0.1:8881...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8881 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:8881
> User-Agent: curl/7.68.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 401 Unauthorized
< Server: nginx/1.18.0 (Ubuntu)
< Date: Tue, 05 Jan 2021 02:37:57 GMT
< Content-Type: text/html
< Content-Length: 188
< Connection: keep-alive
< WWW-Authenticate: Basic realm="Restricted Access"
< 
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.18.0 (Ubuntu)</center>
</body>
</html>
* Connection #0 to host 127.0.0.1 left intact

從上面的輸出中我們可以看出來他需要驗證纔可以進行訪問。我們接下來使用如下的方式來訪問 Elasticsearch:

curl --verbose http://kibanauser:[email protected]:8881

上面的命令的輸出爲:

$ curl --verbose http://kibanauser:[email protected]:8881
*   Trying 127.0.0.1:8881...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8881 (#0)
* Server auth using Basic with user 'kibanauser'
> GET / HTTP/1.1
> Host: 127.0.0.1:8881
> Authorization: Basic a2liYW5hdXNlcjoxMjM0
> User-Agent: curl/7.68.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx/1.18.0 (Ubuntu)
< Date: Tue, 05 Jan 2021 02:42:25 GMT
< Content-Type: application/json; charset=UTF-8
< Content-Length: 531
< Connection: keep-alive
< 
{
  "name" : "liuxgu",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "6DeOscunTaevVlsn68DYYA",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
* Connection #0 to host 127.0.0.1 left intact

在上面,我們使用了用戶名及密碼 kibanauser:1234,那麼我們可以看到正確的輸出。

同樣地,我們可以在另外一臺電腦上對 Ubuntu 機器進行訪問:

它提示我們需要輸入正確的用戶名及密碼來進行訪問。我們輸入正確的用戶名及密碼,並點擊上面的 Sign In 按鈕:

我們就進入到 Kibana 的界面中了。

如果我們使用其它機器訪問 Elasticsearch,我們同樣也需要使用正確的用戶名及密碼:

在上面輸入正確的用戶名及密碼:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章