设置符合 FIPS 标准的安全远程 Linux 开发

Linux 支持在 Visual Studio 2017 及更高版本中提供。 可以在 Visual Studio 2019 版本 16.5 及更高版本中设置符合 FIPS 的安全远程 Linux 开发。

美国联邦信息处理标准 (FIPS) 出版物 140-2 是美国政府规定的加密模块标准。 此标准的实现由 NIST 进行验证。 Windows 已验证对符合 FIPS 的加密模块的支持。 在 Visual Studio 2019 版本 16.5 及更高版本中,可以对 Linux 系统进行符合 FIPS 的安全加密连接,以用于远程开发。

下面介绍了如何设置 Visual Studio 与远程 Linux 系统之间符合 FIPS 的安全连接。 本指南适用于在 Visual Studio 中生成 CMake 或 MSBuild Linux 项目。 本文是连接到远程 Linux 计算机中的连接说明的符合 FIPS 版本。

设置符合 FIPS 的连接的准备工作

必须完成一些准备工作,才能在 Visual Studio 与远程 Linux 系统之间进行符合 FIPS 的安全加密 SSH 连接。 为了符合 FIPS-140-2,Visual Studio 仅支持 RSA 密钥。

本文中的示例结合使用 Ubuntu 18.04 LTS 和 OpenSSH 服务器版本 7.6。 不过,对于任何使用最新版 OpenSSH 的发行版,操作说明应该是相同的。

在远程系统上设置 SSH 服务器的具体步骤

  1. 在 Linux 系统上,安装并启动 OpenSSH 服务器:

    sudo apt install openssh-server
    sudo service ssh start
    
  2. 若要让 ssh 服务器在系统启动时自动启动,请使用 systemctl 启用它:

    sudo systemctl enable ssh
    
  3. 以根用户身份打开 /etc/ssh/sshd_config。 编辑(或添加,如果不存在)以下行:

    Ciphers aes256-cbc,aes192-cbc,aes128-cbc,3des-cbc
    HostKeyAlgorithms ssh-rsa
    KexAlgorithms diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1
    MACs hmac-sha2-256,hmac-sha1
    

    注意

    ssh-rsa 是 VS 唯一支持的符合 FIPS 的主机密钥算法。 虽然 aes*-ctr 算法也符合 FIPS,但 Visual Studio 中的实现并未获准。 尽管 ecdh-* 密钥交换算法符合 FIPS,但并不受 Visual Studio 支持。

    除了这些,还可以使用其他选项。 可以将 ssh 配置为使用其他密码、主机密钥算法等。 不妨考虑使用的其他一些相关安全选项有 PermitRootLoginPasswordAuthenticationPermitEmptyPasswords。 有关详细信息,请参阅 sshd_configman 页或 SSH 服务器配置一文。

  4. 保存并关闭 sshd_config 后,重启 SSH 服务器,以应用新配置:

    sudo service ssh restart
    

接下来,将在 Windows 计算机上创建 RSA 密钥对。 然后,将公钥复制到远程 Linux 系统,以供 ssh 使用。

创建和使用 RSA 密钥文件的具体步骤

  1. 在 Windows 计算机上,使用以下命令生成公用/专用 RSA 密钥对:

    ssh-keygen -t rsa -b 4096 -m PEM
    

    此命令将创建一个公钥和一个私钥。 默认情况下,密钥保存到 %USERPROFILE%\.ssh\id_rsa%USERPROFILE%\\.ssh\\id_rsa.pub。 (在 PowerShell 中,请使用 $env:USERPROFILE,而不是 cmd 宏 %USERPROFILE%)如果更改密钥名称,请在后续步骤中使用更改后的名称。 为了提高安全性,建议使用密码。

  2. 将公钥从 Windows 复制到 Linux 计算机:

    scp %USERPROFILE%\.ssh\id_rsa.pub user@hostname:
    
  3. 在 Linux 系统上,将密钥添加到授权密钥列表中,并确保文件具有正确的权限:

    cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
    
  4. 现在,可以测试新密钥在 ssh 中是否有效。 使用它在 Windows 中登录:

    ssh -i %USERPROFILE%\.ssh\id_rsa user@hostname
    

