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

Debian 服务器上线前必做的安全加固清单与脚本实战

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

Debian 安全加固方案|附源码

Debian 以稳定、简洁和安全著称,广泛用于服务器、云主机、容器宿主机、数据库节点、Web 服务、堡垒机以及企业内部基础设施。但“默认安全”并不等于“上线即安全”。一台刚安装完成的 Debian 系统,仍然可能存在弱口令、SSH 暴露、无防火墙策略、日志缺失、服务权限过大、内核参数未优化、自动更新未启用等问题。

本文将围绕 Debian 服务器安全加固 展开,提供一套适用于生产环境的基线方案,并附带可直接参考使用的 Shell 加固脚本源码。本文以 Debian 11 / Debian 12 为主要参考对象,其他 Debian 系发行版可根据实际情况调整。


一、加固目标

Debian 安全加固的核心目标不是“安装几个安全软件”这么简单,而是从系统、账户、网络、服务、日志、权限、更新、审计等多个层面降低风险。

主要目标包括:

  1. 降低被暴力破解的风险;
  2. 限制不必要的网络访问;
  3. 减少系统暴露面;
  4. 提升入侵后的攻击难度;
  5. 增强日志审计与追踪能力;
  6. 及时修复已知安全漏洞;
  7. 限制普通用户和服务进程权限;
  8. 建立可复用、可验证的安全基线。

二、加固前准备

在进行安全加固前,建议先完成以下准备工作。

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 常用防火墙方案包括 nftablesiptablesufw。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_addressespg_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


十九、生产环境进一步建议

基础加固只是第一步。如果是生产环境,还建议继续完善以下能力:

  1. 接入集中日志平台,例如 ELK、Graylog、Loki;
  2. 使用堡垒机统一管理 SSH 登录;
  3. 开启 MFA 多因素认证;
  4. 对重要目录做完整性监控;
  5. 使用 Wazuh、OSSEC 等主机入侵检测系统;
  6. 对容器环境单独配置 Docker 或 Kubernetes 安全策略;
  7. 建立定期漏洞扫描机制;
  8. 建立最小权限账号体系;
  9. 定期复核 sudo 权限和开放端口;
  10. 制定应急响应流程。

二十、总结

Debian 安全加固不是一次性任务,而是一个持续过程。真正有效的安全方案应同时具备以下特点:

  • 配置合理;
  • 可审计;
  • 可回滚;
  • 可自动化;
  • 可持续维护;
  • 与业务场景匹配。

本文提供的方案覆盖了账户密码、SSH、防火墙、系统更新、日志审计、内核参数、Fail2ban、防恶意软件、权限控制等常见加固项,并附带了可执行的 Shell 脚本源码。实际使用时,建议根据业务角色进行裁剪,例如 Web 服务器、数据库服务器、容器宿主机、跳板机的安全策略并不完全相同。

最后需要强调:安全加固不能替代安全运维。及时更新、持续监控、权限治理、日志分析和应急演练,才是 Debian 服务器长期安全运行的关键。

目录结构
全文