所有系统运行正常 14 个地区 · 1.2 TBPS 防护盾 充值方式 BTC · XMR · LTC · ETH · USDT +3 币种

教程

新 VPS 安全加固:头十分钟该做什么

阅读需 11 分钟

新 VPS 安全加固:头十分钟该做什么

一台新服务器在刚获得 IP 地址的那一刻,暴露程度达到顶点。自动化扫描器在不间断地扫遍整个 IPv4 地址空间,所以一台一分钟前才部署好的服务器,往往在你把欢迎信息读完之前,就已经收到第一批登录尝试。这些扫描并非针对你个人,只是网络空间里无差别的背景辐射——这也是为什么一台 root 账户仍可用密码登录、尚未加固的服务器,通常几个小时、而不是几个月,就会被攻陷。好消息是,把这一切关上并不费事:按顺序花十分钟,就能清除掉几乎所有的机会主义风险。本指南要讲的,正是这份清单、不会把自己锁在门外的正确顺序,以及大多数加固教程从不会提到的一点——默认配置会不声不响地,在这台你特意租来、本该与你本人脱钩的机器上,留下你的个人信息痕迹。

加固到底能防住什么

加固之所以值得做,恰恰是因为它的收益范围虽窄,却是真实的。把这条边界看清楚,才不会在它触及不到的地方产生一种虚假的安全感。

  • 它能彻底挡住机会主义型攻击者。撞库机器人、SSH 暴力破解,以及扫描暴露管理面板的行为,在只认密钥的身份验证和默认拒绝的防火墙面前,统统无功而返。
  • 当你运行的某个服务出了漏洞时,它能限制波及范围。一个绑定在 localhost、端口又是关闭状态的服务,哪怕它的 CVE 就在当天公布,陌生人也照样连不进来。
  • 它能降低犯错的代价。非特权用户、各自独立的密钥,加上自动打补丁,意味着一次糟糕的决定不会把整台机器拱手让人。
  • 它不会把服务器从主机商眼皮底下藏起来。任何能接触到 hypervisor 的人,原则上都能读取一台正在运行的机器的内存——这是关于你向谁租用的问题,与你的防火墙规则无关。
  • 它不会让你变得匿名。加固保护的是这台机器;这台机器有没有和你的名字绑在一起,是在注册和付款那一刻就已经决定了的,远早于你第一次登录。

最后这一条区别,恰恰是人们最容易搞反的。一台用你本人信用卡、以真实姓名买下的服务器,就算加固得再完美,纸面上依然是你名下的服务器。这两层是互补关系:无 KYC 主机和一笔用加密货币充值的余额,决定的是这台机器在纸面上归属于谁;而下面这十分钟,决定的是谁能真正进得去。

不会把自己锁在门外的顺序

几乎每一个加固翻车的故事,讲的都是同一件事:有人在确认密钥能用之前就关掉了密码登录,或者开启了一个规则里根本没放行 SSH 的防火墙,结果把自己锁在了一台再也连不上的机器外面。这套顺序存在的意义,就是让这种事变得不可能发生。先装好密钥,在第二个窗口里确认它真的能用,然后才关掉密码登录。防火墙的 SSH 放行规则要先加好,再开启防火墙——顺序绝不能反。

在修改 sshd_config 或防火墙规则的整个过程中,让你的第一个 SSH 会话全程保持开启,每一次改动都要在第二个终端里测试。一个开着的会话扛得住一次糟糕的配置——它就是你回去的路。如果第二个窗口能连上,说明这次改动是安全的;如果连不上,就回到第一个窗口里把它改回来。

同样值得在真正用到之前,先弄清楚自己的恢复路径是什么。一台只能通过 SSH 访问的 VPS,就只有这一扇门,所以主机商后台里的控制台,就是能把一次锁死变成小麻烦、而不是推倒重来的退路。趁一切还正常,先确认自己能打开它。

