给elasticsearch 5.X 安装sql插件 并修复安全隐患

2018-07-11 17,455

本文主题是介绍elasticsearch-sql插件的安装方法 顺便说一个该插件安装过程中我发现存在安全隐患的地方,并分析其原因与解决办法。

 

安装正文开始


先简单介绍一下elasticsearch(百度百科 其实就是著名的elk中的e)

elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

 

再简单介绍一下sql插件

项目git的地址

https://github.com/NLPchina/elasticsearch-sql

ElasticSearch的强大程度不用我多讲了,但是查询语法真是要命,各种匹配方式与查询语法,今天正好有个特殊需求,这时我想起了之前有人介绍过一款叫做sql的插件,它的功能就是能让我们用熟悉的sql语句查询Elasticsearch。

elasticsearch-sql-8.png


在GITHUB的介绍上,作者详细的介绍了插件的每个版本与es的版本对应,以及功能是否齐全。

elasticsearch-sql-0.png

同时作者在GITHUB也给出了在线安装方法

elasticsearch-sql-1.png


进入elasticsearch的目录 进入bin目录 执行安装语句 (windows同理)


以下为 在线与离线的安装方法以及卸载插件方法(第一句为在线安装 第二句为删除 第三句为本地离线安装)

elasticsearch-sql-3.png

如图所示 回显Installed便是安装成功了。

 

重点来了

那么在5.x和6.x 需要一项额外配置

elasticsearch-sql-5.png


需要下载 es-sql-site-standalone.zip 

下载后将其解压至任意目录 进入site-server目录

执行npm install express –save 安装所需依赖文件

执行后可以看见存在以下几个文件

elasticsearch-sql-6.png

site_configuration.json文件为配置文件

内容为

{
"port":8080
}

node-server.js文件为程序文件

内容为

var express = require('express');
var app = express();
app.use(express.static('../_site'));

app.get('/', function (req, res) {
res.sendFile("../_site/" + "index.html" );
})
var fs = require('fs');
var siteConfiguration = JSON.parse(fs.readFileSync('site_configuration.json', 'utf8'));
var server = app.listen(siteConfiguration.port)

可以修改为任意端口

 

此时执行 node node-server.js 后访问你设置的端口已经可以正常使用了。

 

安装过程中发现的安全隐患


按照github提供的方法进行安装、配置、使用到此应该结束了,但因为我的主业是信息安全,我心中突然闪出几个问题:

 

1、如此监听那不是绑定了0.0.0.0?

2、是什么原因形成的?

3、这样是否会直接将sql插件暴露给内网?

4、如有公网ip那不是直接暴露给公网了?

 

正常来说,一个程序默认的安全设置应是存在的,如不存在就会酿成mongodb那样的血案,那一定会造成信息泄露甚至数据全部丢失。

想到这里 我验证了一下我的想法,因我司elasticsearch为确保安全不接入公网,所以我在测试环境重新搭建了一个,果然证实了我的想法:

 

1、确实绑定了 0.0.0.0

2、形成原因:插件为什么默认没有认证,是因为使用了expressjs(https://expressjs.com) 这个库建的一个简单的web server导致的.

elasticsearch-sql-9.jpg

elasticsearch-sql-10.jpg


3、如没有其他waf限制,确实会将操作数据的权限暴露给内网与公网.


结论:如直接按照默认给出的方法操作那将会造成极大的安全隐患(不知道有多少人按这种默认方法安装了 希望你家数据没丢)。

 

解决方案:


将node-server.js的最后一句

var server = app.listen(siteConfiguration.port)

修改为

var server = app.listen(siteConfiguration.port, '127.0.0.1')

将监听地址绑定为127.0.0.1 如此便将应用限制为本机访问了

 

最后思考:


其实因为elasticsearch安全模块收费,而默认使用时无默认安全设置(类似mongodb),所以多数elasticsearch都对外封闭了他的默认端口9200(或做了验证 常见的401 或ip验证)  但这个插件会为我们带来惊喜。

到底有多少数据服务器存在这个问题呢?附图一张,可见数据服务器拥有外网地址的并不多,但我相信在内网存在该隐患的情况会比外网多N倍。

elasticsearch-sql-7.png


本文作者:7kbstorm

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/73422.html

Tags:
评论  (0)
快来写下你的想法吧!

7kbstorm

文章数:1 积分: 20

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号