Linux 服务器安全加固 Checklist:上线前必做的 15 项配置

摘要:一台刚开通的云服务器就像一扇没上锁的门,默认配置存在大量安全隐患。本文整理 15 项上线前必做的安全加固配置,涵盖账号安全、SSH 防护、防火墙、系统更新、日志审计等核心维度,每项附完整命令,30 分钟内可全部完成,适用于 Ubuntu / Debian / CentOS 全系发行版。

加固优先级总览

#加固项目优先级耗时风险等级(不做)
修改 root 密码为强密码🔴 必做1 分钟极高
创建普通用户并授予 sudo🔴 必做2 分钟
SSH 密钥登录 + 禁用密码认证🔴 必做5 分钟极高
修改 SSH 默认端口🔴 必做2 分钟中高
配置防火墙🔴 必做3 分钟极高
安装 Fail2Ban🔴 必做5 分钟
更新系统 + 自动安全更新🔴 必做5 分钟
禁用不必要服务🟡 推荐3 分钟
时区 + 时间同步🟡 推荐2 分钟
开启日志审计(auditd)🟡 推荐3 分钟
限制 SUID/SGID 危险文件🟡 推荐5 分钟
内核安全参数(sysctl)🟡 推荐3 分钟
Rootkit 检测工具🟢 进阶5 分钟
日志集中存储与轮转🟢 进阶3 分钟低中
安全扫描自检🟢 进阶5 分钟

1 修改 root 密码为强密码

云服务商初始密码通常较简单或在邮件中明文发送,上线第一步必须修改。

# 修改当前用户(root)密码
passwd

# 生成一个高强度随机密码(建议复制保存到密码管理器)
openssl rand -base64 24