分步指南:新机器的头十分钟

  1. 01更新软件包索引和已安装的软件包一个全新镜像,只是它构建那一刻的快照。把它更新到最新状态,是整份清单里性价比最高的一步,而且用不到一分钟。
  2. 02创建一个拥有 sudo 权限的非特权用户一直以 root 身份操作,意味着每一个手误、每一个进程都拥有完全权限。创建一个普通用户,把它加入 sudo 或 wheel 组,之后就用这个账户。
  3. 03把你的公钥拷贝给这个用户如果你还没有密钥,就在自己的机器上生成一个 ed25519 密钥,然后用 ssh-copy-id 把公钥推送过去。私钥永远不会离开你的笔记本电脑。
  4. 04打开第二个终端,确认密钥登录可用这一步不能跳过。在改动任何身份验证设置之前,先在一个新窗口里,用密钥以新用户身份登录一次。
  5. 05禁用密码登录和 root 登录设置 PasswordAuthentication no 和 PermitRootLogin prohibit-password,然后重新加载 sshd。针对这台机器的暴力破解,从此无密码可猜。
  6. 06开启默认拒绝、放行 SSH 的防火墙先拒绝所有入站流量,放行你的 SSH 端口,再启用防火墙。之后再按需逐个添加你自己的服务所需的端口。
  7. 07开启自动安全更新Debian 和 Ubuntu 上用 unattended-upgrades,RHEL 系用 dnf-automatic。等到第六个月你早已不再留意的时候,正是它在替你守住这台机器。
  8. 08列出所有正在监听的端口,关掉不该开的一条 ss -tulpn 命令,就能报告每一个打开的套接字。凡是不是你自己有意打开的,都该关掉,或者绑定到 localhost。

SSH:只用密钥,以及真正重要的那些设置

公钥身份验证,几乎就是 SSH 加固的全部。一旦关掉密码登录,攻击者就需要一把他们没有的私钥——而私钥再怎么猜也猜不出来。生成 ed25519 密钥——它短、快,也是如今的默认选择——并给密钥加一个密码短语,这样丢了笔记本电脑,也不等于丢了服务器。sshd_config 里其余的一切,都只是在这一个决定之上做的细化。

  • PasswordAuthentication no——终结暴力破解的那一项设置。先在第二个会话里确认密钥能用,再动这个开关。
  • PermitRootLogin prohibit-password——root 仍可用密钥登录以备恢复,但绝不能用密码。一旦你的 sudo 用户验证无误,就把它设为 no。
  • AllowUsers 或 AllowGroups——明确列出谁可以登录的白名单,这样某个软件包顺手创建的服务账户,就永远不可能成为 SSH 的入口。
  • KbdInteractiveAuthentication no——关掉另一条交互式路径,它在某些发行版上会悄悄把密码提示重新打开。
  • 给第二台设备配第二把密钥,而不是把同一把私钥到处拷贝。丢了一部手机,应该只是从 authorized_keys 里删掉一行,而不是把所有密钥全部轮换一遍。
  • 把 SSH 挪出 22 端口,能大幅减少日志量,但这只是降噪,不是安全措施——对任何真正盯上你这个 IP 的人来说,这什么都改变不了。

如果你想做得比密钥更进一步,最稳妥的安排是干脆不把 SSH 公开暴露出去:把机器放到一条WireGuard 隧道后面,在防火墙上把 22 端口锁定为只接受来自隧道地址的连接。这样一来,你的 SSH 守护进程就变成了互联网根本看不见的东西——这比对一个暴露在外的端口做再多配置层面的加固都更有效。

防火墙:默认拒绝,精确放行

防火墙只有在默认拒绝的前提下才有意义。先放行一切、再去封禁已知的坏端口,这个顺序是反的:结果只会是你记得住的服务受到了保护,忘掉的那些反而暴露在外。正确做法是拒绝全部入站流量、放行出站流量,再随着你部署需要联网的东西,逐个开放对应端口。现代 Linux 底层用的都是 nftables,ufw 或 firewalld 都是很好用的前端——用哪个工具,远不如默认策略重要。

  • 要在启用防火墙之前放行 SSH,而不是之后。这是把自己锁在门外的第二常见方式。
  • 只放行一个服务真正需要对外开放的端口。Web 服务器需要 80 和 443;数据库几乎从来都不需要对外开放任何端口。
  • 只在本地使用的服务,要绑定到 127.0.0.1,而不是 0.0.0.0。关闭的端口和一个从不公开监听的服务,是两道相互独立的防线,两个你都要。
  • IPv6 规则要和 IPv4 一起写。在一台双栈机器上,如果规则集只覆盖了 v4,同一个服务会在它的 v6 地址上大开着门。
  • 能做到的话,按来源地址限制管理端口。如果你的管理操作总是来自同一个 VPN 出口,就把这一点直接写进规则里。
  • 每加一个服务,都重新读一遍规则。为一个后来已经卸载掉的东西开的端口,正是那种悄悄累积、最终毁掉一个干净开局的东西。

