date: 2020-05-31title: es集群配置TLS加密通信及身份验证 #标题
tags: es安全加密 #标签
categories: elastic stack # 分类
从es 6.8开始,默认提供很多安全功能,例如TLSv加密通信、基于角色的访问控制 (RBAC)等等。
这篇博文将用于记录下启用这些功能,以此来保证我们es集群的安全。
注:我这里已经有es集群以及kibana,安装文档请参考:elasticsearch集群部署
我这里的集群就是基于上面的文档进行安装的。
为了避免大家踩坑,我这里明确说明下现在我这里的环境:
- 三个节点配置了/etc/hosts文件,互相可以解析
- es集群已初始化完成,现在集群处于停止状态(个人感觉集群是否已经初始化没什么关系)
在es集群master节点配置TLS
$ cd /usr/local/es # 切换至es家目录
# 生成CA证书
$ bin/elasticsearch-certutil ca --out config/elastic-stack-ca.p12 -pass ""
# 生成节点证书
$ bin/elasticsearch-certutil cert --ca config/elastic-stack-ca.p12 -pass "" --out config/elastic-certificates.p12
.........# 省略部分输出
Enter password for CA (config/elastic-stack-ca.p12) :
# 这里输入CA证书的密码,我上面生成CA时没指定密码,所以直接回车即可
# 修改新生成的文件属主为es
$ chown es.es config/elastic*
# 配置文件中增加以下配置
$ cat >>config/elasticsearch.yml <<EOF
> xpack.security.enabled: true
> xpack.security.transport.ssl.enabled: true
> xpack.security.transport.ssl.verification_mode: certificate # 证书认证级别
> xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
> xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
> EOF
# 启动master节点
$ su -s /bin/bash -c "/usr/local/es/bin/elasticsearch -p /data/es/es.pid -d" es
待es的9200端口处于监听后,访问会看到以下界面:
看到上面的界面就说明我们的配置无误,那么用户名和密码是什么呢?接下来就来搞用户名和密码。
设置es集群密码
启动集群中的其他节点
我们必须保证集群内状态为green,才可以为集群设置密码,否则密码会设置失败。
启动集群中的其他节点之前,还需要修改节点上的配置文件,同样开启TSL传输,并且需要将master节点生成的节点证书分发到其他节点才可以。
master节点配置如下
# 分发节点证书到要加入此集群的节点,后续有新的节点要加入es集群,都需要此证书
$ for i in es{2..3};do rsync -avz /usr/local/es/config/elastic-certificates.p12 root@${i}:/usr/local/es/config/;done
配置要加入集群的节点
注:此操作任何要加入es集群的节点都要配置。
$ cd /usr/local/es
# 确认config目录下有节点证书文件,并且属主为es的启动用户
$ ll config/elastic-certificates.p12
-rw------- 1 es es 3443 5月 27 13:24 config/elastic-certificates.p12
# 修改配置文件
$ cat >>config/elasticsearch.yml <<EOF
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate # 证书 认证级别
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
EOF
# 启动各节点
$ su -s /bin/bash -c "/usr/local/es/bin/elasticsearch -p /data/es/es.pid -d" es
$ ss -lnpt | egrep '9331|9200' # 确定端口在监听(我这里配置了数据传输使用9331端口,如果你没配置,那么此端口不会监听)
LISTEN 0 128 ::ffff:192.168.20.4:9200 :::* users:(("java",pid=3357,fd=272))
LISTEN 0 128 ::ffff:192.168.20.4:9331 :::* users:(("java",pid=3357,fd=210))
设置密码
一旦集群状态为green(现在这个情况,也查看不了集群状态,因为都需要用户密码认证了,而现在还没设置用户密码,当然,你也可以通过日志输出来判断es集群的状态),便可以为集群设置密码了:
注:设置密码操作是在master节点上进行
$ pwd # 确认当前路径
/usr/local/es
$ bin/elasticsearch-setup-passwords auto # “auto”将会为不同的内部堆栈用户生成随机密码。
# 或者也可以跳过 auto 参数,改为通过 interactive 参数手动定义密码。
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
The passwords will be randomly generated and printed to the console.
Please confirm that you would like to continue [y/N]y # 输入“y”确定
然后你就会看到屏幕输出如下内容:
这些密码很重要,请妥善保存。
logstash增加访问es集群的用户及密码
当es集群配置了鉴权认证后,所有需要连接es的组件都需要更改配置,这里记录下logstash如何配置。
output {
elasticsearch {
hosts => ["http://es1:9200", "http://es2:9200","http://es3:9200"]
index => "secure-%{+YYYY.MM.dd}"
user => "elastic" # 注意:这里演示使用超级账号,安全起见最好是使用自定义的账号,并授予该用户创建索引的权限,具体看下方地址
password => "lkmg76aI8B99OW59avft"
}
}
当然,上面这样直接将用户名和密码写在配置文件中,不太安全,我们可以换一种方式,可以参考博文:logstash对敏感信息加密使用
elasticsearch-head访问es集群的用户及密码
elasticsearch-head插件此时再去访问有安全认证的es集群时,会发现可能无法进行查看,打开控制台可以看到报错:401 unauthorized。
解决办法是修改elasticsearch.yml文件,增加以下配置。
http.cors.allow-headers: Authorization,content-type
Kibana组件访问带有安全认证的Elasticsearch集群
修改kibana配置文件如下:
$ pwd
/usr/local/kibana
$ cat >> config/kibana.yml << EOF
> elasticsearch.username: "kibana" # 注意:此处不用超级账号elastic,而是使用kibana跟es连接的账号kibana
> elasticsearch.password: "zXBItVI3vcfynGwgcufd"
> EOF
# 启动kibana
$ su -s /bin/bash -c "/usr/local/kibana/bin/kibana &" kibana
访问kibana,会看到如下界面:
目前只能elastic用户可以登录到kibana。
关于kibana多用户创建及角色权限控制,这里给点提示,自己琢磨吧,如下:
一般是先创建角色,再创建用户。