上一篇 下一篇 分享链接 返回 返回顶部

Debian 服务器上线前必做的安全加固清单与自动化脚本

发布人:慈云数据-客服中心 发布时间:11小时前 阅读量:4

Debian 安全加固方案|附源码

适用范围:Debian 11 / Debian 12 服务器
适用场景:云服务器、Web 服务器、数据库服务器、跳板机、内网业务主机
目标:降低系统被扫描、爆破、提权、横向移动和恶意入侵的风险


一、前言

Debian 作为稳定、可靠、社区生态成熟的 Linux 发行版,被广泛应用于服务器环境中。无论是部署 Web 服务、数据库服务、容器平台,还是作为内部运维跳板机,Debian 都具备较高的稳定性和可维护性。

但默认安装后的 Debian 系统并不等于“安全”。默认配置通常是为了兼容性和易用性,并没有针对生产环境做严格加固。如果服务器直接暴露在公网中,常见风险包括:

  • SSH 被暴力破解;
  • root 账户被尝试登录;
  • 弱口令导致系统沦陷;
  • 不必要的端口暴露;
  • 系统补丁长期未更新;
  • 普通用户通过 sudo 或 SUID 文件提权;
  • 防火墙未配置;
  • 日志缺失或未审计;
  • 敏感文件权限过宽;
  • 内核参数未优化,容易受到网络层攻击;
  • 服务运行权限过高;
  • 没有入侵检测和登录告警机制。

因此,在 Debian 服务器正式上线前,进行系统安全加固是非常有必要的。本文将从账号安全、SSH 加固、防火墙、系统更新、内核参数、文件权限、日志审计、自动化脚本等多个方面介绍一套较完整的 Debian 安全加固方案,并附带可直接参考的 Shell 源码。


二、安全加固总体思路

Debian 安全加固并不是简单执行几个命令,而是一套系统化流程。通常可按照以下思路进行:

  1. 最小化原则
    只安装必要软件,只开放必要端口,只赋予必要权限。

  2. 纵深防御原则
    不依赖单一安全措施,而是从账号、网络、服务、日志、内核等多个层面进行防护。

  3. 默认拒绝原则
    防火墙默认拒绝所有入站连接,只允许明确需要的端口。

  4. 权限隔离原则
    服务尽量使用低权限账户运行,避免 root 直接运行应用。

  5. 持续更新原则
    及时安装安全补丁,避免已知漏洞被利用。

  6. 可审计原则
    关键行为需要留下日志,便于溯源和排查。

  7. 自动化原则
    对通用加固项编写脚本,降低人工误操作概率。


三、系统更新与基础软件安装

服务器上线前,首先需要更新软件源并安装安全补丁。

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 可以使用 nftablesufw 配置防火墙。对于大多数场景,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 检测;
  • 自动化加固脚本源码;
  • 加固后的验证清单。

需要注意的是,安全加固不是一次性工作,而是持续过程。服务器上线后仍需要定期巡检、更新补丁、检查日志、验证备份、复核权限,并根据业务变化调整安全策略。

如果是公网服务器,建议至少做到:

  1. 禁止 root 远程登录;
  2. 禁止 SSH 密码登录;
  3. 使用密钥认证;
  4. 开启防火墙;
  5. 只开放必要端口;
  6. 启用 Fail2ban;
  7. 自动安装安全更新;
  8. 定期检查日志和异常进程;
  9. 数据库不暴露公网;
  10. 建立备份和恢复机制。

只要坚持最小权限、默认拒绝、持续更新和日志审计这几个原则,Debian 服务器的整体安全性就能得到明显提升。

目录结构
全文