有些工作负载则刚好相反,需要故意开一个大敞着的端口——Tor 中继必须能接受来自任何地方的连接,Bitcoin 全节点也只有在 8333 端口可达时才能服务其他节点。这完全没问题。这条规则要求的不是"什么都不开",而是"有意识地开",一个生来就该公开的服务,本身就是一次经过深思的选择。

fail2ban,以及它为什么没你想的那么重要

fail2ban 会盯着你的日志,把反复验证失败的地址封掉。它确实有用,但也值得诚实面对一点:一旦你已经关掉了密码登录,就没有人能靠猜密码得手,fail2ban 也就不再是在阻止入侵了。它真正防住的,是每天几千行毫无意义的日志、那些连接尝试所消耗的 CPU,以及一次真实事件被淹没在你几个月前就已经不再看的噪音里的风险。

即便如此,花十秒钟配置它依然值得,而且只要你在跑某个确实接受密码的东西——一个 Web 应用的登录页、一台邮件服务器、一个控制面板——它就会立刻变得真正有用。把它指向那些日志,而不只是盯着 sshd。封禁时长设成以小时、而不是以分钟计,再把自己的地址加入白名单,这样手滑打错一次密码,也不会把自己锁在自己的机器外面。

不要让 fail2ban 成为你继续开着密码登录的理由。它只是一个限速器,不是身份验证机制。密钥能让你彻底退出互联网的猜密码游戏;fail2ban 只是在那之后,让日志保持可读而已。

不用你操心去记的更新

对一台配置得当的服务器来说,现实中的威胁并不是有人攻破了你的 SSH 密钥,而是你装上之后就忘了的某个东西被公开了一个漏洞,三天后就被某个扫描器盯上——而那时候你早就在忙别的事了。自动安全更新就是答案:在 Debian 或 Ubuntu 上,是配置好只安装安全补丁的 unattended-upgrades;在 Fedora、Rocky 或 Alma 上,则是 dnf-automatic。在头十分钟里把它打开,这台机器就会在你的注意力早已转移到别处之后,继续自己给自己打补丁。

内核和 libc 更新是个例外,仍然需要你出手:它们只有在重启之后才会生效,所以一台已经运行了四百天的服务器,跑的代码几乎肯定是一年前就已经打在磁盘上、却从未真正生效的补丁。Debian 的 needrestart 会告诉你哪些服务还在用已经被删除的库运行,而一个定期的重启窗口——哪怕只是每月一次——就是"补丁已安装"和"补丁已生效"之间的区别。不管你运行什么,本来就该扛得住一次意外重启;如果扛不住,那是另一个值得单独修的问题。

加固清单会漏掉的那些身份线索

如果你是特意选了一家离岸、无需 KYC 的主机商,这一节就是关键所在。标准的加固指南,写的是一台归属人本来就是公开信息的公司服务器,所以它从不会去问,默认配置到底把你的哪些信息记录了下来。而在一台你匿名租来的机器上,好几处默认设置会悄悄把你的名字重新和它绑在一起。

  • 你的 SSH 公钥带着一段注释——默认情况下是你本地的用户名和笔记本电脑的主机名,形如 alex@alex-macbook——这段注释会原封不动地存在服务器的 authorized_keys 里。生成密钥时用 -C 参数指定它,或者在拷贝过去之后手动编辑那一行。
  • 你给服务器取的主机名,会出现在日志里、邮件标头里、监控输出里,有时还会出现在服务的 banner 里。一个通用的主机名什么都不会暴露;你的名字或者你公司的名字会。
  • 系统时区。云镜像默认是 UTC,这对谁都没有任何信息量。一旦把它设成你本地时区,就等于把你可能身处的位置圈小了范围,而每条日志里的时间戳,又会反过来印证你的工作时段。
  • 拷到机器上的 Git 配置,带着你提交代码时用的姓名和邮箱地址。Shell 历史文件、从你工作机同步过来的 dotfiles,以及仓促测试时缓存下来的任何凭据,也是一样。
  • 签发证书时留给 Let's Encrypt 的邮箱地址,会成为该证书公开记录的一部分。要用一个和你的身份没有关联的邮箱。
  • Web 服务器的版本 banner 和 X-Powered-By 响应头,还有任何会带着账号标识符、从这台机器往外发送数据的分析工具、崩溃报告或厂商监控代理。
