威胁狩猎:基于ELK的日志监控

#0x0 概述

ELK Stack即以前的Elastic Stack,Elk Stack是Elastic公司专门为集中化日志管理设计的免费开源软件组合。它允许搜索、分析和可视化来自不同来源的日志。

如在ubuntu上安装配置ELK Stack,需要如下先决条件:

  • Ubuntu 20.04
  • 最好使用Root 权限进行配置

#0x1 内容目录

  • ELK Stack 组成部分
  • 安装 Java 和所有依赖项
  • 安装和配置 Elasticsearch
  • 安装和配置 Logstash
  • 安装和配置 Kibana
  • 安装和配置 Nginx
  • 安装和配置 Filebeat
  • 配置 Linux 日志到 Elasticsearch
  • 在Kibana中创建日志仪表板
  • 监控 SSH 事件

#0x2 ELK Stack 组成

1、Elasticsearch:Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎,使用RESTful API,可以存储、检索数据。

2、Logstash:Logstash是一个开源的数据收集引擎,可以采集不同数据源的数据发送给Elasticsearch

3、Kibana:用于分析和可视化日志的 Web可视化平台

4、Filebeat:轻量级的日志收集和转发器,可以把数据收集后转发到Logstash或Elasticsearch

#0x3 安装 Java 和所有依赖项

Elasticsearch是Java编写的程序,所以需要安装JDK,可以使用如下命令安装OpenJDK和其他一些所需的软件包。

复制代码
sudo apt install -y openjdk-14-jdk wget apt-transport-https curl

然后导入Elasticsearch的公钥,添加apt软件源

复制代码
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

添加软件源

#0x4 安装和配置Elasticsearch

更新软件源

复制代码
sudo apt update

然后安装(国内安装比较慢,请耐心等待)

复制代码
sudo apt-get install elasticsearch

安装完后,开始配置Elasticsearch

Elasticsearh默认监听9200端口。为了安全,需要设置一下限制外网访问。使外部网络无法通过REST API访问数据和elastic集群。Elasticsearch的配置文件是elasticsearch.yml。修改它就行。

打开配置文件

复制代码
sudo gedit  /etc/elasticsearch/elasticsearch.yml

找到监听接口和端口进行修改

删掉前面的注释符号#改成如下的样子:

保存,然后启动Elasticsearch服务

复制代码
sudo systemctl start elasticsearch

查看服务状态和验证是否已经启动

复制代码
sudo systemctl status elasticsearch
复制代码
curl -X GET localhost:9200

看到这个,就说明Elasticsearch启动成功了。

你也可以在浏览器里面访问https://localhost:9200查看

#0x5 安装和配置Logstash

首先确保系统里面有openssl,然后安装Logstash

复制代码
openssl version -a
sudo apt install logstash -y

创建一个SSL证书用于保证Rsyslog 和Filebeat传输数据给Logstash时的安全性。

在Logstash的配置文件目录下创建一个ssl的目录,然后生成证书

复制代码
sudo mkdir -p /etc/logstash/ssl
cd /etc/logstash
sudo openssl req -subj '/CN=elkmaster/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout ssl/logstash-forwarder.key -out ssl/logstash-forwarder.crt

为了方便后续配置,我们可以修改一下/etc/hosts文件。把主机的ip配置一个主机名

然后我们需要配置三个文件,分别是用于从filebeat接收数据的filebeat-input.conf,用于过滤系统日志的过滤器配置文件syslog-filter.conf,以及用于输出数据到elasticsearch的output-elasticsearch.conf。

在logstash配置目录创建filebeat-input.conf文件

复制代码
cd /etc/logstash/
sudo gedit conf.d/filebeat-input.conf

添加如下内容:

复制代码
input {
  beats {
    port => 5443
    type => syslog
    ssl => true
    ssl_certificate => "/etc/logstash/ssl/logstash-forwarder.crt"
    ssl_key => "/etc/logstash/ssl/logstash-forwarder.key"
  }
}

然后创建过滤器配置文件syslog-filter.conf并采用grok过滤器,这个的作用就是让Logstash根据给出的规则提取数据。

复制代码
sudo gedit conf.d/syslog-filter.conf

输入如下内容:

复制代码
filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

然后创建一个output-elasticsearch.conf配置文件用于将数据传输给 elasticsearch。

复制代码
sudo gedit conf.d/output-elasticsearch.conf

内容如下:

复制代码
output {
  elasticsearch { hosts => ["localhost:9200"]
    hosts => "localhost:9200"
    manage_template => false
    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
    document_type => "%{[@metadata][type]}"
  }
}

配置文件弄好之后,启动logstash服务看是否正常。

复制代码
sudo systemctl start logstash
sudo systemctl status logstash

没有报错,说明服务正常启动了。

#0x6 安装和配置Kibana

安装Kibana也是通过apt即可完成

复制代码
sudo apt install kibana

安装完成之后,我们设置一下kibana的配置文件

复制代码
sudo gedit /etc/kibana/kibana.yml

主要是修改监听端口和地址,以及elasticsearch的地址

保存,然后启动kibana服务

然后你可以直接在浏览器中访问它

#0x7 安装和配置Nginx

安装这个主要是给Kibana做反向代理的。

首先安装Nginx和Apache2-utlis

复制代码
sudo apt install nginx apache2-utils -y

安装完成之后,创建kibana虚拟主机配置文件

复制代码
sudo gedit /etc/nginx/sites-available/kibana

内容如下:

