Linux 服务器安全加固 Checklist:上线前必做的 15 项配置
- 加固优先级总览
- ① 修改 root 密码为强密码
- ② 创建普通用户并授予 sudo 权限
- ③ 配置 SSH 密钥登录并禁用密码认证
- ④ 修改 SSH 默认端口
- ⑤ 配置防火墙(UFW / firewalld)
- ⑥ 安装 Fail2Ban 自动封禁暴力破解
- ⑦ 更新系统并开启自动安全更新
- ⑧ 禁用不必要的系统服务
- ⑨ 配置系统时区和时间同步
- ⑩ 开启系统日志审计(auditd)
- ⑪ 限制 SUID/SGID 危险文件
- ⑫ 配置内核安全参数(sysctl)
- ⑬ 安装 Rootkit 检测工具
- ⑭ 配置日志集中存储与轮转
- ⑮ 部署前验证:安全扫描自检
- 完整 Checklist(可打印版)
- 常见问题解答(FAQ)
加固优先级总览
| # | 加固项目 | 优先级 | 耗时 | 风险等级(不做) |
|---|---|---|---|---|
| ① | 修改 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 位,包含大小写字母、数字和特殊字符(!@#$%^&*),不使用任何有意义的单词或日期。
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
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
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 端口的入方向规则
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
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-upgrades8 禁用不必要的系统服务
每个运行的服务都是潜在的攻击面,关闭不需要的服务可以减少暴露风险。
# 查看所有正在运行的服务 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
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
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
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-journald15 部署前验证:安全扫描自检
完成以上配置后,用以下工具做一次全面的自检,确认没有遗漏。
# 安装 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'
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 --check 和 chkrootkit 检测 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 用 apt 和 ufw,CentOS/RHEL 用 yum/dnf 和 firewalld,服务名称可能略有不同(如 sshd vs ssh)。本文在 Ubuntu 22.04 和 CentOS 8 上均已验证。
Q5:后浪云新开的服务器默认做了哪些安全配置?
后浪云服务器默认开启了云平台安全组防护,初始只开放 SSH 端口。但操作系统层面的加固(防火墙、Fail2Ban、密钥登录等)需要用户自行配置。建议参照本文 Checklist,在服务器上线后 30 分钟内完成基础加固。如需技术支持,可通过工单或 Telegram 联系后浪云技术团队。
