新 VPS 上线前 10 分钟安全加固指南
新 VPS 获得公网 IP 后就可能遭到扫描。本操作手册用约 10 分钟创建 sudo 用户、配置 SSH 密钥、禁用 root 和密码登录,并启用防火墙。
服务器是否安全,最初的 10 分钟至关重要
全新的 VPS 并不安全。服务器获得公网 IP 后,扫描器就会尝试登录。默认镜像通常会暴露较大的攻击面:root 经常可以直接登录,通常允许使用密码登录,没有防火墙,也没有按计划安装补丁。好消息是,完成这些加固通常只需约 10 分钟和几条命令。这是我在新服务器上部署任何内容前都会执行的操作手册。
请按顺序执行,因为后续步骤依赖前面的步骤。每一步都有对应的指南,文中会提供链接;本页是将这些指南串联起来的快速路径。
第 1 分钟:更新所有软件
使用服务提供商提供的凭据以 root 身份登录,并在执行其他操作前将系统完全更新到最新状态:
apt update && apt upgrade -y未安装补丁的服务器最容易遭到攻击,因此必须先完成这一步。更新完成后,设置自动安全更新,确保系统持续安装补丁,无需手动记忆。
第 2 分钟:创建具有 sudo 权限的普通用户
不要继续使用 root。为自己创建一个用户,并授予其 sudo 权限:
adduser matt
usermod -aG sudo matt从现在开始,使用此用户登录,并在执行管理任务时使用 sudo。始终以 root 身份运行意味着任何错误和安全入侵都会获得不受限制的权限,而这正是以非特权用户身份运行要防止的问题。
第 4 分钟:设置 SSH 密钥
密码可能被猜到,密钥不会。在您自己的笔记本电脑上,如果尚未创建密钥,请先创建:
ssh-keygen -t ed25519然后将公钥复制到服务器:
ssh-copy-id matt@YOUR_SERVER新用户必须启用密码登录,ssh-copy-id 才能正常工作;如果密码登录已关闭,请将 root 的 ~/.ssh/authorized_keys 复制到 /home/matt/.ssh/authorized_keys(所有者设为 matt),或者手动将您的公钥粘贴到该文件中。
本步骤涉及的原理,包括每台设备使用一个密钥、导致密钥登录失败的权限问题,以及撤销丢失的密钥,详见SSH 密钥管理基础。
使用密钥以 matt 身份退出并重新登录,确认登录正常后再进行下一步。在确认可以使用密钥登录之前就锁定 SSH,可能导致您无法登录。如果登录时出现 Permission denied (publickey),请立即排查,不要退回使用密码,因为这条消息可能对应五种不同故障,而 ssh -v 输出会告诉您实际遇到的是哪一种。
第 6 分钟:关闭 root 登录和密码认证
现在密钥已可用,关闭扫描器依赖的两种登录方式。使用 drop-in 文件,这样软件包升级不会覆盖配置。将文件命名为 00-,使其排序在 50-cloud-init.conf 之前;Ubuntu 云镜像会随附 PasswordAuthentication yes。sshd 会保留它读取到的第一个值,因此排序较晚的文件会被静默忽略:
sudo nano /etc/ssh/sshd_config.d/00-hardening.confPasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no然后重新加载 SSH:
sudo systemctl restart ssh随后检查 sshd 实际使用的设置,避免被未生效的 drop-in 文件误导:
sudo sshd -T | grep -Ei 'passwordauthentication|permitrootlogin'关闭密码认证并禁止 root 登录后,针对服务器的持续暴力破解流量将无法成功。完整说明(包括可选的端口更改)请参阅 VPS 上的 SSH 加固。
第 8 分钟:启用防火墙
默认拒绝所有入站流量,然后只允许必需的流量。启用防火墙前先允许 SSH,否则会断开当前连接:
sudo ufw default deny incoming
sudo ufw allow 22/tcp
sudo ufw enable为实际运行的服务添加 allow 规则。例如,网站需要添加 80/tcp 和 443/tcp 规则。如果新 SSH 会话在此之后无法连接,先查看错误信息,再进行任何操作,因为拒绝通常表示 sshd 已响应,而超时通常表示防火墙丢弃了数据包。确认 IPv4 和 IPv6 都已覆盖,因为只过滤 IPv4 的防火墙会让IPv6 端完全暴露。完整步骤请参阅VPS 防火墙入门。这些 ufw 命令假设系统为 Ubuntu 或 Debian;在 Rocky 或 AlmaLinux 上,默认拒绝的目标相同,但使用的工具是 firewalld,因此请改为按照本步骤的 firewalld 版本操作。
第 10 分钟:使用 Fail2ban 减缓扫描器
最后,添加 Fail2ban,封禁频繁攻击您端口的地址:
sudo apt install -y fail2ban在 Ubuntu 24.04 上,默认安装会从首次启动开始保护 SSH。如果已经要求使用密钥登录,Fail2ban 的作用是减少日志噪声并阻止重复违规者,而不是作为主要防御措施。
检查清单
这是运行手册。使用下面的生成器逐项确认每个控制措施,并生成一份个性化检查清单,随服务器保存,其中包含每一步的准确命令:
每台新服务器都按此清单执行一次,之后整套流程就会形成习惯。现在花费 10 分钟,可以避免服务器遭到入侵后随之而来的糟糕经历。
完成基本配置后,Ubuntu 自动安全更新可让服务器保持最新状态,无需您再次登录。之后部署的每项服务都需要单独检查,薄弱点也会发生变化:使用自托管密码库时,服务器不会保存明文密码,因此Vaultwarden 的实际风险在于管理令牌和备份文件。
FAQ
新 VPS 上首先应该做什么?
使用 apt update && apt upgrade -y 更新系统,然后创建一个具有 sudo 权限的普通用户,并停止使用 root。接下来设置 SSH 密钥、禁用 root 登录和密码身份验证、启用默认拒绝防火墙,并安装 Fail2ban。按此顺序操作,可以确保每一步都不会让您无法登录服务器。
如何在加固 SSH 时避免把自己锁在服务器外?
在禁用密码或 root 登录之前,先设置并测试 SSH 密钥登录。使用密钥退出并重新登录,确认登录正常,然后再关闭 PasswordAuthentication 和 PermitRootLogin。启用防火墙时,先允许端口 22,再运行 ufw enable。如果确实被锁在服务器外,服务商提供的 Web 控制台可以让您重新登录,无需使用 SSH。
小型服务器确实需要完成所有这些配置吗?
需要,因为扫描器不会考虑服务器规模。它们会以相同方式扫描每个公网 IP。整套操作大约需要十分钟,并能移除容易利用的入口:禁止 root 登录、禁止密码猜测、不暴露您未明确选择的服务,并自动修补已知漏洞。
最重要的一步是什么?
仅允许使用密钥的 SSH 登录,并禁用 root 登录。新 VPS 遭受的大多数攻击,都是针对 root 的自动化密码猜测。关闭这两项后,这类攻击将无法成功。防火墙和 Fail2ban 会进一步限制暴露面,并减缓剩余攻击。
如何确认服务器确实已完成安全加固?
在信任服务器配置之前,手动检查以下三项。运行 sudo ss -tlnp,确认只有您计划开放的端口正在公网地址上监听,并且没有遗忘的 0.0.0.0 或 [::] 服务。运行 sudo ufw status verbose,确认默认入站策略为 deny,并且普通规则和 (v6) 规则都已存在。关闭第一个 SSH 会话前,始终先打开第二个 SSH 会话,这样 SSH 配置中的错误不会让您无法登录服务器。如果这三项都正确,基础安全配置就已完成。