跳转至

09 - 基础安全加固(fail2ban、unattended-upgrades)

前提条件

  • 已完成 Debian 12 Bookworm 基础安装、网络配置、SSH 端口改为 2222 并启用公钥认证
  • ops 用户已配置好 sudo 权限并可通过密钥登录
  • SSH 服务正常运行在 2222 端口(PermitRootLogin noPasswordAuthentication no
  • 以 root 身份登录,或 ops 用户执行 sudo -i 切换至 root 环境
  • 虚拟机环境:VMware Workstation Pro,IP 192.168.1.100/24

详细步骤

1. 启用 unattended-upgrades(自动安全更新)

安装并启用:

apt update
apt install -y unattended-upgrades apt-listchanges

运行配置向导:

dpkg-reconfigure --priority=low unattended-upgrades
# 选择 Yes → 启用自动更新

编辑主配置文件:

vim /etc/apt/apt.conf.d/50unattended-upgrades

确认以下内容已启用(取消注释或按需添加):

Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}";
    "${distro_id}:${distro_codename}-security";
    // "${distro_id}:${distro_codename}-updates";
};

Unattended-Upgrade::Mail "root";
Unattended-Upgrade::MailOnlyOnError "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";

自动重启策略

生产环境中 Automatic-Reboot 必须设为 "false",避免在业务高峰期自动重启。内核安全更新需要手动在维护窗口重启。Automatic-Reboot-Time 即使设置了,在 Automatic-Reboot "false" 时也不生效,保留作注释说明即可。

启用自动更新定时任务:

systemctl enable --now unattended-upgrades.timer
systemctl status unattended-upgrades.timer

手动触发一次测试(干跑):

unattended-upgrade --dry-run --debug 2>&1 | head -40

检查点

systemctl status unattended-upgrades.timer 显示 active (waiting)unattended-upgrade --dry-run 无错误输出。

2. 安装并配置 fail2ban

安装:

apt install -y fail2ban

创建本地配置文件(不修改原始 jail.conf,避免升级时被覆盖):

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

编辑本地配置,在文件末尾找到或添加 [sshd] 段:

vim /etc/fail2ban/jail.local

修改 [DEFAULT] 段的全局设置:

[DEFAULT]
# 白名单:本机、本地回环、管理网段(根据实际情况调整)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24
bantime  = 3600
findtime = 600
maxretry = 5

配置 SSH jail(在文件末尾或找到现有 [sshd] 段):

[sshd]
enabled  = true
port     = 2222
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 5
bantime  = 3600
findtime = 600

[sshd-ddos]
enabled  = true
port     = 2222
filter   = sshd-ddos
logpath  = /var/log/auth.log
maxretry = 3
bantime  = 86400

ignoreip 白名单说明

192.168.1.0/24 将整个管理网段加入白名单,防止因误操作导致管理主机被封禁。若管理机 IP 固定,可精确到单 IP(如 192.168.1.10)进一步收紧。

重启并启用服务:

systemctl restart fail2ban
systemctl enable fail2ban

检查点

fail2ban-client status           # 显示已启用的 jail 列表
fail2ban-client status sshd      # 显示 Currently banned: 0(初始状态)
journalctl -u fail2ban -n 20     # 无 ERROR 级别日志

3. 验证 fail2ban 封禁功能

另一台机器或工具(不要用已加白名单的 192.168.1.x)多次尝试错误密码登录:

# 故意使用错误密码连续尝试(在不在白名单内的机器上执行)
ssh -p 2222 wronguser@192.168.1.100

尝试 5 次后查看封禁状态:

fail2ban-client status sshd
# 查看 Currently banned 数量
tail -50 /var/log/fail2ban.log

手动解封 IP(若误封管理机):

fail2ban-client set sshd unbanip <IP地址>

4. 基础 ufw 防火墙配置

(第 13 章会详细配置,此处仅做最小化开启)

# 若在第 8 章未安装
apt install -y ufw

# 设置默认策略:拒绝所有入站,允许所有出站
ufw default deny incoming
ufw default allow outgoing

# 允许 SSH 新端口
ufw allow 2222/tcp comment 'SSH custom port'

# 启用防火墙
ufw --force enable

# 查看规则
ufw status verbose

检查点

ufw status 输出 Status: active,并列出 2222/tcp ALLOW IN Anywhere 规则。
ssh -p 2222 ops@192.168.1.100 确认仍可正常登录。

5. 最终安全状态核查

# SSH 安全配置确认
grep -E "^(Port|PermitRootLogin|PasswordAuthentication|AllowUsers)" /etc/ssh/sshd_config

# 开放端口检查(应只有 2222)
ss -tuln

# 服务状态
systemctl is-active fail2ban unattended-upgrades.timer ufw

实践任务

  1. 启用 unattended-upgrades,配置只自动安装 security 更新,禁用自动重启
  2. 安装 fail2ban,配置 sshd jail 使用 2222 端口,maxretry=5,白名单 192.168.1.0/24
  3. 从不在白名单的机器 / 工具故意尝试错误密码登录 SSH 5 次以上,观察 fail2ban 是否封禁
  4. 查看 fail2ban-client status sshd/var/log/fail2ban.log 确认封禁记录

自测问题

1. unattended-upgrades 默认会自动重启系统吗?如何关闭?

默认不会自动重启。配置文件 /etc/apt/apt.conf.d/50unattended-upgradesAutomatic-Reboot 默认值为 "false"。若该行被注释或值为 "true",则会在凌晨(Automatic-Reboot-Time 指定时间,默认 "now")自动重启。生产环境应明确设置:

Unattended-Upgrade::Automatic-Reboot "false";

内核安全更新需重启才生效,应在人工确认后于维护窗口手动执行 reboot

2. fail2ban 中 bantimefindtime 参数分别代表什么?

  • findtime:滑动时间窗口。在此时间范围内(单位:秒)统计失败次数,超过 maxretry 则触发封禁。例如 findtime=600 表示 10 分钟内累计失败次数超过阈值才封禁,防止误封偶发连接错误
  • bantime:封禁持续时间(单位:秒)。封禁期间该 IP 的所有连接请求均被 iptables / nftables 直接丢弃。负值表示永久封禁(需手动解封)

两者配合 maxretry 形成完整的封禁策略:findtime 秒内失败 maxretry 次 → 封禁 bantime 秒。

3. 为什么要在 jail.local 而不是 jail.conf 中做自定义配置?

jail.conf 是 fail2ban 软件包提供的默认配置文件,每次 apt upgrade 升级 fail2ban 时可能被覆盖,导致自定义配置丢失。jail.local 是用户自定义配置文件,升级时不会被覆盖,且 fail2ban 启动时会自动将 jail.local 的设置覆盖 jail.conf 中的同名配置。这是 fail2ban 设计的官方推荐实践。

4. 如何临时解除某个 IP 的 fail2ban 封禁?

# 查看当前已封禁的 IP
fail2ban-client status sshd

# 解封指定 IP
fail2ban-client set sshd unbanip 192.168.1.50

# 若要永久白名单(防止再次被封),在 jail.local 的 ignoreip 中添加该 IP
# ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 192.168.1.50
# 然后重启 fail2ban:systemctl restart fail2ban

总结

完成了基础安全加固的两大核心组件:

  • unattended-upgrades:自动保持系统安全补丁最新,降低已知漏洞暴露时间
  • fail2ban:有效防御 SSH 暴力破解,配合白名单避免误封管理机

结合第 8 章的 SSH 端口变更、公钥认证、禁止 root 登录,形成 Debian 服务器初始安全基线。后续章节的 nftables / ufw 详细配置将进一步收紧网络边界。