使用后量子 SSH 的最佳实践

本文档介绍了在配置工作站和 Compute Engine 虚拟机 (VM) 实例时,如何使用后量子密钥交换算法建立 SSH 连接的最佳实践。

如需详细了解 SSH 连接在 Compute Engine 中的工作原理,请参阅与 Linux 虚拟机的 SSH 连接。如需了解如何使用 IAM 管理 SSH 访问权限,请参阅 OS Login 简介。

以下部分介绍了 SSH 环境中的后量子加密:

以下部分包含一些最佳实践,可帮助您保护 SSH 连接免遭未来量子计算威胁的侵害:

了解“先捕获后解密”攻击的威胁

从理论上讲,传统公钥加密(例如 RSA 和椭圆曲线加密)容易受到量子计算机的攻击。虽然目前还没有大规模量子计算机,但攻击者可以捕获并存储加密的网络流量,以便在未来出现足够强大的量子计算机时解密这些流量。这种攻击称为“先捕获,后解密”攻击。

为了防范这种威胁,OpenSSH 和其他现代 SSH 客户端支持后量子加密 (PQC) 密钥交换方法。这些方法使用混合密钥交换算法,将后量子算法与经典算法(例如 X25519)相结合。只要其中一种算法保持安全,窃听者就无法推导出会话的加密密钥。

现代 SSH 实现支持以下混合后量子密钥交换算法:

  • sntrup761x25519-sha512@openssh.com:Streamlined NTRU Prime 761 和 X25519 的混合。OpenSSH 9.0 及更高版本和 PuTTY 0.78 及更高版本支持此功能。
  • mlkem768x25519-sha256:NIST 标准化 ML-KEM-768(以前称为 CRYSTALS-Kyber)和 X25519 的混合体。在 OpenSSH 10.0 及更高版本和 PuTTY 0.83 及更高版本中受支持。mlkem768x25519-sha256 是当前首选的 SSH 后量子密钥交换算法。

了解 SSH 中后量子保护的范围

SSH 连接涉及三个加密阶段:

  1. 密钥交换 (KexAlgorithms):客户端和服务器建立共享的对称密钥。当您使用后量子密钥交换算法时,此共享密钥可免遭量子计算机解密。
  2. 用户和主机身份验证:客户端验证服务器主机密钥,服务器验证用户的 SSH 密钥或证书。标准 OpenSSH 尚未将后量子签名算法用于用户身份验证,但由于身份验证发生在密钥交换建立的加密通道内部,因此您的凭据和主机密钥可免受追溯性解密的威胁。
  3. 会话数据加密 (Ciphers):密钥交换完成后,会话将使用对称密码(例如 aes256-gcm@openssh.com 或 chacha20-poly1305@openssh.com)进行加密。对称密码不像非对称(密钥交换)密码那样容易受到量子计算攻击。

算法协商的运作方式

在 SSH 连接握手期间,客户端会发送其支持的密钥交换算法的有序列表。服务器将客户端的列表与其自身支持的算法进行比较,然后选择客户端列表中服务器也支持的第一个算法。

由于客户端决定了偏好顺序,因此将工作站客户端配置为优先使用后量子算法可确保在目标虚拟机支持后量子密钥交换时,始终使用后量子密钥交换。

配置 SSH 客户端

在工作站上配置 SSH 客户端,以优先使用或强制使用后量子密钥交换算法。完成首选客户端工具的相关步骤。

控制台

SSH-in-browser(内置于 Cloud de Confiance 控制台)会自动支持并首选后量子密钥交换算法。

如果您使用 SSH-in-browser 连接到虚拟机,则无需在工作站上配置任何设置。当目标虚拟机支持后量子算法时,SSH-in-browser 会自动协商后量子密钥交换。

如需使用 SSH-in-browser 进行连接,请执行以下操作:

  1. 在 Cloud de Confiance 控制台中,转到虚拟机实例页面。

    转到“虚拟机实例”

  2. 在虚拟机实例列表中,点击要连接的虚拟机所在行中的 SSH。

gcloud

gcloud CLI (gcloud compute ssh) 使用本地工作站上安装的 OpenSSH 客户端。

  1. 验证工作站是否已安装 OpenSSH 9.0 或更高版本:

    ssh -V
    

    如果您的 OpenSSH 版本低于 9.0,请使用操作系统的软件包管理系统升级 OpenSSH。

  2. 当工作站运行 OpenSSH 9.0 或更高版本时,OpenSSH 会在其默认算法列表中包含后量子密钥交换。当您连接到兼容的虚拟机时,连接会协商后量子密钥交换,而无需添加额外的标志:

    gcloud compute ssh <var>VM_NAME</var> --zone=<var>ZONE</var>
    

    替换以下内容:

    • <var>VM_NAME</var>:您要连接到的虚拟机的名称。
    • <var>ZONE</var>:该虚拟机所在的可用区。

