使用filebeat进行数据加密传输和区别不同的日志源


使用filebeat进行数据加密传输和区别不同的日志源_第1张图片
打开微信扫一扫,关注微信公众号【数据与算法联盟】

转载请注明出处:http://blog.csdn.net/gamer_gyt
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamer


写在前边的话

数据在远程传输过程中,可能被劫持和获取,继而造成的后果是数据信息泄露,那么如何有效的进行数据传输呢,在ELK Stack中filebeat 提供了这样的一个解决方案,其不仅可以监听指定文件夹的数据,还可以对数据进行TLS 双向认证加密,从而保证数据传输过程中的可靠性。


环境说明

Ubuntu 16.04
ELK 5.2.1 (elk在192.168.1.127上)
Filebeat 5.2.1 (fb在192.168.1.128上)


Filebeat区别不同的日志源

filebeat.yaml 文件配置如下:

filebeat.prospectors:

# Each - is a prospector. Most options can be set at the prospector level, so
# you can use different prospectors for various configurations.
- input_type: log
  paths:
    - /home/thinkgamer/test/*.log
  document_type: test_log

- input_type: log

  paths:
    - /var/log/*.log
  document_type: auth_log

这里得document_type 就是对应filter中对应的log的type,在logstash的解析文件中可以这样写

input {
    beats {
        port => 5044
    }
}

filter {
    if [type] == 'auth_log'{
    }
    else if [type] == 'test_log'{
     }
}

output {
    elasticsearch {
        hosts => ["http://localhost:9200"]
        index =>"%{type}-%{+YYYY.MM.dd}" 
    }
}

Filebeat传输数据加密

上边基本环境里介绍到logstash和filebeat的ip地址分别为127和128 上,分别在两个机器上生成证书
logstash(127 机器):

cd ~
mkdir -p pki/tls/certs
mkdir -p pki/tls/private
openssl req -subj '/CN=192.168.1.127/' -x509 -days $((100 * 365)) -batch -nodes -newkey rsa:2048 -keyout pki/tls/private/logstash.key -out pki/tls/certs/logstash.crt

配置logstash的input为如下形式:

input {
    beats {
        port => 5044
        ssl => true
        ssl_certificate_authorities => ["/home/thinkgamer/pki/tls/certs/filebeat.crt"]
        ssl_certificate => "/home/thinkgamer/pki/tls/certs/logstash.crt" 
        ssl_key => "/home/thinkgamer/pki/tls/private/logstash.key" 
        ssl_verify_mode => "force_peer" 
    }
}

ssl:true 表示开启 Logstash 的 SSL/TLS 安全通信功能;
ssl_certificate_authorities:配置 Logstash 使其信任所有由该 CA 证书发行的证书;
ssl_certificate & ssl_key:Logstash server 证书和 key 文件。Logstash 使用它们向 Filebeat client 证明自己的可信身份;
ssl_verify_mode:表明 Logstash server 是否验证 Filebeat client 证书。有效值有 peer 或 force_peer。如果是 force_peer,表示如果 Filebeat 没有提供证书,Logstash server 就会关闭连接。

Filebeat(128机器):

cd ~
mkdir -p pki/tls/certs
mkdir -p pki/tls/private
openssl req -subj '/CN=192.168.1.128/' -x509 -days $((100 * 365)) -batch -nodes -newkey rsa:2048 -keyout pki/tls/private/filebeat.key -out pki/tls/certs/filebeat.crt

filebeat.yaml 配置文件中修改output logstash:

output.logstash:
  # The Logstash hosts
  hosts: ["192.168.1.127:5044"]

  # Optional SSL. By default is off.
  # List of root certificates for HTTPS server verifications
  ssl.certificate_authorities: ["/home/master/pki/tls/certs/logstash.crt"]

  # Certificate for SSL client authentication
  ssl.certificate: "/home/master/pki/tls/certs/filebeat.crt" 

  # Client Certificate Key
  ssl.key: "/home/master/pki/tls/private/filebeat.key" 

certificate_authorities:CA 证书,即用来签署证书的证书。这里表示配置 Filebeat 使其信任所有由该 CA 证书发行的证书。因为自签名证书的发行者和证书主体相同,所以这里直接使用 Logstash 证书使 Filebeat 信任使用该证书的 Logstash server;
certificate & certificate_key:Filebeat 证书和 key 文件。Filebeat 将使用它们向 Logstash server 证明自己的可信身份。

至此配置over了,在两个机器上分别启动logstash和filebeat,报错如下:

cannot validate certificate for 10.10.11.109 because it doesn't contain any IP SANs 

解决办法参考下边《遇到的问题和解决办法》


遇到的问题和解决办法

在配置好证书之后启动filebeat和logstash,filebeat并不能将数据传输给logstash,报出了下边的错误

cannot validate certificate for 10.10.11.109 because it doesn't contain any IP SANs 

解决办法是:
删除之前产生的证书,对openssl进行重新配置

sudo vim /etc/ssl/openssl.cnf

找到 [ v3_ca ]
加入下边一行:

subjectAltName = IP:这里写ip地址

比如我的两个机器便为:

subjectAltName = IP:192.168.1.127
subjectAltName = IP:192.168.1.128

重新生成证书,进行copy 配置即可


加密多个日志源问题

在生产环境中有多个日志源这是个很常见的问题,那么如果我们需要对多个日志源的数据进行加密传输时该怎么办呢?
答案是肯定得,这里有多种解决办法
1:每个filebeat分别发送到logstash监听的不同端口,比如说Filebeat A 发送到logstash的 5044端口,Filebeat B发送到logstash的5045 端口,这样做肯定是没有任何问题的
input 的输入是类似于下面这样的

input {
    beats {
        port => 5044
    }
    beats {
        port => 5044
    }
}

2:每个filebeat所在的机器都发送到logstash 的5044 端口,这样做在没有加密保护的情况下也是可以的(已经尝试过了),那如果是在加密的情况下该怎么做呢?是否能成功呢?

回答:当然是可以的,用同样的方法在另外一台安装filebeat的机器上生成证书,和logstash所在的机器进行证书的互相copy和配置,logstash的机器的input差不多应该是下面的这种

input {
    beats {
        port => 5044
        ssl => true
        ssl_certificate_authorities => ["/home/thinkgamer/pki/tls/certs/filebeat.crt","/home/thinkgamer/pki/tls/certs/filebeat1.crt"]
        ssl_certificate => "/home/thinkgamer/pki/tls/certs/logstash.crt" 
        ssl_key => "/home/thinkgamer/pki/tls/private/logstash.key" 
        ssl_verify_mode => "force_peer" 
    }
}

引深应用

以上仅仅是对数据从发源地到logstash收集过程进行解释,但是filebeat进行数据传输加密也可以应用别的方面,比如说A公司的两个数据点之间(B,C)要进行数据的传递,这个时候便可以使用filebeat了,在B和C地点分别生成证书和配置,在C地点可以使用logstash的output将传输过来的数据输出到指定文件夹中即可。

你可能感兴趣的:(使用filebeat进行数据加密传输和区别不同的日志源)