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

  1. $ cd /usr/local/es # 切换至es家目录
  2. # 生成CA证书
  3. $ bin/elasticsearch-certutil ca --out config/elastic-stack-ca.p12 -pass ""
  4. # 生成节点证书
  5. $ bin/elasticsearch-certutil cert --ca config/elastic-stack-ca.p12 -pass "" --out config/elastic-certificates.p12
  6. .........# 省略部分输出
  7. Enter password for CA (config/elastic-stack-ca.p12) :
  8. # 这里输入CA证书的密码,我上面生成CA时没指定密码,所以直接回车即可
  9. # 修改新生成的文件属主为es
  10. $ chown es.es config/elastic*
  11. # 配置文件中增加以下配置
  12. $ cat >>config/elasticsearch.yml <<EOF
  13. > xpack.security.enabled: true
  14. > xpack.security.transport.ssl.enabled: true
  15. > xpack.security.transport.ssl.verification_mode: certificate # 证书认证级别
  16. > xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
  17. > xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
  18. > EOF
  19. # 启动master节点
  20. $ su -s /bin/bash -c "/usr/local/es/bin/elasticsearch -p /data/es/es.pid -d" es

待es的9200端口处于监听后,访问会看到以下界面:

es集群配置TLS加密通信及身份验证 - 图1

看到上面的界面就说明我们的配置无误,那么用户名和密码是什么呢?接下来就来搞用户名和密码。

设置es集群密码

启动集群中的其他节点

我们必须保证集群内状态为green,才可以为集群设置密码,否则密码会设置失败。

启动集群中的其他节点之前,还需要修改节点上的配置文件,同样开启TSL传输,并且需要将master节点生成的节点证书分发到其他节点才可以。

master节点配置如下

  1. # 分发节点证书到要加入此集群的节点,后续有新的节点要加入es集群,都需要此证书
  2. $ for i in es{2..3};do rsync -avz /usr/local/es/config/elastic-certificates.p12 root@${i}:/usr/local/es/config/;done

配置要加入集群的节点

注:此操作任何要加入es集群的节点都要配置。

  1. $ cd /usr/local/es
  2. # 确认config目录下有节点证书文件,并且属主为es的启动用户
  3. $ ll config/elastic-certificates.p12
  4. -rw------- 1 es es 3443 5 27 13:24 config/elastic-certificates.p12
  5. # 修改配置文件
  6. $ cat >>config/elasticsearch.yml <<EOF
  7. xpack.security.enabled: true
  8. xpack.security.transport.ssl.enabled: true
  9. xpack.security.transport.ssl.verification_mode: certificate # 证书 认证级别
  10. xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
  11. xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
  12. EOF
  13. # 启动各节点
  14. $ su -s /bin/bash -c "/usr/local/es/bin/elasticsearch -p /data/es/es.pid -d" es
  15. $ ss -lnpt | egrep '9331|9200' # 确定端口在监听(我这里配置了数据传输使用9331端口,如果你没配置,那么此端口不会监听)
  16. LISTEN 0 128 ::ffff:192.168.20.4:9200 :::* users:(("java",pid=3357,fd=272))
  17. LISTEN 0 128 ::ffff:192.168.20.4:9331 :::* users:(("java",pid=3357,fd=210))

设置密码

一旦集群状态为green(现在这个情况,也查看不了集群状态,因为都需要用户密码认证了,而现在还没设置用户密码,当然,你也可以通过日志输出来判断es集群的状态),便可以为集群设置密码了:

注:设置密码操作是在master节点上进行

  1. $ pwd # 确认当前路径
  2. /usr/local/es
  3. $ bin/elasticsearch-setup-passwords auto # “auto”将会为不同的内部堆栈用户生成随机密码。
  4. # 或者也可以跳过 auto 参数,改为通过 interactive 参数手动定义密码。
  5. Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
  6. The passwords will be randomly generated and printed to the console.
  7. Please confirm that you would like to continue [y/N]y # 输入“y”确定

然后你就会看到屏幕输出如下内容:

es集群配置TLS加密通信及身份验证 - 图2

这些密码很重要,请妥善保存。

logstash增加访问es集群的用户及密码

当es集群配置了鉴权认证后,所有需要连接es的组件都需要更改配置,这里记录下logstash如何配置。

  1. output {
  2. elasticsearch {
  3. hosts => ["http://es1:9200", "http://es2:9200","http://es3:9200"]
  4. index => "secure-%{+YYYY.MM.dd}"
  5. user => "elastic" # 注意:这里演示使用超级账号,安全起见最好是使用自定义的账号,并授予该用户创建索引的权限,具体看下方地址
  6. password => "lkmg76aI8B99OW59avft"
  7. }
  8. }

当然,上面这样直接将用户名和密码写在配置文件中,不太安全,我们可以换一种方式,可以参考博文:logstash对敏感信息加密使用

elasticsearch-head访问es集群的用户及密码

elasticsearch-head插件此时再去访问有安全认证的es集群时,会发现可能无法进行查看,打开控制台可以看到报错:401 unauthorized。

解决办法是修改elasticsearch.yml文件,增加以下配置。

  1. http.cors.allow-headers: Authorization,content-type

Kibana组件访问带有安全认证的Elasticsearch集群

修改kibana配置文件如下:

  1. $ pwd
  2. /usr/local/kibana
  3. $ cat >> config/kibana.yml << EOF
  4. > elasticsearch.username: "kibana" # 注意:此处不用超级账号elastic,而是使用kibana跟es连接的账号kibana
  5. > elasticsearch.password: "zXBItVI3vcfynGwgcufd"
  6. > EOF
  7. # 启动kibana
  8. $ su -s /bin/bash -c "/usr/local/kibana/bin/kibana &" kibana

访问kibana,会看到如下界面:

es集群配置TLS加密通信及身份验证 - 图3

目前只能elastic用户可以登录到kibana。

关于kibana多用户创建及角色权限控制,这里给点提示,自己琢磨吧,如下:

es集群配置TLS加密通信及身份验证 - 图4

一般是先创建角色,再创建用户。