Syslog 不是监控工具:Linux 安全事件如何接到日报与自动封禁

枫少@KillBoy
枫少@KillBoy
枫少@KillBoy
管理员
244
文章
0
粉丝
安全运维1 30字数 1433阅读4分46秒阅读模式
AI智能摘要
AI 生成的文章内容摘要

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

Syslog 日志流向示意图

1. 用 Syslog 可靠采集安全事件

1.1 启用并统一日志来源

linux 系统的关键安全事件(如认证、sudo、SSH、iptables)默认写入 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(RHEL/CentOS)。确保 rsyslogsystemd-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)中添加封禁规则。

Fail2ban 工作流程图

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. 常见误区与排查技巧

  1. 日志未被 rsyslog 捕获
  2. 确认 rsyslog 已加载 imuxsock 模块,且 /etc/rsyslog.d/ 没有误删 auth,authpriv.* 行。
  3. 使用 logger "test message" 手动写入,检查是否出现在 /var/log/auth.log
  1. Logwatch 报告为空
  2. 检查 logwatch.conf 中的 Range 是否正确(如使用 today 而非 yesterday)。
  3. 确认 cron 任务 /etc/cron.daily/00logwatch 已经执行,查看 /var/log/cron.log(或系统日志)是否有报错。
  1. Fail2ban 未触发
  2. 确认 logpath 指向实际日志文件。
  3. 使用 fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf 手动测试正则匹配情况。
  4. 检查防火墙是否被其他规则覆盖,例如 ufwiptables 同时启用。
  1. 误封导致业务中断
  2. 使用 ignoreip 将可信内部网络加入白名单。
  3. 设置 bantime 为相对保守的数值(如 10 分钟),先观察效果再逐步加长。

5. 搭建最小闭环的实践步骤

  1. 统一日志:确保所有安全相关服务(SSH、sudo、firewalld)均写入同一 Syslog 文件。
  2. 配置 Logwatch:开启每日 cron,生成包含登录、sudo、iptables 变动的安全日报,发送至运维邮箱。
  3. 部署 Fail2ban:使用 jail.local 定义 SSH、sudo 等监控规则,配合 ignoreip 防止内部误封。
  4. 监控与回顾:每日阅读 Logwatch 报告,结合 fail2ban-client status 检查封禁情况,必要时调整阈值。

通过上述三环相扣的配置,即可在不依赖 ELK/Loki 等大型平台的前提下,实现 采集 → 识别 → 响应 的完整安全防护闭环,适用于单机或小规模服务器环境。

持续关注日志质量、正则匹配的准确性以及防火墙规则的冲突,能够让这套轻量方案保持高效且易于维护。

 
枫少@KillBoy
    • Phoenix涅槃
      Phoenix涅槃 1

      刚装了 Fail2ban,发现默认阈值有点低。

    匿名

    发表评论

    匿名网友

    拖动滑块以完成验证