家庭网络日志采集

易雾君
发布于 2023-05-27 / 167 阅读
0
0

家庭网络日志采集

前言

家庭网络的不断壮大,各种系统、应用每天都在产生多样繁杂的日志,当日志分布在各自自己的机器上,必然给日志审计带来巨大的挑战,所以需要建设一套日志审计系统,能够集中采集各类系统中的安全事件、用户访问记录、系统运行日志,经过规范化、过滤、归并和分析等处理流程后,以统一格式的日志形式进行存储和管理。

日志采集架构变更

在采集节点还不多的时候,整个架构原本是用 redis 作为中间缓存,如下图所示。

redis-log-collector

想要加入更多的节点日志,显然 redis 存内存不合理,目前满足 24 小时开机的就我那工控主机了,内存和存储都相当有限,必须做出调整。于是引入 kafka 作为中间缓存,占用更少的内存,缓存 3 天的日志记录,架构如下。

kafka-log-collector

这样布置也是比较的主流的形式,另外有个好处就是,仅 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 两项,这里尝试接入他们及系统日志到管理平台。首先需要在 状态 -> 系统日志 -> 设置 下开启远程日志,如下图位置

Screenshot 2023-05-27 at 21.02.13

另外日志格式需要设定下,选 RFC 5424 那项

Screenshot 2023-05-27 at 21.04.40

远程日志定义好后,需要再对应用日志如上提到的 Suricata nginx 做一定设置。

服务 -> Suricata -> Global Settings 设置将日志复制到 syslog ,并在对应接口上应用策略即可。

Screenshot 2023-05-27 at 21.10.37

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;

如下图所示,修改好后保存

Screenshot 2023-05-27 at 22.03.18

waf modsecurity 日志接入

dmz 区的 nginx 反代,我是默认内置了 modsecurity 防护模块的,日志记录的格式为 json ,时间戳没有带时区信息,我在 logstash 规则里加入了时区信息,各位根据实际情况调整即可。我这里 waf 的日志地址为 /var/log/modsec_audit.log ,样式如下

Screenshot 2023-05-27 at 22.09.55

给 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 如下图。

Screenshot 2023-05-27 at 23.01.36

openvpn 日志接入

在 openvpn 配置下加入下图选项

Screenshot 2023-05-27 at 23.35.16

新增 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 下点击新增按钮。

Screenshot 2023-05-27 at 23.29.27

效果示例

Screenshot 2023-05-27 at 23.30.57

结语

下篇讲讲日志可视化。


评论