OpenSSH 客户端

如果您在 Linux、macOS 或 Windows 上使用标准 OpenSSH 客户端 (ssh),请执行以下操作:

  1. 验证本地 OpenSSH 客户端版本是否为 9.0 或更高版本:

    ssh -V
    
  2. 打开或创建用户 SSH 配置文件(在 Linux 和 macOS 上为 ~/.ssh/config,在 Windows 上为 %USERPROFILE%\.ssh\config)。

  3. 添加或更新 KexAlgorithms 指令。

    • 如需在允许经典回退的情况下优先使用后量子算法(推荐),请添加以下配置:

      KexAlgorithms ^mlkem768x25519-sha256,sntrup761x25519-sha512@openssh.com,diffie-hellman-group-exchange-sha256
      
    • 如需严格强制执行后量子算法并拒绝经典连接,请仅指定后量子算法:

      KexAlgorithms mlkem768x25519-sha256,sntrup761x25519-sha512@openssh.com
      
  4. 使用 SSH 连接到虚拟机:

    ssh -i <var>PATH_TO_PRIVATE_KEY</var> <var>USERNAME</var>@<var>EXTERNAL_IP</var>
    

    替换以下内容:

    • <var>PATH_TO_PRIVATE_KEY</var>:SSH 私钥的路径。
    • <var>USERNAME</var>:您的用户名(例如您的 OS Login 用户名)。
    • <var>EXTERNAL_IP</var>:虚拟机的外部 IP 地址。

PuTTY 应用

如果您在 Windows 上使用 PuTTY 连接到虚拟机,请执行以下操作:

  1. 确保您运行的是 PuTTY 0.78 版或更高版本(或 0.83 版或更高版本,以支持 ML-KEM)。如需查看版本,请打开 PuTTY,然后点击关于。如果需要,请从 PuTTY 下载页面下载最新版本。

  2. 打开 PuTTY。

  3. 在类别窗格中,依次点击连接 > SSH > Kex。

  4. 在算法选择政策列表中,找到后量子算法:

    • NTRU Prime / Curve25519 混合 KEX(可在 PuTTY 0.78 及更高版本中使用)
    • ML-KEM / Curve25519 混合 KEX(可在 PuTTY 0.83 及更高版本中使用)
  5. 选择后量子算法,然后点击向上,直到该算法位于列表顶部,高于经典 Diffie-Hellman 和 ECDH 算法。

  6. (可选)如需严格强制执行后量子算法,请选择每种经典算法,然后点击向下,直到该算法位于 -- Warn below here -- 或 -- Don't use below here -- 分隔线下方。

  7. 在类别窗格中,点击会话。

  8. 在已保存的会话下,选择您的会话名称,然后点击保存以保留您的算法偏好设置。

  9. 点击打开以连接到虚拟机。

配置虚拟机

如需使用后量子密钥交换算法,虚拟机的操作系统和 SSH 精灵必须支持这些算法。在进行配置更改之前,请查看兼容的操作系统并了解默认行为。

兼容的操作系统

为了支持后量子密钥交换,您的虚拟机必须运行包含 OpenSSH 9.0 或更高版本的操作系统。Compute Engine 上提供的以下公共 Linux 映像包含 OpenSSH 9.0 或更高版本:

  • Debian:Debian 12 (Bookworm) 及更高版本
  • Ubuntu:Ubuntu 24.04 LTS (Noble Numbat) 及更高版本
  • Fedora:Fedora 39 及更高版本
  • Container-Optimized OS:里程碑 109 及更高版本
  • Rocky Linux / AlmaLinux:版本 10 及更高版本

旧版操作系统(例如 Ubuntu 22.04 LTS、Debian 11 或 RHEL 9)默认包含低于 9.0 的 OpenSSH 版本,并且不支持后量子密钥交换。

默认行为

如果您的虚拟机运行的操作系统具有 OpenSSH 9.0 或更高版本,则 OpenSSH 服务器 (sshd) 默认支持 sntrup761x25519-sha512@openssh.com。运行 OpenSSH 10.0 或更高版本的虚拟机也默认支持 mlkem768x25519-sha256。

