Debian 服务器安全加固实战:基础防护与一键部署脚本
Debian 安全加固方案|一键部署
在服务器运维场景中,Debian 因稳定、轻量、软件生态成熟而被广泛应用于 Web 服务、数据库、中间件、容器平台以及各类企业内部系统。然而,默认安装完成后的 Debian 系统并不等于“安全可用”。如果服务器直接暴露在公网,弱口令、SSH 暴力破解、过期软件包、开放端口过多、日志审计不足、权限配置不合理等问题,都可能成为攻击者入侵系统的突破口。
本文将围绕 Debian 服务器安全加固展开,提供一套适合通用生产环境的安全加固方案,并附带一个可参考的一键部署脚本。该方案主要面向 Debian 11 / Debian 12 系统,适用于云服务器、物理服务器以及虚拟机环境。需要注意的是,任何安全加固方案都不应盲目执行,建议在测试环境验证无误后再应用到生产环境。
一、Debian 安全加固目标
Debian 安全加固的核心目标并不是“安装越多安全软件越好”,而是通过系统化配置降低攻击面,提高入侵难度,增强可观测性和恢复能力。通常可以从以下几个方面进行设计:
-
账号与权限安全
限制 root 远程登录,禁用弱口令,强化 sudo 权限控制,清理无用账号。 -
SSH 服务加固
修改默认配置,关闭密码登录或限制登录用户,防止暴力破解。 -
系统更新与补丁管理
及时更新安全补丁,避免已知漏洞被利用。 -
防火墙访问控制
默认拒绝不必要的入站连接,仅开放业务必需端口。 -
入侵防护与暴力破解防御
使用 Fail2ban 等工具对异常登录行为进行自动封禁。 -
内核参数优化
通过 sysctl 调整网络安全相关参数,防御常见网络攻击。 -
日志审计与追踪
保存关键日志,对登录、sudo、SSH、系统异常进行审计。 -
文件权限与系统完整性
限制敏感文件权限,避免普通用户读取关键配置。 -
服务最小化
关闭不需要的服务,减少潜在漏洞入口。 -
备份与回滚机制
安全配置前先备份关键文件,出现异常时能够快速恢复。
二、加固前准备工作
在执行任何系统加固操作前,建议先完成以下准备:
1. 创建普通管理用户
不建议长期使用 root 直接登录服务器。可以创建一个普通用户,并赋予 sudo 权限。
adduser adminuser
usermod -aG sudo adminuser
之后使用该用户登录,再通过 sudo 执行管理命令。
2. 配置 SSH 公钥登录
如果准备关闭 SSH 密码登录,必须提前确保公钥登录可用。可以在本地执行:
ssh-keygen -t ed25519
ssh-copy-id adminuser@服务器IP
测试登录:
ssh adminuser@服务器IP
只有确认公钥登录成功后,才建议禁用密码登录。
3. 确认控制台可用
如果服务器位于云平台,建议确认云厂商提供的 VNC、串口控制台或救援模式可用。因为 SSH 配置错误可能导致远程无法登录。
4. 备份关键配置
至少备份以下文件:
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
cp /etc/sysctl.conf /etc/sysctl.conf.bak
cp /etc/sudoers /etc/sudoers.bak
三、系统更新与基础安全组件安装
安全加固的第一步是更新系统软件包。很多入侵事件并非源于复杂攻击,而是因为服务器长期不更新,存在公开漏洞。
apt update
apt -y upgrade
apt -y install sudo curl wget vim ufw fail2ban auditd unattended-upgrades apt-listchanges
其中:
sudo:用于权限控制;ufw:简化防火墙管理;fail2ban:防止 SSH 暴力破解;auditd:系统审计工具;unattended-upgrades:自动安装安全更新;apt-listchanges:升级前查看软件变更说明。
启用自动安全更新:
dpkg-reconfigure -plow unattended-upgrades
也可以编辑:
vim /etc/apt/apt.conf.d/50unattended-upgrades
确保 Debian 安全源被启用,并建议自动清理无用依赖。
四、SSH 服务安全加固
SSH 是 Linux 服务器最常见的远程管理入口,也是攻击者扫描和暴力破解的重点目标。
编辑 SSH 配置文件:
vim /etc/ssh/sshd_config
推荐配置如下:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
X11Forwarding no
ClientAliveInterval 300
ClientAliveCountMax 2
MaxAuthTries 3
LoginGraceTime 30
UseDNS no
如果无法立即禁用密码登录,可以先使用折中方案:
PermitRootLogin no
PasswordAuthentication yes
MaxAuthTries 3
然后配合 Fail2ban 进行暴力破解防护。
修改完成后,先检查配置是否合法:
sshd -t
没有输出表示配置基本正确。然后重启 SSH:
systemctl restart ssh
注意:不要在当前 SSH 会话中立刻退出。建议新开一个终端测试登录成功后,再关闭旧连接。
五、防火墙策略配置
生产环境中,服务器不应开放所有端口。应遵循“默认拒绝,按需开放”的原则。
使用 UFW 配置防火墙:
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw enable
ufw status verbose
如果 SSH 修改了端口,例如改为 2222,则应开放:
ufw allow 2222/tcp
常见业务端口示例:
ufw allow 80/tcp
ufw allow 443/tcp
如果数据库只供内网访问,不建议对公网开放 3306、5432、6379、9200 等敏感端口。应通过内网安全组、VPN、堡垒机或 SSH 隧道访问。
六、Fail2ban 防暴力破解配置
Fail2ban 可以监控日志中的失败登录记录,并自动调用防火墙封禁异常 IP。
安装:
apt install -y fail2ban
创建本地配置文件:
vim /etc/fail2ban/jail.local
推荐配置:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd
ignoreip = 127.0.0.1/8
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = %(sshd_log)s
maxretry = 5
如果 SSH 使用非默认端口,例如 2222:
[sshd]
enabled = true
port = 2222
filter = sshd
backend = systemd
maxretry = 5
启动并设置开机自启:
systemctl enable --now fail2ban
fail2ban-client status
fail2ban-client status sshd
七、内核网络安全参数优化
Linux 内核提供了大量网络安全参数,可通过 sysctl 进行配置。下面是一组较为通用的安全配置。
创建配置文件:
vim /etc/sysctl.d/99-security-hardening.conf
写入:
# 防止 IP 转发,非网关服务器建议关闭
net.ipv4.ip_forward = 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.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
# 开启反向路径过滤
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 记录异常数据包
net.ipv4.conf.all.log_martians = 1
# 开启 SYN Cookies,缓解 SYN Flood
net.ipv4.tcp_syncookies = 1
# 忽略广播 ICMP 请求
net.ipv4.icmp_echo_ignore_broadcasts = 1
# 忽略伪造错误响应
net.ipv4.icmp_ignore_bogus_error_responses = 1
# 地址空间布局随机化
kernel.randomize_va_space = 2
# 限制 dmesg 非特权访问
kernel.dmesg_restrict = 1
# 限制 ptrace
kernel.yama.ptrace_scope = 1
应用配置:
sysctl --system
需要注意,如果服务器承担路由、VPN、Kubernetes 节点、Docker 网关等角色,ip_forward 等参数可能需要根据实际情况调整,不能一刀切关闭。
八、账号、密码与 sudo 权限加固
1. 检查空密码账号
awk -F: '($2 == "") {print $1}' /etc/shadow
如果存在空密码账号,应立即锁定:
passwd -l 用户名
2. 锁定无用系统账号
部分系统账号不需要登录 Shell,可设置为 /usr/sbin/nologin:
usermod -s /usr/sbin/nologin 用户名
查看可登录用户:
awk -F: '$7 !~ /(nologin|false)/ {print $1,$7}' /etc/passwd
3. 强化密码策略
安装 PAM 密码质量模块:
apt install -y libpam-pwquality
编辑:
vim /etc/security/pwquality.conf
建议配置:
minlen = 12
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
retry = 3
含义:
minlen = 12:密码至少 12 位;dcredit = -1:至少包含一个数字;ucredit = -1:至少包含一个大写字母;lcredit = -1:至少包含一个小写字母;ocredit = -1:至少包含一个特殊字符。
4. sudo 权限管理
不要直接编辑 /etc/sudoers,应使用:
visudo
可以限制只有 sudo 组用户具备提权能力:
%sudo ALL=(ALL:ALL) ALL
如需记录 sudo 命令,可添加:
Defaults logfile="/var/log/sudo.log"
九、日志审计与系统追踪
安全加固不仅要阻止攻击,还要在发生异常后能够追踪和取证。
1. 查看登录日志
last
lastb
who
w
其中:
last:查看成功登录记录;lastb:查看失败登录记录;who:查看当前登录用户;w:查看用户正在执行的命令。
2. 开启 auditd
systemctl enable --now auditd
添加审计规则:
vim /etc/audit/rules.d/hardening.rules
示例规则:
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/group -p wa -k group_changes
-w /etc/sudoers -p wa -k sudoers_changes
-w /etc/ssh/sshd_config -p wa -k sshd_config_changes
加载规则:
augenrules --load
systemctl restart auditd
查询审计日志:
ausearch -k sshd_config_changes
ausearch -k passwd_changes
十、文件权限与敏感配置保护
系统中的关键文件必须保持严格权限。可以检查以下权限:
stat /etc/passwd
stat /etc/shadow
stat /etc/group
stat /etc/gshadow
推荐权限:
chmod 644 /etc/passwd
chmod 600 /etc/shadow
chmod 644 /etc/group
chmod 600 /etc/gshadow
SSH 私钥权限必须更严格:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
如果权限过于宽松,SSH 可能拒绝使用公钥登录。
十一、服务最小化与端口检查
查看当前监听端口:
ss -tulnp
查看开机启动服务:
systemctl list-unit-files --type=service --state=enabled
对于不需要的服务,可以关闭:
systemctl disable --now 服务名
例如,如果服务器不需要 Avahi、CUPS、NFS、RPC 等服务,应考虑禁用。原则是:不了解用途的服务不要直接删除,先确认业务依赖再处理。
十二、自动安全更新配置
Debian 支持无人值守安全更新。编辑:
vim /etc/apt/apt.conf.d/20auto-upgrades
写入:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";
编辑:
vim /etc/apt/apt.conf.d/50unattended-upgrades
确认包含类似内容:
Unattended-Upgrade::Origins-Pattern {
"origin=Debian,codename=${distro_codename},label=Debian-Security";
};
生产环境中,是否启用自动重启应谨慎。可以配置只安装安全更新,不自动重启,由运维窗口统一重启。
十三、一键部署安全加固脚本
下面提供一个 Debian 安全加固脚本示例。该脚本会执行系统更新、安装安全工具、配置 UFW、配置 Fail2ban、写入 sysctl 安全参数、开启 auditd,并备份关键配置。
重要提醒:执行前请确保你拥有可用的 SSH 公钥登录方式,且不要在未测试的生产环境直接运行。脚本默认不禁用 SSH 密码登录,避免误操作导致无法远程登录。你可以根据实际情况手动开启相关配置。
#!/usr/bin/env bash
set -euo pipefail
BACKUP_DIR="/root/security-hardening-backup-$(date +%F-%H%M%S)"
SSH_PORT="${SSH_PORT:-22}"
echo "[1/9] 创建备份目录:${BACKUP_DIR}"
mkdir -p "$BACKUP_DIR"
backup_file() {
if [ -f "$1" ]; then
cp -a "$1" "$BACKUP_DIR/"
echo "已备份:$1"
fi
}
echo "[2/9] 备份关键配置文件"
backup_file /etc/ssh/sshd_config
backup_file /etc/sysctl.conf
backup_file /etc/sudoers
backup_file /etc/fail2ban/jail.local
echo "[3/9] 更新系统并安装安全组件"
apt update
DEBIAN_FRONTEND=noninteractive apt -y upgrade
DEBIAN_FRONTEND=noninteractive apt -y install \
sudo curl wget vim ufw fail2ban auditd audispd-plugins \
unattended-upgrades apt-listchanges libpam-pwquality
echo "[4/9] 配置 UFW 防火墙"
ufw --force reset
ufw default deny incoming
ufw default allow outgoing
ufw allow "${SSH_PORT}/tcp"
ufw --force enable
echo "[5/9] 配置 Fail2ban"
cat > /etc/fail2ban/jail.local < /etc/sysctl.d/99-security-hardening.conf <<'EOF'
net.ipv4.ip_forward = 0
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
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
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.log_martians = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
kernel.randomize_va_space = 2
kernel.dmesg_restrict = 1
kernel.yama.ptrace_scope = 1
EOF
sysctl --system
echo "[7/9] 配置密码复杂度策略"
if [ -f /etc/security/pwquality.conf ]; then
cp -a /etc/security/pwquality.conf "$BACKUP_DIR/pwquality.conf.bak"
cat > /etc/security/pwquality.conf <<'EOF'
minlen = 12
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
retry = 3
EOF
fi
echo "[8/9] 配置 auditd 审计规则"
cat > /etc/audit/rules.d/hardening.rules <<'EOF'
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/group -p wa -k group_changes
-w /etc/gshadow -p wa -k gshadow_changes
-w /etc/sudoers -p wa -k sudoers_changes
-w /etc/ssh/sshd_config -p wa -k sshd_config_changes
EOF
systemctl enable --now auditd || true
augenrules --load || true
systemctl restart auditd || true
echo "[9/9] 配置自动安全更新"
cat > /etc/apt/apt.conf.d/20auto-upgrades <<'EOF'
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";
EOF
systemctl enable --now unattended-upgrades || true
echo "安全加固完成。"
echo "备份目录:${BACKUP_DIR}"
echo "当前防火墙状态:"
ufw status verbose
echo "Fail2ban 状态:"
fail2ban-client status || true
echo "建议:"
echo "1. 确认 SSH 可正常登录。"
echo "2. 如已配置公钥登录,可手动禁用 SSH 密码登录。"
echo "3. 根据业务需要开放 80/443 等端口。"
echo "4. 定期检查 /var/log/auth.log、journalctl 和 auditd 日志。"
使用方法
保存脚本:
vim debian-hardening.sh
赋予执行权限:
chmod +x debian-hardening.sh
执行:
sudo ./debian-hardening.sh
如果 SSH 使用非 22 端口,例如 2222:
sudo SSH_PORT=2222 ./debian-hardening.sh
十四、执行后的验证清单
脚本执行完成后,应按以下清单逐项验证:
1. 检查 SSH 登录
ssh 用户名@服务器IP
如果使用非默认端口:
ssh -p 2222 用户名@服务器IP
2. 检查防火墙状态
ufw status verbose
确认只开放必要端口。
3. 检查 Fail2ban 状态
fail2ban-client status
fail2ban-client status sshd
4. 检查系统内核参数
sysctl net.ipv4.tcp_syncookies
sysctl kernel.randomize_va_space
5. 检查监听端口
ss -tulnp
6. 检查安全更新服务
systemctl status unattended-upgrades
7. 检查审计服务
systemctl status auditd
十五、生产环境加固建议
一键脚本只能完成基础安全配置,真正的生产安全还需要结合业务架构、访问来源和合规要求进行持续管理。
1. 配合云安全组
如果服务器部署在云平台,应优先使用云安全组限制来源 IP。例如 SSH 端口只允许公司出口 IP、堡垒机或 VPN 网段访问,而不是开放给全网。
2. 使用堡垒机或 VPN
生产服务器不建议直接暴露 SSH 到公网。更安全的方式是:
- 管理员先接入 VPN;
- 再通过堡垒机登录服务器;
- 所有操作可审计、可追踪。
3. 禁用 SSH 密码登录
在确认公钥登录稳定后,建议修改:
PasswordAuthentication no
PermitRootLogin no
然后执行:
sshd -t
systemctl restart ssh
4. 定期漏洞扫描
可以使用 Lynis 对系统进行安全基线扫描:
apt install -y lynis
lynis audit system
根据扫描报告进一步加固。
5. 制定备份策略
安全加固不能代替备份。至少应备份:
- 业务数据;
- 数据库;
- 配置文件;
- SSL 证书;
- 应用部署文件。
建议采用“本地快照 + 异地备份 + 定期恢复演练”的方式。
十六、常见问题
1. 执行脚本后无法 SSH 登录怎么办?
如果 SSH 配置未被脚本修改,一般问题来自防火墙端口不匹配。可以通过云控制台登录,执行:
ufw status verbose
确认 SSH 端口是否放行。如需临时关闭防火墙:
ufw disable
2. 为什么脚本没有默认关闭密码登录?
因为直接关闭密码登录存在较高风险。如果用户未正确配置 SSH 公钥,就会被锁在服务器外。更稳妥的方式是先完成基础加固,再手动确认公钥登录,最后禁用密码登录。
3. 修改 SSH 端口是否能提升安全性?
修改默认端口可以减少低质量扫描和自动化爆破日志,但不能替代强认证、防火墙、Fail2ban 和访问来源限制。它属于“降低噪音”的措施,而不是核心安全措施。
4. UFW 和云安全组是否冲突?
通常不冲突。云安全组位于云平台网络层,UFW 位于服务器操作系统层。建议两者同时使用,形成双重防护。
总结
Debian 安全加固应遵循“最小权限、最小暴露、持续更新、可审计、可恢复”的原则。本文提供的方案覆盖了系统更新、SSH 加固、防火墙、Fail2ban、防暴力破解、内核参数优化、密码策略、日志审计、文件权限和自动安全更新等关键方面,并给出了一键部署脚本,适合作为 Debian 服务器安全基线的起点。
不过,安全不是一次性工作。服务器上线后,还需要持续关注系统补丁、登录日志、业务漏洞、访问控制和备份恢复情况。只有将安全加固纳入日常运维流程,才能真正降低系统被攻击和数据丢失的风险。