介绍
介绍
福哥在前面已经教给大家如何使用Docker搭建ES集群的方法了,不过这里面有个问题,就是福哥搭建的集群环境是没有安全认证的,也就是说任何人都可以对ES集群进行任何操作,这个太可怕了~~
这个ES集群用来搞科研还行,如果是要作为生产环境使用那风险未免太大了!所以,今天福哥要带着大家给ES集群添加一道安全防护,我们来学习如何给ES集群开启HTTP Basic安全认证,一起来吧~~
开启认证
docker-compose-es-cluster.yml
xpack.security.enabled
其实给ES开启安全认证只需要在环境变量里加上一个设置xpack.security.enabled=true即可。
xpack.security.enabled=true
xpack.security.transport.ssl.enabled
另外还得配置一个xpack.security.transport.ssl.enabled=true来开启TLS/SSL传输,否则启动集群的时候会报如下错误。
Transport SSL must be enabled if security is enabled on a [basic] license. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security by setting [xpack.security.enabled] to [false]
xpack.security.transport.ssl.enabled=true
证书
除此之外还得配置集群共享证书,通过共享证书可以让集群各个节点之间建立信任关系。
这个证书需要进入到elasticsearch的节点里面手动创建,所以福哥后面再去创建这个证书。现在只要把配置参数设置好就可以了。
这个/usr/share/elasticsearch/config/certs目录本身是没有的,福哥后面会通过volumes映射到容器里面。
xpack.security.transport.ssl.verification_mode=certificate xpack.security.transport.ssl.keystore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12 xpack.security.transport.ssl.truststore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12
docker-compose-es-cluster.yml
因为我们是ES集群,记得给每个节点都配置这个选项哦!!
福哥这里设置的证书目录每个节点是分开的,因为通常情况下ES节点是部署在不同的服务器上面的,这里这样配置是告诉大家需要有复制证书这一步的。
version: "3.2" services: tfes01: image: registry.tongfu.net:5000/elasticsearch:6.8.15 container_name: tfes01 environment: - node.name=tfes01 - cluster.name=tfes-cluster - discovery.zen.ping.unicast.hosts=tfes01,tfes02,tfes03 - bootstrap.memory_lock=true - xpack.security.enabled=true - xpack.security.transport.ssl.enabled=true - xpack.security.transport.ssl.verification_mode=certificate - xpack.security.transport.ssl.keystore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12 - xpack.security.transport.ssl.truststore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 volumes: - /data/docker.data/tfes01/data:/usr/share/elasticsearch/data - /data/docker.data/tfes01/config/certs:/usr/share/elasticsearch/config/certs ports: - 9200:9200 tfes02: image: registry.tongfu.net:5000/elasticsearch:6.8.15 container_name: tfes02 environment: - node.name=tfes02 - cluster.name=tfes-cluster - discovery.zen.ping.unicast.hosts=tfes01,tfes02,tfes03 - bootstrap.memory_lock=true - xpack.security.enabled=true - xpack.security.transport.ssl.enabled=true - xpack.security.transport.ssl.verification_mode=certificate - xpack.security.transport.ssl.keystore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12 - xpack.security.transport.ssl.truststore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 volumes: - /data/docker.data/tfes02/data:/usr/share/elasticsearch/data - /data/docker.data/tfes02/config/certs:/usr/share/elasticsearch/config/certs tfes03: image: registry.tongfu.net:5000/elasticsearch:6.8.15 container_name: tfes03 environment: - node.name=tfes03 - cluster.name=tfes-cluster - discovery.zen.ping.unicast.hosts=tfes01,tfes02,tfes03 - bootstrap.memory_lock=true - xpack.security.enabled=true - xpack.security.transport.ssl.enabled=true - xpack.security.transport.ssl.verification_mode=certificate - xpack.security.transport.ssl.keystore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12 - xpack.security.transport.ssl.truststore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 volumes: - /data/docker.data/tfes03/data:/usr/share/elasticsearch/data - /data/docker.data/tfes03/config/certs:/usr/share/elasticsearch/config/certs
目录
福哥为每个ES节点建立了一个证书目录,授权目录所有者为1000这是容器里的es用户ID,这些目录会映射到ES容器里面。
启动tfes01
先注释掉tfes01的三个证书配置项,因为此时证书目录还是空的,直接启动tfes01会报错。
# - xpack.security.transport.ssl.verification_mode=certificate # - xpack.security.transport.ssl.keystore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12 # - xpack.security.transport.ssl.truststore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12
使用docker-compose启动tfes01节点。
docker-compose -f docker-compose-es-cluster.yml up -d tfes01
初始化证书
现在要进入到tfes01节点里面,切入到certs目录下,准备创建证书。
docker exec -ti tfes01 bash cd /usr/share/elasticsearch/config/certs/
创建ca证书。这里会有一些交互选项,一路回车即可。
elasticsearch-certutil ca
创建cert证书。这里也会有一些交换选项,一路回车即可。
elasticsearch-certutil cert --ca elastic-stack-ca.p12
此时certs目录下会有两个文件。
初始化密码
因为开启了安全认证,我们需要设置一下ES集群的密码。
进入tfes01节点里面,执行设置密码命令。
docker exec -ti tfes01 bash elasticsearch-setup-passwords interactive
复制证书
将tfes01的certs目录下的文件复制到其他节点的certs目录下,记得授权所有者为1000这是容器里的es用户ID。
启动集群
这个时候要把tfes01的证书选项的注释给删除掉了。
- xpack.security.transport.ssl.verification_mode=certificate - xpack.security.transport.ssl.keystore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12 - xpack.security.transport.ssl.truststore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12
使用docker-compose启动集群。
docker-compose -f docker-compose-es-cluster.yml up -d
查看节点状态,需要加上用户名和密码。
curl -u elastic:abcdef 'http://localhost:9200/_cat/nodes?v'
查看健康状态,需要加上用户名和密码。
curl -u elastic:abcdef 'http://localhost:9200/_cluster/health?pretty'
查看分片信息,需要加上用户名和密码。
可以看到除了test索引的分片之外,还多了一个.security-6的分片,这个就是存储安全认证信息数据的了。
查询数据,需要加上用户名和密码。
可以看到test索引里面的数据都还在。
curl -sS -u elastic:abcdef 'http://localhost:9200/test/_search?pretty' | grep '"name"'
总结
今天福哥带着大家学习了给ES集群开启HTTP Basic安全认证的方法,学会了这个之后我们就可以在生产环境上面搭建ES集群了。