Debian系统默认安装后并不算“裸奔”,但离生产环境能直接用的安全标准还有明显距离。很多人以为改个SSH端口、装个fail2ban就完事了,实际上真正容易被利用的往往是一些不起眼的默认配置、软件源策略和内核参数。极简加固的核心思路是:在不引入复杂安全框架的前提下,用系统自带工具和最小化配置,把最常见的攻击面收窄。下面直接讲具体做法。

先处理SSH登录面,但不要只改端口

改SSH端口能挡掉一批扫描器,但端口扫描成本很低,真正有效的是限制谁能登录、用什么方式登录。编辑/etc/ssh/sshd_config,重点改这几项:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowUsers deploy
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2

PermitRootLogin直接设为no,不要用without-password这种折中方案。创建一个普通用户deploy用于日常登录,需要root权限时用su或sudo。PasswordAuthentication设为no的前提是你已经配置好密钥登录并测试成功,否则会把自己锁在门外。AllowUsers白名单比DenyUsers更可靠,明确只允许一个或少数几个用户通过SSH登录。MaxAuthTries降低暴力尝试的容错次数,ClientAliveInterval和ClientAliveCountMax用来断开僵死连接,减少资源占用。

改完重启sshd服务:

systemctl restart sshd

不要急着关掉当前会话,新开一个终端测试密钥登录正常后再结束旧会话。

用ufw把入站策略收紧到默认拒绝

Debian最小化安装通常不带防火墙,ufw是iptables的极简前端,一条命令就能把默认策略改成拒绝所有入站。安装并配置:

apt update
apt install ufw -y
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw enable

如果你改了SSH端口,把22换成实际端口。其他服务按需放行,比如Web服务只放80和443。不要习惯性放行所有端口,每多一条放行规则就多一个潜在入口。ufw status numbered可以查看规则编号,方便后续删除或调整。

锁定软件源和自动更新策略

Debian默认的软件源是官方主源,网络条件差时很多人会换第三方镜像,但第三方镜像如果被篡改,apt安装的软件包就不可信。建议只使用Debian官方源或你完全信任的镜像,并启用签名校验。检查/etc/apt/sources.list,确保没有混入不明来源的仓库。对于安全更新,配置unattended-upgrades只自动安装安全更新,不自动升级整个系统,避免业务兼容性问题:

apt install unattended-upgrades -y
dpkg-reconfigure -plow unattended-upgrades

然后编辑/etc/apt/apt.conf.d/50unattended-upgrades,只保留安全更新源,把其他更新源注释掉。这样系统能及时修复已知漏洞,又不会因为大版本升级导致服务异常。

内核参数做基础网络层加固

Debian默认内核参数偏通用,针对服务器场景可以加几项防常见攻击的配置。创建/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.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

rp_filter开启反向路径过滤,能挡掉一部分IP欺骗。tcp_syncookies防止SYN Flood消耗资源。关闭ICMP重定向和发送重定向,避免被诱导修改路由表。执行sysctl -p /etc/sysctl.d/99-hardening.conf立即生效。这些参数对性能影响极小,但能显著提高基础攻击门槛。

最小化已安装软件包

Debian最小化安装后仍然可能带了一些用不到的包,每个多余的包都是潜在攻击面。用dpkg -l列出已安装包,重点找带网络服务、提权工具或解释器的包。比如服务器不需要图形界面、不需要打印服务、不需要蓝牙,直接卸载:

apt purge cups bluez avahi-daemon -y
apt autoremove -y

avahi-daemon是mDNS服务,局域网内可能被用于服务发现攻击,服务器上完全没必要。cups是打印服务,bluez是蓝牙协议栈,服务器上都是多余组件。定期用deborphan或aptitude检查孤儿包,保持系统精简。

限制cron和at的执行权限

cron和at是计划任务工具,如果攻击者拿到低权限shell,可能通过写入cron任务实现持久化。Debian默认允许所有用户使用cron,但服务器上通常只有root和少数服务账户需要。创建/etc/cron.allow和/etc/at.allow,只写入需要使用的用户:

echo "root" > /etc/cron.allow
echo "deploy" >> /etc/cron.allow
echo "root" > /etc/at.allow

同时确保/etc/cron.deny和/etc/at.deny不存在或为空。这样即使某个服务账户被攻破,也无法通过计划任务留下后门。

用auditd记录关键文件访问

极简加固不代表不做审计。auditd是Linux内核级审计工具,可以记录关键文件的访问和修改,对事后排查非常有用。安装并配置基础规则:

