Debian 官方默认安装完成后,真正暴露在公网上的攻击面往往不是内核本身,而是那些跟着默认配置一起启动的服务、预置的软件包和过于宽松的文件权限。极简加固的思路不是堆砌安全工具,而是先做减法:砍掉一切当前业务不需要的组件,再把剩下的核心组件锁死。下面直接按操作顺序给出具体方案,从系统安装阶段到运行期监控,每一步都可在生产环境落地。
安装阶段就控制软件包数量很多人拿到一台新服务器第一件事就是 apt upgrade,但如果你用的是云厂商提供的 Debian 镜像,建议先检查预装包列表。执行 dpkg -l | more 查看所有已安装软件,把 cloud-init 之外用不到的调试工具、开发库、桌面组件全部标记为手动删除。极简系统的目标是把已安装包数量控制在 400 个以内。安装时如果还有选择余地,在 tasksel 界面只勾选 “SSH server” 和 “standard system utilities”,不要勾选任何桌面环境或打印服务。
锁定 SSH 登录入口SSH 是远程管理的命脉,也是暴力破解的首要目标。先备份 /etc/ssh/sshd_config,然后逐项修改:禁止 root 直接登录、只允许指定用户或用户组登录、关闭密码认证改用密钥、限制认证尝试次数和登录超时时间。具体配置如下:
PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes AllowUsers deploy MaxAuthTries 3 LoginGraceTime 30 ClientAliveInterval 300 ClientAliveCountMax 2 X11Forwarding no AllowTcpForwarding no
改完执行 systemctl reload ssh 让配置生效。注意在关闭密码认证之前,务必先把自己账号的公钥写入 ~/.ssh/authorized_keys 并测试密钥登录成功,否则会把自己锁在门外。如果服务器必须对外开放 22 端口,建议再配合 fail2ban 或直接改用非标准端口,但非标准端口只能降低扫描噪声,不能替代密钥认证。
用防火墙实现默认拒绝Debian 自带的 nftables 比 iptables 更轻量,规则语法也更清晰。极简方案不安装 ufw 或 firewalld,直接用 nftables 写一张最小规则表。创建 /etc/nftables.conf,内容如下:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
iif lo accept
tcp dport 22 ct state new accept
ip protocol icmp icmp type echo-request limit rate 5/second accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
这套规则只放行已建立的连接、回环接口、SSH 新连接和限速的 ICMP ping,其余入站流量全部丢弃。启用方式为 systemctl enable nftables && systemctl start nftables。如果后续要开放 Web 服务,只需在 input 链中增加一行 tcp dport 443 accept,然后 nft -f /etc/nftables.conf 重载即可。
内核参数收紧网络行为Debian 默认的内核网络参数偏宽松,容易受到 IP 欺骗、SYN 泛洪和路由重定向攻击。创建 /etc/sysctl.d/99-hardening.conf,写入以下内容:
net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 3 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 kernel.randomize_va_space = 2 fs.protected_hardlinks = 1 fs.protected_symlinks = 1
执行 sysctl --system 立即生效。其中 rp_filter 开启反向路径过滤,能有效防止源地址欺骗;tcp_syncookies 在 SYN 队列满时启用 cookie 机制,缓解 SYN 泛洪;fs.protected_hardlinks 和 fs.protected_symlinks 则防止普通用户利用硬链接或符号链接绕过文件权限检查。
最小化服务与定时任务查看当前所有已启用的 systemd 服务:systemctl list-unit-files --state=enabled。除了 ssh.service、systemd-timesyncd.service、cron.service 和 nftables.service 之外,其余服务如果业务不需要就全部禁用。特别注意 Debian 默认可能启用 ModemManager、avahi-daemon、cups、bluetooth 这类桌面向服务,在服务器上毫无必要。禁用命令统一为 systemctl disable --now 服务名。对于 cron,检查 /etc/cron.d、/etc/cron.daily 等目录,删除不需要的定时脚本。如果服务器不需要定时任务,可以直接 apt purge cron 并启用 systemd-timer 作为替代,但大多数场景保留 cron 更省事。
限制用户权限与 sudo 策略极简系统不应该存在除管理员之外的登录用户。检查 /etc/passwd 中 UID 大于等于 1000 的账号,只保留一个日常管理账号。所有需要提权的操作通过 sudo 完成,但不要给该账号无限制的 ALL 权限。编辑 /etc/sudoers.d/10-deploy,内容示例:
deploy ALL=(root) /usr/bin/systemctl, /usr/bin/journalctl, /usr/bin/nft, /usr/bin/apt
这样 deploy 用户只能执行指定的系统管理命令,即使账号被入侵,攻击者也无法直接修改用户或读取任意文件。同时设置 Defaults env_reset,timestamp_timeout=1 让 sudo 凭证在一分钟后失效。对于不需要交互登录的服务账号,统一设置 shell 为 /usr/sbin/nologin。
文件系统与关键目录加固Debian 默认挂载选项没有开启 nodev、nosuid 和 noexec。对于 /tmp 和 /var/tmp 这类可写目录,攻击者经常用来放置并执行恶意脚本。编辑 /etc/fstab,为 /tmp 单独挂载 tmpfs 并加上限制选项:
tmpfs /tmp tmpfs defaults,nodev,nosuid,noexec,size=1G 0 0
如果 /var/tmp 无法单独挂载,至少加上 nosuid 和 nodev。对于 /home 和 /var 分区,建议加上 nodev 和 nosuid。修改后执行 mount -o remount /tmp 验证。另外检查 /etc/shadow 权限是否为 640,/etc/passwd 为 644,/etc/group 为 644。使用 chmod 640 /etc/shadow 修正。对于 SUID 和 SGID 文件,执行 find / -perm /6000 -type f 2>/dev/null 列出所有特权文件,只保留系统必需的如 /usr/bin/su、/usr/bin/sudo、/usr/bin/passwd,其余用 chmod -s 去掉特权位。
自动安全更新与日志审计Debian 的 unattended-upgrades 包可以自动安装安全更新,但极简方案不建议开启全部自动升级,只开启安全源。安装 apt install unattended-upgrades,然后编辑 /etc/apt/apt.conf.d/50unattended-upgrades,只保留 Debian-security 相关的源,并把 Unattended-Upgrade::AutoFixInterruptedDpkg 设为 true,Unattended-Upgrade::Remove-Unused-Dependencies 设为 false。启用后执行 dpkg-reconfigure -plow unattended-upgrades 完成配置。日志方面,确保 systemd-journald 的存储模式为持久化,编辑 /etc/systemd/journald.conf 设置 Storage=persistent 和 SystemMaxUse=200M。定期用 journalctl -p err 检查错误日志,重点关注 sshd 和 nftables 的拒绝记录。
进程与网络连接基线检查加固完成后,建立一份系统基线快照,方便日后对比异常变化。执行 ss -tulnp 记录所有监听端口,正常极简系统应该只有 22 端口在监听。执行 ps auxf 查看进程树,确认没有多余的后台进程。执行 dpkg -l > /root/pkg-baseline.txt 保存软件包清单。把这些基线文件放在离线存储中,每周或每次变更后重新生成并 diff 对比。如果发现新的监听端口或未知进程,立即排查是否被入侵。
定期审计与入侵检测极简系统不一定要装重量级 HIDS,但可以用 Debian 自带的工具做轻量审计。安装 aide 做文件完整性校验:apt install aide,初始化数据库 aideinit,然后把 /var/lib/aide/aide.db 复制到离线位置。之后每次怀疑系统被改动时执行 aide --check 对比。对于登录行为,直接监控 /var/log/auth.log 中的 Failed password 和 Accepted publickey 记录,用 logwatch 或简单的 awk 脚本每日汇总。如果发现异常登录来源,立即在 nftables 中封禁对应 IP 段。
这套方案的核心逻辑是:最小化安装减少攻击面,SSH 密钥认证阻断暴力破解,nftables 默认拒绝控制入站流量,内核参数和文件权限提升利用难度,自动更新和基线审计保证长期可控。整个过程不需要额外安装复杂的安全软件,全部基于 Debian 原生组件完成,适合追求稳定和低资源占用的生产环境。
