zoukankan      html  css  js  c++  java
  • Filebeat与Logstash配置SSL加密通信

    为了保证应用日志数据的传输安全,我们可以使用SSL相互身份验证来保护Filebeat和Logstash之间的连接。 这可以确保Filebeat仅将加密数据发送到受信任的Logstash服务器,并确保Logstash服务器仅从受信任的Filebeat客户端接收数据。
    下面就讲述一下配置Filebeat与Logstash之间进行加密通信的方法。全文是在CentOS7上基于Elastic 7.5.0技术栈所验证的。

    需要一个自签的CA证书,以及使用该CA证书签署的两份数据证书。一份是给Logstash作为server端验证自己身份时使用,一份是提供给Filebeat客户端验证自己身份使用。
    直接利用的Elasticsearch随安装包提供的数字证书工具elasticsearch-certutil来制作需要的证书.官方地址:https://www.elastic.co/guide/en/elasticsearch/reference/7.5/certutil.html

    • 制作自签的CA证书
      在Linux下,进入到Elasticsearch程序的部署家目录中,执行以下命令可以生成一份自签的CA证书:
      ./bin/elasticsearch-certutil ca

    使用默认输出文件名elastic-stack-ca.p12,并为证书设置访问口令。

    根据证书文件导出一份CA公钥文件,用于后续各应用配置文件中引用CA公钥时使用:
    openssl pkcs12 -clcerts -nokeys -in elastic-stack-ca.p12 -out ca.pem

    或者使用这个:

    bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 # elastic-certificates.p12
    openssl pkcs12 -in elastic-certificates.p12 -cacerts -nokeys -out out ca.pem
    
    
    • 制作Logstash使用的数字证书
      Logstash服务在启用SSL加密通信支持时,会有一个特殊的问题。因为Logstash在底层是通过集成了Netty来提供的对外服务端口,而Netty在支持数字证书这一功能上面,有一个局限性,即Netty仅支持使用PKCS#8的密钥格式。
      对于我们使用最多的PEM格式证书,Logstash会毫不留情地打印出以下异常信息:
    [ERROR][logstash.inputs.beats    ] Looks like you either have a bad certificate, an invalid key or your private key was not in PKCS8 format.
    

    由于Elastic官网上对于Filebeat和Logstash之间配置SSL加密通信时的说明资料对制作Logstash使用的数字证书的操作一带而过,只是简单的说既可以使用elasticsearch自带的证书工具,也可以使用通用的openssl。所以,按照Elastic技术栈中处理其它工具配置SSL功能支持时的方法,制作和得到PEM格式的证书后,便会遇到Logstash抛出的上面的异常信息了。由于Logstash打印的错误信息比较多,分析了很长时间才定位到是由于未使用PKCS8密钥格式所引发的。

    制作Logstash Server证书的正确方法

    # --name为制作的证书名称,--dns为hosts文件解析后的地址,--ip为logstash程序所在主机ip
    在生成证书时至少需要提供--dns参数的值,可以使用逗号分隔指定多个,简单处理的话可以接指定为Filebeat工具所在主机的hostname即可。
    ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --name logstash --dns logstash --ip 192.168.75.21 --pem --out logstash.zip # 使用自签的CA签署生成了一份名为logstash的数字证书
    unzip logstash.zip # 解压后会各有一个.key和.crt后缀的文件
    cd logstash
    openssl pkcs8 -in logstash.key -topk8 -nocrypt -out logstash.p8 # 使用openssl转换出一份PKCS#8格式的密钥文件,即logstash.p8
    
    # 不一定非要使用p8结尾,这样的也可以:openssl pkcs8 -in config/certs/logstash.key -topk8 -nocrypt -out config/certs/logstash.pkcs8.key
    

    对于制作的logstash.crt的证书,可以使用以下命令查看证书中的信息:
    openssl x509 -in logstash.crt -text

    将证书文件部署到Logstash配置目录下
    假定我们部署Logstash的路径为/etc/logstash ,我们创建下面这样的证书存放目录certs,并把包括logstash证书和ca证书在内的文件部署于此。

    mkdir -p /etc/logstash/certs
    # 把ca.pem  logstash.crt  logstash.key  logstash.p8这四个文件拷贝到该目录下
    ll /etc/logstash/certs
    ca.pem  logstash.crt  logstash.key  logstash.p8
    chmod 600 * # 安全起见,将以上文件权限调整为600 
    
    • 为Filebeat服务制作和配置数字证书
      回到刚才制作CA证书的地方,继续为Filebeat生成一份数字证书:
    # 在生成证书时至少需要提供--dns参数的值,可以使用逗号分隔指定多个,简单处理的话可以直接指定为Filebeat工具所在主机的hostname即可。
    ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --name filebeat  --dns filebeat --ip 192.168.75.20 --pem --out filebeat.zip
    unzip filebeat.zip
    
    # 将得到的数字证书和密钥文件,以及ca证书文件,复制到Filebeat存储证书的路径下:
    mkdir -p /etc/filebeat/certs
    ll /etc/filebeat/certs
    filebeat.crt  filebeat.key  ca.pem
    chmod 600 * # 安全起见,将以上文件权限调整为600 
    
    • 配置Filebeat使用SSL
      编辑filebeat.yml文件,参照以下内容进行配置:
    # 注意logstash的ip地址,或者使用dns地址代替
    output.logstash:
      hosts: ["192.168.75.21:5044"]
      ssl.certificate_authorities: ["/etc/filebeat/certs/ca.pem"]
      ssl.certificate: "/etc/filebeat/certs/filebeat.crt"
      ssl.key: "/etc/filebeat/certs/filebeat.key"
    
    • 配置Logstash在通过beats接收日志数据时使用SSL
    # 在ssl_key参数中,引用的是我们制作的PCKS#8格式的密钥文件
    input {
      beats {
        port => 5044
        codec => plain {
          charset => "UTF-8"
        }
        ssl => true
        ssl_certificate_authorities => ["/etc/logstash/certs/ca.pem"]
        ssl_certificate => "/etc/logstash/certs/logstash.crt"
        ssl_key => "/etc/logstash/certs/logstash.p8"
        ssl_verify_mode => "force_peer"
      }
    }
    
    
    • 启动Filebeat服务并观察日志
      观察日志输出,显示有类似以下信息时表示Filebeat正常连接到Logstash服务且SSL功能工作正常。
    Connecting to backoff(async(tcp://log.mytestserver.com:5044))
    Connection to backoff(async(tcp://log.mytestserver.com:5044)) established
    

    或者配置output输出进行查看是否可以收到filebeat传递过来的日志信息

    output {
      stdout {
         codec => rubydebug
      }
    }
    

    官方说明

  • 相关阅读:
    Redis常用命令详细介绍(摘抄)
    线性表和链表
    TCP传输连接中的SYN、ACK、SEQ、AN分别是什么意思?他们所带的数字又是代表什么?
    redis默认有16个数据库
    常见问题
    jquery-table2excel 不导出列(隐藏列,或指定列)
    AngularJS 防止页面闪烁的方法
    如何做好需求分析
    IIS 一个服务器下不同站点操作共享文件夹
    批量修改 mysql数据库编码格式(Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='格式错误)
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/12055038.html
Copyright © 2011-2022 走看看