复制代码
server {
    listen 80;
    server_name localhost;
    auth_basic "Restricted Access";
    auth_basic_user_file /etc/nginx/.kibana-user;
    location / {
        proxy_pass https://localhost:5601;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

给配置文件创建一个连接

复制代码
sudo ln -s /etc/nginx/sites-available/kibana /etc/nginx/sites-enabled/

然后给访问Kibana Dashboard配置一个基础身份认证

复制代码
sudo htpasswd -c /etc/nginx/.kibana-user elastic

然后测试Nginx配置文件并启动服务

复制代码
sudo nginx -t
sudo systemctl restart nginx

#0x8 安装和配置Filebeat

下载filebeat然后安装

下载地址:

https://www.elastic.co/cn/downloads/beats/filebeat

可以按照自己的需求进行下载

我们这里是安装在Ubuntu上,所以选择DEB版本下载。当然也可以直接用apt安装,前提是你在之前添加了Elastic的软件源。可以看官方指南进行添加软件源:

https://www.elastic.co/guide/en/beats/filebeat/7.10/setup-repositories.html#_apt

复制代码
sudo apt install filebeat -y

然后编辑filebeat的配置,配置文件的路径:

复制代码
/etc/filebeat/filebeat.yml

首先把input部分改为true

然后修改Elasticsearch output部分

修改成如下配置:(根据你的实际情况进行设置)

修改Kibana配置部分:

修改完后保存。

然后初始化filebeat

复制代码
sudo filebeat setup

复制之前生成的logstash-forwarder.crt证书到/etc/filebeat目录中

复制代码
sudo cp /etc/logstash/ssl/logstash-forwarder.crt /etc/filebeat/

然后启动filebeat服务

复制代码
sudo systemctl start filebeat

#0x9 配置 Linux 日志到 Elasticsearch

配置rsyslog到Logstash,然后这些日志会自动传输到Elasticsearch

在配置日志到Logstash之前,我们首先需要配置Logstash到Elasticsearch之间的日志转发。

在/etc/logstash/conf.d目录下创建一个配置文件来设置到Elasticsearch之间的日志转发。

复制代码
cd /etc/logstash/conf.d/
sudo gedit logstash.conf

配置文件的内容如下:

复制代码
input {
  udp {
    host => "127.0.0.1"
    port => 10514
    codec => "json"
    type => "rsyslog"
  }
}
                                                                                          
# The Filter pipeline stays empty here, no formatting is done.
filter { } 

                      
# Every single log will be forwarded to ElasticSearch. If you are using another port, you should specify it here.                              
output {
  if [type] == "rsyslog" {
    elasticsearch {
      hosts => [ "localhost:9200" ]
    }
  }
  }

配置文件主要由三部分组成,input部分:定义日志从哪儿来,filter部分:日志过滤器,output部分:日志传输到什么地址。

然后我们重启一下logstash服务

复制代码
sudo systemctl restart logstash

然后配置从rsyslog到Logstash日志转发,rsyslog可以使用模板转换日志然后进行转发。

为了让 rsyslog 转发日志,需要在 /etc/rsylog.d目录中创建一个70-output.conf的配置文件。

复制代码
cd /etc/rsyslog.d/
sudo gedit 70-output.conf

添加如下内容:

复制代码
*.*                         @127.0.0.1:10514;json-template

意思是所有日志发送到127.0.0.1:10514并使用json格式的模板进行转换

我们需要创建一个json格式的模板文件

复制代码
sudo gedit 01-json-template.conf

内容如下:

复制代码
template(name="json-template"
  type="list") {
    constant(value="{")
      constant(value="\"@timestamp\":\"")     property(name="timereported" dateFormat="rfc3339")
      constant(value="\",\"@version\":\"1")
      constant(value="\",\"message\":\"")     property(name="msg" format="json")
      constant(value="\",\"sysloghost\":\"")  property(name="hostname")
      constant(value="\",\"severity\":\"")    property(name="syslogseverity-text")
      constant(value="\",\"facility\":\"")    property(name="syslogfacility-text")
      constant(value="\",\"programname\":\"") property(name="programname")
      constant(value="\",\"procid\":\"")      property(name="procid")
    constant(value="\"}\n")
}

然后启动rsyslog服务

复制代码
sudo systemctl start rsyslog

检查logstash监听端口是否正常:

复制代码
ss -na | grep 10514

如果监听没成功,并且在日志中看到以下报错信息:

是因为配置文件里面存在语法错误,ELK软件对配置文件的语法要求比较严格,请仔细检查。

#0x10 在Kibana中创建日志仪表板

在浏览器中打开Kibana界面

首先需要创建一个索引模式

然后找到Stack Management---Kibana中的Index Patterns

然后点击Create index pattern

输入logstash-*,然后点击Next step

然后时间过滤器我们选择@timestamp

然后点击Create index pattern

添加成功后是这样的:

点击回到Kibana的Discover中,在这里可以查询搜索你的数据

#0x11 监控 SSH 事件

在过滤条件中,我们设置过滤条件为programename:sshd*

这样就可以看到sshd程序相关事件了。

#0x12 更多参考资料

配置 SSL、TLS 以及 HTTPS 来确保 Elasticsearch、Kibana、Beats 和 Logstash 的安全 | Elastic Blog

https://www.elastic.co/cn/blog/configuring-ssl-tls-and-https-to-secure-elasticsearch-kibana-beats-and-logstash

如何使用 Elastic Stack 监测 Nginx Web 服务器 | Elastic Blog

https://www.elastic.co/cn/blog/how-to-monitor-nginx-web-servers-with-the-elastic-stack

相关推荐
Avan_菜菜9 小时前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB1 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode3 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智6 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_6 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化