配置SSH Agent Forwarding

使用SSH Agent Forwarding在远程服务器上安全访问仓库

Posted by wszqkzqk on October 20, 2024
本文字数:1664

前言

在远程服务器上访问仓库时,我们通常会使用SSH密钥来进行认证。但是,如果我们直接将私钥拷贝到远程服务器上,就会存在私钥泄露的风险。SSH Agent Forwarding是一种解决这一问题的方法,它可以让我们在远程服务器上使用本地的SSH密钥,而不需要将私钥拷贝到远程服务器上。

配置SSH Agent Forwarding

在ssh访问时启用SSH Agent Forwarding所需的参数是-A,例如:

ssh -A user@remote

对于SSH客户端,可以在~/.ssh/config中添加以下配置:

Host remote
    HostName remote
    User user
    ForwardAgent yes

其中,ForwardAgent yes表示启用SSH Agent Forwarding。

然而,仅仅加上这一参数是不够的,我们还需要配置SSH Agent。

Linux

在Linux系统上,我们可以使用systemd的用户单元ssh-agent.service来启动SSH Agent,首先我们需要在~/.profile中设置环境变量:

echo 'export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"' >> ~/.profile

然后启用ssh-agent.service

systemctl --user enable ssh-agent.service

重新登录用户,SSH Agent就会自动启动。

如果想在SSH Agent中添加私钥,可以使用ssh-add命令,例如:

ssh-add ~/.ssh/id_rsa

如果希望在每次登录时自动添加私钥,在~/.ssh/config中添加:

AddKeysToAgent yes

Windows

在Windows系统上,我们可以使用SetService来启动SSH Agent,在pwsh中以管理员身份运行:

Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent

然后使用ssh-add命令添加私钥:

ssh-add ~/.ssh/id_rsa

远程机器的SSH_AUTH_SOCK

当将本地ssh-agent转发到远程机器时(ssh -A remote或在配置文件中设置ForwardAgent yes),远程机器不能覆盖环境变量SSH_AUTH_SOCK。当用户通过 SSH 登录时,必须避免在登录过程中设置SSH_AUTH_SOCK。否则,SSH 转发可能会失败,并且在远程机器上使用ssh-add -l检查现有密钥时,可能会看到错误信息(如:The agent has no identities)。

可以在远程机器~/.profile中加入以下代码:

if [[ -z "${SSH_CONNECTION}" ]]; then
    export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"
fi

这样,只有在非 SSH 登录时,SSH_AUTH_SOCK才会被设置。

  • 不过我们一般很少会在远程机器上存储私钥,也不太会在远程机器上启用它本身的ssh-agent,因此这个问题一般不会出现。

vscode连接的坑:再次连接时SSH_AUTH_SOCK变量不更新

由于在vscode多次连接中,远程的vscode-server均不会重启,因此如果在此前vscode-server已经启动,加载了当时的ssh连接下的SSH_AUTH_SOCK变量,在断开连接后再次连接时,SSH_AUTH_SOCK变量不会更新,导致ssh-agent转发失败。

解决方法是在vscode中手动重启vscode-server,在vscode中按F1,输入Remote-SSH: Kill Current VS Code Server,等待片刻自动重新连接即可。

当然,也可以退出vscode后再手动通过ssh连接远程服务器,并通过命令pkill -f vscode-server杀死vscode-server进程,再次连接vscode即可。