全新部署的 VPS 默认配置存在多个安全隐患:开放了 root SSH 登录、使用密码验证、没有防火墙保护。服务器加固是在生产环境上线前系统性地消除这些漏洞的过程。整个流程不超过 30 分钟,但能为您的服务器提供多年的保护。本指南提供了经过实战验证、可直接复制使用的命令和配置方法。
为什么服务器加固如此关键
互联网上有成千上万的机器人持续扫描 22 端口(SSH 服务)。一台新部署、未经加固的 VPS 在上线后数小时内就会收到数千次登录尝试,每天可能被攻击数万次。根据 Shodan 的数据分析,开启了 root 登录和密码验证的服务器极容易迅速遭到入侵。
即便您的服务器上没有存储敏感数据,攻击者也可能将其用作以下目的:发送垃圾邮件、进行加密货币挖矿、发动 DDoS 攻击,或用作入侵其他目标的跳板。这会导致您的服务器 IP 被列入黑名单、被 ISP 限制、产生额外的流量费用,甚至对其他受害者造成伤害。
- 缩小攻击面 — 关闭不必要的端口和服务,降低被攻击的可能性
- 阻止暴力破解 — SSH 密钥认证配合 Fail2Ban 自动 ban IP
- 自动安全更新 — unattended-upgrades 持续应用安全补丁,无需手动干预
- 最小权限原则 — 不使用 root 账户直接操作,改用 sudo 执行需要权限的命令
- 持续监控和审计 — 定期检查日志和系统配置,及时发现异常
第一步 — 首先完整更新系统
这是最关键的第一步。VPS 供应商提供的系统镜像可能已有数周甚至数月的历史,包含已知的安全漏洞。立即应用所有可用的更新,包括安全补丁和系统包。
sudo apt update && sudo apt upgrade -y
sudo apt autoremove -y
sudo apt autoclean
这三个命令分别做以下工作:apt update 刷新软件包列表;apt upgrade -y 自动安装所有可用的升级版本;apt autoremove 删除已过时的依赖;apt autoclean 清理安装缓存,释放磁盘空间。
第二步 — 创建非 root 用户账户
永远不要直接使用 root 账户进行日常操作。创建一个普通用户账户用于日常管理,需要权限时使用 sudo。这样做可以限制意外操作的影响范围,提高安全审计的有效性。
# 创建新用户
sudo adduser deployer
# 将用户加入 sudo 组,获得 sudo 权限
sudo usermod -aG sudo deployer
# 切换到新用户测试
su - deployer
# 验证 sudo 权限正常工作
sudo whoami # 应该返回 "root"
之后所有操作都使用 deployer 用户进行。系统会提示设置密码(暂时保留,待 SSH 密钥配置完成后可禁用),并可选择填写全名等信息。
第三步 — 配置 SSH 密钥认证
SSH 密钥提供了远强于密码的安全性。Ed25519 算法是现代推荐的选择,相比 RSA 4096 位既更快更强。
在您的本地电脑上生成密钥对
重要:密钥对必须在您的本地电脑上生成,不是在 VPS 上。
# 生成 Ed25519 密钥对
ssh-keygen -t ed25519 -C "[email protected]"
# 系统会问密钥保存位置(默认 ~/.ssh/id_ed25519 — 按 Enter)
# 然后问是否设置 passphrase(密码保护密钥 — 建议设置)
# 系统会生成两个文件:
# - ~/.ssh/id_ed25519 (私钥 — 绝不可分享)
# - ~/.ssh/id_ed25519.pub (公钥 — 可复制到服务器)
将公钥复制到 VPS
您需要在 VPS 上安装公钥,以便用私钥登录。有两种方法:
# 方法1:使用 ssh-copy-id(推荐,最简单)
ssh-copy-id -i ~/.ssh/id_ed25519.pub deployer@YOUR_VPS_IP
# 方法2:手动复制(如果 ssh-copy-id 不可用)
cat ~/.ssh/id_ed25519.pub | ssh deployer@YOUR_VPS_IP \
"mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
这两种方法都会:
1. 在 VPS 的 ~/.ssh/ 文件夹中创建 authorized_keys 文件
2. 将您的公钥添加到这个文件
3. 设置正确的权限(600 = 仅拥有者可读写)
测试密钥登录
# 用密钥登录 VPS — 应该不再提示输入密码
ssh -i ~/.ssh/id_ed25519 deployer@YOUR_VPS_IP
# 在 VPS 内验证登录成功
whoami # 应该显示 "deployer"
pwd # 应该显示 "/home/deployer"
关键提醒:必须在禁用密码验证之前彻底测试 SSH 密钥登录。如果密钥配置出错,禁用密码后会无法登录服务器,只能通过 VPS 控制台(console)进行救援操作。反复测试,直到确保密钥登录完全正常。
第四步 — 强化 SSH 配置
SSH 默认配置包含许多可被利用的弱点。编辑 SSH 配置文件,应用一系列加固措施。
sudo nano /etc/ssh/sshd_config
在编辑器中找到或添加以下配置项。如果该行以 # 开头,删除 # 取消注释;如果行不存在,则在文件末尾添加:
# 禁止 root 用户通过 SSH 直接登录
PermitRootLogin no
# 禁用密码认证,仅允许 SSH 密钥
PasswordAuthentication no
PubkeyAuthentication yes
# 限制尝试次数(防止暴力破解)
MaxAuthTries 3
MaxSessions 5
# 自动断开无活动连接(单位秒)
# ClientAliveInterval 设置多久检查一次;ClientAliveCountMax 设置允许多少次未响应
ClientAliveInterval 300
ClientAliveCountMax 2
# 仅允许特定用户登录(可选,提高安全性)
AllowUsers deployer
# 修改 SSH 端口(可选,但要记住新端口号)
# Port 2222
# 其他加固设置
HostKey /etc/ssh/ssh_host_ed25519_key
Protocol 2
LogLevel VERBOSE
X11Forwarding no
保存退出(Ctrl+X,然后 Y,再 Enter),然后重启 SSH 服务使配置生效:
sudo systemctl restart sshd
关键:重启前再次用另一个终端测试密钥登录,确保可以连接,再关闭原连接。这样即使新配置有问题也不会被锁在外面。
第五步 — 配置 UFW 防火墙
UFW(Uncomplicated Firewall)是 Linux 防火墙的简单管理界面。它提供了易于理解的规则语法,同时减少了配置错误的风险。
# 安装 UFW(通常已预装)
sudo apt install ufw -y
# 设置默认策略:进入流量默认拒绝,出去流量默认允许
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 在启用防火墙前,一定要打开 SSH 端口,否则会被锁在外面!
sudo ufw allow 22/tcp
# 如果前面改了 SSH 端口,这里也要改
# sudo ufw allow 2222/tcp
# 允许网页服务的标准端口(如果运行 web 服务器)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 启用防火墙
sudo ufw enable
# 查看防火墙状态和所有规则
sudo ufw status verbose
# 输出示例应该显示:
# Status: active
# To Action From
# -- ------ ----
# 22/tcp ALLOW Anywhere
# 80/tcp ALLOW Anywhere
# 443/tcp ALLOW Anywhere
使用 UFW 应用程序配置文件
UFW 可以直接使用预定义的应用程序配置文件,而不需要手动指定端口号:
# 查看所有可用的应用程序配置文件
sudo ufw app list
# 使用配置文件名添加规则(示例)
sudo ufw allow 'OpenSSH' # 等同于 allow 22/tcp
sudo ufw allow 'Nginx Full' # 允许 80 和 443
sudo ufw allow 'Apache Full' # 允许 80 和 443
# 查看配置文件详情
sudo ufw app info 'Nginx Full'
第六步 — 安装和配置 Fail2Ban
Fail2Ban 监控系统日志,自动检测恶意的登录尝试,并暂时 ban 掉这些攻击 IP。它可以显著减少暴力破解攻击的成功率。
# 安装 Fail2Ban
sudo apt install fail2ban -y
# 启用并启动服务
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
创建本地配置文件
不要直接编辑 /etc/fail2ban/jail.conf(这是默认配置)。应该创建本地覆盖文件 jail.local 来自定义配置,这样系统更新时原文件会保留。
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
找到 [sshd] 部分,确保以下设置存在:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3 # 3 次失败后 ban
bantime = 3600 # ban 1 小时(单位秒)
findtime = 600 # 在 10 分钟内的失败次数计入
ignoreip = 127.0.0.1/8 # 本地回环地址不 ban
保存后重启 Fail2Ban:
sudo systemctl restart fail2ban
# 查看 SSH 的 ban 状态
sudo fail2ban-client status sshd
# 输出示例:
# Status for the jail: sshd
# |- Filter set: sshd
# |- Currently failed: 2
# |- Currently banned: 1
# `- Total banned: 42
定期检查 Fail2Ban 的日志:
# 查看实时日志
sudo journalctl -u fail2ban -f
# 查看历史日志
cat /var/log/fail2ban.log | grep Ban
第七步 — 启用自动安全更新
手动定期应用安全补丁容易被遗忘。unattended-upgrades 可以自动下载和应用系统更新,保持服务器的安全性。
# 安装自动更新工具
sudo apt install unattended-upgrades -y
# 使用图形界面配置
sudo dpkg-reconfigure --priority=low unattended-upgrades
# 系统会问是否启用自动更新,选择 "Yes"
配置自动重启(可选但推荐)
某些更新需要重启才能生效。您可以配置自动重启时间:
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
# 找到以下行并取消注释(删除行前的 //)
// Unattended-Upgrade::Automatic-Reboot "false";
// Unattended-Upgrade::Automatic-Reboot-Time "02:00";
# 改为
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";
这将在午夜 2 点自动安装更新并重启(选择在您的业务不活跃时段)。
第八步 — 删除不必要的服务
精简运行的服务可以减少攻击面。审计并关闭不使用的服务。
# 查看当前运行的所有服务
sudo systemctl list-units --type=service --state=running
# 禁用不需要的服务(示例)
sudo systemctl disable --now snapd # Ubuntu snap 应用
sudo systemctl disable --now avahi-daemon # 网络发现
sudo systemctl disable --now cups # 打印服务(如果不需要)
sudo systemctl disable --now isc-dhcp-server # DHCP 服务
# 查看所有打开的端口
sudo ss -tlnp
第九步 — 系统级网络加固(sysctl)
Linux 内核参数可以调整网络行为,防止某些类型的攻击。这些设置对所有网络接口生效。
sudo nano /etc/sysctl.d/99-hardening.conf
添加以下配置:
# 启用反向路径过滤 — 防止 IP 欺骗
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 禁用 ICMP 重定向 — 防止路由表篡改
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# 启用 SYN Cookies — 防止 SYN flood 攻击
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
# 禁用源路由 — 防止源路由欺骗
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.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# 忽略 ping 请求(ping 扫描)
net.ipv4.icmp_echo_ignore_all = 0
# 增加打开文件描述符的限制
fs.file-max = 65535
# 增加连接跟踪限制,防止连接表溢出
net.ipv4.ip_conntrack_max = 2000000
保存并应用这些设置:
sudo sysctl -p /etc/sysctl.d/99-hardening.conf
# 输出应该显示所有设置值已被加载
第十步 — 使用 Lynis 进行全面安全审计
Lynis 是一个全面的 Linux 安全审计工具。它扫描系统配置,检测潜在的安全问题,并提供改进建议。Lynis 会给出 0-100 的加固指数评分。
# 安装 Lynis
sudo apt install lynis -y
# 执行完整的系统审计
sudo lynis audit system
# 输出会显示大量的检查项和建议
# 最后会显示最终的加固指数评分(Hardening Index)
Lynis 审计过程会检查:
- 系统配置 — 内核参数、系统服务、挂载点
- 文件权限 — 敏感文件的访问权限
- 网络配置 — 防火墙、TCP 包装器、SSH 配置
- 用户账户 — 密码策略、 sudo 配置、登录权限
- 软件和补丁 — 已安装软件的已知漏洞
- 日志和审计 — 日志文件的配置和权限
完成本指南的所有步骤后,Lynis 评分应该在 65-80 分之间。继续参考 Lynis 的建议进一步提升评分。
第十一步 — 监控和日志管理
即使加固完美,监控系统活动对于及时发现异常也至关重要。
# 查看最近的登录尝试
sudo tail -f /var/log/auth.log
# 查看 SSH 相关的日志
sudo grep sshd /var/log/auth.log | tail -20
# 使用 journalctl 查看系统日志
sudo journalctl -u sshd -n 50
# 配置日志轮转防止日志文件过大
sudo nano /etc/logrotate.d/rsyslog
第十二步 — AppArmor 和 SELinux(高级)
这些是强制访问控制 (MAC) 系统,提供额外的沙箱隔离。Ubuntu 默认使用 AppArmor,CentOS/RHEL 使用 SELinux。
# 检查 AppArmor 状态
sudo aa-status
# 启用所有已禁用的配置文件
sudo aa-enforce /etc/apparmor.d/*
# 重启 AppArmor
sudo systemctl restart apparmor
# 查看 AppArmor 日志
sudo tail -f /var/log/syslog | grep apparmor
加固清单和验证
| 项目 | 重要性 | 所需时间 | 验证命令 |
|---|---|---|---|
| 系统更新 | 关键 | 2-5分钟 | apt list --upgradable |
| 创建非root用户 | 关键 | 2分钟 | id deployer |
| SSH密钥 + 禁密码 | 关键 | 5-10分钟 | ssh -i KEY user@host |
| UFW防火墙 | 高 | 5分钟 | ufw status verbose |
| Fail2Ban | 高 | 5分钟 | fail2ban-client status sshd |
| 自动安全更新 | 高 | 2分钟 | systemctl status unattended-upgrades |
| sysctl加固 | 中 | 5分钟 | sysctl net.ipv4.conf.all.rp_filter |
| Lynis审计 | 中 | 10分钟 | lynis audit system |
成功标志:完成以上步骤后,您的 VPS 应该满足以下条件:
- 仅允许 SSH 密钥登录(无密码)
- 禁用了 root 直接登录
- UFW 防火墙已激活
- Fail2Ban 正在运行并守护 SSH
- 自动安全更新已启用
- 系统参数已强化
- Lynis 评分 ≥65 分
定期维护建议
加固完成并不是终点。安全是一个持续的过程,需要定期的监控和维护。
- 每周:查看一次 SSH 和 Fail2Ban 日志,检查是否有异常的登录尝试
- 每月:运行
sudo apt update && sudo apt list --upgradable检查是否有未应用的更新(虽然自动更新应该已处理) - 每季度:重新运行 Lynis 审计,查看评分是否有变化,核实所有加固措施仍在生效
- 事件发生时:遭受攻击或发现可疑活动时,立即检查日志并分析
- 定期备份:定期备份重要数据,以防被勒索软件加密或被意外删除
需要一台可立即加固的 VPS?
AsiaGB 提供完整的 root 权限和标准的 Linux 系统,支持 Ubuntu 和 Debian,开箱即可执行本指南中的所有加固步骤。VPS 月租仅从 500 泰铢起。
查看 VPS 套餐