接手一台全新的Debian服务器,第一件事不是部署业务,而是立刻检查SSH配置。默认的22端口、允许root密码登录,这些设置会让你的机器在公网上存活不超过十分钟就被扫描器盯上。修改SSH端口是降低噪音最直接的手段,编辑/etc/ssh/sshd_config,将Port 22改为一个高位端口,比如49221。更关键的是禁用root的密码登录,设置PermitRootLogin prohibit-password,这样root只能通过密钥登录。同时把PasswordAuthentication设为no,彻底关闭密码认证通道,只保留密钥方式。改完重启sshd服务之前,务必确认你已经把公钥写入了/root/.ssh/authorized_keys,否则自己也会被锁在外面。
系统用户与权限的精细化管控Debian默认安装后会创建一些系统用户,这些用户往往拥有不必要的shell权限。执行cat /etc/passwd | grep -v nologin可以快速找出哪些账户拥有登录shell。对于像sync、halt、shutdown这类系统账户,直接用usermod -s /usr/sbin/nologin锁定。日常运维中,绝对避免直接使用root操作,创建一个普通用户并配置sudo权限才是标准做法。在/etc/sudoers中通过visudo添加授权时,遵循最小权限原则,只给特定命令的sudo权限,而不是ALL=(ALL:ALL) ALL这种粗放授权。另外,定期检查/etc/shadow文件中密码字段为空的账户,这类账户是提权漏洞的温床。
防火墙策略:从零信任开始构建Debian上iptables是内核自带的包过滤工具,但直接手写规则容易出错,建议使用ufw作为前端简化管理。初始策略必须是拒绝所有入站流量、允许所有出站流量:ufw default deny incoming && ufw default allow outgoing。然后逐条开放必要端口,比如你的SSH端口、Web服务的443端口。这里有个容易被忽视的细节:ufw allow 49221/tcp这样写会向全世界开放该端口,如果你的运维IP固定,应该用ufw allow from 192.168.1.0/24 to any port 49221 proto tcp限制来源IP。对于面向公网的Web服务器,80和443端口需要对外开放,但数据库端口3306或5432绝对禁止绑定在公网IP上,务必在应用的配置文件中将监听地址设为127.0.0.1。
自动安全更新与内核热补丁Debian的unattended-upgrades包能实现安全更新的自动安装,但默认配置只更新主仓库。编辑/etc/apt/apt.conf.d/50unattended-upgrades,把Debian-Security和Debian-Updates两个源都包含进去。重点配置Unattended-Upgrade::Automatic-Reboot "false"和Unattended-Upgrade::Automatic-Reboot-Time "02:00",避免业务高峰期自动重启。对于内核漏洞,重启服务器代价太大,这时候需要引入livepatch机制。Debian官方提供的内核热补丁服务可以修复严重内核漏洞而无需重启,通过apt install snapd && snap install canonical-livepatch安装后,用canonical-livepatch enable命令激活,内核关键CVE就能在运行中被修复。
审计与入侵检测的落地配置auditd是Linux内核级的审计框架,部署它能记录所有敏感文件的操作痕迹。安装后先配置/etc/audit/rules.d/audit.rules,重点监控/etc/passwd、/etc/shadow、/etc/sudoers这些权限文件的修改,规则写法是-w /etc/passwd -p wa -k identity_changes。还要记录所有用户执行特权命令的行为,用-a always,exit -F arch=b64 -S execve -F euid=0 -k root_commands。auditd产生的日志量巨大,必须配合logrotate做日志轮转,保留30天即可。另一个轻量级检测工具是aide,它通过计算文件哈希来发现文件篡改。首次安装后执行aideinit初始化数据库,之后设置cron每周执行aide.wrapper --check,任何被替换的系统二进制文件都逃不过它的检查。
服务最小化与进程隔离用ss -tlnp和ss -ulnp列出所有监听端口,关闭一切非必要服务。systemctl list-unit-files --state=enabled能看到所有开机自启的服务,逐个审视是否真的需要。对于必须运行的服务,用systemd的沙盒能力进行限制。编辑服务的unit文件,在[Service]段添加PrivateTmp=true隔离临时目录,ProtectSystem=strict让服务对系统目录只读,ProtectHome=true禁止访问用户家目录,NoNewPrivileges=true阻止服务获取新权限。这些配置能有效限制攻击者即便拿下了某个服务进程,也难以横向移动到系统其他部分。
日志集中与异常告警单机日志很容易被攻击者清理,把日志实时转发到远端才是可靠方案。Debian自带rsyslog,配置/etc/rsyslog.conf将auth日志和kern日志通过TCP发送到日志服务器。更现代的做法是部署filebeat轻量级采集器,把/var/log下的关键日志流式传输到集中存储。同时要在本地部署logwatch或自定义脚本做异常检测,比如用grep "Failed password" /var/log/auth.log | wc -l统计SSH暴力破解次数,超过阈值就触发告警。把告警脚本挂到cron每五分钟执行一次,用mail命令发送通知,这是最原始但最可靠的方式。
文件系统加固与隐藏权限位chattr命令能设置文件系统的扩展属性,这是很多管理员忽略的防御手段。对关键配置文件执行chattr +i /etc/ssh/sshd_config后,连root都无法修改或删除该文件,除非先chattr -i解除锁定。对于存放日志的目录,设置chattr +a /var/log/auth.log让日志文件只能追加不能删除,攻击者即便拿到root权限也无法抹除入侵痕迹。挂载分区时在/etc/fstab中为/tmp和/var/tmp添加nosuid、noexec、nodev选项,防止攻击者在临时目录放置并执行恶意程序。这些挂载选项对PHP Webshell的阻断效果立竿见影。
内核参数调优对抗网络攻击编辑/etc/sysctl.conf能调整内核网络参数来抵御常见攻击。开启TCP SYN Cookie防护:net.ipv4.tcp_syncookies = 1,这能缓解SYN Flood攻击。禁止ICMP重定向:net.ipv4.conf.all.accept_redirects = 0,防止中间人篡改路由表。关闭源路由包:net.ipv4.conf.all.accept_source_route = 0,阻断攻击者指定数据包路径的企图。启用反向路径过滤:net.ipv4.conf.all.rp_filter = 1,丢弃来源地址明显伪造的数据包。这些参数修改后执行sysctl -p立即生效,它们在内核层面就拦截了大量恶意流量,减轻应用层的防御压力。
定期备份与不可变备份策略安全防护的终点不是防御成功,而是被攻破后能快速恢复。用rsync做增量备份是基础操作,但备份文件本身也可能被勒索软件加密。正确的做法是采用pull模式的备份,由备份服务器主动拉取Debian服务器的数据,这样Web服务器上不保存任何备份凭据。备份存储端开启快照功能,保留最近7天的每日快照和4周的每周快照。关键数据库的备份必须做异地存储,用rclone加密后同步到对象存储,传输前用gpg对备份文件加密,确保即便存储端泄露数据也无法解密。恢复演练每季度至少做一次,在隔离环境中完整走一遍从备份重建业务的流程。
容器化环境下的额外防护层如果Debian上运行Docker,安全边界需要重新审视。Docker默认以root权限运行守护进程,这意味着容器逃逸后直接获得宿主机root。修改/etc/docker/daemon.json,添加"userns-remap": "default"开启用户命名空间隔离,容器内的root映射到宿主机只是普通用户。同时设置"icc": false禁止容器间网络通信,需要通信的容器通过--link显式指定。对于容器本身的镜像,必须用docker scan或trivy做漏洞扫描,基础镜像坚持用debian-slim而非latest标签,确保可追溯性和最小攻击面。
手动核查与自动化基线扫描结合所有上述配置完成后,用Lynis这类开源审计工具跑一遍系统基线检查。lynis audit system会扫描内核参数、文件权限、服务配置等数百个检查项,输出详细的风险报告和改进建议。但工具不能替代人工判断,每周登录服务器做一次手动核查:用lastb看暴力破解尝试的IP来源,用netstat观察是否有异常外连,用ps auxf检查进程树是否有奇怪的子进程。在/var/spool/cron/crontabs下检查所有用户的定时任务,攻击者常在这里藏匿持久化脚本。这些手动操作形成肌肉记忆后,任何异常都逃不过你的直觉。
