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

枫少@KillBoy
枫少@KillBoy
枫少@KillBoy
管理员
267
文章
0
粉丝
安全运维271,210字数 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
评论  27  访客  27
    • Phoenix涅槃
      Phoenix涅槃 1

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

      • Petal Waltz
        Petal Waltz 1

        Logwatch 报告里每天都有几条 ssh 登录失败,挺实用的。

          • OasisDreamer
            OasisDreamer 1

            @ Petal Waltz 如果想只看失败次数,可以把 Detail 调低,或在 custom‑auth.conf 加 *Only = yes*。

          • 碧波映月
            碧波映月 1

            有没有办法把多台服务器的日志统一到同一个 Logwatch 配置?

            • 狂傲之鹰
              狂傲之鹰 0

              我怕误封,ignoreip 里加了内部网段,结果不错。

              • 狐仙录
                狐仙录 1

                rsyslog 同时写本地和转发真的会导致重复计数吗?

                  • PancakeSyrup
                    PancakeSyrup 1

                    @ 狐仙录 是的,写本地再转发会产生两条记录,建议在转发规则后加 ‘~’ 丢弃本地副本。

                  • PhantomSniper
                    PhantomSniper 1

                    想问下,Fail2ban 的 bantime 建议设多长合适?

                    • 夜半钟
                      夜半钟 2

                      用 fail2ban-regex 测试正则确实能少踩坑。

                        • 牡丹
                          牡丹 1

                          @ 夜半钟 改完正则先拿fail2ban-regex跑一遍,比直接reload踩坑少太多了

                        • OpalSerenade
                          OpalSerenade 1

                          用 logger 发测试信息,发现日志根本不进 /var/log/auth.log,怎么排查?

                            • Phantom
                              Phantom 1

                              @ OpalSerenade 先确认 rsyslog 已加载 imuxsock,检查 /etc/rsyslog.conf 中的模块路径,权限也要对。

                            • 云鬟雾鬓
                              云鬟雾鬓 1

                              轻量方案够用就好,小服务器上 GAFAM 那套太重了。

                              • PawsMcGee
                                PawsMcGee 1

                                如果系统升级后 jail.conf 被覆盖,最好直接改 jail.local 吧。

                                • PebblePaws
                                  PebblePaws 1

                                  对小型部署来说,这套方案比 ELK 省太多资源了。

                                  • PineScented
                                    PineScented 1

                                    有没有推荐的正则表达式,能更精准匹配 ssh 暴力登录?

                                    • Old Time Ollie
                                      Old Time Ollie 1

                                      fail2ban 的 bantime 先设 10 分钟观察,误封少时再慢慢延长。

                                      • 竹露清响
                                        竹露清响 1

                                        把所有服务器的 Logwatch 配置放到 /etc/logwatch/conf/services 共享目录,省事。

                                        • PebbleCollector
                                          PebbleCollector 1

                                          使用 systemd‑journal 的持久化模式可以省去 rsyslog 的本地文件。

                                          • 指尖流沙
                                            指尖流沙 1

                                            日志通过 UDP 传输不加密,若跨网段建议改为 TLS 或使用 VPN。

                                            • OolongDreamer
                                              OolongDreamer 2

                                              在 logwatch 的 cron 里加个随机延迟,避免多台机器同秒跑导致 I/O 峰值。

                                              • CloudWatcher
                                                CloudWatcher 1

                                                可以把logpath用通配符,兼容压缩日志。

                                                  • 科技宅
                                                    科技宅 1

                                                    @ CloudWatcher 这个建议不错,这样处理历史压缩日志就方便多了。

                                                  • PeachFuzz
                                                    PeachFuzz 1

                                                    fail2ban‑regex 调试时加上 -v 参数,能看到匹配的每一行,排错更直观。

                                                    • LoneExplorer
                                                      LoneExplorer 1

                                                      jail.local 这个细节很重要,之前被更新覆盖过好几次。

                                                      • 小猪佩奇的粉丝
                                                        小猪佩奇的粉丝 1

                                                        Fail2ban 的 ignoreip 一定要配好,不然容易误封自己。

                                                          • 星河滚烫
                                                            星河滚烫 1

                                                            @ 小猪佩奇的粉丝 是的,ignoreip一定要配好自己的IP,不然容易误封自己。

                                                        匿名

                                                        发表评论

                                                        匿名网友

                                                        拖动滑块以完成验证