结合官网资料,做了更详细的实际使用总结。
从单机版安装到集群高可用生产环境搭建、基本概念(索引,分片,节点,倒排索引…)、DSL语法实践、分词器(内置+中文)、SpringBoot整合实战、仿京东商品搜索实战实现。

1.前言

当我们安装完ElasticSearch的时候发现,访问过程中我们没有任何安全认证就可以直接访问并操作。如果是生产环境,端口向外暴露的话,那么对数据的安全性是无法得到保障的。

一般解决方案有

  • 开启ElasticSearch认证插件,访问的时候添加账密不就好了
  • 当然也可以通过nginx作代理防护

本文主要讲解通过启用X-Pack来设置ElasticSearch的访问密码。

集群与单据环境都适合次方法

  • 集群与单据环境配置的区别就是,集群需要在某一台生成证书然后拷贝到其它节点目录下。
  • 集群环境重设置密码的时候需要整个集群节点都已启动,可在任一台处修改。

2.X-Pack简介

X-Pack是Elastic Stack扩展功能,提供安全性,警报,监视,报告,机器学习和许多其他功能。 ES7.0+之后,默认情况下,当安装Elasticsearch时,会自动安装X-Pack,无需单独再安装。自6.8以及7.1+版本之后,基础级安全永久免费了。
在使用的时候主要需要配置一下证书,以及修改配置文件(config/elasticsearch.yml )

3.证书配置

3.1生成节点证书

切换到 elasticsearch 安装文件目录 bin 下 :示例:/usr/local/elasticsearch-7.4.0/bin
借助elasticsearch-certutil命令生成证书:

./elasticsearch-certutil ca -out config/certs/elastic-certificates.p12 -pass

这里单独设置了一个 证书文件目录 config/certs

es 设置账户密码 es默认账号密码_es 设置账户密码

生成后的证书

es 设置账户密码 es默认账号密码_elasticsearch_02

3.2修改配置

配置通信证书 > 需要在 config目前下elasticsearch.yml 配置

# 开启xpack
xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true
# 证书配置
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12

其它配置(可选)

#跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type

注:若是集群环境则需要将证书文件目录,以及配置文件,在所有集群环境下都修改一下。

3.3.重启生效

需要重启elasticsearch

注:若是集群环境下则需要启动所有集群节点,再统一设置密码

注:重启异常情况,若出现报错,类似 failed to load plugin class[org.elasticsearch.xpack.core.XPackPlugin]
请检查是否是使用root用户生成的证书,启动用户无权限导致。

4.设置用户密码

执行设置用户名和密码的命令,内置了部分用户
切换到 elasticsearch 安装文件目录 bin 下 :示例:/usr/local/elasticsearch-7.4.0/bin/

# 手动配置每个用户密码模式(需要一个一个的输入)
./elasticsearch-setup-passwords interactive

也可以先自动配置密码后续再修改

#自动配置每个用户密码(随机生成并返回字符串密码,需要保存好)
./elasticsearch-setup-passwords auto

下图1是自动生成密码情况(一定拷贝下来要牢记密码)

es 设置账户密码 es默认账号密码_elasticsearch_03

下图2是自定义密码情况

分别为多个用户设置密码例如:elastic, kibana, logstash_system,beats_system,

设置密码的时候需要连续输入2遍。

es 设置账户密码 es默认账号密码_elasticsearch_04

部分内置账号的角色权限解释如下:

  • elastic 账号:拥有 superuser 角色,是内置的超级用户。
  • kibana 账号:拥有 kibana_system 角色,用户 kibana 用来连接 elasticsearch 并与之通信。Kibana 服务器以该用户身份提交请求以访问集群监视 API 和 .kibana 索引。不能访问 index。
  • logstash_system 账号:拥有 logstash_system 角色。用户 Logstash 在 Elasticsearch 中存储监控信息时使用。

至此单节点安全配置完毕,重启es后访问9200会出现用户名和密码的提示窗口,我们就可以通过用户生成的密码过行访问了

5.测试访问

通过查看证书方式,顺便测试一下密码是否生效了

浏览器输入 http://IP:9200/_license 可以看到,弹窗出来,需要输入密码了

es 设置账户密码 es默认账号密码_重启_05


es 设置账户密码 es默认账号密码_elasticsearch_06

附录:常见问题

1.如何修改账号密码

以elastic账号为例,注意需要在elasticsearch服务已启动的情况下进行

curl -H 'Content-Type: application/json' -u elastic:123456 -XPUT 'http://localhost:9200/_xpack/security/user/elastic/_password' -d '{ "password" : "1234567" }'

2.客户端ES-head连接问题

连接失败情况下先检查是否是跨域问题

http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type

例如下图连接的时候报错未授权

es 设置账户密码 es默认账号密码_elastic_07

解决方案:在访问的URL中拼接授权账号信息
示例:?auth_user=elastic&auth_password=1234567

示例:指定服务端地址以及账户

http://IP:9100/?base_uri=http://IP:9200&auth_user=elastic&auth_password=1234567

3.启动报xpack相关错

es 设置账户密码 es默认账号密码_elastic_08

DecoderException: javax.net.ssl.SSLHandshakeException: No available authentication scheme

es 设置账户密码 es默认账号密码_es 设置账户密码_09

解决方案:请通过上文配置步骤,排查,检查证书是否已经配置好,以及配置是否填写正确