VPS托管安全吗?KVM隔离与您能控制的风险
KVM VPS通过虚拟机监控程序隔离其他客户,风险主要来自您自己的配置:开放服务、重复使用的密钥、未更新的软件包和泄露的机密信息。
VPS 托管安全吗?简短回答
安全。对于大多数用户购买 VPS 的用途来说,VPS 托管是安全的,而且比共享托管更可靠。KVM VPS(虚拟专用服务器)是一台拥有独立内核、独立内存、独立磁盘和独立用户账户的虚拟机;运行它的 hypervisor 会将其他客户隔离在这四项资源之外。与您共用同一台物理机、租用相邻服务器的用户,无法读取您的文件、列出您的进程、登录您的服务器或查看您的网络流量。基于容器的方案隔离性较弱,下面会介绍。
准确的答案包含两方面。提供商负责硬件和 hypervisor。您负责虚拟机内部的所有内容,而几乎所有真实的安全事件都从这里开始。服务器通常因为开放端口、薄弱的 SSH 密码、长期未更新的软件包,或发布到公开位置的文件中包含机密信息而遭到入侵。通过 hypervisor 入侵服务器的情况非常少见。
虚拟机监控程序实际隔离的内容
虚拟机监控程序是在一台物理主机上运行虚拟机的软件。在 KVM VPS 中(KVM 表示 kernel based virtual machine,是 Linux 主机上的标准方案),您的服务器是一台完整的虚拟机。它会启动自己的内核。主机会为它分配一块固定的物理内存区域。处理器的内存管理单元会拒绝任何超出该区域的访问。因此,另一个客户机中运行的代码完全无法访问您的内存。不同客户机之间没有共享文件系统,也没有共享用户表。因此,邻居服务器上的文件权限对您的服务器不起作用。
共享主机的工作方式不同。许多网站运行在同一个操作系统中,共用一个 Web 服务器和一个 PHP 安装,并作为普通用户帐户运行。唯一的隔离边界是文件权限。因此,权限配置错误,或以权限过高的用户身份运行且能够读取过多内容的易受攻击插件,可能访问其他帐户的文件。这正是 从共享主机迁移到 VPS 所解决的问题。
请确认您购买的具体方案,因为并非所有标称为 VPS 的方案都是虚拟机。基于容器的方案(OpenVZ、LXC、Virtuozzo)共享主机内核,并使用 namespaces 和 cgroups 隔离不同客户,而不是使用硬件虚拟化。这种隔离边界更弱,因为主机内核中的漏洞同样会影响您的服务器。您也无法在这些方案中加载内核模块,因此部分软件无法使用。KVM 是更安全的默认选择。付款前请确认您获得的是哪一种方案。
共享物理主机可能带来的影响
共享物理主机会降低您的速度,这是它唯一的影响。同一台主机上的虚拟机共享物理 CPU 和磁盘。当 CPU 忙于处理其他客户的任务时,您的虚拟 CPU 会等待,Linux 会将这段等待报告为 steal time:即 %st 中的 top 和 vmstat 字段。如果 steal time 连续数小时高于几个百分点,说明主机超额分配了资源。这不表示有人正在读取您的数据。解决方法是更换套餐或服务商。您也可以先测量实际获得的 CPU 和磁盘资源,再做决定。
有一种跨客户影响值得了解,但它不是安全漏洞。如果您从 VPS 发送邮件,您的 IP 地址会处于其他客户也在使用的地址段中。某个邻居发送垃圾邮件后,可能导致该地址段的一部分被列入 blocklist,因此您的邮件会进入垃圾邮件文件夹,而原因并非由您造成。会主动处理滥用行为的服务商通常拥有更干净的地址段。如果邮件对您很重要,请向服务商询问这一点。
恶意邻居无法做什么,以及他们少数情况下能够做什么
同一台宿主机上的其他客户无法访问您的文件。他们无法查看您的进程、挂载您的磁盘,也无法在您的服务器上打开 shell,因为这些对象都不存在于他们的虚拟机中。有一种例外情况需要明确说明:应将提供商的私有网络视为与陌生人共享的网络。经过该网络传输的数据应加密,不要假设这些数据对其他人不可见。
虚拟机监控程序逃逸是真实存在的风险。虚拟化层中的漏洞可能允许某个虚拟机内的代码访问宿主机,再从宿主机访问其上的所有虚拟机。这类漏洞会被发现,并以 CVE(常见漏洞和暴露)编号公开,随后得到修复。托管提供商会快速修复这类漏洞,因为其整个业务都依赖该层。利用此类漏洞需要针对特定虚拟机监控程序版本的可用漏洞利用代码。对于一个小型托管账户而言,攻击者通常不会为此投入如此高的成本。
跨虚拟机侧信道也是真实存在的风险。这类攻击属于 Spectre 和 Meltdown 家族,利用共享的处理器缓存推断边界另一侧的少量数据。微码和内核更新可以降低这类风险,已发表研究中的数据泄漏速率也极低。公开案例主要是研究演示,而不是大规模攻击。风险并非为零,但它远不如其他更可能造成损害的问题重要。
提供商的职责范围,以及您需要负责的部分
提供商负责机房、宿主机硬件、虚拟机监控程序和宿主机内核、物理网络,以及可用于启动、停止、重建和创建服务器快照的控制面板。如果其中任何部分出现故障,提供商负责修复。
您负责从操作系统开始向上的所有内容。这包括您安装的软件包、保持开放的端口、可用于登录的账户和密钥、您执行的更新、备份,以及您自己的应用代码。大多数 VPS 方案都是非托管的,也就是说,没有人会替您修补服务器,提交支持工单也不会自动完成这项工作。购买前应阅读托管与非托管的区别,因为它决定了上述责任中有多少需要由您承担。
您负责的部分中,有一项很容易被忽略:托管控制面板本身。持有该控制面板登录权限的人可以重建您的服务器,或将您的磁盘挂载到救援系统,而完全不需要知道服务器内部的任何密码。请在托管账户上启用双因素身份验证(2FA),并且不要在其他任何地方重复使用该密码。
您的主机提供商能看到您的数据吗?
是的,原则上可以。这是 VPS 能提供的保护范围。您的磁盘镜像存储在提供商的存储设备上。提供商的控制台可以访问您的虚拟机屏幕。救援模式可以启动另一个系统,并挂载您的磁盘。VPS 可防止其他客户访问您的系统,但不包含提供商。
如果您持有必须让主机方无法读取的数据,应在写入数据前于应用中进行加密。在 guest 中启用全盘加密,可以防止他人读取处于静止状态的复制磁盘镜像。但服务器运行时,密钥必须存放在内存中,因此仍无法排除提供商的访问能力。同样的信任关系也适用于 您单独租用的专用服务器,只是少了一层共享基础设施。
实际会攻破 VPS 的因素
监听所有网络接口的服务。 数据库、缓存、消息队列和管理面板通常默认绑定到 0.0.0.0,这表示会绑定每个网络接口,包括公网接口。IPv4 互联网范围内的扫描持续进行且高度自动化,因此一个新上线的 IPv4 地址通常在上线后几分钟内就会收到第一次未经请求的探测。IPv6 地址空间太大,无法逐个地址扫描,但 IPv6 地址仍可能通过 DNS 记录和其他信息泄露被发现,因此不要将其视为隐藏地址。没有密码的 Redis、未进行身份验证的 Elasticsearch 节点、开放在端口 2375 上的 Docker API,以及仍使用默认登录凭据的管理面板,都会通过这种方式被发现;扫描器甚至不知道您是谁。仅当服务只需供本机使用时,才将其绑定到 127.0.0.1,并在防火墙中阻止其他访问。
绕过防火墙的 Docker。 发布容器端口会写入网络地址转换(NAT)规则。这些规则的匹配顺序早于 ufw(uncomplicated firewall)的规则,因此即使 ufw status 表示该端口已被拒绝,容器仍可能可以从互联网访问。即使其他配置全部正确,也可能因此暴露服务。发布容器端口前,建议阅读Docker 端口为何会忽略 ufw。
启用了密码认证的 SSH。 在任何具有公网 IPv4 地址的服务器上查看 SSH 日志(Ubuntu 中为 /var/log/auth.log,Rocky Linux 和其他 RHEL 系统中为 /var/log/secure;不保存日志文件的系统中则为 journalctl -u ssh 和 journalctl -u sshd),您会发现类似 Failed password for root from 203.0.113.10 port 54312 ssh2 的日志行,全天候成千上万条。机器人会尝试常见的用户名和密码。只要启用密码登录,且 root 账户允许登录,攻击者就具备入侵所需的条件。仅允许使用密钥认证并禁用 root 登录后,这些流量就只是可以忽略的噪声。
到处使用同一份私钥。 将同一份密钥复制到每台笔记本电脑和每台服务器后,一台被盗的笔记本电脑就能解锁所有系统。SSH 密钥不会过期,因此两年前交给承包商的密钥今天仍然有效。为每个人和每台机器分别使用密钥不需要额外成本,还能限制单份被盗密钥可以访问的范围。
长期不更新的软件包。 针对您的 Web 服务器或应用框架公开的 CVE 会提供一套公开的利用指引,扫描器会在数天内开始测试该漏洞。安全更新是成本最低的防御措施,而且可以自动执行:参见Ubuntu 上的自动安全更新。
泄露的机密信息。 数据库密码和 API 密钥存储在 .env 文件中,而这些文件可能被提交到公开代码仓库,或被指向错误目录的 Web 服务器提供出来。粘贴到 AI 编码代理上下文中的任何内容也可能出现在日志中;相关问题另见:避免让代理接触机密信息。
所有程序都以 root 身份运行。 当应用以 root 身份运行时,其中一个漏洞就可能控制整台机器,因为服务器内部已经没有边界阻止它继续扩散。
您负责的部分
以下内容都不属于虚拟机监控程序的工作。它们都由您负责,也正是这些事项决定 VPS 是否安全。
- 正确完成第一个小时的设置:新 VPS 上的前十分钟涵盖非 root 用户和防火墙配置。
- 加固远程访问:加固 VPS 上的 SSH。
- 关闭不使用的端口:ufw 防火墙基础知识。
- 仅授予每项服务所需的访问权限:VPS 上的最小权限用户。
- 减缓暴力破解登录:Ubuntu 24.04 上的 fail2ban。
- 保留至少成功恢复过一次的备份:VPS 的 restic 备份。
服务器启动时,提供商负责的部分已经完成。您负责的部分在第一天大约需要一个小时,此后每月只需几分钟。如果您仍在比较不同选项,VPS 的实际含义介绍了这些内容所依托的基础。
FAQ
同一台物理服务器上的其他客户可以读取我的文件吗?
不能,KVM VPS 不会出现这种情况。您的服务器是一台虚拟机,拥有自己的内核和虚拟磁盘,以及由主机分配给它的一段物理内存;处理器会阻止对该内存区域之外的访问。各个客户机之间没有共享文件系统,因此,邻居服务器中的文件权限在您的服务器内没有任何作用。OpenVZ 和 LXC 等基于容器的方案共享主机内核,隔离边界较弱,因此请确认您购买的方案类型。
VPS 比共享主机更安全吗?
就隔离性而言,是的。在共享主机上,许多网站运行在同一个操作系统中,唯一的隔离边界是文件权限,因此其他账户中的错误有时可能导致文件暴露。在 VPS 上,隔离边界是虚拟机。代价是,共享主机由主机提供商负责打补丁,而非托管 VPS 则由您负责打补丁。只有在您确实应用更新并关闭端口的情况下,VPS 才更安全。
我的主机提供商可以读取我的数据吗?
原则上可以,任何 VPS 产品都无法改变这一点。磁盘映像存储在提供商的硬件上,控制台可以访问运行中机器的屏幕,救援模式还可以启动另一个系统,并挂载您的磁盘。如果某些数据必须让主机无法读取,请在写入前于应用中对其加密。客户机内部的磁盘加密在服务器运行期间仍会将密钥保留在内存中,因此无法让提供商退出信任范围。
VPS 最常见的被入侵方式是什么?
绝大多数情况下,是暴露的服务或薄弱的 SSH 登录凭据。自动扫描器会持续探测每个公网 IPv4 地址,因此,没有密码且绑定到 0.0.0.0 的数据库,或仍使用默认凭据的管理面板,几分钟内就会被发现,而不是几个月后才被发现。任何具有公网 IPv4 地址的服务器上的 SSH 日志(Ubuntu 上为 /var/log/auth.log,Rocky Linux 上为 /var/log/secure)都会显示其中的 SSH 部分:来自世界各地地址的重复 Failed password for root 行。虚拟机监控程序逃逸确实存在,但这类攻击需要研究级能力,目标是高价值系统,并不是普通服务器被入侵的原因。