Debian 服务器上线前必做的安全加固清单与脚本实战
Debian 安全加固方案|附源码
Debian 以稳定、简洁和安全著称,广泛用于服务器、云主机、容器宿主机、数据库节点、Web 服务、堡垒机以及企业内部基础设施。但“默认安全”并不等于“上线即安全”。一台刚安装完成的 Debian 系统,仍然可能存在弱口令、SSH 暴露、无防火墙策略、日志缺失、服务权限过大、内核参数未优化、自动更新未启用等问题。
本文将围绕 Debian 服务器安全加固 展开,提供一套适用于生产环境的基线方案,并附带可直接参考使用的 Shell 加固脚本源码。本文以 Debian 11 / Debian 12 为主要参考对象,其他 Debian 系发行版可根据实际情况调整。
一、加固目标
Debian 安全加固的核心目标不是“安装几个安全软件”这么简单,而是从系统、账户、网络、服务、日志、权限、更新、审计等多个层面降低风险。
主要目标包括:
- 降低被暴力破解的风险;
- 限制不必要的网络访问;
- 减少系统暴露面;
- 提升入侵后的攻击难度;
- 增强日志审计与追踪能力;
- 及时修复已知安全漏洞;
- 限制普通用户和服务进程权限;
- 建立可复用、可验证的安全基线。
二、加固前准备
在进行安全加固前,建议先完成以下准备工作。
1. 备份重要数据
加固过程中可能会修改 SSH、网络、防火墙、PAM、内核参数等配置。如果操作不当,可能导致远程连接中断。
建议至少备份以下文件:
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
cp /etc/sysctl.conf /etc/sysctl.conf.bak
cp /etc/login.defs /etc/login.defs.bak
cp /etc/profile /etc/profile.bak
如果是云服务器,建议先创建快照。
2. 确认当前系统版本
cat /etc/debian_version
lsb_release -a
uname -a
3. 保留一个可用的管理员会话
在修改 SSH 配置、防火墙规则时,不要立即关闭当前 SSH 窗口。建议新开一个窗口测试是否能正常登录,确认无误后再退出旧会话。
三、账户与密码安全加固
账户安全是 Linux 安全加固的第一道防线。很多服务器被入侵,并不是因为系统漏洞,而是因为弱口令、默认账户、共享账户或 SSH 密码爆破。
1. 禁止 root 远程 SSH 登录
生产服务器建议禁止 root 用户直接通过 SSH 登录。管理员应使用普通用户登录,再通过 sudo 提权。
编辑 SSH 配置:
vim /etc/ssh/sshd_config
修改或添加:
PermitRootLogin no
重启 SSH 服务:
systemctl restart ssh
2. 创建普通管理员用户
adduser opsadmin
usermod -aG sudo opsadmin
确认该用户拥有 sudo 权限:
su - opsadmin
sudo whoami
如果输出:
root
说明配置成功。
3. 设置密码复杂度策略
安装密码质量检查模块:
apt update
apt install -y libpam-pwquality
编辑配置:
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. 设置密码有效期
编辑:
vim /etc/login.defs
推荐配置:
PASS_MAX_DAYS 90
PASS_MIN_DAYS 1
PASS_WARN_AGE 7
对已有用户生效:
chage -M 90 -m 1 -W 7 username
查看用户密码策略:
chage -l username
四、SSH 安全加固
SSH 是 Linux 服务器最常见的远程管理入口,因此也是攻击者重点扫描的目标。
1. 修改默认端口
默认 22 端口每天都会遭遇大量扫描。可以将 SSH 改为非默认端口,例如 22222。
Port 22222
修改后注意放行防火墙端口,否则可能无法登录。
2. 禁止空密码登录
PermitEmptyPasswords no
3. 禁止密码登录,使用密钥认证
如果具备条件,建议关闭密码登录,仅允许密钥登录:
PasswordAuthentication no
PubkeyAuthentication yes
生成 SSH 密钥:
ssh-keygen -t ed25519 -C "admin@server"
上传公钥:
ssh-copy-id -p 22222 opsadmin@server_ip
4. 限制允许登录用户
AllowUsers opsadmin
如果有多个用户:
AllowUsers opsadmin deploy backup
5. 设置登录失败限制
虽然 SSH 本身可配置部分限制,但更推荐配合 Fail2ban 使用,后文会介绍。
6. 推荐 SSH 配置示例
Port 22222
Protocol 2
PermitRootLogin no
PermitEmptyPasswords no
PasswordAuthentication no
PubkeyAuthentication yes
X11Forwarding no
AllowTcpForwarding no
ClientAliveInterval 300
ClientAliveCountMax 2
MaxAuthTries 3
LoginGraceTime 30
AllowUsers opsadmin
配置检查:
sshd -t
重启服务:
systemctl restart ssh
五、防火墙加固
防火墙的原则是:默认拒绝,按需放行。
Debian 常用防火墙方案包括 nftables、iptables 和 ufw。Debian 12 默认更推荐 nftables,但对于通用服务器,ufw 简单易用,适合大多数场景。
1. 安装 UFW
apt install -y ufw
2. 设置默认策略
ufw default deny incoming
ufw default allow outgoing
3. 放行 SSH 端口
假设 SSH 端口是 22222:
ufw allow 22222/tcp
如果是 Web 服务器:
ufw allow 80/tcp
ufw allow 443/tcp
4. 启用防火墙
ufw enable
ufw status verbose
5. 防火墙建议
不要直接暴露数据库端口,例如:
- MySQL:3306
- PostgreSQL:5432
- Redis:6379
- MongoDB:27017
- Elasticsearch:9200
如果必须访问,应限制来源 IP:
ufw allow from 192.168.1.10 to any port 3306 proto tcp
六、系统更新与安全补丁
系统不及时更新是服务器被入侵的重要原因之一。很多攻击并不复杂,只是利用了公开漏洞。
1. 手动更新
apt update
apt upgrade -y
apt autoremove -y
2. 启用自动安全更新
安装:
apt install -y unattended-upgrades apt-listchanges
启用:
dpkg-reconfigure unattended-upgrades
配置文件:
vim /etc/apt/apt.conf.d/50unattended-upgrades
常用配置:
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";
自动更新周期配置:
vim /etc/apt/apt.conf.d/20auto-upgrades
内容如下:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";
七、关闭不必要服务
系统暴露的服务越多,风险越大。应定期检查监听端口和正在运行的服务。
1. 查看监听端口
ss -tunlp
2. 查看服务状态
systemctl list-units --type=service --state=running
3. 禁用无用服务
例如不需要 avahi:
systemctl disable --now avahi-daemon
不需要 cups:
systemctl disable --now cups
是否关闭某服务应根据业务判断,不能盲目执行。
八、内核参数加固
内核参数可以通过 sysctl 调整。合理配置可降低 IP 欺骗、ICMP 攻击、SYN Flood 等风险。
创建加固配置文件:
vim /etc/sysctl.d/99-security-hardening.conf
写入以下内容:
# 禁用 IP 转发,非路由服务器建议关闭
net.ipv4.ip_forward = 0
# 启用 SYN Cookie,缓解 SYN Flood
net.ipv4.tcp_syncookies = 1
# 忽略 ICMP 广播请求
net.ipv4.icmp_echo_ignore_broadcasts = 1
# 忽略伪造错误响应
net.ipv4.icmp_ignore_bogus_error_responses = 1
# 开启反向路径过滤,减少 IP 欺骗
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 禁止源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# 禁止 ICMP 重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
# 禁止发送 ICMP 重定向
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# 记录可疑数据包
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# IPv6 不使用时可考虑禁用
# net.ipv6.conf.all.disable_ipv6 = 1
# net.ipv6.conf.default.disable_ipv6 = 1
# net.ipv6.conf.lo.disable_ipv6 = 1
加载配置:
sysctl --system
注意:如果服务器本身承担网关、VPN、容器网络或转发功能,不应盲目关闭 ip_forward。
九、日志与审计加固
日志是发现攻击、溯源和排查问题的重要依据。
1. 安装常用日志工具
apt install -y rsyslog logrotate auditd audispd-plugins
启动服务:
systemctl enable --now rsyslog
systemctl enable --now auditd
2. 查看登录日志
last
lastb
who
w
查看 SSH 登录记录:
journalctl -u ssh
3. 配置 auditd 审计规则
编辑:
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
# 监控系统时间修改
-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
# 监控内核模块加载
-a always,exit -F arch=b64 -S init_module,finit_module,delete_module -k kernel-module
-a always,exit -F arch=b32 -S init_module,delete_module -k kernel-module
加载规则:
augenrules --load
systemctl restart auditd
查询审计日志:
ausearch -k identity
ausearch -k sshd_config
十、Fail2ban 防暴力破解
Fail2ban 可以根据日志检测暴力破解行为,并自动封禁攻击 IP。
1. 安装 Fail2ban
apt install -y fail2ban
2. 配置 SSH 防护
创建本地配置:
vim /etc/fail2ban/jail.local
示例:
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
ignoreip = 127.0.0.1/8
[sshd]
enabled = true
port = 22222
filter = sshd
logpath = /var/log/auth.log
backend = systemd
启动:
systemctl enable --now fail2ban
查看状态:
fail2ban-client status
fail2ban-client status sshd
手动解封:
fail2ban-client set sshd unbanip x.x.x.x
十一、文件权限与敏感文件保护
Linux 的安全很大程度上依赖权限模型。错误的权限设置可能导致敏感信息泄露。
1. 关键文件权限
chmod 644 /etc/passwd
chmod 640 /etc/shadow
chmod 644 /etc/group
chmod 640 /etc/gshadow
chown root:root /etc/passwd /etc/shadow /etc/group /etc/gshadow
2. SSH 目录权限
用户家目录下 SSH 权限应严格控制:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
如果权限过宽,SSH 密钥认证可能失败。
3. 查找 SUID 文件
SUID 文件可能被攻击者用于提权,应定期检查。
find / -perm -4000 -type f 2>/dev/null
可以将结果保存为基线,后续对比是否出现异常新增文件。
十二、sudo 权限控制
sudo 是常见提权入口,必须谨慎授权。
1. 使用 visudo 编辑
visudo
不要直接用普通编辑器修改 /etc/sudoers,避免语法错误导致 sudo 不可用。
2. 避免无密码 sudo
不推荐:
opsadmin ALL=(ALL) NOPASSWD: ALL
更推荐:
opsadmin ALL=(ALL) ALL
如果确实需要免密,应只允许特定命令:
deploy ALL=(root) NOPASSWD: /bin/systemctl restart nginx
3. 记录 sudo 日志
可在 sudoers 中添加:
Defaults logfile="/var/log/sudo.log"
Defaults timestamp_timeout=5
十三、时间同步安全
日志审计依赖准确时间。服务器应启用 NTP 时间同步。
安装 chrony:
apt install -y chrony
启动:
systemctl enable --now chrony
查看状态:
chronyc tracking
chronyc sources -v
十四、恶意软件与 Rootkit 检测
Linux 并非不会中毒。生产服务器可安装基础检测工具。
apt install -y rkhunter chkrootkit clamav clamav-daemon
更新病毒库:
freshclam
扫描:
chkrootkit
rkhunter --check
clamscan -r /var/www
注意:这些工具可能存在误报,应结合日志、进程、网络连接综合判断。
十五、Web 服务器安全建议
如果 Debian 作为 Web 服务器,还需要对 Nginx、Apache、PHP、数据库等进行额外加固。
1. 隐藏版本号
Nginx:
server_tokens off;
Apache:
ServerTokens Prod
ServerSignature Off
2. 限制上传目录执行权限
例如 Nginx 禁止上传目录执行 PHP:
location /uploads/ {
location ~ \.php$ {
deny all;
}
}
3. 数据库不要公网暴露
MySQL 应绑定本地地址:
bind-address = 127.0.0.1
PostgreSQL 应限制 listen_addresses 和 pg_hba.conf。
十六、Debian 安全加固脚本源码
下面提供一个基础版 Debian 安全加固脚本。该脚本适用于新服务器初始化安全配置,包含系统更新、防火墙、Fail2ban、SSH 配置备份、内核参数、安全工具安装等操作。
注意:脚本不会自动修改 SSH 端口和关闭密码登录,以避免误操作导致远程失联。相关项可根据实际情况手动开启。
debian-hardening.sh
#!/bin/bash
set -e
# Debian Security Hardening Script
# Author: ops
# Usage: bash debian-hardening.sh
if [ "$(id -u)" -ne 0 ]; then
echo "请使用 root 用户执行该脚本。"
exit 1
fi
echo "======================================"
echo " Debian 安全加固脚本开始执行"
echo "======================================"
BACKUP_DIR="/root/security_backup_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
echo "[1/10] 备份关键配置文件..."
backup_file() {
if [ -f "$1" ]; then
cp "$1" "$BACKUP_DIR/"
echo "已备份:$1"
fi
}
backup_file /etc/ssh/sshd_config
backup_file /etc/sysctl.conf
backup_file /etc/login.defs
backup_file /etc/security/pwquality.conf
echo "[2/10] 更新系统软件包..."
apt update
apt upgrade -y
apt autoremove -y
echo "[3/10] 安装基础安全组件..."
apt install -y \
sudo \
vim \
curl \
wget \
ufw \
fail2ban \
auditd \
audispd-plugins \
rsyslog \
logrotate \
chrony \
unattended-upgrades \
apt-listchanges \
libpam-pwquality
echo "[4/10] 配置密码复杂度策略..."
PWQUALITY_CONF="/etc/security/pwquality.conf"
cat > "$PWQUALITY_CONF" <> "$SSHD_CONFIG"
fi
}
set_sshd_option "PermitRootLogin" "no"
set_sshd_option "PermitEmptyPasswords" "no"
set_sshd_option "X11Forwarding" "no"
set_sshd_option "ClientAliveInterval" "300"
set_sshd_option "ClientAliveCountMax" "2"
set_sshd_option "MaxAuthTries" "3"
set_sshd_option "LoginGraceTime" "30"
sshd -t
systemctl restart ssh || systemctl restart sshd
echo "[7/10] 配置 UFW 防火墙..."
ufw default deny incoming
ufw default allow outgoing
# 默认放行 22 端口,若已修改 SSH 端口,请手动调整
ufw allow 22/tcp
# 如需开放 Web 服务,可取消以下注释
# ufw allow 80/tcp
# ufw allow 443/tcp
ufw --force enable
ufw status verbose
echo "[8/10] 配置 Fail2ban..."
cat > /etc/fail2ban/jail.local < /etc/sysctl.d/99-security-hardening.conf < /etc/apt/apt.conf.d/20auto-upgrades <
使用方法
保存脚本:
vim debian-hardening.sh
赋予执行权限:
chmod +x debian-hardening.sh
执行:
sudo ./debian-hardening.sh
执行完成后检查:
systemctl status ssh
systemctl status ufw
systemctl status fail2ban
systemctl status auditd
ufw status verbose
十七、加固后检查清单
完成加固后,应根据以下清单进行验证。
| 检查项 | 命令 | 期望结果 |
|---|---|---|
| SSH 配置语法 | sshd -t |
无错误输出 |
| SSH 服务状态 | systemctl status ssh |
active |
| 防火墙状态 | ufw status verbose |
active |
| Fail2ban 状态 | fail2ban-client status |
正常显示 jail |
| 自动更新 | systemctl status unattended-upgrades |
正常 |
| 审计服务 | systemctl status auditd |
active |
| 时间同步 | chronyc tracking |
正常同步 |
| 监听端口 | ss -tunlp |
无异常端口 |
| root 登录限制 | 查看 sshd_config | PermitRootLogin no |
十八、常见风险与处理建议
1. 修改 SSH 后无法登录
处理建议:
- 不要关闭当前 SSH 会话;
- 先执行
sshd -t检查语法; - 确认防火墙已放行新端口;
- 云服务器可通过控制台 VNC 修复。
2. 开启 UFW 后业务无法访问
检查端口是否放行:
ufw status numbered
添加规则:
ufw allow 端口/tcp
删除错误规则:
ufw delete 编号
3. Fail2ban 误封自己
查看封禁列表:
fail2ban-client status sshd
解封:
fail2ban-client set sshd unbanip your_ip
建议将可信 IP 加入 ignoreip。
十九、生产环境进一步建议
基础加固只是第一步。如果是生产环境,还建议继续完善以下能力:
- 接入集中日志平台,例如 ELK、Graylog、Loki;
- 使用堡垒机统一管理 SSH 登录;
- 开启 MFA 多因素认证;
- 对重要目录做完整性监控;
- 使用 Wazuh、OSSEC 等主机入侵检测系统;
- 对容器环境单独配置 Docker 或 Kubernetes 安全策略;
- 建立定期漏洞扫描机制;
- 建立最小权限账号体系;
- 定期复核 sudo 权限和开放端口;
- 制定应急响应流程。
二十、总结
Debian 安全加固不是一次性任务,而是一个持续过程。真正有效的安全方案应同时具备以下特点:
- 配置合理;
- 可审计;
- 可回滚;
- 可自动化;
- 可持续维护;
- 与业务场景匹配。
本文提供的方案覆盖了账户密码、SSH、防火墙、系统更新、日志审计、内核参数、Fail2ban、防恶意软件、权限控制等常见加固项,并附带了可执行的 Shell 脚本源码。实际使用时,建议根据业务角色进行裁剪,例如 Web 服务器、数据库服务器、容器宿主机、跳板机的安全策略并不完全相同。
最后需要强调:安全加固不能替代安全运维。及时更新、持续监控、权限治理、日志分析和应急演练,才是 Debian 服务器长期安全运行的关键。