如何安全配置 VSCode 的 SSH 远程开发防止密钥泄露?

文章导读
用 VSCode 的 Remote-SSH 做远程开发时,私钥泄露是很多人没太当回事的风险。我自己处理过几回因为权限没设好、密钥复制到远程、或者代理转发开太宽导致的问题,后来养成了一套固定习惯。下面把几个关键节点拆开说,每个地方我都会解释为什么这么做、做完怎么确认,以及什么情况可以放宽。
📋 目录
  1. 生成密钥时别偷懒
  2. 配置文件中显式指定身份文件
  3. 严格限制私钥文件权限
  4. 避免私钥离开本地机器
  5. 监控代理加载状态并及时清理
A A

用 VSCode 的 Remote-SSH 做远程开发时,私钥泄露是很多人没太当回事的风险。我自己处理过几回因为权限没设好、密钥复制到远程、或者代理转发开太宽导致的问题,后来养成了一套固定习惯。下面把几个关键节点拆开说,每个地方我都会解释为什么这么做、做完怎么确认,以及什么情况可以放宽。

生成 SSH 密钥对时,推荐使用 ed25519 算法而非默认的 RSA。执行 `ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519` 后,系统会提示设置密码短语。这一步不能跳过——空密码短语意味着私钥文件一旦被窃取,攻击者可直接使用。密码短语建议使用 15 位以上包含大小写字母和特殊字符的字符串,并妥善保存在密码管理器中。

在 VSCode 的 `Remote-SSH` 扩展配置中,应显式指定使用哪个私钥文件。编辑 `~/.ssh/config`,添加类似 `IdentityFile ~/.ssh/id_ed25519` 的条目。避免依赖 SSH 代理自动加载所有私钥,因为这样会增加私钥被无关连接调用的风险。同时,将 `ForwardAgent` 设置为 `yes` 仅限于信任的远程主机,否则建议保持 `no`,防止代理转发过程中密钥被中间主机窃取。

生成密钥时别偷懒

生成 SSH 密钥对时,推荐使用 ed25519 算法而非默认的 RSA。执行 ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519 后,系统会提示设置密码短语。这一步不能跳过——空密码短语意味着私钥文件一旦被窃取,攻击者可直接使用。密码短语建议使用 15 位以上包含大小写字母和特殊字符的字符串,并妥善保存在密码管理器中。我见过有人为图方便设个空密码,结果笔记本被偷后,远程服务器直接被人登进去。ed25519 的优点是密钥短、安全性高,而且多数现代 SSH 客户端都支持。如果远程服务器 SSH 版本太旧(比如 CentOS 6 的 OpenSSH 5.3),可能不支持 ed25519,那就只能用 RSA 4096 位。判断方法:在远程主机执行 ssh -Q key,看输出里有没有 ssh-ed25519。没有的话就换 RSA,但密码短语依然不能省。

如何安全配置 VSCode 的 SSH 远程开发防止密钥泄露?

配置文件中显式指定身份文件

在 VSCode 的 Remote-SSH 扩展配置中,应显式指定使用哪个私钥文件。编辑 ~/.ssh/config,添加类似 IdentityFile ~/.ssh/id_ed25519 的条目。避免依赖 SSH 代理自动加载所有私钥,因为这样会增加私钥被无关连接调用的风险。同时,将 ForwardAgent 设置为 yes 仅限于信任的远程主机,否则建议保持 no,防止代理转发过程中密钥被中间主机窃取。具体操作:打开 VSCode 命令面板,搜索 Remote-SSH: Open SSH Configuration File,选择家目录下的 config 文件。针对每个主机写一个 Host 块,例如:

Host my-server
    HostName 192.168.1.100
    User dev
    IdentityFile ~/.ssh/id_ed25519
    ForwardAgent no

如果这台远程服务器还需要通过它再跳转到另一台内网机器,才考虑设 ForwardAgent yes,并且只在连接期间打开,用完后立即关闭。检查方法:连接成功后,在 VSCode 终端里运行 echo $SSH_AUTH_SOCK,如果有值说明代理在运行,再用 ssh-add -l 看看加载了哪些密钥。

严格限制私钥文件权限

私钥文件的权限必须严格限制,仅当前用户可读写。检查方法:在终端运行 ls -la ~/.ssh/,确保私钥文件的权限为 -rw-------(600),公钥可为 -rw-r--r--(644)。如果 .ssh 目录权限不是 drwx------(700),需立即修正:chmod 700 ~/.ssh && chmod 600 ~/.ssh/id_ed25519。权限过松会导致其他进程或恶意软件轻易读取私钥。有一次同事把 .ssh 目录设成了 755,结果被一个挖矿脚本扫到,私钥被复制走,几台服务器都被植入了后门。修正后最好再检查一下 ~/.ssh/authorized_keys,确保里面没有多余的公钥行。另外,如果在 Windows 上用 WSL,同样要关注文件权限——Windows 下的文件系统可能没有 Linux 那么严格的权限模型,尽量在 WSL 的 ext4 分区里操作。

如何安全配置 VSCode 的 SSH 远程开发防止密钥泄露?

避免私钥离开本地机器

一个常见的坑是将私钥文件放在了 VSCode 的工作区内或同步到云盘。私钥应始终存放于用户主目录的 .ssh 文件夹内,且不要参与任何文件同步服务(如 OneDrive、iCloud、Git 仓库)。另外,不要在远程服务器上保存私钥副本——远程开发时仅通过 SSH 代理转发本地私钥,私钥本身不应离开本地机器。若确实需要在远程使用,考虑使用 SSH 证书而非复制私钥。我处理过一个 case:开发者为了省事,把私钥传到了远程服务器上,后来远程服务器被渗透,私钥被公开到 GitHub。其实用 SSH 证书的话,可以在服务器端做 CA 签名,吊销起来也方便。如果非要在远程使用密钥,可以考虑先用 ssh-keygen -t ed25519 -a 100 在远程生成一对,然后本地用 ssh-copy-id 把公钥传过去,私钥永远不离开源机器。

监控代理加载状态并及时清理

使用 ssh-add -l 可以查看当前 SSH 代理中加载了哪些私钥。如果发现有多余的密钥,执行 ssh-add -d 移除特定密钥或 ssh-add -D 清空所有。在 VSCode 中连接远程主机时,留意状态栏提示的密钥使用情况。若远程主机被攻破,攻击者可能利用代理转发窃取正在使用的私钥,因此应尽量缩短代理的超时时间,或在完成操作后执行 ssh-add -D 清理。我习惯在 VSCode 关闭远程窗口后,手动跑一遍 ssh-add -D,或者设置一个短超时:在 ~/.ssh/config 里加 IdentityFile 对应的主机可以加 IdentitiesOnly yes 来限制只使用指定密钥。如果使用 ssh-agent,可以设置 ssh-agent -t 3600 让密钥一小时后自动过期。

最后稍微提醒一下:如果你在团队里维护统一开发环境,最好把上述检查项写成脚本(比如检查 .ssh 目录权限、是否在同步目录、有无空密码密钥),每次搭建新机器后跑一遍。密钥安全不是一次配置就一劳永逸,养成习惯比任何工具都重要。