Debian 服务器上线前必做的安全加固清单与自动化脚本
Debian 安全加固方案|附源码
适用范围:Debian 11 / Debian 12 服务器
适用场景:云服务器、Web 服务器、数据库服务器、跳板机、内网业务主机
目标:降低系统被扫描、爆破、提权、横向移动和恶意入侵的风险
一、前言
Debian 作为稳定、可靠、社区生态成熟的 Linux 发行版,被广泛应用于服务器环境中。无论是部署 Web 服务、数据库服务、容器平台,还是作为内部运维跳板机,Debian 都具备较高的稳定性和可维护性。
但默认安装后的 Debian 系统并不等于“安全”。默认配置通常是为了兼容性和易用性,并没有针对生产环境做严格加固。如果服务器直接暴露在公网中,常见风险包括:
- SSH 被暴力破解;
- root 账户被尝试登录;
- 弱口令导致系统沦陷;
- 不必要的端口暴露;
- 系统补丁长期未更新;
- 普通用户通过 sudo 或 SUID 文件提权;
- 防火墙未配置;
- 日志缺失或未审计;
- 敏感文件权限过宽;
- 内核参数未优化,容易受到网络层攻击;
- 服务运行权限过高;
- 没有入侵检测和登录告警机制。
因此,在 Debian 服务器正式上线前,进行系统安全加固是非常有必要的。本文将从账号安全、SSH 加固、防火墙、系统更新、内核参数、文件权限、日志审计、自动化脚本等多个方面介绍一套较完整的 Debian 安全加固方案,并附带可直接参考的 Shell 源码。
二、安全加固总体思路
Debian 安全加固并不是简单执行几个命令,而是一套系统化流程。通常可按照以下思路进行:
-
最小化原则
只安装必要软件,只开放必要端口,只赋予必要权限。 -
纵深防御原则
不依赖单一安全措施,而是从账号、网络、服务、日志、内核等多个层面进行防护。 -
默认拒绝原则
防火墙默认拒绝所有入站连接,只允许明确需要的端口。 -
权限隔离原则
服务尽量使用低权限账户运行,避免 root 直接运行应用。 -
持续更新原则
及时安装安全补丁,避免已知漏洞被利用。 -
可审计原则
关键行为需要留下日志,便于溯源和排查。 -
自动化原则
对通用加固项编写脚本,降低人工误操作概率。
三、系统更新与基础软件安装
服务器上线前,首先需要更新软件源并安装安全补丁。
sudo apt update
sudo apt upgrade -y
sudo apt dist-upgrade -y
sudo apt autoremove --purge -y
建议安装以下常用安全工具:
sudo apt install -y \
vim curl wget net-tools lsof tree unzip git \
ufw fail2ban auditd audispd-plugins \
unattended-upgrades apt-listchanges \
debsums rkhunter chkrootkit \
rsyslog logrotate
说明
| 工具 | 作用 |
|---|---|
| ufw | 简化防火墙管理 |
| fail2ban | 防止 SSH、Web 等服务被暴力破解 |
| auditd | 系统审计 |
| unattended-upgrades | 自动安装安全更新 |
| debsums | 校验系统软件包文件完整性 |
| rkhunter | Rootkit 检测 |
| chkrootkit | Rootkit 检测 |
| rsyslog | 日志收集 |
| logrotate | 日志轮转 |
四、账号与密码安全加固
1. 禁止 root 远程登录
root 账户权限过高,如果允许 root 直接通过 SSH 登录,一旦密码被破解,攻击者即可完全控制服务器。因此建议禁止 root 远程登录,改为普通用户登录后再通过 sudo 提权。
编辑 SSH 配置:
sudo vim /etc/ssh/sshd_config
修改或添加:
PermitRootLogin no
然后重启 SSH:
sudo systemctl restart ssh
2. 创建普通运维用户
sudo adduser ops
sudo usermod -aG sudo ops
建议生产环境中不要共用一个账号。每个运维人员应使用独立账号,便于权限控制和日志审计。
3. 设置密码复杂度策略
安装密码质量检查模块:
sudo apt install -y libpam-pwquality
编辑配置文件:
sudo vim /etc/security/pwquality.conf
推荐配置如下:
minlen = 12
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
retry = 3
dictcheck = 1
usercheck = 1
含义如下:
| 参数 | 含义 |
|---|---|
| minlen | 密码最小长度 |
| dcredit | 至少包含数字 |
| ucredit | 至少包含大写字母 |
| lcredit | 至少包含小写字母 |
| ocredit | 至少包含特殊字符 |
| retry | 输入错误重试次数 |
| dictcheck | 检查字典密码 |
| usercheck | 检查是否包含用户名 |
4. 设置密码有效期
编辑:
sudo vim /etc/login.defs
推荐配置:
PASS_MAX_DAYS 90
PASS_MIN_DAYS 7
PASS_WARN_AGE 14
对已有用户生效:
sudo chage -M 90 -m 7 -W 14 ops
5. 锁定无用账号
查看系统用户:
cat /etc/passwd
锁定不需要登录的账号:
sudo usermod -L username
sudo usermod -s /usr/sbin/nologin username
五、SSH 安全加固
SSH 是服务器最常见的入口,也是攻击者重点扫描的目标。建议从端口、认证方式、登录限制、超时机制等方面进行加固。
编辑配置文件:
sudo vim /etc/ssh/sshd_config
推荐配置:
Port 22222
Protocol 2
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
ChallengeResponseAuthentication no
UsePAM yes
MaxAuthTries 3
MaxSessions 3
LoginGraceTime 30
AllowUsers ops
ClientAliveInterval 300
ClientAliveCountMax 2
X11Forwarding no
AllowTcpForwarding no
PermitTunnel no
关键说明
| 配置项 | 建议值 | 说明 |
|---|---|---|
| Port | 非默认端口 | 降低自动化扫描频率 |
| PermitRootLogin | no | 禁止 root 登录 |
| PasswordAuthentication | no | 禁止密码登录 |
| PubkeyAuthentication | yes | 启用密钥登录 |
| MaxAuthTries | 3 | 限制认证尝试次数 |
| AllowUsers | 指定用户 | 只允许特定用户登录 |
| X11Forwarding | no | 禁止 X11 转发 |
| AllowTcpForwarding | no | 禁止端口转发 |
注意:修改 SSH 端口和禁用密码登录前,务必确认密钥登录已经可用,并保持当前 SSH 会话不要断开,避免把自己锁在服务器外。
生成密钥示例:
ssh-keygen -t ed25519 -C "ops@debian-server"
上传公钥:
ssh-copy-id -p 22222 ops@server_ip
测试登录:
ssh -p 22222 ops@server_ip
确认无误后再重启 SSH:
sudo systemctl restart ssh
六、防火墙加固
Debian 可以使用 nftables 或 ufw 配置防火墙。对于大多数场景,ufw 更简单易用。
1. 配置 UFW
默认拒绝入站,允许出站:
sudo ufw default deny incoming
sudo ufw default allow outgoing
允许 SSH 新端口:
sudo ufw allow 22222/tcp
如果是 Web 服务器:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
启用防火墙:
sudo ufw enable
查看状态:
sudo ufw status verbose
2. 限制 SSH 连接频率
sudo ufw limit 22222/tcp
该命令可以限制短时间内大量 SSH 连接请求,降低暴力破解风险。
七、Fail2ban 防暴力破解
Fail2ban 可以根据日志检测异常登录行为,并自动封禁攻击 IP。
1. 创建本地配置
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vim /etc/fail2ban/jail.local
配置 SSH 防护:
[sshd]
enabled = true
port = 22222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 3600
ignoreip = 127.0.0.1/8
参数说明:
| 参数 | 含义 |
|---|---|
| maxretry | 最大失败次数 |
| findtime | 统计时间窗口,单位秒 |
| bantime | 封禁时间,单位秒 |
| ignoreip | 白名单 IP |
启动服务:
sudo systemctl enable fail2ban
sudo systemctl restart fail2ban
查看状态:
sudo fail2ban-client status
sudo fail2ban-client status sshd
八、自动安全更新
生产服务器建议开启安全补丁自动更新,尤其是面向公网的主机。
安装:
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";
};
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";
设置自动更新周期:
sudo vim /etc/apt/apt.conf.d/20auto-upgrades
内容如下:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";
九、内核参数安全加固
通过配置 sysctl 可以增强系统在网络层面的安全性。
创建配置文件:
sudo vim /etc/sysctl.d/99-security-hardening.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
# 开启反向路径过滤,防止 IP 欺骗
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 忽略广播 ICMP 请求
net.ipv4.icmp_echo_ignore_broadcasts = 1
# 忽略伪造错误响应
net.ipv4.icmp_ignore_bogus_error_responses = 1
# 开启 SYN Cookie,缓解 SYN Flood
net.ipv4.tcp_syncookies = 1
# 记录异常 Martian 包
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# 限制 core dump
fs.suid_dumpable = 0
# 内核地址随机化
kernel.randomize_va_space = 2
# 限制 ptrace,降低进程间窥探风险
kernel.yama.ptrace_scope = 1
使配置生效:
sudo sysctl --system
十、文件系统与权限加固
1. 检查 SUID / SGID 文件
SUID 文件如果配置不当,可能被攻击者利用进行提权。
查看 SUID 文件:
sudo find / -perm -4000 -type f 2>/dev/null
查看 SGID 文件:
sudo find / -perm -2000 -type f 2>/dev/null
建议定期保存基线:
sudo find / -perm -4000 -type f 2>/dev/null | sort > /var/log/suid-baseline.txt
后续可以对比变化:
sudo find / -perm -4000 -type f 2>/dev/null | sort > /tmp/suid-current.txt
diff -u /var/log/suid-baseline.txt /tmp/suid-current.txt
2. 敏感文件权限检查
关键文件应保持严格权限:
sudo chmod 600 /etc/shadow
sudo chmod 644 /etc/passwd
sudo chmod 644 /etc/group
sudo chmod 600 /etc/gshadow
检查权限:
ls -l /etc/passwd /etc/shadow /etc/group /etc/gshadow
3. 限制 cron 权限
只允许指定用户使用 cron:
sudo touch /etc/cron.allow
sudo chmod 600 /etc/cron.allow
echo "root" | sudo tee /etc/cron.allow
echo "ops" | sudo tee -a /etc/cron.allow
拒绝文件建议清空或删除:
sudo rm -f /etc/cron.deny
十一、日志与审计加固
日志是安全事件排查的重要依据。服务器上线后,如果没有日志审计,即使被入侵也很难定位攻击来源和操作过程。
1. 启用 auditd
sudo systemctl enable auditd
sudo systemctl start auditd
添加审计规则:
sudo vim /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
# 监控 sudoers
-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
# 监控 cron
-w /etc/crontab -p wa -k cron
-w /etc/cron.d/ -p wa -k cron
-w /etc/cron.daily/ -p wa -k cron
# 监控主机名解析配置
-w /etc/hosts -p wa -k network
-w /etc/resolv.conf -p wa -k network
加载规则:
sudo augenrules --load
sudo systemctl restart auditd
查询审计日志:
sudo ausearch -k identity
sudo ausearch -k sudoers
2. 日志轮转
确保日志不会无限增长占满磁盘。Debian 默认安装 logrotate,可以检查配置:
ls /etc/logrotate.d/
例如为自定义应用添加日志轮转:
sudo vim /etc/logrotate.d/myapp
内容:
/var/log/myapp/*.log {
daily
rotate 14
compress
missingok
notifempty
copytruncate
}
十二、服务最小化与端口检查
查看监听端口:
sudo ss -tulnp
或者:
sudo lsof -i -P -n
关闭不必要服务:
sudo systemctl disable service_name
sudo systemctl stop service_name
查看开机启动项:
systemctl list-unit-files --type=service | grep enabled
生产环境中应尽量减少暴露端口。例如:
- 数据库服务不应直接暴露公网;
- Redis、MongoDB、Elasticsearch 等服务应绑定内网地址;
- 管理后台应限制来源 IP;
- 文件共享服务不应在公网开放;
- 临时调试端口上线后必须关闭。
十三、Rootkit 与完整性检查
1. 使用 rkhunter
初始化:
sudo rkhunter --update
sudo rkhunter --propupd
执行检查:
sudo rkhunter --check
2. 使用 chkrootkit
sudo chkrootkit
3. 使用 debsums 校验软件包
sudo debsums -s
如果输出异常,应进一步确认文件是否被篡改。
十四、Debian 安全加固自动化脚本源码
下面提供一个基础加固脚本,适用于 Debian 11 / 12。脚本包含系统更新、基础工具安装、SSH 配置、UFW 防火墙、Fail2ban、内核参数、安全更新等常见加固项。
使用前务必先在测试环境验证。
如果服务器通过 SSH 远程操作,请确保新端口已经放行,并确认密钥登录可用。
harden-debian.sh
#!/usr/bin/env bash
set -euo pipefail
# ==============================
# Debian Security Hardening Script
# Author: security hardening demo
# Version: 1.0
# ==============================
SSH_PORT="${SSH_PORT:-22222}"
ADMIN_USER="${ADMIN_USER:-ops}"
ALLOW_HTTP="${ALLOW_HTTP:-false}"
ALLOW_HTTPS="${ALLOW_HTTPS:-false}"
if [[ $EUID -ne 0 ]]; then
echo "[ERROR] 请使用 root 权限执行该脚本"
exit 1
fi
echo "[INFO] 当前 SSH 加固端口: ${SSH_PORT}"
echo "[INFO] 管理用户: ${ADMIN_USER}"
backup_file() {
local file="$1"
if [[ -f "$file" ]]; then
cp "$file" "${file}.bak.$(date +%F-%H%M%S)"
echo "[INFO] 已备份: $file"
fi
}
install_packages() {
echo "[INFO] 更新系统并安装安全工具..."
apt update
apt upgrade -y
apt install -y \
vim curl wget net-tools lsof unzip git \
ufw fail2ban auditd audispd-plugins \
unattended-upgrades apt-listchanges \
libpam-pwquality \
debsums rkhunter chkrootkit \
rsyslog logrotate
}
create_admin_user() {
if id "$ADMIN_USER" >/dev/null 2>&1; then
echo "[INFO] 用户 $ADMIN_USER 已存在"
else
echo "[INFO] 创建管理用户 $ADMIN_USER"
adduser "$ADMIN_USER"
usermod -aG sudo "$ADMIN_USER"
fi
}
configure_password_policy() {
echo "[INFO] 配置密码复杂度策略..."
backup_file /etc/security/pwquality.conf
cat > /etc/security/pwquality.conf <> /tmp/sshd_config.new
fi
cat >> /tmp/sshd_config.new < /etc/fail2ban/jail.local < /etc/sysctl.d/99-security-hardening.conf < /etc/apt/apt.conf.d/20auto-upgrades < /etc/audit/rules.d/hardening.rules <> /etc/cron.allow
grep -qxF "$ADMIN_USER" /etc/cron.allow || echo "$ADMIN_USER" >> /etc/cron.allow
rm -f /etc/cron.deny
}
generate_baseline() {
echo "[INFO] 生成 SUID 文件基线..."
find / -perm -4000 -type f 2>/dev/null | sort > /var/log/suid-baseline.txt || true
}
main() {
install_packages
create_admin_user
configure_password_policy
configure_ssh
configure_ufw
configure_fail2ban
configure_sysctl
configure_unattended_upgrades
configure_auditd
secure_file_permissions
generate_baseline
echo "======================================"
echo "[SUCCESS] Debian 安全加固完成"
echo "[INFO] SSH 端口: ${SSH_PORT}"
echo "[INFO] 管理用户: ${ADMIN_USER}"
echo "[WARN] 请确认你可以使用新端口和密钥正常登录"
echo "======================================"
}
main "$@"
使用方法
保存脚本:
vim harden-debian.sh
赋予执行权限:
chmod +x harden-debian.sh
执行脚本:
sudo SSH_PORT=22222 ADMIN_USER=ops ALLOW_HTTP=true ALLOW_HTTPS=true ./harden-debian.sh
如果不是 Web 服务器,可以不开放 80 和 443:
sudo SSH_PORT=22222 ADMIN_USER=ops ./harden-debian.sh
十五、加固后的验证清单
完成加固后,建议按照以下清单进行检查。
1. 检查 SSH 配置
sudo sshd -t
sudo grep -E "Port|PermitRootLogin|PasswordAuthentication|AllowUsers" /etc/ssh/sshd_config
2. 检查防火墙
sudo ufw status verbose
3. 检查 Fail2ban
sudo fail2ban-client status sshd
4. 检查系统监听端口
sudo ss -tulnp
5. 检查内核参数
sysctl net.ipv4.tcp_syncookies
sysctl kernel.randomize_va_space
sysctl kernel.yama.ptrace_scope
6. 检查自动更新
systemctl status unattended-upgrades
7. 检查审计服务
systemctl status auditd
十六、生产环境补充建议
基础加固完成后,还可以根据业务场景进一步增强安全性。
1. 使用密钥登录并保护私钥
SSH 私钥必须妥善保管,建议:
- 私钥设置 passphrase;
- 不要将私钥上传到服务器;
- 不要多人共用同一私钥;
- 定期轮换密钥;
- 离职人员及时删除公钥。
2. 管理后台限制来源 IP
如果服务器部署了管理后台,例如 Jenkins、Grafana、Kibana、Adminer 等,应尽量限制来源 IP,不建议直接暴露公网。
可以通过 Nginx 配置限制:
location /admin/ {
allow 192.168.1.0/24;
allow 10.0.0.0/8;
deny all;
}
3. 数据库不暴露公网
MySQL、PostgreSQL、Redis、MongoDB 等数据库服务建议只监听本地或内网地址。
例如 Redis:
bind 127.0.0.1
protected-mode yes
MySQL:
bind-address = 127.0.0.1
4. 定期备份
安全加固不能替代备份。服务器应建立完善备份策略:
- 数据库定时备份;
- 配置文件备份;
- 备份文件加密;
- 备份异地存储;
- 定期验证备份可恢复。
5. 建立登录告警
可以通过脚本监控 SSH 登录,并发送到企业微信、钉钉或邮件。示例思路:
- 监听
/var/log/auth.log; - 检测
Accepted publickey; - 提取登录 IP、用户、时间;
- 调用 Webhook 发送告警。
十七、常见问题
1. 修改 SSH 端口后无法连接怎么办?
如果使用云服务器,首先检查安全组是否放行新端口。其次确认 UFW 是否允许该端口:
sudo ufw allow 22222/tcp
如果 SSH 配置错误,可以通过云厂商控制台的 VNC 或救援模式恢复 /etc/ssh/sshd_config。
2. 禁用密码登录前需要注意什么?
必须确认公钥已经写入:
~/.ssh/authorized_keys
并且权限正确:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
否则禁用密码后可能无法登录。
3. 是否一定要改 SSH 默认端口?
修改端口不能代替真正的安全措施,但可以减少大量自动扫描和日志噪音。真正关键的是禁用 root 登录、禁用密码登录、启用密钥登录、配置 Fail2ban 和防火墙。
4. 自动更新会不会影响业务?
自动安全更新通常风险较低,但仍建议:
- 生产环境先在测试环境验证;
- 重要业务服务器设置维护窗口;
- 不建议自动重启;
- 对内核更新定期人工重启。
十八、总结
Debian 安全加固的核心不是追求“绝对安全”,而是在可维护、可审计、可恢复的前提下,尽可能降低被攻击的概率和入侵后的影响范围。
本文介绍了一套较完整的 Debian 安全加固方案,覆盖了以下内容:
- 系统更新与安全工具安装;
- 账号与密码策略;
- SSH 安全配置;
- UFW 防火墙;
- Fail2ban 防暴力破解;
- 自动安全更新;
- 内核参数加固;
- 文件权限检查;
- SUID 基线管理;
- 日志审计;
- Rootkit 检测;
- 自动化加固脚本源码;
- 加固后的验证清单。
需要注意的是,安全加固不是一次性工作,而是持续过程。服务器上线后仍需要定期巡检、更新补丁、检查日志、验证备份、复核权限,并根据业务变化调整安全策略。
如果是公网服务器,建议至少做到:
- 禁止 root 远程登录;
- 禁止 SSH 密码登录;
- 使用密钥认证;
- 开启防火墙;
- 只开放必要端口;
- 启用 Fail2ban;
- 自动安装安全更新;
- 定期检查日志和异常进程;
- 数据库不暴露公网;
- 建立备份和恢复机制。
只要坚持最小权限、默认拒绝、持续更新和日志审计这几个原则,Debian 服务器的整体安全性就能得到明显提升。