ElasticSearch默认没有用户认证,任何人都能访问,这样很不安全,官方的安全解决方案Xpack是收费的,如果只想实现简单的用户认证,可以选择加入Nginx实现基本的用户认证即可。同时因为前端程序需要调用ElasticSearch的REST快速查询数据,所以需要保证ElasticSearch的REST API支持跨域用户调用。
ElasticSearch配置
将ElasticSearch设置为只能本地访问,只需要在配置文件elasticsearch.yaml文件里保证下一行是注释掉的。ElasticSearch默认配置就是只能localhost访问。
#network.host: 0.0.0.0
同时加入CORS的支持,添加如下字段:
http.cors.enabled : true
http.cors.allow-origin : "*"
http.cors.allow-methods : OPTIONS, HEAD,GET, POST, PUT, DELETE
http.cors.allow-headers:X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization
注意:
- http.cors.allow-origin : "*" ,表示允许来自任意源站点的访问,如果想进一步限制,可以设成具体的站点列表,用逗号分隔,比如“a.com, b.com‘’。
- http.cors.allow-methods定义了允许跨域调用的http方法,只允许REST查询的话,只需要OPTIONS,HEAD,GET即可
- http.cors.allow-headers定义允许跨域调用的头字段。
Nginx安装配置
生成passwords文件
在ElasticSearch的同一台机器上安装Nginx,安装很简单。因为要在Nginx端作简单的用户认证,需要先生成密码文件(我的工作目录是/home/software/nginx):
htpasswd -c passwords <username>
按提示输入密码即可,当前目录下会生成一个passwords文件,即我们之后让Nginx使用的passwords文件。
注意:也可用openssl来生成passwords文件,不过我在ubuntu 14.0.2上试,发现不好用,认证总是说密码不对,用htpasswd没问题。
Nginx配置
从系统自带配置文件(/etc/nginx/nginx.conf)copy一份出来,自定义自己的nginx_es.conf,如下:
upstream elasticsearch {
server 127.0.0.1:9200;
}
location / {
//OPTIONS 设置为不用认证,否则CORS的prefight会有问题。其他操作都需要认证。
limit_except OPTIONS {
auth_basic "ProtectedElasticsearch";
auth_basic_user_file passwords;
}
proxy_pass http://elasticsearch;
proxy_redirect off;
}
}
启动Nginx
cd /home/software/nginx
nginx -c $PWD/nginx_es.conf
注意:nginx_es.conf和passwords文件必须在同一目录下,因为默认是到配置文件的同目录找passwords文件。
问题debug
如果认证不通过,首先需要查看Nginx的日志,日志地址:/var/log/nginx,access.log和error.log都需要查看。
常用命令
nginx -s stop 快速关闭nginx
nginx -