apt install auditd -y
systemctl enable auditd
systemctl start auditd

在/etc/audit/rules.d/audit.rules中添加:

-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/ssh/sshd_config -p wa -k sshd_config
-w /etc/sudoers -p wa -k sudoers
-w /var/log/auth.log -p wa -k auth_log

这些规则监控密码文件、SSH配置、sudoers和认证日志的写入和属性变更。用ausearch -k identity可以快速检索相关事件。auditd本身资源占用很低,但能提供关键的入侵痕迹。

设置合理的文件权限和umask

Debian默认umask是022,意味着新建文件默认权限是644,新建目录是755。对于多用户服务器,建议改为027,让同组用户可读但不可写,其他用户完全不可访问。编辑/etc/profile和/etc/bash.bashrc,添加或修改:

umask 027

同时检查关键目录权限,/home下每个用户目录应该是750或700,/tmp目录需要sticky bit。如果/tmp没有sticky bit,执行:

chmod 1777 /tmp

sticky bit确保用户只能删除自己的临时文件,防止恶意删除他人文件或替换文件内容。

日志轮转和远程日志

本地日志如果被攻击者清除,安全事件就无从追溯。Debian默认用logrotate管理日志轮转,但默认保留周期可能不够。编辑/etc/logrotate.conf,把rotate从4改成12或更高,保留更长时间。更可靠的做法是把日志同步到独立的日志服务器,用rsyslog的远程转发功能:

echo "*.* @192.168.1.100:514" >> /etc/rsyslog.conf
systemctl restart rsyslog

把日志发到内网另一台机器,即使服务器被完全攻破,日志仍然保留在远端。日志服务器本身要做严格的访问控制,只允许接收日志的端口对内网开放。

禁用不必要的SUID和SGID位

SUID程序允许普通用户以文件所有者权限执行,如果这些程序存在漏洞,可能被用于提权。Debian默认安装的SUID程序不多,但可以进一步收紧。查找所有SUID程序:

find / -perm -4000 -type f 2>/dev/null

常见的passwd、su、sudo需要保留SUID,但像mount、umount、ping这些如果不需要普通用户使用,可以去掉SUID位:

chmod u-s /usr/bin/passwd
chmod u-s /bin/mount
chmod u-s /bin/umount
chmod u-s /bin/ping

注意去掉passwd的SUID后普通用户无法修改自己的密码,只适用于你确定不需要该功能的场景。ping去掉SUID后普通用户无法使用ping命令,但服务器上通常只有管理员需要网络诊断,影响很小。

定期检查异常账户和登录记录

安全加固不是一次性工作,需要定期检查。重点看/etc/passwd中是否有UID为0的异常账户,看/var/log/auth.log中是否有可疑登录尝试。可以用几条命令快速排查:

awk -F: '($3 == 0) {print}' /etc/passwd
last -20
grep "Failed password" /var/log/auth.log | tail -20

UID为0的账户应该只有root一个,如果出现其他账户,立即排查。last命令查看最近登录记录,grep查看失败登录尝试。如果发现大量来自同一IP的失败尝试,直接用ufw封禁:

ufw deny from 203.0.113.50

这种手动封禁比fail2ban更直接,适合极简环境。如果服务器暴露在公网,建议还是装fail2ban,但只启用SSH相关的jail,保持规则简单。

内核模块和文件系统层面的额外限制

如果服务器不涉及USB设备、不涉及某些文件系统,可以直接禁用相关内核模块,减少攻击面。创建/etc/modprobe.d/blacklist-hardening.conf:

install usb-storage /bin/true
install firewire-core /bin/true
install thunderbolt /bin/true
install cramfs /bin/true
install freevxfs /bin/true
install jffs2 /bin/true
install hfs /bin/true
install hfsplus /bin/true
install squashfs /bin/true
install udf /bin/true

这些文件系统在服务器上极少使用,禁用后可以防止通过挂载恶意文件系统触发内核漏洞。USB存储禁用后,物理接触服务器也无法直接挂载U盘,对托管环境尤其有用。

总结

Debian极简安全加固的核心是“少即是多”。不需要堆砌复杂的安全工具,把SSH访问面、防火墙策略、软件源、内核参数、文件权限和审计日志这几个基础面做扎实,就能挡住绝大多数自动化攻击和常见入侵手段。关键是每一项配置都要理解其作用,而不是照搬脚本。加固完成后做一次重启测试,确认所有服务正常启动、所有安全策略生效,然后定期检查日志和系统状态。安全是一个持续过程,不是一次配置就一劳永逸。