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

Debian 服务器安全加固实战:基础防护与一键部署脚本

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

Debian 安全加固方案|一键部署

在服务器运维场景中,Debian 因稳定、轻量、软件生态成熟而被广泛应用于 Web 服务、数据库、中间件、容器平台以及各类企业内部系统。然而,默认安装完成后的 Debian 系统并不等于“安全可用”。如果服务器直接暴露在公网,弱口令、SSH 暴力破解、过期软件包、开放端口过多、日志审计不足、权限配置不合理等问题,都可能成为攻击者入侵系统的突破口。

本文将围绕 Debian 服务器安全加固展开,提供一套适合通用生产环境的安全加固方案,并附带一个可参考的一键部署脚本。该方案主要面向 Debian 11 / Debian 12 系统,适用于云服务器、物理服务器以及虚拟机环境。需要注意的是,任何安全加固方案都不应盲目执行,建议在测试环境验证无误后再应用到生产环境。


一、Debian 安全加固目标

Debian 安全加固的核心目标并不是“安装越多安全软件越好”,而是通过系统化配置降低攻击面,提高入侵难度,增强可观测性和恢复能力。通常可以从以下几个方面进行设计:

  1. 账号与权限安全
    限制 root 远程登录,禁用弱口令,强化 sudo 权限控制,清理无用账号。

  2. SSH 服务加固
    修改默认配置,关闭密码登录或限制登录用户,防止暴力破解。

  3. 系统更新与补丁管理
    及时更新安全补丁,避免已知漏洞被利用。

  4. 防火墙访问控制
    默认拒绝不必要的入站连接,仅开放业务必需端口。

  5. 入侵防护与暴力破解防御
    使用 Fail2ban 等工具对异常登录行为进行自动封禁。

  6. 内核参数优化
    通过 sysctl 调整网络安全相关参数,防御常见网络攻击。

  7. 日志审计与追踪
    保存关键日志,对登录、sudo、SSH、系统异常进行审计。

  8. 文件权限与系统完整性
    限制敏感文件权限,避免普通用户读取关键配置。

  9. 服务最小化
    关闭不需要的服务,减少潜在漏洞入口。

  10. 备份与回滚机制
    安全配置前先备份关键文件,出现异常时能够快速恢复。


二、加固前准备工作

在执行任何系统加固操作前,建议先完成以下准备:

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

如果数据库只供内网访问,不建议对公网开放 3306543263799200 等敏感端口。应通过内网安全组、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 服务器安全基线的起点。

不过,安全不是一次性工作。服务器上线后,还需要持续关注系统补丁、登录日志、业务漏洞、访问控制和备份恢复情况。只有将安全加固纳入日常运维流程,才能真正降低系统被攻击和数据丢失的风险。

目录结构
全文