本文档介绍了控制对 Linux 虚拟机 (VM) 实例的 SSH 网络访问权限的最佳实践。
如需使用 SSH 连接到虚拟机实例,用户需要拥有对虚拟机实例的网络访问权限和有效的 SSH 凭据。默认情况下,Compute Engine 使用防火墙规则,该规则不会限制 SSH 网络访问,但允许互联网上的任何人连接到虚拟机实例的端口 22
。虽然开发者无需考虑网络或安全控制即可快速上手,但允许用户通过任何设备、网络和位置进行连接会带来风险:
- 用户可能会通过不受信任的设备或网络进行连接。
- 作恶方可能会发起暴力破解攻击,并尝试入侵您的虚拟机实例。
- 拥有泄露的 SSH 凭据或未及时撤销的 SSH 凭据的恶意行为者可以使用这些凭据从任何网络访问虚拟机并登录到虚拟机。
以下部分介绍了如何通过限制用户可通过哪些网络、位置或设备建立与虚拟机的 SSH 连接来降低风险:
本文档重点介绍特定于 Google Cloud 的实践或在 Google Cloud 上使用 SSH 时特别重要的实践。本文档未涵盖特定 SSH 客户端或服务器实现的最佳实践。
减少网络暴露
允许用户从任何位置建立 SSH 连接意味着您完全依赖 SSH 身份验证和授权机制来保护虚拟机。您可以通过减少虚拟机的网络暴露来降低风险并建立额外的保护层。
您可以通过多种方式来减少虚拟机的网络暴露。如需确定最适合您环境的方法,您必须考虑以下流程图所示的多个因素:
外部访问:首先要考虑的是,虚拟机是否只需要在 VPC 网络中可访问,还是也需要在外部可访问。
如果 VPC 内部访问权限足够,则无需为虚拟机分配外部 IP 地址,但您仍必须决定如何管理访问权限。
内部网络的大小:如果 VPC 内部访问足够,则需要考虑的第二个因素是内部网络的大小。
在较小的网络中,使用防火墙规则允许从内部地址入站到端口
22
可能就足以帮助保护您的虚拟机。在较大的网络中,仅依靠防火墙规则可能会过于局限:在这种情况下,您可以使用 Identity-Aware Proxy TCP 转发来强制执行对虚拟机的情境感知访问。VPC Service Controls 边界设计:下一个要考虑的因素是虚拟机实例是否属于 VPC Service Controls 边界。
如果虚拟机是服务边界的一部分,则源自虚拟机的任何 API 访问都被视为源自边界内。如果您向位于边界外部的用户授予对边界内的虚拟机的 SSH 访问权限,他们可能会将数据从边界复制到本地工作站,反之亦然,这可能会使边界数据的机密性和完整性面临风险。
每当您需要向 VPC Service Controls 边界内的虚拟机实例授予 SSH 访问权限时,请使用 IAP TCP 转发。IAP 会检测用户工作站是否属于同一 VPC Service Controls 边界,并默认阻止来自服务边界外的访问尝试。如需允许外部访问,请使用入站流量规则并将其配置为强制执行情境感知访问权限。
客户端设备的管理:最后一个需要考虑的因素是如何管理客户端设备,因为这决定了您可以通过哪些方式控制情境感知访问权限。
当 Access Context Manager 可以访问有关用户、其设备和其位置的丰富信号时,情境感知访问权限最为有效,因此可与 Chrome 企业进阶版配合使用:如果您使用 Chrome 企业进阶版管理设备,则可以设置访问权限级别,以便根据设备状态控制访问权限。然后,您可以使用 IAP TCP 转发以及访问绑定或 IAM 条件,将此访问权限级别应用于 SSH 访问。
如果您无法控制客户端设备的配置,则必须将其视为不受管理且可能不受信任的设备。
如需允许从非受管设备访问,您还可以使用 IAP TCP 转发,但只能根据用户身份和设备 IP 地址管理访问权限。由于 Access Context Manager 无法访问任何设备信号,因此您将无法根据设备状态限制访问权限。
根据这些因素并使用流程图,您可以确定哪种减少网络暴露的方法最适合您的环境。下面几个部分将详细介绍这些方法。
基于 IAP 的 SSH 访问
这种方法的思路是,仅允许通过 IAP TCP 转发进行 SSH 访问,并让 IAP 根据用户身份控制访问权限。
我们建议在以下情况下使用此方法来管理虚拟机实例:
- 虚拟机实例必须可从外部或大型内部网络访问。
- 虚拟机不属于 VPC Service Controls 边界。
默认情况下,具有外部 IP 地址的虚拟机实例允许 SSH 访问,因为默认防火墙允许从公用互联网连接到端口 22,但我们不建议使用这种方法。这种方法可能会显著增加虚拟机遭受攻击的风险,例如:
- 未撤销的凭据的使用情况:访问权限尚未完全撤销的离职员工可能会继续访问虚拟机。
- 滥用有效凭据:不法分子可能拥有被盗或泄露的凭据,并可能使用这些凭据登录。
- 拒绝服务:不法分子可能会尝试通过向虚拟机发送大量请求来耗尽其资源。
如需以更安全的方式启用对虚拟机实例的外部 SSH 访问权限,请使用 IAP TCP 转发。与堡垒主机或反向代理类似,IAP TCP 转发充当客户端设备与虚拟机之间的中介。
当用户尝试建立 SSH 连接时,IAP TCP 转发会执行以下四项功能:
- 身份验证:IAP 会验证用户是否拥有有效的 Google 凭据。
- 授权:IAP 会检查 IAM 政策,以验证用户是否已获授通过 IAP 连接到虚拟机的权限。
- 情境感知访问权限:如有需要,IAP 可以验证用户、其设备和位置是否满足特定的访问权限级别。
- 审核:启用数据访问日志后,IAP 会记录每次成功和失败的尝试连接到虚拟机实例的操作。
通过充当中间人并执行这些功能,IAP 消除了为虚拟机分配外部 IP 地址的需要,并提供了额外的安全层。
基于 IAP 的情境感知 SSH 访问权限
这种方法的思路是,仅允许通过 IAP TCP 转发进行 SSH 访问,并让 IAP 基于用户身份和其他因素来控制访问权限。
我们建议在以下情况下使用此方法来管理虚拟机实例:
- 必须能够从 VPC 外部以及与 VPC 相连的网络访问虚拟机实例。
- 虚拟机不属于 VPC Service Controls 边界。
- 虚拟机只需要从特定设备、网络或位置访问即可。
当您向用户授予对虚拟机实例的 SSH 访问权限(无论是直接授予还是通过 IAP 授予)后,默认情况下,用户可以从任何设备、网络和位置访问虚拟机实例。虽然这种访问权限级别对用户来说很方便,但由于用户可能会通过受损设备或不受信任的网络进行连接,因此会增加风险。
为降低风险,请配置 IAP TCP 转发,以便用户只能从特定设备或位置访问虚拟机实例。您可以通过以下两种方式配置此类情境感知访问权限:
访问权限绑定:您可以创建访问权限级别,并使用访问权限绑定将其分配给群组。访问绑定是一种基于表单或身份的政策,适用于用户尝试访问的所有资源,包括 IAP 以及其他 API 和 Google Cloud 控制台。
如果您想确保对资源的情境感知访问权限能够在各个资源中统一执行,那么使用访问权限绑定最为合适。
IAM 条件:您可以创建访问权限级别,并使用 IAM 条件将其分配给各个 IAM 角色绑定。
使用 IAM 角色绑定是一种基于资源的政策,如果您想对不同的虚拟机集应用不同的政策,这种方法最适合。
通过基本访问权限级别,您可以按网络或地理位置来限制访问权限。作为 Chrome 企业进阶版订阅者,您还可以根据其他属性限制访问权限,例如凭据强度、用于身份验证的浏览器配置或设备状态。
基于 VPC Service Controls 的 SSH 访问
此方法的思路是,仅允许通过 IAP TCP 转发进行 SSH 访问,并将服务边界配置为允许我们来源的特定身份的 IAP 入站流量。
我们建议将此方法用于属于 VPC Service Controls 边界的虚拟机实例。
向用户授予对服务边界中虚拟机的 SSH 外部访问权限可能会存在风险,因为这可能会让用户通过 SSH 渗漏数据,从而破坏 VPC Service Controls 边界。
仅允许通过 IAP TCP 转发进行 SSH 访问,您可以降低此风险,并确保所有 SSH 访问都受 VPC Service Controls 边界配置的约束:
- 如果用户尝试从服务边界外部进行连接(如上一个示例所示),IAP TCP 转发不仅会检查用户是否已获授对虚拟机的 IAM 访问权限,还会检查请求是否满足边界的入站流量规则中的任一规则。
如果用户尝试从服务边界内进行连接,IAP TCP 转发还会检查用户是否已获授予对虚拟机的 IAM 访问权限,但会忽略 VPC Service Controls 入站规则。
如果满足以下任一条件,IAP 会将连接视为来自服务边界内:
- 源 IP 是服务边界的一部分的虚拟机的外部 IP 地址。
- 连接是服务边界中的虚拟机通过专用 Google 访问通道建立的。
- 连接是通过服务边界的 Private Service Connect 访问端点建立的。
防火墙控制的内部 SSH 访问
此方法的思路是,禁止所有外部访问,仅允许 VPC 内部 SSH 访问。
您可以将此方法用于满足以下条件的虚拟机实例:
- 虚拟机实例无需可从外部访问。
- 虚拟机已连接到小型到中型内部网络。
- 虚拟机不属于 VPC Service Controls 边界。
如需禁止所有外部访问,您可以执行以下任一操作:
- 部署没有外部 IP 地址的虚拟机实例。
- 配置防火墙规则,以禁止来自 VPC 外部 IP 地址范围的入站 SSH 流量。
停用串行控制台访问
为了排查出现问题的虚拟机实例,Compute Engine 允许您通过 SSH 网关连接到实例的串行端口控制台,即 ssh-serialport.googleapis.com
。此网关可通过互联网公开访问。
SSH 网关通过底层 Hypervisor(而不是 VPC 网络)访问虚拟机。因此,对串行控制台的访问权限由 IAM 政策控制,而不是由防火墙规则控制。
允许用户访问虚拟机串行控制台可能会意外地使虚拟机过度暴露。为防止这种过度暴露,请使用 compute.disableSerialPortAccess
组织政策限制条件停用串行控制台访问权限,并在需要紧急访问虚拟机的串行端口时暂时解除限制条件。
如果您需要会话录制,请使用堡垒虚拟机
通过充当客户端设备和虚拟机之间的中介,IAP TCP 转发可执行堡垒主机或跳转服务器通常执行的功能。这些函数包括:
- 以集中方式强制执行访问权限政策
- 审核访问权限
与某些堡垒主机不同,IAP TCP 转发不会终止 SSH 连接:当您通过 IAP TCP 转发建立与虚拟机的 SSH 连接时,SSH 连接会在客户端和虚拟机之间进行端到端加密。由于采用了端到端加密,IAP TCP 转发无法检查 SSH 会话的内容,也不提供会话录制功能。IAP 审核日志包含连接元数据,但不会泄露有关会话内容的任何信息。
如果您需要录制会话,请使用堡垒虚拟机:
- 配置堡垒机虚拟机,以便终止 SSH 连接并记录其内容。请务必限制使用 SSH 端口转发,因为这可能会影响会话录制效果。
- 设置目标虚拟机的防火墙规则,以便仅允许从堡垒机虚拟机建立 SSH 连接。
- 仅允许通过 IAP TCP 转发访问堡垒虚拟机
使用防火墙政策限制 SSH 暴露
确定哪种限制 SSH 暴露的方式最适合您的环境后,您必须确保所有虚拟机和项目都已相应配置。具体而言,您必须确保所有项目都使用一组一致的防火墙规则,以确定如何使用 SSH。
如需在多个项目中应用一组防火墙规则,请使用分层防火墙政策并将其应用于资源层次结构中的文件夹。
例如,为了强制要求所有 SSH 访问都通过 IAP TCP 转发进行,请应用包含以下两条自定义规则(按优先级排序)的防火墙政策:
- 允许从
35.235.240.0/20
到所选虚拟机的端口 22 的入站流量。35.235.240.0/20
是 IAP TCP 转发使用的 IP 地址范围。 - 拒绝从
0.0.0.0/0
到所有虚拟机的端口 22 的入站流量。