firewalld rich规则支持log动作,可指定prefix、level(emerg–debug)和limit,但日志由rsyslog/journald接收并转发至siem,需通过日志采集器解析prefix等字段实现联动。

1. 使用 rich rule 添加带日志的过滤规则
firewalld 的 rich rule 支持 log 子句,可指定前缀、级别(仅限 emerg–debug,对应 syslog 优先级数值 0–7)、限速等:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.50" port port="22" protocol="tcp" log prefix="sshd-block-" level="warning" limit value="3/m" reject'
说明:
-
level="warning"→ 对应 syslog 优先级LOG_WARNING(数值 4),会被内核写入kern.warning设施+级别; -
prefix是日志行开头字符串,便于 SIEM 过滤识别; -
limit防止日志刷屏; - 该规则拒绝 SSH 访问,同时记录匹配行为。
2. 确保日志被 rsyslog 正确捕获并打标
默认 firewalld 日志走 kern.*,但无结构化字段。需配置 rsyslog 提取 rich rule 信息:
- 确认
/etc/rsyslog.conf或/etc/rsyslog.d/01-firewall.conf启用内核日志模块:$ModLoad imklog(旧版)或module(load="imklog" LogKernel="on")(新版); - 添加模板提取 prefix 和 level:
template(name="FWLogFormat" type="string" string="%TIMESTAMP% %HOSTNAME% firewall: %msg%\n")if $msg contains 'sshd-block-' then /var/log/firewall.log;FWLogFormat; - 重启:
sudo systemctl restart rsyslog。
3. 将日志接入 SIEM 的关键操作
SIEM 不解析原始内核日志,需结构化或打标签:
-
Splunk:用
props.conf定义 sourcetype,配合TRANSFORMS提取prefix、source_ip(从日志文本中正则抽取); -
Elastic + Filebeat:在
filebeat.inputs中启用multiline.pattern合并多行,并用processors.dissect拆解sshd-block-192.168.10.50得到 IP 字段; -
Wazuh:直接监听
/var/log/firewall.log,在ossec.conf中定义 decoders 匹配sshd-block-,再写 rules 触发告警或联动响应。
4. 补充建议:提升可联动性
- 避免只依赖
kern.*:把 firewall 日志单独路由到local5.*等自定义 facility,方便 SIEM 按 facility 过滤; - 启用
journalctl -t kernel查看原始 netfilter 日志格式,验证 prefix 是否出现; - 测试时用
logger -p local5.warning "test-firewalld"对比格式,确保 SIEM 解析逻辑一致; - 生产环境建议关闭
log的高频率规则,改用audit或 eBPF 工具(如 bpftrace)补全日志细节。
log level 只影响 syslog 优先级数值,不改变日志内容本身;真正决定 SIEM 能否联动的是后续日志采集端能否稳定获取、解析并映射字段。把 prefix 设计成机器可读格式(如 fw-reject-ssh-192.168.10.50),比调优 level 更有效。











