elasticsearch安全通讯配置要点(es 8.5.1)

       elasticsearch的安全通讯配置,官网文档说明比较零散,尤其是几种组件如kibana、fleetserver、各类agent、beat采用的处理方式都不一样,这里针对利用elasticsearch自带证书工具创建CA的方式,归集一下配置要点,希望能有所帮助。

一、基本知识

    1、默认情况下,服务器将使用两个端口进行通讯,9300与9200:

          9300,用于elasticsearch服务器集群内各服务器节点间的通讯。

          9200,用于http通讯,各类restful客户端,例如kibana,浏览器直接访问、agent等等需要通过该端口与服务器连接。

    2、如果首次使用yum或者rpm按装elasticsearch服务器,安装程序会自动进行安全配置,并生成几个安全配置需要的文件,如ca的keystore、用于http加密通讯的keystore(http.p12)等,这些最好保留下来,当然,你也可以用它提供的证书工具在后面自行创建。留意,如果不是首次安装,又希望系统再次自动生成安全配置,需要先把/var/lib/elasticsearch里的东西删除干净。

    3、通过自动安全配置生成的几个文件会放在/usr/share/elasticsearch下:

         elastic-stack-ca.p12   keystore文件,存储了ca的公共证书及用于签发其他证书的密钥。

         transport.p12   包含了传输层密钥和证书,用于elasticsearch节点间加密通讯。

         http.p12  这个keystore存储着http加密通讯需要的证书和密钥。

         http_ca.crt  证书文件,用于集群内的http通讯加密。

二、配置要点(以下elasticsearch服务简称es服务器)

    1、创建CA

     (yum/rpm方式安装的es,其自带的工具都放在/usr/share/elasticsearch/bin里面。)

        ./elasticsearch-certutil ca 

      按提示操作即可,我这里选择了不改名字、不加密码。完成后该工具会在上一级文件夹(即/usr/share/elasticsearch)里生成elastic-stack-ca.p12文件。这个文件将用于签署其他证书,非常重要。

    2、启用elasticsearch节点间加密通讯:

       2.1、创建用于节点间加密的keystore

               把上面的CA文件复制到需要加入集群的节点服务器,使用certutil工具生成节点keystore文件,如下:

               ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

       按提示操作,为了方便,我没改默认文件名,但为了后面说明keystore工具的使用,我在这里添加了密码:abcdef

       完成后生成keystore文件elastic-certificates.p12,里面包含了节点证书,节点密钥,以及CA的证书。

     2.2、由于上面的文件加了密码,需要在本地的keystore里添加密码以便本节点elasticsearch进程可以读取,如下:

           ./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password

           ./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password

     2.3、在/etc/elasticsearch文件夹里新建certs文件夹以方便后面对路径统一管理。把elastic-certificates.p12文件复制到每一个节点的certs目录。注意读取权限要分配给elasticsearch组(该组在yum/rpm方式安装时自动创建)。

     2.4、在每一个节点上配置elasticsearch.yml文件
            cluster.name: (集群名字,所有节点都要一致)
            node.name:  (节点名字 ,最好有规律方便自己记忆)

           xpack.security.transport.ssl:
                 enabled: true
                 verification_mode: certificate
                 keystore.path: certs/elastic-certificates.p12
                 truststore.path: certs/elastic-certificates.p112

