同福

Elasticsearch6.8.15集群开启HTTP Basic安全认证的方法【20220909】

介绍

介绍

福哥在前面已经教给大家如何使用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容器里面。

home/topic/2022/0907/15/df78ec4ab9c01a3a89c09a1e4910b4b3.png

启动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

home/topic/2022/0907/15/52f6cff3b8cf954df8d2ca8fc2470102.png

初始化证书

现在要进入到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目录下会有两个文件。

home/topic/2022/0907/15/b6c18a3935d8fef0add44c0a4560a4b3.png

初始化密码

因为开启了安全认证,我们需要设置一下ES集群的密码。

进入tfes01节点里面,执行设置密码命令。

docker exec -ti tfes01 bash
elasticsearch-setup-passwords interactive

home/topic/2022/0907/14/c363c5f0029eb86a582cc2dfcfc30b32.png

复制证书

将tfes01的certs目录下的文件复制到其他节点的certs目录下,记得授权所有者为1000这是容器里的es用户ID。

home/topic/2022/0907/15/adc636e61da3537b907ab564f951f90d.png

启动集群

这个时候要把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

home/topic/2022/0907/16/6b0a8f74a8ab5ce40424c99eb05d8b3a.png查看节点状态,需要加上用户名和密码。

curl -u elastic:abcdef 'http://localhost:9200/_cat/nodes?v'

home/topic/2022/0907/16/90ec336daa22b5fa4b239851688e4913.png

查看健康状态,需要加上用户名和密码。

curl -u elastic:abcdef 'http://localhost:9200/_cluster/health?pretty'

home/topic/2022/0907/16/6c15eec985572e5973eebba73faeaa68.png

查看分片信息,需要加上用户名和密码。

可以看到除了test索引的分片之外,还多了一个.security-6的分片,这个就是存储安全认证信息数据的了。

home/topic/2022/0907/16/f2dae92eed91afc860a81a8801d063a6.png

查询数据,需要加上用户名和密码。

可以看到test索引里面的数据都还在。

curl -sS -u elastic:abcdef 'http://localhost:9200/test/_search?pretty' | grep '"name"'

home/topic/2022/0907/16/454aeaa062bb55edeecf8cc2eeaf4742.png

总结

今天福哥带着大家学习了给ES集群开启HTTP Basic安全认证的方法,学会了这个之后我们就可以在生产环境上面搭建ES集群了。