4. 日志采集与集中管理:ELK/EFK架构搭建,Rsyslog与Fluentd配置实战,日志源接入
日志这东西,平时没人搭理它,一出事它就是唯一的救命稻草。我干了这么多年运维,见过太多因为日志没管好,排查故障时两眼一抹黑的场景。说白了,日志集中管理就是给整个网络装一个黑匣子,关键时刻能回放事故现场。
4.1 为什么必须做日志集中管理?
你想想看,一台交换机每天产生几千条日志,防火墙更多。如果每台设备都各自为政,出问题了你得一台一台登录去看,效率极低。更可怕的是——攻击者往往先删日志再跑路。
核心价值三点:
- 统一检索:所有设备日志在一个地方查,不用到处翻
- 实时告警:发现异常行为立刻通知,比如防火墙拒绝连接突增
- 合规审计:等保2.0、ISO27001都要求日志留存6个月以上
我记得有一次帮客户做安全审计,发现他们的核心交换机日志只保留7天。等保检查时直接被扣分,后来连夜搭了ELK才补上。嗯,这种事真不能拖。
4.2 两大主流架构:ELK vs EFK
目前业界最成熟的就是ELK和EFK两套方案。区别其实就一个组件——日志采集器。
| 组件 | ELK | EFK |
|---|---|---|
| 采集器 | Logstash | Fluentd |
| 特点 | 功能强大,插件丰富,但吃内存 | 轻量级,资源占用低,适合容器环境 |
| 适用场景 | 传统IDC、日志量大的环境 | Kubernetes、边缘节点、资源受限场景 |
我个人习惯:如果服务器资源充裕,首选ELK,Logstash的过滤能力确实强。如果跑在容器里或者机器配置不高,用Fluentd更稳。
4.3 ELK架构搭建实战
下面我直接给出一套能用的搭建步骤。注意,这是生产级别的精简版,去掉了花里胡哨的东西。
4.3.1 环境准备
三台服务器,最低配置2核4G:
- Node1:Elasticsearch(数据节点)
- Node2:Logstash + Kibana
- Node3:Elasticsearch(备用节点,可选)
版本选择很重要。我踩过坑——ELK各组件版本必须严格一致,否则各种兼容性问题。建议用7.17.x,稳定且功能齐全。
4.3.2 安装Elasticsearch
# 导入GPG密钥
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
# 添加仓库
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
# 安装
sudo apt update && sudo apt install elasticsearch
# 修改配置 /etc/elasticsearch/elasticsearch.yml
# 关键参数:
cluster.name: my-elk-cluster
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["127.0.0.1"]
cluster.initial_master_nodes: ["node-1"]
# 启动
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
注意:生产环境千万别把network.host设成0.0.0.0暴露公网。我曾经见过有人这么干,结果被挖矿程序扫到,ES直接被拿来当肉鸡。一定要加防火墙或绑定内网IP。
4.3.3 安装Logstash
sudo apt install logstash
# 创建配置文件 /etc/logstash/conf.d/syslog.conf
input {
syslog {
port => 514
type => "syslog"
}
}
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:hostname} %{DATA:program}(?:\[%{POSINT:pid}\])?: %{GREEDYDATA:message}" }
}
date {
match => [ "timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "syslog-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
# 启动
sudo systemctl enable logstash
sudo systemctl start logstash
这里grok正则我用了好几年,基本覆盖了主流设备的syslog格式。如果你接的设备日志格式比较怪,可以用Grok Debugger在线调试,省得一遍遍重启Logstash。
4.3.4 安装Kibana
sudo apt install kibana
# 修改配置 /etc/kibana/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
# 启动
sudo systemctl enable kibana
sudo systemctl start kibana
访问 http://你的IP:5601,看到Kibana界面就算成了。第一次进去需要创建索引模式,选syslog-*就行。
4.4 EFK架构搭建(轻量版)
如果你觉得Logstash太重,试试Fluentd。我最近在容器环境里全换成了EFK,内存占用直接降了60%。
# 安装Fluentd(使用td-agent)
curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-focal-td-agent4.sh | sh
# 配置 /etc/td-agent/td-agent.conf
<source>
@type syslog
port 514
bind 0.0.0.0
tag syslog
</source>
<filter syslog.*>
@type parser
key_name message
<parse>
@type syslog
</parse>
</filter>
<match syslog.*>
@type elasticsearch
host localhost
port 9200
logstash_format true
logstash_prefix fluentd
flush_interval 5s
</match>
Fluentd的配置比Logstash简洁很多,而且它自带内存缓冲,网络断了不会丢数据。这一点我在生产环境验证过——ES重启期间,Fluentd缓存了大概20万条日志,恢复后全部写入,一条没丢。
4.5 日志源接入实战
架构搭好了,接下来就是接设备。这是最繁琐的一步,因为不同厂家的日志格式千奇百怪。
4.5.1 交换机日志接入(华为/Cisco)
以华为交换机为例:
# 华为交换机配置
info-center loghost 192.168.1.100 # 指向Logstash/Fluentd服务器
info-center source default channel loghost log level informational
info-center timestamp log
# Cisco交换机配置
logging host 192.168.1.100
logging trap informational
logging source-interface Vlan1
logging on
这里有个坑:华为默认日志时间戳是相对时间,必须加上info-center timestamp log才能显示绝对时间。我刚开始没加,查日志时发现时间全是错的,排查了半天才找到原因。
4.5.2 防火墙日志接入(深信服/Palo Alto)
防火墙日志通常包含安全事件,是审计的重点:
# 深信服防火墙
syslog-server 192.168.1.100 514
syslog-level notice
# Palo Alto防火墙
set shared log-settings syslog server ELK transport UDP
set shared log-settings syslog server ELK port 514
set shared log-settings syslog server ELK format BSD
set shared log-settings syslog server ELK facility LOG_LOCAL0
经验之谈:防火墙日志量巨大,建议只发送notice级别以上的日志。如果全量发送,一天可能几个GB,ES索引压力很大。我一般会做两级过滤——设备端只发重要日志,Logstash端再做一次去重和聚合。
4.5.3 服务器日志接入(Linux/Windows)
Linux服务器用Rsyslog最方便:
# 修改 /etc/rsyslog.conf
# 启用UDP接收
module(load="imudp")
input(type="imudp" port="514")
# 转发到Logstash
*.* @192.168.1.100:514
# 重启
systemctl restart rsyslog
Windows服务器需要安装Winlogbeat或NXLog。我个人推荐Winlogbeat,和ELK生态无缝集成:
# winlogbeat.yml 关键配置
winlogbeat.event_logs:
- name: Application
- name: Security
- name: System
output.elasticsearch:
hosts: ["192.168.1.100:9200"]
index: "winlogbeat-%{+yyyy.MM.dd}"
4.6 架构总览图
下面这张图是我自己画的,把整个日志采集链路串起来了:
4.7 避坑指南与最佳实践
最后分享几个我这些年总结的经验,都是真金白银换来的:
坑1:日志时间戳混乱
不同设备时区不同,有的用UTC,有的用CST。我建议所有设备统一使用UTC,在Kibana展示时再转换时区。否则日志排序全是乱的,根本没法查。
坑2:磁盘空间爆炸
日志增长速度快得吓人。我见过一个客户,防火墙日志一天产生50GB,三天就把磁盘撑爆了。解决方案:ES配置ILM(索引生命周期管理),设置30天后自动删除或归档到冷存储。
坑3:日志格式不兼容
华为和Cisco的syslog格式差异很大。华为是<14>2024-01-01T12:00:00,Cisco是<14>Jan 1 12:00:00。我建议在Logstash里写两套grok规则,用if语句区分设备类型。
嗯,日志集中管理这件事,说白了就是「平时养兵千日,用兵一时」。架构搭好了可能几个月都用不上,但一旦出安全事件,它就是你的救命稻草。别等到被攻击了才想起来搞日志,那时候已经晚了。
公众号:蓝海资料掘金营,微信deep3321