Debian 服务器上线前安全加固清单:SSH、防火墙、审计与自动更新配置全整理
Debian 安全加固方案|附配置文件
Debian 以稳定、可靠和安全著称,广泛用于服务器、云主机、容器宿主机、数据库节点、网关设备以及企业内部业务系统。但“系统默认安全”并不等于“部署后无需加固”。任何一台接入公网或承载关键业务的 Debian 服务器,都应该在上线前完成系统安全基线配置,并在运行过程中持续维护。
本文以 Debian 11 / Debian 12 为主要参考对象,整理一套较为通用的安全加固方案,内容涵盖系统更新、账户安全、SSH 加固、防火墙、权限控制、审计日志、自动更新、入侵防护、内核参数优化、服务最小化等方面,并附带可直接参考的配置文件示例。
说明:以下操作建议在测试环境验证后再应用到生产环境。修改 SSH、防火墙、PAM 等配置时,请务必保留一个已登录的 root 或 sudo 会话,避免误配置导致无法远程连接。
一、加固目标与基本原则
Debian 安全加固的核心目标包括:
-
减少攻击面
关闭不必要服务,限制开放端口,仅保留业务必须组件。 -
强化身份认证
禁止 root 远程登录,优先使用 SSH Key,限制弱口令和暴力破解。 -
最小权限原则
普通用户只授予必要权限,避免长期使用 root 操作。 -
及时修复漏洞
保持系统包和安全补丁更新,启用自动安全更新。 -
增强日志与审计能力
保留关键操作记录,方便追踪异常行为。 -
网络访问控制
通过防火墙、TCP 参数和 SSH 限制降低暴露风险。 -
持续监控与响应
结合 Fail2ban、auditd、日志分析等手段发现异常。
二、系统初始化与更新
新安装 Debian 后,第一步应更新软件源并升级系统软件包。
sudo apt update
sudo apt upgrade -y
sudo apt full-upgrade -y
sudo apt autoremove --purge -y
如果服务器长期未维护,建议先查看当前系统版本:
cat /etc/debian_version
uname -a
安装常用基础工具:
sudo apt install -y vim curl wget gnupg ca-certificates lsb-release \
apt-transport-https net-tools htop unzip sudo
三、配置安全软件源
Debian 官方安全源通常已经默认配置,但仍建议确认 /etc/apt/sources.list 文件内容是否正确。
Debian 12 示例配置
deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware
deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
更新索引:
sudo apt update
如果是 Debian 11,将 bookworm 替换为 bullseye,安全源格式通常如下:
deb http://deb.debian.org/debian bullseye main contrib non-free
deb http://deb.debian.org/debian bullseye-updates main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib non-free
四、创建普通管理员用户
不建议长期直接使用 root 登录服务器。可以创建一个普通用户,并加入 sudo 组。
adduser adminuser
usermod -aG sudo adminuser
验证用户是否具备 sudo 权限:
su - adminuser
sudo whoami
如果输出:
root
表示 sudo 权限正常。
五、SSH 安全加固
SSH 是 Linux 服务器最常见的远程入口,也是攻击者重点扫描目标。因此 SSH 加固非常重要。
1. 备份 SSH 配置
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
2. 推荐 SSH 配置文件
编辑:
sudo vim /etc/ssh/sshd_config
参考配置如下:
# /etc/ssh/sshd_config
Port 22222
Protocol 2
# 禁止 root 远程登录
PermitRootLogin no
# 禁止空密码登录
PermitEmptyPasswords no
# 建议关闭密码登录,仅使用密钥
PasswordAuthentication no
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no
# 启用公钥认证
PubkeyAuthentication yes
# 限制登录用户
AllowUsers adminuser
# 登录超时设置
LoginGraceTime 30
# 最大认证尝试次数
MaxAuthTries 3
# 最大并发未认证连接数
MaxStartups 10:30:60
# 禁止 X11 转发
X11Forwarding no
# 禁止 TCP 转发,如无特殊需求建议关闭
AllowTcpForwarding no
# 禁止 Agent 转发,如无特殊需求建议关闭
AllowAgentForwarding no
# 禁止隧道
PermitTunnel no
# 不显示上次登录信息,可按需开启
PrintLastLog yes
# 客户端保活
ClientAliveInterval 300
ClientAliveCountMax 2
# 使用 PAM
UsePAM yes
# SFTP 子系统
Subsystem sftp /usr/lib/openssh/sftp-server
注意:如果你还没有配置 SSH Key,请不要直接关闭
PasswordAuthentication,否则可能导致无法登录。
3. 配置 SSH Key
在本地客户端生成密钥:
ssh-keygen -t ed25519 -C "adminuser@server"
将公钥复制到服务器:
ssh-copy-id -p 22 adminuser@your_server_ip
如果已经修改了 SSH 端口,则使用新端口:
ssh-copy-id -p 22222 adminuser@your_server_ip
确保服务器端权限正确:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
4. 检查 SSH 配置并重启服务
sudo sshd -t
如果无输出,说明配置语法正常。
重启 SSH:
sudo systemctl restart ssh
测试登录:
ssh -p 22222 adminuser@your_server_ip
六、密码策略加固
即便使用 SSH Key,也应为系统账户配置合理的密码策略,防止本地账户或其他服务被弱密码攻击。
安装密码质量检查模块:
sudo apt install -y libpam-pwquality
编辑配置文件:
sudo vim /etc/security/pwquality.conf
推荐配置:
# /etc/security/pwquality.conf
minlen = 12
minclass = 3
maxrepeat = 3
maxclassrepeat = 4
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
dictcheck = 1
usercheck = 1
enforcing = 1
retry = 3
参数说明:
| 参数 | 含义 |
|---|---|
minlen |
密码最小长度 |
minclass |
至少包含几类字符 |
dcredit |
数字字符要求 |
ucredit |
大写字母要求 |
lcredit |
小写字母要求 |
ocredit |
特殊字符要求 |
retry |
修改密码重试次数 |
七、账户登录策略
1. 设置密码过期策略
编辑:
sudo vim /etc/login.defs
推荐配置:
# /etc/login.defs
PASS_MAX_DAYS 90
PASS_MIN_DAYS 1
PASS_WARN_AGE 7
UID_MIN 1000
UID_MAX 60000
UMASK 027
配置说明:
PASS_MAX_DAYS 90:密码最长使用 90 天。PASS_MIN_DAYS 1:密码至少使用 1 天才能修改。PASS_WARN_AGE 7:密码过期前 7 天提醒。UMASK 027:新建文件默认权限更严格。
对已有用户应用策略:
sudo chage -M 90 -m 1 -W 7 adminuser
查看用户密码策略:
sudo chage -l adminuser
2. 锁定无用账户
查看系统账户:
awk -F: '{print $1,$3,$7}' /etc/passwd
锁定不需要登录的账户:
sudo usermod -L username
sudo usermod -s /usr/sbin/nologin username
对于系统服务账户,通常应使用 /usr/sbin/nologin 或 /bin/false。
八、sudo 权限加固
避免直接修改 /etc/sudoers,推荐使用:
sudo visudo
或在 /etc/sudoers.d/ 下单独配置。
创建配置文件:
sudo visudo -f /etc/sudoers.d/adminuser
示例配置:
# /etc/sudoers.d/adminuser
adminuser ALL=(ALL:ALL) ALL
Defaults timestamp_timeout=5
Defaults passwd_tries=3
Defaults logfile="/var/log/sudo.log"
Defaults insults
Defaults requiretty
注意:
requiretty在某些自动化任务、Ansible、CI/CD 场景中可能导致 sudo 无法执行,可按需取消。
设置权限:
sudo chmod 440 /etc/sudoers.d/adminuser
九、配置防火墙
Debian 可以使用 nftables 或 ufw。如果你希望配置简单,可以使用 UFW;如果追求更强灵活性,建议使用 nftables。
方案一:使用 UFW
安装 UFW:
sudo apt install -y ufw
默认拒绝入站,允许出站:
sudo ufw default deny incoming
sudo ufw default allow outgoing
允许 SSH 新端口:
sudo ufw allow 22222/tcp
如果服务器提供 HTTP/HTTPS 服务:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
启用防火墙:
sudo ufw enable
查看状态:
sudo ufw status verbose
方案二:使用 nftables
安装:
sudo apt install -y nftables
启用服务:
sudo systemctl enable nftables
编辑配置文件:
sudo vim /etc/nftables.conf
参考配置如下:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0;
policy drop;
# 允许本地回环
iif "lo" accept
# 丢弃非法连接
ct state invalid drop
# 允许已建立连接
ct state established,related accept
# 允许 ICMP,用于基础网络诊断
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
# 允许 SSH
tcp dport 22222 ct state new accept
# 如需 Web 服务,放行 HTTP/HTTPS
tcp dport { 80, 443 } ct state new accept
# 记录被拒绝流量,避免日志过多可按需关闭
limit rate 5/minute log prefix "nftables denied: " flags all counter drop
}
chain forward {
type filter hook forward priority 0;
policy drop;
}
chain output {
type filter hook output priority 0;
policy accept;
}
}
检查配置:
sudo nft -c -f /etc/nftables.conf
加载配置:
sudo systemctl restart nftables
查看规则:
sudo nft list ruleset
十、Fail2ban 防暴力破解
Fail2ban 可以监控日志,并在发现暴力破解行为时自动封禁攻击 IP。
安装:
sudo apt install -y fail2ban
创建本地配置文件:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vim /etc/fail2ban/jail.local
推荐 SSH 配置:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd
destemail = admin@example.com
sender = fail2ban@example.com
action = %(action_)s
[sshd]
enabled = true
port = 22222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 10m
bantime = 12h
启动服务:
sudo systemctl enable --now fail2ban
查看状态:
sudo fail2ban-client status
sudo fail2ban-client status sshd
手动解封 IP:
sudo fail2ban-client set sshd unbanip 1.2.3.4
十一、启用自动安全更新
Debian 可以使用 unattended-upgrades 自动安装安全更新。
安装:
sudo apt install -y unattended-upgrades apt-listchanges
启用:
sudo dpkg-reconfigure unattended-upgrades
编辑配置:
sudo vim /etc/apt/apt.conf.d/50unattended-upgrades
参考配置:
Unattended-Upgrade::Origins-Pattern {
"origin=Debian,codename=${distro_codename},label=Debian-Security";
"origin=Debian,codename=${distro_codename}-security,label=Debian-Security";
};
Unattended-Upgrade::Package-Blacklist {
};
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Unattended-Upgrade::MinimalSteps "true";
Unattended-Upgrade::InstallOnShutdown "false";
Unattended-Upgrade::Mail "admin@example.com";
Unattended-Upgrade::MailReport "on-change";
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Automatic-Reboot-Time "03:30";
编辑自动更新周期:
sudo vim /etc/apt/apt.conf.d/20auto-upgrades
配置:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";
测试:
sudo unattended-upgrade --dry-run --debug
十二、内核网络参数加固
编辑 sysctl 配置:
sudo vim /etc/sysctl.d/99-security.conf
参考配置:
# /etc/sysctl.d/99-security.conf
# 禁止 IP 转发,非网关服务器建议关闭
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0
# 防止源路由攻击
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0
# 禁止 ICMP 重定向
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
# 禁止发送 ICMP 重定向
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# 开启反向路径过滤
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 忽略广播 ping
net.ipv4.icmp_echo_ignore_broadcasts = 1
# 忽略伪造错误响应
net.ipv4.icmp_ignore_bogus_error_responses = 1
# 开启 SYN Cookie
net.ipv4.tcp_syncookies = 1
# 记录可疑包
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# 限制 core dump 相关风险
fs.suid_dumpable = 0
# 增强 ASLR
kernel.randomize_va_space = 2
# 限制 dmesg 信息
kernel.dmesg_restrict = 1
# 限制 ptrace
kernel.yama.ptrace_scope = 1
应用配置:
sudo sysctl --system
十三、文件权限与 umask 加固
1. 设置默认 umask
编辑 /etc/profile:
sudo vim /etc/profile
加入或确认:
umask 027
编辑 /etc/login.defs:
UMASK 027
2. 检查关键文件权限
sudo chmod 644 /etc/passwd
sudo chmod 640 /etc/shadow
sudo chmod 644 /etc/group
sudo chmod 640 /etc/gshadow
确认属主:
sudo chown root:root /etc/passwd /etc/group
sudo chown root:shadow /etc/shadow /etc/gshadow
3. 查找 SUID/SGID 文件
sudo find / -perm -4000 -type f -exec ls -lh {} \; 2>/dev/null
sudo find / -perm -2000 -type f -exec ls -lh {} \; 2>/dev/null
对于不需要的 SUID 程序,应谨慎移除权限。例如:
sudo chmod u-s /path/to/file
十四、禁用不必要服务
查看正在运行的服务:
systemctl --type=service --state=running
查看监听端口:
sudo ss -tulnp
关闭不必要服务:
sudo systemctl disable --now service_name
常见需要关注的服务包括:
- FTP 服务
- Telnet 服务
- 未使用的数据库服务
- 未使用的 RPC 服务
- 暴露在公网的管理面板
- 默认安装但业务不需要的 Web 服务
如果没有特殊需求,不建议安装 Telnet、rsh、rlogin 等明文协议工具。
十五、日志与审计配置
1. 安装 auditd
sudo apt install -y auditd audispd-plugins
sudo systemctl enable --now auditd
编辑审计规则:
sudo vim /etc/audit/rules.d/hardening.rules
参考规则:
# /etc/audit/rules.d/hardening.rules
# 监控账户和权限文件
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/gshadow -p wa -k identity
-w /etc/sudoers -p wa -k sudoers
-w /etc/sudoers.d/ -p wa -k sudoers
# 监控 SSH 配置
-w /etc/ssh/sshd_config -p wa -k sshd_config
# 监控主机名和网络配置
-w /etc/hosts -p wa -k hosts
-w /etc/network/ -p wa -k network
# 监控系统时间变更
-a always,exit -F arch=b64 -S adjtimex,settimeofday,clock_settime -k time-change
-a always,exit -F arch=b32 -S adjtimex,settimeofday,clock_settime -k time-change
-w /etc/localtime -p wa -k time-change
# 监控提权行为
-a always,exit -F arch=b64 -S execve -C uid!=euid -k privilege-escalation
-a always,exit -F arch=b32 -S execve -C uid!=euid -k privilege-escalation
# 监控模块加载
-w /sbin/insmod -p x -k kernel-modules
-w /sbin/rmmod -p x -k kernel-modules
-w /sbin/modprobe -p x -k kernel-modules
加载规则:
sudo augenrules --load
sudo systemctl restart auditd
查询审计日志:
sudo ausearch -k identity
sudo ausearch -k sshd_config
2. 配置日志轮转
Debian 默认使用 logrotate,建议确认 /etc/logrotate.conf。
参考配置片段:
weekly
rotate 8
create
compress
delaycompress
missingok
notifempty
十六、系统登录提示与信息隐藏
减少系统泄露信息,有助于降低攻击者收集指纹的便利性。
编辑 SSH 登录前提示:
sudo vim /etc/issue.net
示例:
Authorized access only. All activities may be monitored and reported.
在 SSH 配置中启用:
Banner /etc/issue.net
避免暴露过多版本信息:
sudo chmod 644 /etc/issue
sudo chmod 644 /etc/issue.net
如无业务需要,不建议在登录欢迎信息中显示系统版本、内核版本、业务名称等敏感信息。
十七、安装恶意软件与 Rootkit 检测工具
可以安装 rkhunter 和 chkrootkit 进行基础检查。
sudo apt install -y rkhunter chkrootkit
更新数据库:
sudo rkhunter --update
sudo rkhunter --propupd
执行检查:
sudo rkhunter --check
sudo chkrootkit
需要注意的是,这类工具只能作为辅助检测手段,不能替代入侵检测系统、日志分析和基线审计。
十八、时间同步安全配置
准确的系统时间对于日志审计、证书验证、定时任务和故障排查非常重要。
安装 chrony:
sudo apt install -y chrony
启动并设置开机自启:
sudo systemctl enable --now chrony
查看同步状态:
chronyc tracking
chronyc sources -v
配置文件:
sudo vim /etc/chrony/chrony.conf
示例:
pool pool.ntp.org iburst
makestep 1.0 3
rtcsync
十九、AppArmor 强制访问控制
Debian 默认通常支持 AppArmor。确认状态:
sudo apt install -y apparmor apparmor-utils
sudo systemctl enable --now apparmor
sudo aa-status
将某些服务配置为强制模式:
sudo aa-enforce /etc/apparmor.d/*
如果某些业务服务被 AppArmor 拦截,需要结合日志进行策略调整:
sudo journalctl -xe | grep apparmor
AppArmor 的价值在于:即使某个应用被攻击者利用,也可以限制其访问系统敏感路径,降低横向移动和提权风险。
二十、限制编译器和危险工具
生产服务器上如果不需要编译环境,应避免安装 gcc、make 等工具。攻击者入侵后经常会利用编译器编译提权工具或恶意程序。
检查是否安装:
dpkg -l | grep -E 'gcc|make|g\+\+'
如无业务需要可卸载:
sudo apt remove --purge -y gcc g++ make
sudo apt autoremove --purge -y
对于 nc、nmap、tcpdump 等工具,应根据运维需求谨慎保留,并限制普通用户使用。
二十一、配置资源限制
通过 /etc/security/limits.conf 限制用户资源,避免单个用户或进程耗尽系统资源。
编辑:
sudo vim /etc/security/limits.conf
示例配置:
# /etc/security/limits.conf
* soft core 0
* hard core 0
* soft nofile 4096
* hard nofile 65535
* soft nproc 2048
* hard nproc 4096
root soft nofile 65535
root hard nofile 65535
同时可编辑 systemd 默认限制:
sudo vim /etc/systemd/system.conf
示例:
DefaultLimitNOFILE=65535
DefaultLimitNPROC=4096
重新加载:
sudo systemctl daemon-reexec
二十二、挂载参数加固
对于 /tmp、/var/tmp、/home 等目录,可以按需添加 nodev、nosuid、noexec 参数,降低恶意脚本和提权风险。
查看分区:
lsblk
df -h
编辑 /etc/fstab 前请先备份:
sudo cp /etc/fstab /etc/fstab.bak
示例配置:
# /etc/fstab 示例,仅供参考
UUID=xxxx-xxxx /tmp ext4 defaults,nodev,nosuid,noexec 0 2
UUID=yyyy-yyyy /var/tmp ext4 defaults,nodev,nosuid,noexec 0 2
UUID=zzzz-zzzz /home ext4 defaults,nodev,nosuid 0 2
测试挂载配置:
sudo mount -a
注意:
noexec可能影响某些安装脚本、临时执行程序、数据库或应用服务,请结合业务测试。
二十三、Debian 安全加固检查清单
上线前可以根据以下清单逐项确认:
| 检查项 | 建议状态 |
|---|---|
| 系统已更新 | 已完成 |
| 安全源配置 | 已确认 |
| root SSH 登录 | 已禁止 |
| SSH 密码登录 | 推荐关闭 |
| SSH 默认端口 | 推荐修改 |
| SSH 登录用户 | 已限制 |
| 防火墙 | 已启用 |
| 仅开放必要端口 | 已完成 |
| Fail2ban | 已启用 |
| sudo 权限 | 已最小化 |
| 密码复杂度策略 | 已配置 |
| 密码过期策略 | 已配置 |
| 自动安全更新 | 已启用 |
| auditd 审计 | 已启用 |
| AppArmor | 已启用 |
| 不必要服务 | 已关闭 |
| sysctl 安全参数 | 已配置 |
| 日志轮转 | 已确认 |
| 时间同步 | 已启用 |
| 关键文件权限 | 已检查 |
| SUID/SGID 文件 | 已审计 |
| fstab 挂载参数 | 已评估 |
二十四、一键加固脚本示例
下面提供一个基础加固脚本示例,用于快速完成部分通用配置。请根据实际情况修改 SSH 端口、管理员用户名、放行端口等参数。
#!/bin/bash
set -e
ADMIN_USER="adminuser"
SSH_PORT="22222"
echo "[1/8] 更新系统..."
apt update
apt upgrade -y
apt autoremove --purge -y
echo "[2/8] 安装安全组件..."
apt install -y sudo vim curl ufw fail2ban unattended-upgrades \
auditd audispd-plugins apparmor apparmor-utils libpam-pwquality chrony
echo "[3/8] 配置 SSH..."
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F-%H%M%S)
cat > /etc/ssh/sshd_config < /etc/fail2ban/jail.local < /etc/sysctl.d/99-security.conf < /etc/apt/apt.conf.d/20auto-upgrades <
执行前赋予权限:
chmod +x debian-hardening.sh
sudo ./debian-hardening.sh
二十五、总结
Debian 的安全加固不是一次性操作,而是一套持续维护流程。上线前应完成系统更新、SSH 加固、防火墙策略、权限收敛和日志审计;上线后则需要持续关注安全公告、漏洞修复、异常登录、服务暴露和配置漂移。
对于普通服务器,本文提供的配置已经可以覆盖大部分基础安全需求;对于高安全等级场景,还应进一步结合堡垒机、多因素认证、集中日志平台、漏洞扫描、主机入侵检测、配置基线检查、备份恢复演练和零信任访问控制等方案。
最终目标不是“配置越多越安全”,而是在业务可用性、运维便利性和安全风险之间取得平衡。只有经过测试、记录、审计和持续维护的安全加固方案,才是真正可靠的生产级方案。