强密码标准:至少 16 位,包含大小写字母、数字和特殊字符(!@#$%^&*),不使用任何有意义的单词或日期。

✅ 推荐使用 Bitwarden(免费)或 1Password 管理服务器密码,避免忘记或泄露。

2 创建普通用户并授予 sudo 权限

日常操作不应直接使用 root,创建普通用户并按需 sudo 是最小权限原则的基本实践。

# 创建新用户(替换 deploy 为你的用户名)
useradd -m -s /bin/bash deploy

# 设置密码
passwd deploy

# 将用户加入 sudo 组
usermod -aG sudo deploy       # Ubuntu/Debian
usermod -aG wheel deploy      # CentOS/RHEL

# 验证 sudo 权限
su - deploy
sudo whoami   # 应输出 root
💡 最佳实践:完成 SSH 密钥配置(第③步)后,可以完全禁止 root SSH 登录,只允许普通用户 SSH 后再 sudo 切换,这样即使普通账号被盗,攻击者也需要再突破 sudo 密码。

3 配置 SSH 密钥登录并禁用密码认证

密钥认证是彻底杜绝 SSH 密码暴力破解的最有效手段。

# ── 本地电脑执行 ──────────────────────
# 生成 ED25519 密钥对(比 RSA 更短更安全)
ssh-keygen -t ed25519 -C "服务器备注" -f ~/.ssh/id_ed25519_myserver

# 将公钥上传到服务器
ssh-copy-id -i ~/.ssh/id_ed25519_myserver.pub deploy@服务器IP

# 验证密钥登录成功
ssh -i ~/.ssh/id_ed25519_myserver deploy@服务器IP
# ── 服务器端执行(验证密钥登录成功后再操作)──
nano /etc/ssh/sshd_config

# 修改以下配置项
PasswordAuthentication no      # 禁用密码认证
PubkeyAuthentication yes       # 启用密钥认证
PermitRootLogin prohibit-password  # root 只允许密钥登录
AuthenticationMethods publickey   # 只允许公钥认证

systemctl restart sshd
⚠️ 操作顺序很重要:必须先验证密钥登录成功,再禁用密码认证。同时保持当前 SSH 窗口不要关闭,用新窗口测试连接正常后再关闭旧窗口。

4 修改 SSH 默认端口

将 SSH 端口从 22 改为高位端口,可减少 90% 以上的自动化扫描攻击。

nano /etc/ssh/sshd_config

# 将 #Port 22 改为(选一个 10000-65535 之间的端口)
Port 36742

systemctl restart sshd
# ⚠️ 修改前必须先在云平台安全组放行新端口!
# 登录后浪云控制面板 → 安全组 → 添加入方向规则:TCP 36742

# 用新端口测试连接(本地执行)
ssh -p 36742 deploy@服务器IP

# 连接成功后,安全组中删除 22 端口的入方向规则
💡 同步更新 Fail2Ban 配置中的 SSH 端口(jail.local 中 port = 36742),以及本地 ~/.ssh/config 中的 Port 配置,避免每次都要手动指定端口。

5 配置防火墙

防火墙是服务器的第一道网络防线,只开放必要端口,默认拒绝所有其他流量。

Ubuntu/Debian 使用 UFW:

# 设置默认规则
ufw default deny incoming
ufw default allow outgoing

# 放行必要端口(按实际需求添加)
ufw allow 36742/tcp    # SSH 新端口(替换为你的实际端口)
ufw allow 80/tcp       # HTTP
ufw allow 443/tcp      # HTTPS

# 启用防火墙
ufw enable

# 查看规则
ufw status verbose

CentOS/RHEL 使用 firewalld:

systemctl enable --now firewalld

firewall-cmd --permanent --add-port=36742/tcp
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --remove-service=ssh   # 移除默认 22 端口
firewall-cmd --reload
firewall-cmd --list-all
✅ 配置完防火墙后,用 nmap -p 1-1000 服务器IP 从外部扫描确认只有必要端口开放。

6 安装 Fail2Ban 自动封禁暴力破解

apt install -y fail2ban   # Ubuntu/Debian

# 创建配置文件
cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1
bantime  = 86400
findtime = 600
maxretry = 5
backend  = systemd

[sshd]
enabled  = true
port     = 36742
maxretry = 3
bantime  = 86400
EOF

systemctl enable --now fail2ban
fail2ban-client status sshd
💡 详细的 Fail2Ban 配置和 WordPress 防护规则,参考本站文章《Linux 服务器配置 Fail2Ban 防暴力破解完整教程》。

7 更新系统并开启自动安全更新

保持系统和软件包最新是修复已知漏洞的最简单方式。

# 立即更新所有包(Ubuntu/Debian)
apt update && apt upgrade -y && apt autoremove -y

# CentOS/RHEL
yum update -y   # CentOS 7
dnf update -y   # CentOS 8+

开启自动安全更新(Ubuntu/Debian):

apt install -y unattended-upgrades

# 配置只自动安装安全更新
cat > /etc/apt/apt.conf.d/50unattended-upgrades << 'EOF' Unattended-Upgrade::Allowed-Origins { "${distro_id}:${distro_codename}-security"; }; Unattended-Upgrade::AutoFixInterruptedDpkg "true"; Unattended-Upgrade::Remove-Unused-Dependencies "true"; Unattended-Upgrade::Automatic-Reboot "false"; EOF # 启用自动更新 echo 'APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Unattended-Upgrade "1";' \ > /etc/apt/apt.conf.d/20auto-upgrades

systemctl enable unattended-upgrades

8 禁用不必要的系统服务

每个运行的服务都是潜在的攻击面,关闭不需要的服务可以减少暴露风险。

# 查看所有正在运行的服务
systemctl list-units --type=service --state=running

# 查看开机启动的服务
systemctl list-unit-files --state=enabled

# 安全关闭常见不必要服务
systemctl disable --now avahi-daemon  # mDNS(局域网发现,服务器不需要)
systemctl disable --now cups          # 打印服务
systemctl disable --now bluetooth     # 蓝牙
systemctl disable --now ModemManager  # 调制解调器管理

# 查看监听端口(确认只有必要端口在监听)
ss -tlnp
⚠️ 关闭前确认服务用途,绝对不要关闭 sshd、networking、systemd-networkd、cron 等核心服务。

9 配置系统时区和时间同步

正确的时间对于日志分析、SSL 证书验证、定时任务和安全审计至关重要。

# 查看当前时区
timedatectl

# 设置为上海时区(UTC+8)
timedatectl set-timezone Asia/Shanghai

# 确认 NTP 时间同步已启用
timedatectl show | grep NTPSynchronized

# 如果 NTP 未启用,手动启用
systemctl enable --now systemd-timesyncd

# 验证时间正确
date

10 开启系统日志审计(auditd)

auditd 记录系统关键操作(文件访问、用户切换、特权命令执行等),是安全事件溯源的核心工具。

apt install -y auditd audispd-plugins   # Ubuntu/Debian
yum install -y audit                     # CentOS

systemctl enable --now auditd

# 添加关键审计规则
cat >> /etc/audit/rules.d/audit.rules << 'EOF'
# 监控 /etc/passwd 和 /etc/shadow 变更
-w /etc/passwd -p wa -k user_modification
-w /etc/shadow -p wa -k user_modification

# 监控 SSH 配置变更
-w /etc/ssh/sshd_config -p wa -k sshd_config

# 监控 sudo 使用
-w /etc/sudoers -p wa -k sudoers
-w /var/log/sudo.log -p wa -k sudo_log

# 记录所有特权命令执行
-a always,exit -F arch=b64 -S execve -F euid=0 -k root_commands
EOF

# 重载审计规则
augenrules --load

# 查看审计日志
ausearch -k user_modification | tail -20

11 限制 SUID/SGID 危险文件

SUID 位允许普通用户以文件所有者权限执行程序,若被滥用可提权到 root。

# 查找系统中所有 SUID 文件
find / -perm -4000 -type f 2>/dev/null | sort

# 查找所有 SGID 文件
find / -perm -2000 -type f 2>/dev/null | sort

# 对不需要 SUID 的文件移除该权限(谨慎操作,先确认用途)
# 示例:移除 /usr/bin/wall 的 SUID 位
chmod u-s /usr/bin/wall

# 常见可安全移除 SUID 的文件(根据实际环境判断)
chmod u-s /usr/bin/newgrp    # 组切换命令
chmod u-s /usr/bin/chfn      # 修改用户信息
chmod u-s /usr/bin/chsh      # 修改 shell
💡 移除 SUID 前务必了解命令用途,核心系统命令(如 /usr/bin/sudo、/bin/ping)的 SUID 是正常需要的,不要移除。

12 配置内核安全参数(sysctl)

通过调整内核参数可以防御 IP 欺骗、SYN Flood、ICMP 攻击等网络层威胁。

cat >> /etc/sysctl.d/99-security.conf << 'EOF'
# ── 网络安全参数 ──────────────────────────────

# 禁止 IP 源路由(防 IP 欺骗)
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0

# 启用 TCP SYN Cookie(防 SYN Flood 攻击)
net.ipv4.tcp_syncookies = 1

# 禁止接受 ICMP 重定向(防路由欺骗)
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

# 启用反向路径过滤(防 IP 欺骗)
net.ipv4.conf.all.rp_filter = 1

# 忽略广播 ICMP(防 Smurf 攻击)
net.ipv4.icmp_echo_ignore_broadcasts = 1

# 忽略伪造的错误响应
net.ipv4.icmp_ignore_bogus_error_responses = 1

# 禁止转发(非路由器不需要)
net.ipv4.ip_forward = 0

# 增大 TCP 连接队列(提升抗 SYN Flood 能力)
net.ipv4.tcp_max_syn_backlog = 2048
net.core.somaxconn = 65535

# 内核指针不暴露给非特权用户
kernel.kptr_restrict = 2

# 禁止 core dump 包含 SUID 程序信息
fs.suid_dumpable = 0
EOF

# 立即应用配置
sysctl -p /etc/sysctl.d/99-security.conf

# 验证配置已生效
sysctl net.ipv4.tcp_syncookies

13 安装 Rootkit 检测工具

Rootkit 是攻击者入侵后隐藏自身存在的恶意软件,普通命令无法发现。rkhunter 和 chkrootkit 是两款主流开源检测工具。

# 安装两款工具(双重检测)
apt install -y rkhunter chkrootkit   # Ubuntu/Debian
yum install -y rkhunter chkrootkit   # CentOS

# 更新 rkhunter 数据库
rkhunter --update

# 运行 rkhunter 完整扫描
rkhunter --check --skip-keypress 2>&1 | tail -30

# 运行 chkrootkit 扫描
chkrootkit 2>&1 | grep -v "not infected" | grep -v "^$"

# 设置每周自动扫描(加入 crontab)
echo "0 3 * * 0 root rkhunter --check --skip-keypress \
--report-warnings-only | mail -s 'rkhunter 周报' admin@yourdomain.com" \
>> /etc/crontab
💡 rkhunter 首次运行会报告一些误报,建议在系统干净状态下运行一次并记录基准,之后定期对比结果。

14 配置日志集中存储与轮转

日志是安全事件的唯一证据,需要保证完整性、可追溯性,并防止无限增长占满磁盘。

# 配置 logrotate(通常默认已安装)
cat > /etc/logrotate.d/custom-security << 'EOF' /var/log/auth.log /var/log/syslog /var/log/nginx/*.log /var/log/fail2ban.log { daily rotate 30 compress delaycompress missingok notifempty sharedscripts postrotate systemctl reload nginx > /dev/null 2>&1 || true
    endscript
}
EOF

# 测试 logrotate 配置
logrotate --debug /etc/logrotate.d/custom-security

# 查看日志磁盘占用
du -sh /var/log/*  | sort -rh | head -10

# 限制 journald 日志大小(systemd 日志)
sed -i 's/#SystemMaxUse=/SystemMaxUse=500M/' /etc/systemd/journald.conf
systemctl restart systemd-journald

15 部署前验证:安全扫描自检

完成以上配置后,用以下工具做一次全面的自检,确认没有遗漏。

# 安装 lynis(最专业的 Linux 安全审计工具)
apt install -y lynis   # Ubuntu/Debian
yum install -y lynis   # CentOS

# 运行完整系统安全审计
lynis audit system

# 查看审计得分和建议(关注 Hardening index)
# 满分 100,新服务器通常 50-65 分,加固后应达到 75 分以上
# 从外部扫描开放端口(在另一台机器执行)
nmap -sS -O -p 1-65535 服务器IP

# 检查是否有监听在 0.0.0.0 的非预期端口
ss -tlnp | grep '0.0.0.0'
目标:lynis 评分达到 75 分以上,nmap 扫描只显示你主动开放的端口,ss -tlnp 中没有意外监听的服务。

完整 Checklist(可打印版)

🔒 Linux 服务器上线前安全加固 Checklist

  • ① root 密码已修改为 16 位以上强密码
  • ② 已创建普通运维用户并加入 sudo 组
  • ③ SSH 密钥认证已配置,密码认证已禁用
  • ④ SSH 端口已从 22 修改为高位端口
  • ⑤ 防火墙已启用,只开放必要端口
  • ⑥ Fail2Ban 已安装并正常运行
  • ⑦ 系统已更新到最新版本,自动安全更新已开启
  • ⑧ 不必要的系统服务已禁用
  • ⑨ 系统时区已设置为正确时区,NTP 同步正常
  • ⑩ auditd 日志审计已启用并配置关键规则
  • ⑪ SUID/SGID 文件已检查,不必要的已移除
  • ⑫ sysctl 内核安全参数已配置(SYN Cookie、IP 过滤等)
  • ⑬ rkhunter / chkrootkit 已安装并完成基准扫描
  • ⑭ 日志轮转已配置,journald 大小已限制
  • ⑮ lynis 审计评分 ≥ 75,nmap 扫描结果符合预期

常见问题解答(FAQ)

Q1:服务器已经运行了一段时间,没有做这些加固,现在补做来得及吗?

来得及,但需要先排查是否已被入侵。先运行 rkhunter --checkchkrootkit 检测 Rootkit;检查 /var/log/auth.log 是否有可疑登录;检查是否有不明进程(ps aux | grep -v "^root\|^www\|^mysql")。确认系统干净后,按本文顺序逐项加固。

Q2:加固后 Nginx / PHP 服务报错了,可能是哪里导致的?

最常见原因是防火墙配置遗漏了某个端口,或者 sysctl 参数影响了网络行为。先检查防火墙规则(ufw status verbose),再查看 Nginx 错误日志(tail -f /var/log/nginx/error.log)。如果是 sysctl 参数导致的,执行 sysctl -p 查看是否有错误信息。

Q3:lynis 评分很低,应该优先修复哪些?

lynis 报告中以 [WARNING] 标记的问题优先修复,[SUGGESTION] 可按需处理。报告末尾的「Hardening index」下方会列出具体的修复建议,每条建议都有对应的 Test ID,可以在 lynis 官网查到详细说明。通常优先处理:SSH 配置、文件权限、内核参数、账号策略这四类。

Q4:这些加固措施适用于所有 Linux 发行版吗?

核心原则适用于所有发行版,命令有细微差异:Ubuntu/Debian 用 aptufw,CentOS/RHEL 用 yum/dnffirewalld,服务名称可能略有不同(如 sshd vs ssh)。本文在 Ubuntu 22.04 和 CentOS 8 上均已验证。

Q5:后浪云新开的服务器默认做了哪些安全配置?

后浪云服务器默认开启了云平台安全组防护,初始只开放 SSH 端口。但操作系统层面的加固(防火墙、Fail2Ban、密钥登录等)需要用户自行配置。建议参照本文 Checklist,在服务器上线后 30 分钟内完成基础加固。如需技术支持,可通过工单或 Telegram 联系后浪云技术团队。

THE END