Syslog 本身只是把系统产生的日志文本输送到指定目标,它并不具备主动告警或分析的能力;真正的安全监控需要在日志到达后,由专门的工具进行识别、聚合和响应。

1. 用 Syslog 可靠采集安全事件
1.1 启用并统一日志来源
linux 系统的关键安全事件(如认证、sudo、SSH、iptables)默认写入 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(RHEL/CentOS)。确保 rsyslog 或 systemd-journald 已经打开对应的模块:
# 对 rsyslog,确认 /etc/rsyslog.conf 包含:
module(load="imuxsock") # 本地 Unix socket
module(load="imklog") # 内核日志
如果有多台机器需要集中管理,可在每台服务器的 /etc/rsyslog.d/50-default.conf 中添加:
auth,authpriv.* /var/log/auth.log
*.* @logserver.example.com:514 # UDP 514 端口转发
注意:不建议在同一台机器上既写本地文件又转发到远程服务器,否则会产生重复计数。
1.2 过滤与标签化
为后续工具(Logwatch、Fail2ban)提供一致的日志格式,建议统一使用 rsyslog 的模板:
template(name="SecureLog" type="string" string="%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg%n")
auth,authpriv.* -/var/log/auth.log;SecureLog
这样可以保证时间戳、主机名以及日志标签在所有日志文件中保持同一风格,便于正则匹配。
2. Logwatch:从日志到每日安全报告
Logwatch 是一个基于 Cron 的日志分析器,能够在每天的固定时间读取 /var/log/auth.log(或 /var/log/secure),生成结构化的安全日报。
2.1 安装与基本配置
sudo apt update
sudo apt install logwatch -y # Debian/Ubuntu
# 或
sudo yum install logwatch -y # CentOS
安装后,主要配置文件位于 /usr/share/logwatch/default.conf/logwatch.conf,常用选项:
MailTo = root:报告发送目标。Range = yesterday:分析前一天的日志。Detail = High:显示详细条目,适合安全审计。
如果希望仅关注认证类事件,可在 /etc/logwatch/conf/services/sshd.conf 中加入:
*Only = yes
2.2 定制化报告内容
Logwatch 通过 “service” 插件读取不同日志。对安全事件常用的插件包括 sshd, sudo, firewall。可以在 /etc/logwatch/conf/services/ 目录下创建自定义文件,例如 custom-auth.conf:
LogFile = /var/log/auth.log
*Only = yes
然后在主配置里加入:
Service = custom-auth
这样生成的日报会仅列出登录成功、失败、sudo 提升以及防火墙规则变动等关键事件,便于运维快速回顾。
3. Fail2ban:基于日志的自动封禁
Fail2ban 通过监控 Syslog 中的失败登录记录,自动在防火墙(iptables、firewalld、nftables)中添加封禁规则。

3.1 安装与启动
# Ubuntu/Debian
sudo apt update
sudo apt install fail2ban -y
sudo systemctl enable --now fail2ban
# CentOS/RHEL
sudo yum install epel-release -y
sudo yum install fail2ban -y
sudo systemctl enable --now fail2ban
3.2 推荐的本地化配置
官方默认的 jail.conf 会在系统升级时被覆盖,最佳实践是复制为 jail.local:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vi /etc/fail2ban/jail.local
在 [DEFAULT] 部分设置全局阈值(示例):
bantime = 3600 # 封禁 1 小时
findtime = 600 # 10 分钟窗口
maxretry = 3 # 超过 3 次失败即触发
ignoreip = 127.0.0.1/8 192.168.0.0/16 # 本地网段不封禁
针对 SSH 服务的独立配置:
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
maxretry = 3
常见误区:直接编辑
jail.conf而不使用jail.local,会在系统包更新时丢失自定义规则。
3.3 验证与调试
- 查看当前监控状态:
sudo fail2ban-client status sshd - 列出已封禁 IP:
sudo fail2ban-client status - 手动触发测试:在另一台机器上尝试多次错误密码,观察
auth.log中是否出现Failed password,随后在fail2ban-client中看到对应的封禁记录。
如果发现匹配不到日志,可检查对应的 filter 文件(如 /etc/fail2ban/filter.d/sshd.conf),确保正则表达式与系统实际日志格式一致。必要时可以在 logpath 中使用通配符,例如 logpath = /var/log/auth.log*,兼容日志轮转后的压缩文件。
4. 常见误区与排查技巧
- 日志未被 rsyslog 捕获
- 确认
rsyslog已加载imuxsock模块,且/etc/rsyslog.d/没有误删auth,authpriv.*行。 - 使用
logger "test message"手动写入,检查是否出现在/var/log/auth.log。
- Logwatch 报告为空
- 检查
logwatch.conf中的Range是否正确(如使用today而非yesterday)。 - 确认 cron 任务
/etc/cron.daily/00logwatch已经执行,查看/var/log/cron.log(或系统日志)是否有报错。
- Fail2ban 未触发
- 确认
logpath指向实际日志文件。 - 使用
fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf手动测试正则匹配情况。 - 检查防火墙是否被其他规则覆盖,例如
ufw与iptables同时启用。
- 误封导致业务中断
- 使用
ignoreip将可信内部网络加入白名单。 - 设置
bantime为相对保守的数值(如 10 分钟),先观察效果再逐步加长。
5. 搭建最小闭环的实践步骤
- 统一日志:确保所有安全相关服务(SSH、sudo、firewalld)均写入同一 Syslog 文件。
- 配置 Logwatch:开启每日 cron,生成包含登录、sudo、iptables 变动的安全日报,发送至运维邮箱。
- 部署 Fail2ban:使用
jail.local定义 SSH、sudo 等监控规则,配合ignoreip防止内部误封。 - 监控与回顾:每日阅读 Logwatch 报告,结合
fail2ban-client status检查封禁情况,必要时调整阈值。
通过上述三环相扣的配置,即可在不依赖 ELK/Loki 等大型平台的前提下,实现 采集 → 识别 → 响应 的完整安全防护闭环,适用于单机或小规模服务器环境。
持续关注日志质量、正则匹配的准确性以及防火墙规则的冲突,能够让这套轻量方案保持高效且易于维护。

