Elasticsearch 服務器安全加固(PHP)

 Elasticsearch 默認端口是9200,綁定的是本機127.0.0.1的這個 ip,這個默認參數其實很安全,但是有很多人想要綁定其他的 lan 口或者公網的 ip,可以修改相應參數,記住,修改有風險,如果確實需要將 Elasticsearch 暴露在公網環境,請修改特定的端口綁定IP,不要直接修改參數: network.host,而是要分別修改:http.port 來綁定 HTTP 協議9200 端口的 IP(RESTful 接口調用),修改:transport.tcp.port 對應的 TCP 9300 端口的 IP(集羣內通信),如果你不需要 http 端口,你乾脆禁用掉,另外還需要在 Elasticsearch 之上加上成熟的安全防護措施(注意是成熟的!),在這裏提供幾種方案:

9200的 HTTP 接口之上加上 Nginx 來提供 Http Basic-Auth 的基本的身份認證,輔助 SSL 證書進行傳輸層的加密,Nginx 進一步限制可接受 Verb 請求類型及可被操作的索引前綴。

使用 Elastic 的 X-Pack 插件,同樣提供了 Http Basic-Auth 和 SSL 傳輸層的加密,X-Pack 還能提供內外 Elasticsearch 集羣節點間的流量加密,避免旁路攻擊。

    我們今天選用的是第二種方案,第一種方案還請大家與運維配合實驗

    以下操作步驟需要ssh 權限,切會服務器基礎命令與操作

    步驟一:

 elasticsearch-plugin install x-pack   //使用此命令,安裝x-pack 插件

    安裝完成後啓動 elasticsearch 服務 ,訪問9200端口 會讓輸入用戶名和密碼才能訪問。

    Elasticsearch 的默認賬戶爲 elastic 默認密碼爲 changme

    步驟二:使用以下命令修改初始密碼,localhost 改成自己服務器的IP

curl -XPUT -u elastic 'http://localhost:9200/_xpack/security/user/elastic/_password' -d '{

  "password" : "yourpasswd"

}'

    步驟三:修改CURL 請求,增加header參數,使得調用API時可以登錄搜索引擎服務器

    舉個例子 ,如果用戶名和密碼是默認密碼 ,則header 傳參如下:

Authorization: Basic ZWxhc3RpYzopS0k1alFsbHozQWhiYy4hfkZVKyUydzQrIzNzeVk=

Basic 後面的一串 ,是由用戶名密碼通過base64編碼得到 

base64_encode("elastic:changme");

最後講一下,關於elasticsearch 插件的修改 ,文件名 ClientBuilder.php 大約499行 ,增加一個header參數 ,代碼如下

            // Make sure we are setting Content-type and Accept (unless the user has explicitly

            // overridden it

            if (isset($this->connectionParams['client']['headers']) === false) {

                $this->connectionParams['client']['headers'] = [

                    'Content-type' => ['application/json'],

                    'Accept' => ['application/json'],

                    'Authorization'=>[' Basic ZWxhc3RpYzopS0k1alFsbHozQWhiYy4hfkZVKyUydzQrIzNzeVk='],  //這裏是增加的代碼

                ];

            } else {

                if (isset($this->connectionParams['client']['headers']['Content-type']) === false) {

                    $this->connectionParams['client']['headers']['Content-type'] = ['application/json'];

                }

                if (isset($this->connectionParams['client']['headers']['Accept']) === false) {

                    $this->connectionParams['client']['headers']['Accept'] = ['application/json'];

                }

            }

代碼解釋,這裏是創建鏈接時設置的header參數的數組 ,我們在下面增加登錄權限的驗證,最後就可以不修改邏輯代碼的情況下,獲取正確的數據。

 

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