09 - 基础安全加固(fail2ban、unattended-upgrades)
前提条件
- 已完成 Debian 12 Bookworm 基础安装、网络配置、SSH 端口改为 2222 并启用公钥认证
- ops 用户已配置好 sudo 权限并可通过密钥登录
- SSH 服务正常运行在 2222 端口(
PermitRootLogin no、PasswordAuthentication 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
实践任务
- 启用
unattended-upgrades,配置只自动安装 security 更新,禁用自动重启 - 安装 fail2ban,配置
sshdjail 使用 2222 端口,maxretry=5,白名单192.168.1.0/24 - 从不在白名单的机器 / 工具故意尝试错误密码登录 SSH 5 次以上,观察 fail2ban 是否封禁
- 查看
fail2ban-client status sshd和/var/log/fail2ban.log确认封禁记录
自测问题
1. unattended-upgrades 默认会自动重启系统吗?如何关闭?
默认不会自动重启。配置文件 /etc/apt/apt.conf.d/50unattended-upgrades 中 Automatic-Reboot 默认值为 "false"。若该行被注释或值为 "true",则会在凌晨(Automatic-Reboot-Time 指定时间,默认 "now")自动重启。生产环境应明确设置:
Unattended-Upgrade::Automatic-Reboot "false";
内核安全更新需重启才生效,应在人工确认后于维护窗口手动执行 reboot。
2. fail2ban 中 bantime 和 findtime 参数分别代表什么?
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 详细配置将进一步收紧网络边界。