1 整体架构部署
SIEM全称为security information and event management,即安全信息和事件管理,通俗使用的说,安全信息指的是服务运行中产生的日志信息,事件管理即通过对安全信息进行各种分析方法的总称,如入侵检测等。目前我司一个项目中客户要求SIEM系统,最常见的采用elk+filebeat搭建SIEM系统,用来分析服务器产生的日志:其实初步只做到了安全信息管理,后面如果深入我会继续更新。下面先看下部署的整体架构:filebeat部署在哥哥需要收集日志的机器上,然后在云上部署elk系统,然后filebeat将日志传送到logstash中,然后logstash存到es中,进一步通过kibana进行数据化展示。
其中涉及的部署主机如下:
部署用途 | 主机 | 域名 | 环境 |
---|---|---|---|
日志产生集群:部署filebeat7.8 | 10.65.18.105等 | archery-sec0001.xxx.xx | centos7 |
SIEM系统:部署elk7.8 | 10.65.18.112 | archery-sec0002.xxx.xx | centos7,java8 |
2 elk安装
在10.65.18.112主机上部署elk。其中安装elk教程参考前面一篇文章即可写的较详细,这里直接列出关键命令。
2.1 elasticsearch9200
注意安装ES时候,需要java8的环境。
安装目录: 一般是装在/usr/share/elasticsearch/下
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
(0)安装1.8版本java
执行下面命令进行安装1.8jdk。这里有个地方要注意,要选择 要带有-devel的安装,因为这个安装的是jdk,而那个不带-devel的安装完了其实是jre。
yum install -y java-1.8.0-openjdk-devel.x86_64
java -version
(1)下载安装es
sudo wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.0-x86_64.rpm
rpm -ivh elasticsearch-7.8.0-x86_64.rpm
(2) 配置文件
vim /etc/elasticsearch/elasticsearch.yml#修改默认配置
egrep -v "^#|^$" /etc/elasticsearch/elasticsearch.yml
#设置内存不使用交换分区
bootstrap.memory_lock: false
#配置了bootstrap.memory_lock为true时反而会引发9200不会被监听,原因不明
#设置允许所有ip可以连接该elasticsearch
network.host: 0.0.0.0
#开启监听的端口为9200
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
##防止bootstrap报错
node.name: node-1
bootstrap.system_call_filter: false
cluster.initial_master_nodes: ["node-1"]
(3)启动es
sudo systemctl enable elasticsearch #设置开机启动
sudo systemctl start elasticsearch #启动
sudo systemctl status elasticsearch #启查看运行状态
(4)测试是否启动成功
curl -X GET http://localhost:9200 #测试服务是否开启 可以用IP或者域名
curl -X GET http://archery-sec0002.eniot.io:9200/
curl -X GET http://10.65.18.112:9200/
2.2 logstash安装5044
(1)下载安装
sudo wget https://artifacts.elastic.co/downloads/logstash/logstash-7.8.0.rpm
rpm -ivh logstash-7.8.0.rpm
(2)配置文件
这里注意将output下的hosts改为刚才ES的IP地址即可。
cd /etc/logstash#进入logstash目录
vi /etc/logstash/conf.d/logstash.conf#创建配置文件,日志内容输出到elasticsearch中
input {
stdin {}
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["10.65.18.112:9200"] #es主机
index => "filebeats-%{+YYYY.MM.dd}"
}
stdout {
codec => rubydebug
}
}
(3)启动
nohup /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf & #指定logstash.conf配置文件,以后台的方式运用
ps -ef|grep logstash #查看logstash服务
kill -9 pid
这里注意:如果直接运行systemctl start logstash命令启动logstash,不会加载logstash.conf配置文件。
2.3 kibana安装5601
(1)下载安装
sudo wget https://artifacts.elastic.co/downloads/kibana/kibana-7.8.0-x86_64.rpm
rpm -ivh kibana-7.8.0-x86_64.rpm
(2)配置文件
注意将配置文件中的kibana.yml设置在为ES地址。
vi /etc/kibana/kibana.yml
egrep -v "^#|^$" /etc/kibana/kibana.yml
#kibana页面映射在5601端口
server.port: 5601
#允许所有ip访问5601端口
server.host: "0.0.0.0"
#elasticsearch所在的ip及监听的地址
elasticsearch.hosts: ["http://10.65.18.112:9200"]
(3)启动
sudo systemctl enable kibana #设置开机启动
sudo systemctl start kibana #启动
sudo systemctl status kibana #启查看运行状态
(4)浏览器查看
浏览器输入IP:5601或者域名:5601即可查看kibana,例如http://archery-sec0002.eniot.io:5601/
3 部署filebeat
在10.65.18.105主机上部署filebeat,具体如下:
(1)下载安装
sudo wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.8.0-x86_64.rpm
rpm -ivh filebeat-7.8.0-x86_64.rpm
(2)配置filebeat,将日志输出到logstash
vi /etc/filebeat/filebeat.yml
egrep -v "^#|^$" /etc/filebeat/filebeat.yml
#=========================== Filebeat prospectors =============================
filebeat.inputs:
- type: log
# Change to true to enable this input configuration.
enabled: true
# Paths that should be crawled and fetched. Glob based paths.
paths:
- /var/log/*.log#这里配置指定目录的日志
#- c:\programdata\elasticsearch\logs\*
#----------------------------- Logstash output --------------------------------
output.logstash:
# The Logstash hosts
#hosts: ["localhost:5044"]
hosts: ["archery-sec0002.eniot.io:5044"]#这里配置logstash地址,如果是内网最好用域名访问
(3) 启动filebeat
运行如下命令启动filebeat
sudo systemctl enable filebeat#设置开机启动
sudo systemctl start filebeat#启动
sudo systemctl status filebeat#启查看运行状态
(4) 查看日志
如果filebeat可以用systemctl启动成功,则执行下面命令可以看到file beat运行日志,
systemctl status filebeat -l
如果启动不成功,有以下两种方法:
1、查看Linux的rsyslog日志,也就是/var/log/messages这个文件,这个文件日志量比较大,最好使用less命令查看此文件,然后按下大写字母G可翻阅到文件的最后的内容,最后查看是否有关于filebeat的报错语句。
2、直接使用filebeat的启动方法,而不使用systemctl start filebeat来启动。比如:
/usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml -path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat
我这次就是直接使用这个命令,给我报错是127行有问题,然后
cat -n /etc/filebeat/filebeat.yml
我就着重修改了一下,最后启动成功了。
4 启动
首先开启elk,然后在部署filebeat的主机上(10.65.18.105)输入如下命令:
echo "删除用户" >> /var/log/admin.log
浏览器输入:ip/域名:5601,可以在Stack Management–>Index Management下看到该index,filebeat-20210304,即证明filebeat将日志传送到elk上成功了。
还可以去Dev Tools搜索相关数据
5 配置多目录收集
在实际的应用中,filebeat不只需要收集一个目录的日志,这个时候就需要用配置filebeat的多目录收集,本文参考使用Filebeat 6 收集多个目录的日志并发送到lostash 配置两个主要目录收集日志,一个是收集系统日志的/var/log/*.log,一个是收集应用产生的日志/root/FEP/,主要配置如下:并且用Tags进行标记区分。
vi /etc/filebeat/filebeat.yml
filebeat.prospectors:
- type: log
# Change to true to enable this prospector configuration.
enabled: true
# Paths that should be crawled and fetched. Glob based paths.
paths:
- /var/log/*.log
tags: ["systemlog"]
- type: log
enabled: true
paths:
- /home/envuser/energy-os/*/logs/*.log
tags: ["applicationlog"]
生产的日志可以用tags字段进行区分搜索(建立index-pattern->discover就可以看到),如下图所示:
5 ES设置登录
ES默认是没有加认证的,因此外界可以直接访问地址获取数据库信息,造成隐私泄露,这里我们采用X-pack为ES加上登录,具体操作可参考elk笔记二–通过X-Pack权限控制设置elk登录,这里给出logstash配置(/etc/logstash/conf.d/logstash.conf)参考如下:
input {
stdin {}
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["10.65.18.112:9200"]
index => "filebeats-%{+YYYY.MM.dd}"
user => "elastic"#登录ES的账户
password => "xxx"#登录ES的密码口令
}
stdout {
codec => rubydebug
}
}
6 filebeat和logstash加密传输配置
6.1 生成证书
本文采用openssl生成证书,根证书目前使用的是自签证书(即内置的公钥可验证该证书本身),命名为ca.crt。本文配置的是双向证书,即filebeat和logstash交互共需要两套证书,这里我采用从同一CA签发(当然两套也可以采用不同的两个CA签发),分别为logstash.crt和filebeat.crt。(也可以使用 直接利用的Elasticsearch随安装包提供的数字证书工具elasticsearch-certutil来制作需要的证书,可以参考Filebeat与Logstash配置SSL加密通信 )
logstash端应该有的证书:ca.crt,logstash,crt.logstash.key
filebeat端应该有的证书:ca.crt,filebeat,crt.filebeat.key
利用openssl生成证书很方便,只需要主机上装openssl即可,运行openssl version查看版本,若没安装,运行以下命令安装:
yum install openssl
yum install openssl-devel
首先生成证书机器的选择可以随意,这里我选择在logstash主机上生成所有的证书,然后将filebeat的证书拷贝到其机器即可。
6.1.1 制作自签的CA证书
(1)创建certs证书目录
mkdir /etc/logstash/certs
cd /etc/logstash/certs#进入证书目录
(2)生成ca密钥
openssl genrsa 2048 > ca.key
(3)使用ca私钥建立ca证书
openssl req -new -x509 -nodes -days 3650 -key ca.key -out ca.crt
其中值得注意的是参数Common Name为域名,这里填为*.eniot.io,其他参数可以直接enter为空。
6.1.2 制作logstash使用的证书
继续在logstash主机的/etc/logstash/certs目录下生成。
(1)生成logstash服务器csr证书请求文件
openssl req -newkey rsa:2048 -days 3650 -nodes -keyout logstash.key -out logstash.csr
其中值得注意的参数为Common Name为logstash服务的域名:*.eniot.io,challenge password为为该证书请求文件设置密码,这里可以直接为空即可;其他参数直接enter为空即可。
(2)使用ca证书与ca私钥,请求文件logstash.csr签发服务器证书
openssl x509 -req -in logstash.csr -days 3650 -CA ca.crt -CAkey ca.key -set_serial 01 > logstash.crt
至此logstash需要的证书已经生成完成:ca.crt,logstash.crt,logstash.key
6.1.3 制作filebeat使用的证书
继续在logstash主机的/etc/logstash/certs目录下生成。
(1)生成filebeat服务器csr证书请求文件
openssl req -newkey rsa:2048 -days 3650 -nodes -keyout filebeat.key -out filebeat.csr
其中值得注意的参数为Common Name为filebeat服务的域名:*.eniot.io,challenge password为为该证书请求文件设置密码,这里可以直接为空即可;其他参数直接enter为空即可。
(2)使用ca证书与ca私钥,请求文件filebeat.csr签发服务器证书
openssl x509 -req -in filebeat.csr -days 3650 -CA ca.crt -CAkey ca.key -set_serial 01 > filebeat.crt
至此filebeat所需要的证书ca.crt,filebeat.crt,filebeat.key已经生成完毕。
6.1.4 检查生成的openssl证书
(1)查看KEY信息
openssl rsa -noout -text -in ca.key
(2)查看CSR信息
openssl req -noout -text -in logstash.csr
(3)查看证书信息
openssl x509 -noout -text -in ca.crt
(4)验证证书
会提示self signed
openssl verify logstash.crt
(5) 因为myserver.crt 是幅ca.crt发布的,所以会验证成功
openssl verify -CAfile ca.crt logstash.crt
去掉key的密码保护
有时候每次都要输入密码太繁琐了,可以把Key的保护密码去掉
openssl rsa -in logstash.key -out logstash.key.insecure
6.2 配置证书
6.2.1 logstash配置证书
(1)/etc/logstash/conf.d/logstash.conf上配置证书路径
主要需要修改是input节中设置ssl的参数,具体参数
vi /etc/logstash/conf.d/logstash.conf
input {
stdin {}
beats {
port => 5044
ssl => true
ssl_certificate_authorities => ["/etc/logstash/certs/ca.crt"]
ssl_certificate => "/etc/logstash/certs/logstash.crt"
ssl_key => "/etc/logstash/certs/logstash.key"
ssl_verify_mode => "force_peer"
}
}
output {
elasticsearch {
hosts => ["xxxx:9200"]
index => "filebeats-%{+YYYY.MM.dd}"
user => "elastic"
password => "xxxx"
}
stdout {
codec => rubydebug
}
}
(2)查看logstash进程,并kill掉
ps -ef |grep logstash#查看logstash进程
kill -9 pid
(3)重新启动logstash,这里不要以后台方式运行,直接运行下面命令,如果出错可以看到错误信息。没有出错信息就继续往下(不要用systemctl start logstash启动方式,因为该方式不会加载logstash.conf配置文件启动)
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf
(4)带证书访问logstash
在运行Filebeat之前 ,另外开个终端,带证书访问,可以使用curl来验证logstash证书是否成功(启动logstash后,再带证书访问时,可能会有延迟,多试几次)
#带证书访问:
curl -v --cacert /etc/logstash/certs/ca.crt https://域名:5044
curl -v --cacert /etc/logstash/certs/ca.crt https://ip:5044
curl -v --cacert /etc/filebeat/certs/ca.crt https://10.65.18.112:5044
curl -v --cacert /etc/filebeat/certs/ca.crt https://archery-sec0002.eniot.io:5044
返回如下信息则连接成功:
返回如下信息则连接失败:
(5)后台方式运行logstash
证书访问成功后,即可以后台方式长时间运行logstash
nohup /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf &
6.2.2 复制filebeat证书
因为之前的证书都是再logstash主机上生成的,因此我们需要吧filebeat相关证书(ca.crt,filebeat.crt,filebeat.key)从logstash主机复制filebeat主机。这里如果知道主机账户密码可以直接用scp命令,直接看6.2.3节。因为我使用的是堡垒机,不知道主机密码,因为我开始使用的是堡垒机文件夹的上传下载功能,突然发现堡垒机的这个功能有巨坑:上传下载有大小限制,所以这样传过去的证书是不完整的,用起来会一直报no pem file /etc/filebeat/certs/filebeat.crt; file is not a certificate adding/etc/filebeat/certs/ca.pem to the list of known CAs错误,这个真的坑死我了,弄了好久才发现。后面尝试用git来运输文件。
6.2.2.1 logstash主机上传文件到git
上传ca.crt filebeat.key filebeat.crt,3个文件到git:
(1)进入证书目录
cd /etc/logstash/certs
(2)下载git项目(随便建一个,或者用已经存在的),并ca.crt filebeat.key filebeat.crt将复制到项目文件夹gitalk
git clone https://github.com/m01ly/gitalk
cp filebeat.crt gitalk/
cp ca.crt gitalk/
cp filebeat.key gitalk/
(2)添加所有需要上传的文件和配置到git
git add FILE添加确定的文件FILE
git add .添加当前目录下所有文件
cd gitalk
[root@xxxx gitalk]# git add .
(3)提交文件
git commit -m 'filebeat log message'
上述命令必须添加‘-m’及‘log message’,其中log message可以自己随便填写,否则是提交不成功的,在后面的push操作中会提示错误:“error:src refspec master does not match any”
至此,我们就已经提交文件到本地仓库了!
现在我们需要将上述本地仓库里的文件添加到远程库!
(4)在github里添加origin
git remote add origin https://github.com/m01ly/gitalk.git
如果之前配置过一次,再次配置则会提示以下错误:
ERROR:远程 origin 已经存在。
此时只需要将远程配置删除,重新添加即可;
git remote rm origin
git remote add origin https://github.com/m01ly/gitalk.git
再次提交文件即可正常使用
(5)上传文件
git push -u origin main
网页访问git,发现文件上传成功
6.2.2.2 filebeat主机从git下载文件
以下全程再filebeat主机上操作。
(1)进入证书目录,下载git项目
cd /etc/filebeat/
git clone https://github.com/m01ly/gitalk
(2)修改文件夹gitalk为certs,可以看到filebeat相关证书已经下载成功
mv gitalk certs
6.2.3 filebeat配置证书
(1)配置证书
配置/etc/filebeat/filebeat.yml 文件,在output.logstash节点加上3行ssl相关参数为证书路径如下:
cp /etc/filebeat/filebeat.yml /etc/filebeat/filebeat0.yml
vi /etc/filebeat/filebeat.yml
output.logstash:
# The Logstash hosts
#hosts: ["localhost:5044"]
hosts: ["archery-sec0002.eniot.io:5044"]#这里配置logstash地址,如果是内网最好用域名访问
ssl.certificate_authorities: ["/etc/filebeat/certs/ca.crt"]
ssl.certificate: "/etc/filebeat/certs/filebeat.crt"
ssl.key: "/etc/filebeat/certs/filebeat.key"
(2)重启filebeat
运行下面命令启动filebeat(用以下方式启动的原因是因为报错的时候,方便看日志,如果采用systemctl restart filebeat方式启动,如果启动失败,日志不好找,参考Filebeat插件启动失败,不能直接查找报错原因)
/usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml -e -v
可以 看到日志中有Connection to backoff(async(tcp://xx.xx.io:5044)) established信息,则表示连接成功。
7 树莓派上装filebeat
在实际生产项目中,收集日志的可能都是简单的树莓派系统,因此我也尝试再树莓派上安装filebeat,按照网上的一篇教程在Raspberry PI 3上安装Filebeat,博主写的很详细,照着做就可以,这里面有个坑需要提一下,在make update是会报错如下图:一片红,根据描述信息可以看出是python版本不符合,谷歌了一波也没得到解决,然后忽略他,继续安装启动filebeat正常。这里的错误有人可以解决的话,可以写在评论区一起交流。
注意二:
用/usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml -e -v来启动filebeat,自己尝试/usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml -path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat语句 会无回显,启动失败。
vi /lib/systemd/system/filebeat.service
[Unit]
Description=filebeat
Documentation=https://www.elastic.co/guide/en/beats/filebeat/current/index.html
Wants=userwork-online.target
After=network-online.target
[Service]
ExecStart=/usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml -e -v
Restart=always
[Install]
WantedBy=multi-user.target
8 Kibana查看上传的日志
(1)建立索引模式
登录kibana,然后点击链接“stack Management”→”index patterns”–>”Create index pattern”–>输入filebeats-*,然后一直next完成即创建索引模式成功。
(2)查看上传的日志内容
Home->”Discover”–选中所建立的index pattern,就可以看到上传的日志信息。
(3)筛选上传的日志信息
在下图1处 输入 筛选表达式对日志进行筛选,然后按enter或者右边的update按钮,即可看到过滤后的数据。
相关文章
参考:
filebeat与logstash实现ssl加密传输 第1次参考方案
Filebeat与Logstash配置SSL加密通信 第二次参考方案-目前 直接利用的Elasticsearch随安装包提供的数字证书工具elasticsearch-certutil来制作需要的证书
filebeat.yml配置文件详细说明 当字典检索
openssl 查看证书 制作过程中可以检验,我传输的证书有缺陷就是用这个检验出来的
Openssl生成自签名证书的多种方式 本文生成证书参考的
威胁狩猎:基于ELK的日志监控 值得看的结构 后面再看看
配置 SSL、TLS 以及 HTTPS 来确保 Elasticsearch、Kibana、Beats 和 Logstash 的安全 官网参考配置 后面再看看
Raspberry PI 3上安装Filebeat]翻译自Install Filebeat on Raspberry PI 3 本文参考