3、启用elasticsearch服务器上的http加密通讯

     3.1、使用工具生成用于http加密通讯的p12及pem文件。

          ./bin/elasticsearch-certutil http    下面会有一堆问题,我按如下配置:

           创建CSR: 否
           使用已创建CA:是
           CA文件路径:/usr/share/elasticsearch/elastic-stack-ca.p12
           CA文件密码:无密码
           设置证书过期时间:可以按年月日计算,例如10y为10年,10d为10天,10m为10个月。
           是否为每个节点创建独立的证书:否  (使用同一个证书。)
           录入需要使用证书的机器名    (可以多个)
           录入需要使用证书的IP          (可以多个)
           设置证书密码:abcdef

      以上完成后将生成一个zip压缩文件。   

      3.2、解压文件,生成一个文件夹,里面包含两个文件夹,elasticsearch文件夹包含http.p12及elasticsearch.yml的配置参考,kibana文件夹包含elasticsearch-ca.pem及kibana.yml的配置参考。把http.p12复制到certs文件中。

      3.3、同样,把上面keystore文件的密码加入到keystore中,

         ./bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password

      3.4、修改elasticsearch.yml以支持http通讯加密

         xpack.security.http.ssl:
              enabled: true
              keystore.path: certs/http.p12

      3.5、如果你没有记下内置的超级用户elastic的密码,这时可以重置一下它的密码:

            ./bin/elasticsearch-reset-password -u elastic

           该工具会把重置密码显示在屏幕中,记下来。

     3.6、此时,可以尝试在浏览器用https://你的elasticsearch服务器的地址:9200访问一下验证安全设置是否生效。

  4、启用es服务器与kibana间的加密通讯

      4.1、把上面的elasticsearch-ca.pem复制到kibana服务器。

      4.2、修改kibana.yml

              elasticsearch.ssl.certificateAuthorities: [ "文件路径/elasticsearch-ca.pem" ]
              elasticsearch.ssl.verificationMode: certificate

     4.3、重启kibana。

 5、fleet server与es服务器的加密通讯

     我的理解,fleet server实际上是一个agent,启用了特别的代理策略(fleet server policy)。在安装前,需要先准备几个加密通讯用到的文件,当然,你也可以使用--insecure参数跳过,但会带来一系列问题,因此,不建议使用--insecure参数。

    5.1、fleet server加密通讯需要3个证书文件和一个密钥文件。你在kibana上添加fleet server时,可以在系统给出的脚本上看到,如下案例:

            --certificate-authorities=<PATH_TO_CA>    #用于连接到fleet server 的ca证书,即集群CA的证书。
           --fleet-server-es-ca=<PATH_TO_ES_CERT> #用于连接到elasticsearch的证书,加密http通讯的证书。
           --fleet-server-cert=<PATH_TO_FLEET_SERVER_CERT>  # fleet server本身的证书,pem格式。
           --fleet-server-cert-key=<PATH_TO_FLEET_SERVER_CERT_KEY> #fleet server本身的密钥。

   5.1.1、这几个文件分别通过如下步骤创建:

      A. 准备ca.crt及ca.key用于创建fleet-server-cert和fleet-server-cert-key:

       openssl pkcs12 -in elastic-stack-ca.p12 -out ca.crt -clcerts -nokeys   #生成ca.crt

       openssl pkcs12 -in elastic-stack-ca.p12 -out ca.key -nocerts -nodes  #生成ca.key

      (ca.crt可直接用于参数--certificate-authorities=/路径/ca.crt)

     B. 使用certutil工具生成fleet-server-cert和fleet-server-cert-key:

      ./bin/elasticsearch-certutil cert  --name fleet-server  --ca-cert 路径/ca.crt  --ca-key 路径/ca.key 
      --dns 你的fleetserver服务器名字 --ip 你的fleetserver的IP --pem

      完成后会生成一个zip压缩文件。解压该文件,得到fleet-server.crt和fleet-server.key  

      C. 生成参数 --fleet-server-es-ca所需文件,如前所述,实际上fleetserver一个特殊agent,因此它也是采用http与es服务器通讯,因此,我们要使用前面生成的keystore文件http.p12里面的证书:

         openssl pkcs12 -in http.p12 -out elastic-ca.crt -clcerts -nokeys

      生成elastic-ca.crt ,此文件用于通过https连接easticsearch服务器。

   5.2、把上述文件复制到agent机器的某个路径,至此,安装fleet server所需的文件均已齐备,可以利用kibana界面提供的安装脚本进行安装了。

   装完fleet server后,可能会出现agent状态正常,但是没有数据流传递到es服务器的现象,此时需要指定agent使用证书与es通讯,在kibana界面,fleet设置里编辑output,在“高级yaml编辑”加上

     

     protocol: "https"  

         ssl:

            certificate_authorities:  "路径/agent用于与es服务器通讯的http证书"

            verification_mode: "certificate"

        或者,启用Fingerprint认证,在elasticsearch服务器上,获取http证书的fingerprint:

       openssl x509 -in http_ca1.crt -sha256 -fingerprint | grep SHA256 | sed 's/://g'

       获得后,在“高级yaml编辑”里,加上:       

ssl.ca_trusted_fingerprint: 你的fingerprint。

      这个方式比较简单些,不受证书文件路径格式限制,适合场合也多一点。

6、启用agent的加密通讯

    与fleetserver类似,但只需要指定token(kibana上添加代理时会给出)和certificate_authorities即可,这里就略过了。建议注册到fleetserver,会简单很多。没必要使用standalone方式,那是自找麻烦,除非有很特殊的要求或者进行故障排查。

7、beat的加密通讯,这里以filebeat为例

    把elastic-ca.crt复制到要安装beat的机器,正常安装beat后,修改filebeat.yml

     output.elasticsearch:
            hosts: ["https://你的es服务器IP:9200"]
            protocol: "https"           
            ssl:
                 certificate_authorities:  "路径/agent用于与es服务器通讯的http证书"
                 verification_mode: "certificate"  

    

以上,参考了几篇官方文档:

 elastic stack手工配置安全

filebeat配置SSL

     

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>