6、ElasticSearch添加密码验证机制(规避了诸多小坑的
ElasticSearch版本7.6.2
根据官方文档,Elasticsearch 启用安全策略需要下面的步骤。
1、验证当前版本是否支持安全功能
2、是否打开安全设置
3、基于FIPS的一些验证
4、配置节点间通讯传输的安全性
5、配置内置用户的密码/
6、选择用户验证用户身份的领域类型
7、设置角色和用户以控制对Elasticsearch的访问
8、启用审核以跟踪与Elasticsearch集群的尝试和成功的交互
上面是所有安全策略需要配置的内容,但是对于仅仅是启用账号密码这种最处理的安全策略我们只需要考虑下面几步。
1、验证当前版本是否支持安全功能
2、是否打开安全设置
3、配置节点间通讯传输的安全性
4、设置ssl的keystore、truststore的密码
5、重启ES集群是配置生效
6、配置内置用户的密码
7、修改kibana的配置
具体步骤:
1. 验证当前版本是否支持安全功能
Elasticsearch的安全策略需要X-Pack插件的支持,不过对于7.X以上版本X-Pack已经内置,所以不需要额外的操作。
2. 是否打开安全设置
xpack.security.enabled控制安全配置的开启,在默认情况下此参数被设置为false。要想开启安全策略需要在所有集群中讲此参数进行设置
xpack.security.enabled = true
3. 配置节点间通讯传输的安全性
仅仅开启安全设置再启动服务的时候会抛出错误
这是因为传输网络层用于集群中节点之间的内部通信。启用安全功能后,必须使用TLS来确保节点之间的通信已加密。为节点间通讯配置安全策略需要两个步骤:
- 生成节点间安全策略使用的证书
- 修改各个节点的安全配置
3.1 创建证书颁发机构以及为节点生成证书
在Elasticsearch集群中验证证书真实性的推荐方法是信任签署证书的证书颁发机构(CA)。这样,将节点添加到群集后,它们只需要使用由同一CA签名的证书,即可自动允许该节点加入群集。另外证书中可以包含与节点的IP地址和DNS名称相对应的主题备用名称,以便可以执行主机名验证。
*为Elasticsearch集群创建发证机构,使用下面的步骤为集群创建一个CA授权证书
bin/elasticsearch-certutil ca
整个创建过程是这样的。在输入命令后控制台会输出此命令的信息描述,然后你需要先执行{①}的操作然后执行{②}的操作
This tool assists you in the generation of X.509 certificates and certificate
signing requests for use with SSL/TLS in the Elastic stack.
The 'ca' mode generates a new 'certificate authority'
This will create a new X.509 certificate and private key that can be used
to sign certificate when running in 'cert' mode.
Use the 'ca-dn' option if you wish to configure the 'distinguished name'
of the certificate authority
By default the 'ca' mode produces a single PKCS#12 output file which holds:
* The CA certificate
* The CA's private key
If you elect to generate PEM format certificates (the -pem option), then the output will
be a zip file containing individual files for the CA certificate and private key
Please enter the desired output file [elastic-stack-ca.p12]: {①}
Enter password for elastic-stack-ca.p12 : {②}
①:此位置设置文档输出地址和名称。默认名称为elastic-stack-ca.p12。这个文件是PKCS#12密钥存储库,它包含您的CA的公共证书和用于为每个节点签署证书的私有密钥。
(也可以无需输入,直接回车,则会再当前目录,elasticsearch-7.6.2目录下, 和bin同级目录,生成文件elastic-certificates.p12,
然后在elasticsearch-7.6.2/config目录下,新建一个文件夹certs, 把文件elastic-certificates.p12复制到certs文件夹下即可。)
②:此位置设置证书的密码。计划将来向集群添加更多的节点,请记住其密码。
为Elasticsearch集群中的节点生成证书
使用下面的名称生成集群使用的生成节点证书。elastic-stack-ca.p12为上一步生成CA证书。
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
整个创建过程是这样的,类似之前的内容,在输入命令后控制台会输出此命令的信息描述,
输入elastic-stack-ca.p12的密码后,在elasticsearch-7.6.2文件夹下执行命令:
bin/elasticsearch-certutil cert --ca config/certs/elastic-stack-ca.p12
然后你需要先执行{①}的操作然后执行{②}的操作,最后执行{③}的操作
Enter password for CA (/usr/local/es-cluster/elastic-stack-ca.p12) : ①
Please enter the desired output file [elastic-certificates.p12]: ②
Enter password for elastic-certificates.p12 : ③
① : 此位置需要输入elastic-stack-ca.p12 CA授权证书的密码。
② : 此位置为需要输出证书位置。
③ : 此位置为证书的密码。使用空密码可以直接回车结束。
默认情况下,elasticsearch-certutil生成的证书中没有主机名信息。这意味着可以为集群中的任意节点使用此证书,但是必须关闭主机名验证。
es集群模式,修改每个节点的elasticsearch.yml配置
将elastic-certificates.p12文件(只需要此文件)复制到每个节点上的Elasticsearch配置目录中的一个目录中。比如我是放到了每个节点的config/certs目录下。
然后修改每个节点的elasticsearch.yml配置。添加下面的参数:
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
xpack.security.transport.ssl.verification_mode
如果在elasticsearch-certutil cert命令中使用—dns或—ip选项,并且希望启用严格的主机名检查,此参数需要设置为full。而之前的例子证书中并没有输入ip以及dns等信息,所以我们没有使用严格的主机检查。
4、设置ssl的keystore、truststore的密码
如果你在创建证书时没有输入密码,则这个时候重启集群后,如果elastic用户没有密码,则使用默认的引导密码。引导密码是一个临时密码,它允许您运行设置所有内置用户密码的工具。
如果你在创建证书时输入了密码,那可以通过下面的方法设置:
bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password 输入自定义的密码
bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password 输入自定义的密码
5、重启ES集群是配置生效
安全重启步骤:
1、暂停数据写入程序
2、关闭集群shard allocation,手动执行POST /_flush/synced
3、查看进程和杀死进程
4、重启节点
5、.确认进程是否启动,
6、并重新开启集群shard allocation
7、等待recovery完成,集群health status变成green
1、暂停数据写入程序
将写入es的程序暂停
2.关闭集群的动态分片:(动态分片开启状态如果节点宕机了,会导致集群重新分配数据进行数据转移,会导致节点直接大量传输数据)
curl -XPUT ‘http://10.3.14.154:9200/_cluster/settings?pretty’ -d ‘{“transient”:{“cluster.routing.allocation.disable_allocation”: true}}’
curl -XPUT 'http://10.3.14.154:9200/_cluster/settings?pretty' -d '{"transient":{"cluster.routing.allocation.disable_allocation": true}}'
{
"error" : "Content-Type header [application/x-www-form-urlencoded] is not supported",
"status" : 406
}
3. 查看进程和杀死进程
- 重启前,进入到业务账号很重要。见过死的谁都害怕
ps -ef | grep elas
kill -9 12955
4.重启 服务
cd ~/bin
./elasticsearch -d
5.确认进程是否启动
ps -ef | grep elasticsearch
6.开启集群的动态分片:
curl -XPUT ‘http://10.3.14.155:9200/_cluster/settings?pretty’ -d ‘{“transient”:{“cluster.routing.allocation.disable_allocation”: false}}’
{
“error” : “Content-Type header [application/x-www-form-urlencoded] is not supported”,
“status” : 406
}
7.检查集群的健康状态
curl 10.3.14.154:9200/_cluster/health?pretty
6、配置内置用户的密码
重启完成后,我们需要为所有的内置用户设置密码。设置密码使用命令:
bin/elasticsearch-setup-passwords interactive
上面过程中我们需要设置多个默认用户的信息,每个内置用户负责不同的内容。
为以下用户分别设置密码:
elastic
kibana
logstash_system
beats_system
apm_system
remote_monitoring_user
7、修改kibana的配置
截止到目前Elasticsearch的部分已经修改完毕,下面修改kibana配置以便于让其和Elasticsearch完成连接。
修改配置文件
修改kibana的配置文件config/kibana.yml在配置文件中添加下面内容:
elasticsearch.username: "es账号"
elasticsearch.password: "es密码"
kibana 使用ps -ef|grep kibana是查不到进程的,因为其实运行在node里面。但是我们也不能关闭所有node里面的软件,所以我们需要查询kibana监听端口5601的进程。
使用下面命令关闭kibana:
netstat -tunlp|grep 5601(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 16177/bin/../node/b
kill -9 16177
然后重启Kibana
nohup ./kibana &
此时访问kibana(http://localhost:5601)会提示需要输入账号密码。
注意此时需要输入的是elasticsearch的用户密码。
到此为止ES最基础的安全策略已经添加进来了。
参考文章:https://blog.csdn.net/qq330983778/article/details/103537252
https://www.tianmingxing.com/2019/06/20/%E5%9C%A8ElasticSearch6.8%E5%8F%8A%E4%BB%A5%E4%B8%8A%E7%89%88%E6%9C%AC%E5%BC%80%E5%90%AF%E5%AE%89%E5%85%A8%E8%AE%A4%E8%AF%81%E5%8A%9F%E8%83%BD/