Debian服务器上线后默认配置远谈不上安全,很多漏洞并非来自系统本身,而是管理员没有及时收紧配置。要搭建一套真正有效的安全防护体系,不能只靠安装某个工具,而是要从攻击面收敛、访问控制、入侵检测、自动更新、日志审计这几个维度同时下手。下面直接讲具体做法。
先做最小化安装与攻击面收敛装系统时不要勾选任何图形桌面、打印服务、文件共享等用不到的组件。服务器只需要SSH和基础系统工具。安装完成后第一件事是列出所有监听端口,执行
ss -tulnp查看哪些服务在对外监听。除了22端口的SSH,其他一律停用或卸载。如果发现Exim4、Avahi、RPCBind这类默认服务,直接执行
apt purge exim4 avahi-daemon rpcbind移除。攻击面越小,被利用的概率越低。
内核参数也需要同步收紧。编辑
/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 kernel.randomize_va_space = 2 kernel.kptr_restrict = 2 kernel.dmesg_restrict = 1 fs.protected_hardlinks = 1 fs.protected_symlinks = 1
执行
sysctl --system让配置立即生效。这些参数可以防御IP欺骗、SYN洪水、重定向劫持和部分内核信息泄露。 SSH访问控制是第一道门
SSH是远程管理的唯一入口,必须重点加固。不要直接改22端口,端口混淆对自动化扫描有一定作用,但真正有效的是密钥认证和来源限制。编辑
/etc/ssh/sshd_config,修改或确认以下参数:
PermitRootLogin prohibit-password PasswordAuthentication no PubkeyAuthentication yes ChallengeResponseAuthentication no UsePAM yes X11Forwarding no AllowUsers deploy MaxAuthTries 3 LoginGraceTime 30 ClientAliveInterval 300 ClientAliveCountMax 2
这里假设你创建了一个名为deploy的普通用户用于日常管理。root禁止密码登录,只允许密钥。PasswordAuthentication设为no意味着所有密码登录都被拒绝,这是最有效的防爆破手段。改完后执行
systemctl reload ssh重载配置。注意在断开当前会话前,先测试新开一个终端能否用密钥正常登录,否则可能把自己锁在门外。
如果服务器有固定办公出口IP,可以在防火墙层面直接限制SSH来源。使用nftables实现:
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input iif lo accept
nft add rule inet filter input ip saddr 203.0.113.0/24 tcp dport 22 accept
nft add rule inet filter input ip6 saddr 2001:db8::/32 tcp dport 22 accept
nft add rule inet filter input tcp dport 22 limit rate 5/minute burst 3 accept
最后一条规则对非白名单来源的SSH连接做了速率限制,即使不限制来源IP,也能大幅降低爆破效率。将规则保存到
/etc/nftables.conf并设置开机加载。 系统与软件更新必须自动化
Debian的稳定版仓库更新频率不高,但安全更新必须及时安装。安装unattended-upgrades:
apt install unattended-upgrades apt-listchanges dpkg-reconfigure -plow unattended-upgrades
编辑
/etc/apt/apt.conf.d/50unattended-upgrades,至少确保以下内容生效:
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
"${distro_id}ESMApps:${distro_codename}-apps-security";
"${distro_id}ESM:${distro_codename}-infra-security";
};
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
这样每天系统会自动检查安全源并安装补丁,内核更新后会在凌晨4点自动重启。对于生产服务器,自动重启有风险,可以设置Automatic-Reboot为false,改为手动计划重启,但至少保证补丁已安装。
部署入侵检测与文件完整性监控只靠防火墙挡不住所有攻击,需要部署主机型入侵检测。AIDE用于监控关键系统文件的哈希变化,是Debian上最直接的文件完整性工具。安装并初始化:
apt install aide aideinit mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
之后每天执行一次检查,可以用cron定时任务:
0 3 * * * /usr/bin/aide.wrapper --check | mail -s "AIDE Report $(hostname)" root
任何二进制文件、配置文件的非预期修改都会触发告警。注意系统更新后需要更新AIDE数据库,否则会产生大量误报。
对于实时行为检测,可以部署auditd监控敏感路径和系统调用。安装后添加规则到
/etc/audit/rules.d/hardening.rules:
-w /etc/passwd -p wa -k identity_changes -w /etc/shadow -p wa -k identity_changes -w /etc/sudoers -p wa -k sudo_changes -w /etc/ssh/sshd_config -p wa -k sshd_changes -w /var/log/auth.log -p wa -k auth_log_changes -w /usr/bin/passwd -p x -k passwd_exec -w /usr/bin/su -p x -k su_exec -a always,exit -F arch=b64 -S execve -F euid=0 -k root_exec
执行
systemctl restart auditd生效。最后一条规则记录所有以root身份执行的命令,配合
ausearch -k root_exec可以回溯攻击者的操作轨迹。 防火墙策略与出站控制
很多人只关注入站规则,忽略出站控制。服务器被入侵后,攻击者通常需要外联下载工具或回传数据。默认出站策略应该设为拒绝,只放行必要的出站流量。继续使用nftables,在output链上设置:
nft add chain inet filter output { type filter hook output priority 0 \; policy drop \; }
nft add rule inet filter output ct state established,related accept
nft add rule inet filter output oif lo accept
nft add rule inet filter output tcp dport { 53, 80, 443, 123 } accept
nft add rule inet filter output udp dport { 53, 123 } accept
如果服务器需要访问Debian安全源,确保放行对应IP或域名解析后的端口。出站白名单能显著增加攻击者的横向移动难度,同时降低服务器被用作僵尸网络节点的风险。
日志集中与异常告警日志是事后追溯的唯一依据,但本地日志容易被攻击者清除。建议将关键日志同步到独立的日志服务器或至少写入只追加的存储。使用rsyslog的远程转发功能,在
/etc/rsyslog.d/remote.conf中配置:
*.* @192.168.10.50:514
同时保留本地日志,并设置日志轮转和权限。Debian默认的logrotate已经够用,但需要确认
/var/log/auth.log和
/var/log/syslog的权限为640,防止普通用户读取敏感信息。
对于实时告警,可以部署轻量级的日志分析工具,比如使用fail2ban配合SSH和Web服务的日志,自动封禁暴力破解来源。安装配置:
apt install fail2ban
创建
/etc/fail2ban/jail.local:
[DEFAULT] bantime = 3600 findtime = 600 maxretry = 5 destemail = admin@example.com action = %(action_mwl)s [sshd] enabled = true port = 22 filter = sshd logpath = /var/log/auth.log
执行
systemctl enable --now fail2ban启动。fail2ban会在检测到多次失败尝试后自动将来源IP加入nftables黑名单,有效期1小时。对于分布式爆破,这个时间可以适当延长到24小时。 服务隔离与权限最小化
如果服务器上运行Web服务或数据库,不要用root直接启动。Debian的软件包通常会自动创建专用系统用户,但自定义部署的应用需要手动配置。以Nginx为例,确认配置中
user www-data;且网站目录权限为755,文件属主为deploy,属组为www-data。PHP-FPM的池配置中,每个站点使用独立的用户和组,避免一个站点被攻破后读取其他站点的文件。
对于数据库,只监听本地回环地址。编辑
/etc/mysql/mariadb.conf.d/50-server.cnf确认:
bind-address = 127.0.0.1
如果必须远程访问,使用SSH隧道转发,而不是直接开放3306端口。应用连接数据库时使用最小权限账号,只授予对应库的SELECT、INSERT、UPDATE、DELETE权限,禁止GRANT和DDL操作。
容器化部署时,避免使用privileged容器,通过capabilities按需添加权限。Docker的默认网桥模式会绕过部分主机防火墙规则,建议使用自定义网络并显式发布端口,同时在容器内部也做相应的安全配置。
定期审计与基线核查安全防护不是一次性的配置,需要定期核查。Debian提供了几个有用的审计工具。lynis是一个系统安全审计工具,可以快速检查配置问题:
apt install lynis lynis audit system
它会生成一份详细报告,指出需要修复的项目。结合
debsecan可以查看当前系统缺失的安全补丁:
apt install debsecan debsecan --format detail
每月至少执行一次完整审计,并对比历史报告,确认没有新增的异常配置。对于暴露在公网的服务器,建议每季度做一次渗透测试,重点验证SSH配置、Web应用输入过滤、文件上传限制和数据库访问控制。
安全体系的核心是持续收紧和监控。上述配置覆盖了Debian服务器从系统层到应用层的主要攻击面,但真正的防护效果取决于管理员是否持续关注日志和更新。把基础打好,后续的维护成本会低很多。
