前言
家庭网络的不断壮大,各种系统、应用每天都在产生多样繁杂的日志,当日志分布在各自自己的机器上,必然给日志审计带来巨大的挑战,所以需要建设一套日志审计系统,能够集中采集各类系统中的安全事件、用户访问记录、系统运行日志,经过规范化、过滤、归并和分析等处理流程后,以统一格式的日志形式进行存储和管理。
日志采集架构变更
在采集节点还不多的时候,整个架构原本是用 redis 作为中间缓存,如下图所示。
想要加入更多的节点日志,显然 redis 存内存不合理,目前满足 24 小时开机的就我那工控主机了,内存和存储都相当有限,必须做出调整。于是引入 kafka 作为中间缓存,占用更少的内存,缓存 3 天的日志记录,架构如下。
这样布置也是比较的主流的形式,另外有个好处就是,仅 Rsyslog 服务端安装kafka插件,各个采集源头仅修改配置将日志汇聚到服务端即可,将Rsyslog 服务端与Kafka捆绑在一个公共区域,其他区域到这里都是可达的,我是将它俩放置在我的边界外联区,并且是在我那 24 小时开机的工控机上,我的 ELK 所在机器一般很晚才自动开机,但在开机期间就可从 kafka 缓存里消费日志数据,即使ELK服务不在线,Rsyslog 和 Kafka 依旧在收集汇聚的日志数据,不耽搁遗漏。恰好完美融合我的家庭现状。需要注意的是,在 ELK 平台在线没有强制要求的情况下,就会对日志的时间戳提出挑战,不过,我预先定义日志的时间戳取自于日志源头,而不是日志入库的时间。
日志管理平台部署
日志管理平台,选 ELK 技术栈,日志管理整个过程其格式均遵循 RCF5424 业界规范,不建议使用 RFC3164 规范,RFC3164 相对来说格式较为简单,能适应大部分使用场景,但是已废弃。我已经将很大部分的日志处理规则整理好在如下的项目中,自取。
git clone https://github.com/evling2020/syslog-elk.git
docker-compose up -d
日志中转站部署
rsyslog 服务端配合 kafka ,rsyslog 服务端在汇聚了日志后直接转储至 kafka ,kafka 默认保留 3 天的日志供 logstash 消费,快速开始。
git clone https://github.com/evling2020/rsyslog-kafka.git
docker-compose up -d
nginx 日志格式规范
在应用日志方面,我家里采集最多的当属 nginx 了,对于它,重点规范了日志格式,一般在 /etc/nginx/nginx.conf 下新增如下定义。
log_format log_json '{"timestamp": "$time_iso8601", '
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"request": "$request", '
'"status": $status, '
'"body_bytes_sent": $body_bytes_sent, '
'"http_referer": "$http_referer", '
'"http_user_agent": "$http_user_agent", '
'"http_x_forwarded_for": "$http_x_forwarded_for", '
'"server_name": "$server_name", '
'"request_time": $request_time, '
'"upstream_addr": "$upstream_addr", '
'"upstream_status": $upstream_status, '
'"upstream_response_time": $upstream_response_time, '
'"upstream_response_length": $upstream_response_length'
'}';
日志接入
假定我这里使用的 rsyslog server 的地址是 logger.evling.tech ,端口为 tcp 和 udp 的 514 。
防火墙 pfSense 日志接入
对于防火墙,我重点关注入侵检测模块 Suricata 和 nginx 两项,这里尝试接入他们及系统日志到管理平台。首先需要在 状态
-> 系统日志
-> 设置
下开启远程日志,如下图位置
另外日志格式需要设定下,选 RFC 5424 那项
远程日志定义好后,需要再对应用日志如上提到的 Suricata nginx 做一定设置。
在 服务
-> Suricata
-> Global Settings
设置将日志复制到 syslog ,并在对应接口上应用策略即可。
pfsense nginx 日志的设定并未按照上边提到的规范格式,编辑文件 /etc/inc/system.inc
,在 诊断
-> 编辑文件
下输入该路径并加载,修改日志格式及发送日志目标
log_format main_ext '\$remote_addr - \$remote_user [\$time_local] "\$request" '
'\$status \$body_bytes_sent "\$http_referer" '
'"\$http_user_agent" "-" "\$http_x_forwarded_for" '
'sn="\$server_name" '
'rt=\$request_time '
'ua="\$upstream_addr" us="\$upstream_status" '
'ut="\$upstream_response_time" ul="\$upstream_response_length"';
sendfile on;
access_log syslog:server=unix:/var/run/log,facility=local5 main_ext;
如下图所示,修改好后保存
waf modsecurity 日志接入
dmz 区的 nginx 反代,我是默认内置了 modsecurity 防护模块的,日志记录的格式为 json ,时间戳没有带时区信息,我在 logstash 规则里加入了时区信息,各位根据实际情况调整即可。我这里 waf 的日志地址为 /var/log/modsec_audit.log
,样式如下
给 rsyslog 新增一个文件监控配置 /etc/rsyslog.d/nginx.conf
,内容如下
$ModLoad imfile
$InputFilePollInterval 1
$WorkDirectory /var/spool/rsyslog
$PrivDropToGroup adm
$MaxMessageSize 200k
input(type="imfile"
File="/var/log/modsec_audit.log"
Tag="modsec"
PersistStateInterval="25000"
reopenOnTruncate="on"
addMetadata="on"
Severity="info"
Facility="local7")
由于有些 mosecurity 的单条日志大小超过 udp 能承载的最大容量限制,改为发送至 tcp rsyslog 端口,在转发配置处需要加两个 @ 符号,即在 /etc/rsyslog.conf
追加一行
*.* @@127.0.0.1:514;RSYSLOG_SyslogProtocol23Format
服务器地址改为你自己的 rsyslog 服务器 IP 即可,这样就完成了 waf 日志的对接。
nginx及系统日志接入
nginx 日志采集的方式,我统一采用本地留存并轮转的形式,rsyslog 进行监控访问日志、错误日志文件转发新增至远程 rsyslog 服务器,新增 rsyslog 配置文件 /etc/rsyslog.d/nginx.conf
,内容如下。
$ModLoad imfile
$InputFilePollInterval 1
$WorkDirectory /var/spool/rsyslog
$PrivDropToGroup adm
$MaxMessageSize 200k
input(type="imfile"
File="/var/log/nginx/*access.log"
Tag="nginx"
PersistStateInterval="25000"
reopenOnTruncate="on"
addMetadata="on"
Severity="info"
Facility="local7")
input(type="imfile"
File="/var/log/nginx/*error.log"
Tag="nginx_error"
PersistStateInterval="25000"
reopenOnTruncate="on"
addMetadata="on"
Severity="error"
Facility="local7")
同样需要在 /etc/rsyslog.conf
追加一行
*.* @@logger.evling.tech;RSYSLOG_SyslogProtocol23Format
服务器地址改为你自己的 rsyslog 服务器域名或 IP 即可,这样就完成了 nginx 日志的对接。
网关 openwrt 上的 nginx 日志接入
openwrt nginx 日志的对接有点难度,主要考虑到支持 RFC 5424 格式,openwrt 的输出到日志文件及直接转发到远程 syslog 服务的时间时区信息总是对应不上,只能直接在配置文件里边将日志写入到本地套接字 unix:/dev/log
,跟 pfsense nginx 配置的模式一致。修改 /etc/nginx/nginx.conf
如下图。
openvpn 日志接入
在 openvpn 配置下加入下图选项
新增 rsyslog 配置 /etc/rsyslog.d/openvpn.conf
内容如下。
$ModLoad imfile
$InputFilePollInterval 1
$PrivDropToGroup adm
$MaxMessageSize 200k
input(type="imfile"
File="/etc/openvpn/openvpn.log"
Tag="openvpn"
PersistStateInterval="25000"
reopenOnTruncate="on"
addMetadata="on"
Severity="info"
Facility="local7")
同样需要在 /etc/rsyslog.conf
追加一行
*.* @@logger.evling.tech;RSYSLOG_SyslogProtocol23Format
服务器地址改为你自己的 rsyslog 服务器域名或 IP 即可,这样就完成了 openvpn 日志的对接。
索引数据视图
如上各类日志配置完毕并成功接入 ES 后,需要在 kibanna 上新增数据视图进行简单的查阅日志,在 Stack Management
-> Data Views
下点击新增按钮。
效果示例
结语
下篇讲讲日志可视化。