ELASTICSEARCH7.X安全性之访问密码设置
# ELASTICSEARCH7.X 安全性之访问密码设置
1 | 当我们安装完ElasticSearch的时候发现,访问过程中我们没有任何安全认证就可以直接访问并操作。如果是生产环境,端口向外暴露的话,那么对数据的安全性是无法得到保障的。 |
一般解决方案有
- 开启 ElasticSearch 认证插件,访问的时候添加账密
- 当然也可以通过 nginx 作代理防护
本文主要讲解通过启用 X-Pack 来设置 ElasticSearch 的访问密码。
集群与单据环境都适合次方法
- 集群与单据环境配置的区别就是,集群需要在某一台生成证书然后拷贝到其它节点目录下。
- 集群环境重设置密码的时候需要整个集群节点都已启动,可在任一台处修改。
# 2.X-PACK 简介
1 | X-Pack是Elastic Stack扩展功能,提供安全性,警报,监视,报告,机器学习和许多其他功能。 ES7.0+之后,默认情况下,当安装Elasticsearch时,会自动安装X-Pack,无需单独再安装。自6.8以及7.1+版本之后,基础级安全永久免费了。 |
# 3. 证书配置
# 3.1 生成节点证书
切换到 elasticsearch 安装文件目录 bin 下 :示例:/usr/local/elasticsearch-7.4.0/bin
借助 elasticsearch-certutil 命令生成证书:
1 | ./elasticsearch-certutil ca -out config/certs/elastic-certificates.p12 -pass |
这里单独设置了一个 证书文件目录 config/certs
生成后的证书
# 3.2 修改配置
配置通信证书 > 需要在 config 目前下 elasticsearch.yml 配置
1 | # 开启xpack |
其它配置(可选)
1 | #跨域配置 |
注:若是集群环境则需要将证书文件目录,以及配置文件,在所有集群环境下都修改一下。
# 3.3. 重启生效
需要重启 elasticsearch
注:若是集群环境下则需要启动所有集群节点,再统一设置密码
注:重启异常情况,若出现报错,类似 failed to load plugin class [org.elasticsearch.xpack.core.XPackPlugin]
请检查是否是使用 root 用户生成的证书,启动用户无权限导致。
# 4. 设置用户密码
执行设置用户名和密码的命令,内置了部分用户
切换到 elasticsearch 安装文件目录 bin 下 :示例:/usr/local/elasticsearch-7.4.0/bin/
1 | # 手动配置每个用户密码模式(需要一个一个的输入) |
也可以先自动配置密码后续再修改
1 | #自动配置每个用户密码(随机生成并返回字符串密码,需要保存好) |
下图 1 是自动生成密码情况(一定拷贝下来要牢记密码)
下图 2 是自定义密码情况
分别为多个用户设置密码例如:elastic, kibana, logstash_system,beats_system,
设置密码的时候需要连续输入 2 遍。
部分内置账号的角色权限解释如下:
- elastic 账号:拥有 superuser 角色,是内置的超级用户。
- kibana 账号:拥有 kibana_system 角色,用户 kibana 用来连接 elasticsearch 并与之通信。Kibana 服务器以该用户身份提交请求以访问集群监视 API 和 .kibana 索引。不能访问 index。
- logstash_system 账号:拥有 logstash_system 角色。用户 Logstash 在 Elasticsearch 中存储监控信息时使用。
至此单节点安全配置完毕,重启 es 后访问 9200 会出现用户名和密码的提示窗口,我们就可以通过用户生成的密码过行访问了
# 5. 测试访问
通过查看证书方式,顺便测试一下密码是否生效了
浏览器输入 http://IP:9200/_license 可以看到,弹窗出来,需要输入密码了
# 附录:常见问题
# 1. 如何修改账号密码
以 elastic 账号为例,注意需要在 elasticsearch 服务已启动的情况下进行
1 | curl -H 'Content-Type: application/json' -u elastic:123456 -XPUT 'http://localhost:9200/_xpack/security/user/elastic/_password' -d '{ "password" : "1234567" }' |
# 2. 客户端 ES-HEAD 连接问题
连接失败情况下先检查是否是跨域问题
1 | http.cors.enabled: true |
例如下图连接的时候报错未授权
解决方案:在访问的 URL 中拼接授权账号信息
示例:?auth_user=elastic&auth_password=1234567
示例:指定服务端地址以及账户
1 | http://IP:9100/?base_uri=http://IP:9200&auth_user=elastic&auth_password=1234567 |
# 3. 启动报 XPACK 相关错
DecoderException: javax.net.ssl.SSLHandshakeException: No available authentication scheme
解决方案:请通过上文配置步骤,排查,检查证书是否已经配置好,以及配置是否填写正确
# 关于我
Brath 是一个热爱技术的 Java 程序猿,公众号「InterviewCoder」定期分享有趣有料的精品原创文章!
非常感谢各位人才能看到这里,原创不易,文章如果有帮助可以关注、点赞、分享或评论,这都是对我的莫大支持!