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,发现默认阈值有点低。