默认情况下,无需对虚拟机配置进行任何更改。当支持后量子技术的客户端连接时,虚拟机将自动协商后量子密钥交换。与此同时,虚拟机继续接受仅支持经典算法的客户端的连接。

严格要求使用后量子算法

如果您的组织要求所有 SSH 会话都使用后量子密钥交换,您可以配置虚拟机的 SSH 守护程序,使其仅接受后量子密钥交换算法。

如需在虚拟机上严格要求使用后量子算法,请执行以下操作:

  1. 使用 SSH 连接到虚拟机。

  2. 在 /etc/ssh/sshd_config.d/ 中创建放置即用的配置文件:

    sudo bash -c 'cat << 'EOF' > /etc/ssh/sshd_config.d/99-post-quantum-kex.conf
    # Require post-quantum key exchange algorithms only
    KexAlgorithms mlkem768x25519-sha256,sntrup761x25519-sha512@openssh.com
    EOF'
    
  3. 测试 SSH 守护程序配置是否存在语法错误:

    sudo sshd -t
    

    如果该命令产生错误,请检查配置文件,然后再继续操作。

  4. 重新加载 SSH 守护程序,以应用更改,而不会中断有效会话:

    sudo systemctl reload sshd
    

    如果您的 Linux 发行版使用 ssh 作为服务名称,请改为运行 sudo systemctl reload ssh。

  5. 保持当前终端窗口处于打开状态,然后打开一个新终端窗口,以测试与虚拟机的连接。如果新连接成功,则表示您的虚拟机已成功配置为需要后量子算法。

从 SSH 锁定中恢复

如果您将虚拟机配置为严格要求使用后量子算法,但由于客户端不支持所需的算法而无法登录,请使用以下恢复选项之一:

  1. 使用浏览器中的 SSH:打开 Cloud de Confiance 控制台,然后使用浏览器中的 SSH 建立连接。SSH-in-browser 支持后量子密钥交换,即使虚拟机严格要求使用后量子算法,也可以连接。 关联后,移除或修改 /etc/ssh/sshd_config.d/99-post-quantum-kex.conf 并重新加载 sshd。
  2. 使用虚拟串行控制台:使用特殊管理控制台 (SAC) 或串行控制台连接到虚拟机。使用您的凭据登录,移除配置文件,然后重新加载 sshd。
  3. 使用启动脚本:如果无法进行交互式访问:
    1. 在 Cloud de Confiance 控制台中,停止虚拟机。
    2. 修改虚拟机元数据,添加一个启动脚本,用于删除您之前创建的 /etc/ssh/sshd_config.d/99-post-quantum-kex.conf 配置文件,然后重启 SSH 服务器守护程序:startup-script:rm -f /etc/ssh/sshd_config.d/99-post-quantum-kex.conf && (systemctl reload ssh || systemctl reload sshd)
    3. 启动虚拟机。启动脚本以 root 身份运行,并恢复经典兼容性。
    4. 重新获得访问权限后,从元数据中移除启动脚本。

验证协商的密钥交换算法

如需确认活跃的 SSH 连接是否在使用后量子密钥交换算法,请从客户端检查连接详细信息。

使用 OpenSSH 或 gcloud CLI 进行验证

使用 -v 标志连接到虚拟机,并启用详细输出:

  • 使用 OpenSSH:

    ssh -v -i <var>PATH_TO_PRIVATE_KEY</var> <var>USERNAME</var>@<var>EXTERNAL_IP</var>
    
  • 使用 gcloud CLI:

    gcloud compute ssh <var>VM_NAME</var> --zone=<var>ZONE</var> -- -v
    

检查连接建立期间的终端输出。找到 kex: algorithm 行:

debug1: kex: algorithm: sntrup761x25519-sha512@openssh.com

或者:

debug1: kex: algorithm: mlkem768x25519-sha256

如果输出列出 sntrup761x25519-sha512 或 mlkem768x25519-sha256,则表示相应连接受后量子密钥交换保护。如果其中列出了 curve25519-sha256 或 ecdh-sha2-nistp256 等算法,则表示相应连接使用的是传统密钥交换,仍然容易受到“现在捕获,日后解密”攻击。

使用 PuTTY 进行验证

  1. 在 PuTTY 中,连接到您的虚拟机。
  2. 右键点击 PuTTY 窗口标题栏,然后选择 Event Log。
  3. 在 PuTTY 事件日志窗口中,找到指示密钥交换算法的行:
    • Using NTRU Prime / Curve25519 hybrid key exchange
    • Using ML-KEM / Curve25519 hybrid key exchange

后续步骤