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參數的數組 ,我們在下面增加登錄權限的驗證,最後就可以不修改邏輯代碼的情況下,獲取正確的數據。