Debian服务器的安全防护,本质上不是装多少工具,而是减少暴露面、收紧权限、让入侵成本远高于收益。多数攻击并非针对Debian本身的0day,而是扫描到弱口令、老旧服务版本、错误权限配置后的自动化利用。所以极简高效方案的核心思路是:只开必要端口、只用密钥登录、限制服务权限、自动更新安全补丁、保留最小化审计能力。下面直接按部署顺序给出具体做法。
先做系统基线:最小化安装与自动安全更新安装Debian时不要勾选任何桌面环境和多余服务组件,只保留标准系统工具和SSH服务。安装完成后第一件事是启用安全更新。编辑APT源配置,确保包含security.debian.org仓库。然后安装无人值守升级工具:
apt update && apt install unattended-upgrades apt-listchanges -y dpkg-reconfigure -plow unattended-upgrades
选择“是”启用自动安全更新。这样内核、OpenSSL、OpenSSH等关键包的安全补丁会在官方发布后自动安装,不需要人工盯邮件列表。对于个人VPS或小型业务服务器,这是性价比最高的防护手段之一,能堵住大量已知漏洞利用。
SSH加固:只留密钥,不留给密码任何机会SSH是Debian服务器最常被扫描的入口。默认22端口每天会收到海量爆破尝试。第一层防护是禁用密码登录,只允许Ed25519密钥。先在本机生成密钥对:
ssh-keygen -t ed25519 -a 100 -C "server-admin"
把公钥内容追加到服务器的~/.ssh/authorized_keys,然后修改/etc/ssh/sshd_config:
PermitRootLogin prohibit-password PasswordAuthentication no PubkeyAuthentication yes ChallengeResponseAuthentication no UsePAM yes MaxAuthTries 3 LoginGraceTime 30 ClientAliveInterval 300 ClientAliveCountMax 2
重启sshd服务后,密码登录彻底失效。即便有人拿到root密码也无法直接SSH进入。如果必须保留一个普通用户做跳板,同样只给该用户配置密钥,并禁止其使用sudo时输入密码以外的弱认证方式。修改SSH端口从22改到高位端口能减少日志噪音,但这不是安全本身,真正的安全来自密钥和禁用密码。
防火墙策略:默认拒绝入站,按需放行Debian默认没有启用防火墙。安装nftables或使用iptables-persistent均可。极简做法是用nftables写一个基础规则集:
apt install nftables -y systemctl enable --now 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, 80, 443 } accept
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
这套规则只允许22、80、443端口入站,其余全部丢弃。如果服务器只跑Web服务,连22端口也可以改成仅允许特定IP访问,或者套用fail2ban动态封禁。防火墙不是越多规则越好,默认拒绝加最小放行就是极简高效。
fail2ban:只针对SSH和Web登录路径做动态封禁即使禁用了密码登录,SSH端口仍会收到大量连接尝试,fail2ban可以显著降低日志噪音并阻断扫描器。安装后创建一个极简jail配置:
apt install fail2ban -y
在/etc/fail2ban/jail.local中写入:
[sshd] enabled = true port = 22 filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 3600 findtime = 600
如果SSH端口已改,把port改成实际端口。对于跑Nginx或Apache的服务器,还可以启用http-auth jail来防止暴力破解HTTP基本认证。fail2ban的作用是提高自动化攻击的时间成本,不能替代防火墙和密钥登录,但作为补充非常有效。
服务权限最小化:不要用root跑任何对外服务Debian中很多服务默认会降权运行,但用户自己部署的Node.js、Python、Go应用经常直接用root启动,这是极高风险行为。一旦应用存在RCE漏洞,攻击者直接获得root权限。正确做法是为每个服务创建独立系统用户:
useradd -r -s /usr/sbin/nologin -d /var/lib/myapp myapp
然后把应用文件放到/opt/myapp或/srv/myapp,目录属主设为myapp,用systemd管理服务:
[Service] User=myapp Group=myapp NoNewPrivileges=true ProtectSystem=strict ProtectHome=true PrivateTmp=true RestrictSUIDSGID=true
这些systemd安全选项可以防止服务提权、访问家目录、修改系统目录。即使应用被攻破,攻击者也只能在极小的沙箱内活动。对于数据库服务,同样不要用root运行,Debian安装MySQL/MariaDB/PostgreSQL时默认会创建独立用户,不要手动改成root。
内核与系统参数加固:低成本高回报的几项设置编辑/etc/sysctl.conf或/etc/sysctl.d/99-hardening.conf,加入以下参数:
net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 kernel.randomize_va_space = 2 kernel.kptr_restrict = 2 kernel.dmesg_restrict = 1
这些设置开启反向路径过滤、TCP SYN cookies防护、禁用ICMP重定向、保持地址空间随机化、限制内核指针泄露。对性能影响几乎为零,但能挡住一部分网络层欺骗和本地信息泄露。执行sysctl -p生效。
文件完整性监控:用最轻量的方式发现入侵痕迹完整部署AIDE或Tripwire对小型服务器来说过于笨重。极简方案是使用Debian自带的dpkg校验功能配合定期检查。dpkg -V可以列出所有被修改过的已安装包文件:
dpkg -V > /var/log/dpkg-verify.log
把这个命令加入cron每周执行一次,然后对比输出变化。如果某个二进制文件或配置文件被篡改,dpkg -V会显示校验和不匹配。对于关键目录如/etc、/usr/bin、/sbin,可以用find配合stat记录权限变化。更轻量的做法是安装debsums工具:
apt install debsums -y debsums -c
debsums会检查所有已安装包的MD5校验和,输出被修改的文件列表。这比AIDE配置简单得多,适合极简维护场景。
日志与审计:只保留必要信息,但要能追溯Debian默认的rsyslog会记录auth.log、syslog、kern.log等。建议至少保留auth.log和syslog,并配置logrotate防止磁盘占满。对于安全审计,重点看/var/log/auth.log中的SSH登录成功与失败记录。可以用journalctl替代rsyslog,但要注意journald的存储上限:
journalctl --vacuum-size=200M
设置/etc/systemd/journald.conf中SystemMaxUse=200M,避免日志无限增长。如果服务器资源紧张,可以只保留auth日志和内核日志,其他日志按需开启。审计的目的是在入侵发生后能还原路径,而不是收集海量无用数据。
Web服务层加固:Nginx/Apache的几项关键配置如果Debian服务器跑Web服务,除了系统层防护,还要在Web服务器层做几件事。Nginx配置中隐藏版本号:
server_tokens off;
限制请求体大小防止资源耗尽:
client_max_body_size 10m;
限制并发连接和请求速率:
limit_conn_zone $binary_remote_addr zone=addr:10m; limit_req_zone $binary_remote_addr zone=req:10m rate=10r/s;
在server块中应用:
limit_conn addr 10; limit_req zone=req burst=20 nodelay;
对于PHP应用,确保PHP-FPM以独立用户运行,且open_basedir限制在网站目录内。Apache同理,关闭ServerSignature和ServerTokens,启用mod_evasive或mod_qos做基础限速。Web层防护的重点是防止单IP资源耗尽和路径穿越。
数据库安全:监听本地、强密码、最小权限账号Debian上安装MySQL/MariaDB或PostgreSQL后,默认只监听本地socket或127.0.0.1,这是正确的。不要为了远程管理方便改成0.0.0.0监听。如果确实需要远程连接,用SSH隧道转发,而不是直接开放数据库端口。数据库root账号设置强密码,应用连接使用独立账号,只授予对应数据库的SELECT、INSERT、UPDATE、DELETE权限,不要给DDL权限。定期检查mysql.user表中的空密码账号和匿名账号:
SELECT user, host, plugin FROM mysql.user;
删除或锁定不需要的账号。PostgreSQL的pg_hba.conf中确保远程连接使用scram-sha-256认证,而不是trust。
备份与恢复:安全方案的最后一道防线任何安全措施都不能保证100%不被入侵,所以必须有可恢复的备份。极简方案是用rsync或restic定期备份关键数据到异地位置。对于Debian服务器,至少备份/etc目录、/var/lib中的数据库数据、/srv或/opt中的应用数据。使用restic加密备份到对象存储:
apt install restic -y restic init --repo /backup restic backup /etc /var/lib/mysql /srv/myapp
备份加密密码单独保存。定期测试恢复流程,确保备份不是摆设。如果服务器被勒索或数据被删,备份是唯一能挽回损失的手段。
以上方案没有引入复杂的企业级安全产品,全部基于Debian自带的包和配置。核心逻辑是:最小化安装减少攻击面,密钥登录消除弱口令风险,防火墙默认拒绝控制暴露端口,服务降权和systemd沙箱限制入侵后的横向移动,自动更新堵住已知漏洞,日志和完整性检查提供事后追溯能力。把这些基础做扎实,比安装一堆监控告警工具更有效,也更符合Debian服务器极简运维的定位。
