本文档介绍了控制对 Linux 虚拟机 (VM) 实例的 SSH 网络访问权限的最佳实践。
如需使用 SSH 连接到虚拟机实例,用户需要具有对该虚拟机实例的网络访问权限和有效的 SSH 凭据。默认情况下,Compute Engine 使用不限制 SSH 网络访问权限的防火墙规则,但允许互联网上的任何人连接到虚拟机实例的端口 22
。虽然这种方式方便开发者快速入门,无需考虑网络或安全控制,但允许用户从任何设备、网络和位置进行连接会带来风险:
- 用户可能会通过不受信任的设备或网络进行连接。
- 作恶方可能会发起暴力破解攻击,试图入侵您的虚拟机实例。
- 如果作恶方有权访问已泄露或未及时撤消的 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 企业进阶版来管理设备,则可以设置访问权限级别,根据设备姿态控制访问权限。然后,您可以结合使用 访问权限绑定或 IAM 条件,通过 IAP TCP 转发将此访问权限级别应用于 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 的入站流量。