广东省深圳市 1F
刚装了 Fail2ban,发现默认阈值有点低。
山东省烟台市 2F
Logwatch 报告里每天都有几条 ssh 登录失败,挺实用的。
广东省深圳市 B1
@ Petal Waltz 如果想只看失败次数,可以把 Detail 调低,或在 custom‑auth.conf 加 *Only = yes*。
广东省深圳市 3F
有没有办法把多台服务器的日志统一到同一个 Logwatch 配置?
广东省深圳市 4F
我怕误封,ignoreip 里加了内部网段,结果不错。
重庆市 5F
rsyslog 同时写本地和转发真的会导致重复计数吗?
甘肃省 B1
@ 狐仙录 是的,写本地再转发会产生两条记录,建议在转发规则后加 ‘~’ 丢弃本地副本。
山东省烟台市 6F
想问下,Fail2ban 的 bantime 建议设多长合适?
上海市 7F
用 fail2ban-regex 测试正则确实能少踩坑。
北京市 B1
@ 夜半钟 改完正则先拿fail2ban-regex跑一遍,比直接reload踩坑少太多了
上海市浦东新区 8F
用 logger 发测试信息,发现日志根本不进 /var/log/auth.log,怎么排查?
山东省烟台市 B1
@ OpalSerenade 先确认 rsyslog 已加载 imuxsock,检查 /etc/rsyslog.conf 中的模块路径,权限也要对。
韩国 9F
轻量方案够用就好,小服务器上 GAFAM 那套太重了。
上海市青浦区 10F
如果系统升级后 jail.conf 被覆盖,最好直接改 jail.local 吧。
甘肃省 11F
对小型部署来说,这套方案比 ELK 省太多资源了。
山东省烟台市 12F
有没有推荐的正则表达式,能更精准匹配 ssh 暴力登录?
山东省烟台市 13F
fail2ban 的 bantime 先设 10 分钟观察,误封少时再慢慢延长。
广东省深圳市 14F
把所有服务器的 Logwatch 配置放到 /etc/logwatch/conf/services 共享目录,省事。
重庆市 15F
使用 systemd‑journal 的持久化模式可以省去 rsyslog 的本地文件。
上海市浦东新区 16F
日志通过 UDP 传输不加密,若跨网段建议改为 TLS 或使用 VPN。
上海市青浦区 17F
在 logwatch 的 cron 里加个随机延迟,避免多台机器同秒跑导致 I/O 峰值。
湖北省荆州市 18F
可以把logpath用通配符,兼容压缩日志。
泰国 B1
@ CloudWatcher 这个建议不错,这样处理历史压缩日志就方便多了。
山东省烟台市 19F
fail2ban‑regex 调试时加上 -v 参数,能看到匹配的每一行,排错更直观。
印度 20F
jail.local 这个细节很重要,之前被更新覆盖过好几次。
印度 21F
Fail2ban 的 ignoreip 一定要配好,不然容易误封自己。
印度 B1
@ 小猪佩奇的粉丝 是的,ignoreip一定要配好自己的IP,不然容易误封自己。