一个实用的习惯,是把租来的服务器当成一间无菌室来对待:不往上面拷贝任何私人的东西——不要 dotfiles 仓库,不要同步过来的 shell 历史,也不要一把注释里写着你笔记本电脑名字的密钥。从未被写下来的东西,就不可能从磁盘镜像里被恢复,也不可能被将来看这台机器的任何人找到。

值得把这几层分清楚。加固挡住的,是把陌生人挡在机器之外。这些细节做的,是不让机器向那些已经在盯着它看的人描述出你是谁。而支付这一层,决定的是有没有一个名字可供追查——用比特币买 VPS 是否真的匿名对此有诚实的说明,用门罗币充值则把这一点做得更彻底。每一层单独拿出来都会失守;合在一起,才撑得住。

备份:加固替你做不到的那部分

没有哪条防火墙规则,能防住一个被删掉的数据库、一块坏掉的硬盘,或者一次在当时看起来合情合理的配置改动。备份是唯一能让你从自己犯下的错误里恢复过来的手段,而从统计上看,这恰恰是一台已经足够安全的机器上,你最有可能丢数据的方式。在数据离开服务器之前先加密,至少留一份放在服务器自己够不到的地方,并且设成按计划自动运行,而不是等你想起来才做。

最后这一点,重要程度超出听上去的样子:一个服务器自己就能覆写的备份流程,就是任何在这台服务器上拥有 root 权限的东西都能摧毁的备份。把加密好的归档推送到一台独立的存储服务器——或者反过来从那台机器上拉取,让凭据不留在被备份的这台机器上——才能得到一份能在机器出事之后依然存在的副本。而且要在什么都没出问题的时候,主动完整地做一次恢复演练。没测试过的备份,只是一个假设,不是一张安全网。

悄悄把加固成果毁掉的那些错误

  • 在测试密钥之前就关掉了密码登录,结果是从一台再也登录不进去的笔记本电脑上,才发现这个错误。
  • 在放行 SSH 之前就启用了防火墙——同一种锁死,只是从另一个方向走到的。
  • 只写了 IPv4 规则,让每一个服务在这台机器的 IPv6 地址上都畅通无阻。
  • 第一天认认真真做了加固,之后却装上一个控制面板、一个数据库和一套监控系统,它们各自不请自来地打开了自己的端口。
  • 为了少打一个 sudo,什么都用 root 身份运行,结果其中任何一处出了第一个漏洞,就是一次彻底沦陷。
  • 把 fail2ban 当成密钥的替代品,结果留下的只是一场变慢了一点的猜密码游戏。
  • 以为给磁盘加密,就能让一台租来的服务器对主机商保密——全盘加密防的是被偷走的硬盘,防不住正在运行中的那台机器。
  • 从不重启,于是几个月里装好的内核补丁只是躺在磁盘上,旧内核则继续在跑。

这些都不难,也都花不了多少时间。按顺序做完,每一步都先在第二个终端里验证过再往下走,你几分钟前刚部署好的这台机器,就不再是任何扫遍地址空间的人眼里的机会了。然后,把你真正想跑的东西部署上去——一个网站、一个节点、一条隧道,或者一个私有模型端点——建立在一个你能看得清、想得明白的底座之上。

准备好试试了吗?部署 离岸 VPS,低至 $3.99/月 — 无需KYC,加密货币支付。 立即开始