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参数的数组 ,我们在下面增加登录权限的验证,最后就可以不修改逻辑代码的情况下,获取正确的数据。