此时,你已成功设置 ssh、创建和部署加密密钥,并已测试连接。 现在可以设置 Visual Studio 连接了。

在 Visual Studio 中连接到远程系统

  1. 在 Visual Studio 中,依次选择菜单栏上的“工具”>“选项”,以打开“选项”对话框。 然后,依次选择“跨平台”>“连接管理器”,以打开“连接管理器”对话框。

    如果你以前没有在 Visual Studio 中设置过连接,Visual Studio 会在你首次生成项目时,为你打开“连接管理器”对话框。

  2. 在“连接管理器”对话框中,选择“添加” 按钮,以添加新连接。

    连接管理器对话框中选项窗格的屏幕截图。其中突出显示“跨平台”>“C++”>“连接管理器”。

    此时,“连接到远程系统”窗口显示。

    显示“连接到远程系统”窗口的屏幕截图,其中包含针对主机名、端口、用户名、身份验证类型和密码的字段。

  3. 在“连接到远程系统”对话框中,输入远程计算机的连接详细信息。

    条目 描述
    主机名 目标设备的名称或 IP 地址
    端口 运行 SSH 服务的端口,通常为 22
    用户名 要进行身份验证的用户
    身份验证类型 选择用于符合 FIPS 的连接的私钥
    私钥文件 为 ssh 连接创建的私钥文件
    密码 与上面选择的私钥一起使用的密码

    将“身份验证类型”更改为“私钥”。 在“私钥文件”字段中,输入私钥路径。 可以改用“浏览”按钮转到私钥文件。 然后,在“密码”字段中输入用于加密私钥文件的密码。

  4. 选择“连接”按钮,尝试连接到远程计算机 。

    如果连接成功,Visual Studio 便会将 IntelliSense 配置为使用远程标头。 有关详细信息,请参阅远程系统上标头的 IntelliSense

    如果连接失败,则需要更改的输入框的边框为红色。

    “连接到远程系统”窗口的屏幕截图,其中主机名和端口文本框以红色标出,表示需要进行更改。

    若要详细了解如何排查连接问题,请参阅连接到远程 Linux 计算机

用于连接管理器的命令行实用工具

Visual Studio 2019 version 16.5 或更高版本ConnectionManager.exe 是用于在 Visual Studio 之外管理远程开发连接的命令行实用工具。 它对于预配新开发计算机之类的任务非常有用。 你也可以使用它来设置 Visual Studio 进行持续集成。 有关 ConnectionManager 命令的示例和完整参考,请参阅 ConnectionManager 参考

可选:启用或禁用 FIPS 模式

可以在 Windows 中全局启用 FIPS 模式。

  1. 若要启用 FIPS 模式,请按 Windows+R 以打开“运行”对话框,然后运行 gpedit.msc

  2. 依次展开“本地计算机策略”>“计算机配置”>“Windows 设置”>“安全设置”>“本地策略”,并选择“安全选项”。

  3. 在“策略”下,选择“系统加密: 使用符合 FIPS 的算法进行加密、哈希和签名”,然后按 Enter 键以打开相应对话框 。

  4. 在“本地安全设置”选项卡中,选中“已启用”或“已禁用”,再选择“确定”,以保存更改。

警告

启用 FIPS 模式可能会导致某些应用程序中断或出现意外行为。 有关详细信息,请参阅博客文章为什么我们不再推荐“FIPS 模式”

其他资源

有关 FIPS 140 验证的 Microsoft 文档

FIPS 140-2:加密模块的安全要求(来自 NIST)

加密算法验证程序:验证说明(来自 NIST)

Microsoft 博客文章为什么我们不再推荐“FIPS 模式”

SSH 服务器配置

另请参阅

配置 Linux 项目
配置 Linux CMake 项目
连接到远程 Linux 计算机
部署、运行和调试 Linux 项目
配置 CMake 调试会话