关于SSH代理

介绍


SSH代理是OpenSSH的一部分。在这篇文章中,我将解释什么是代理,如何使用它以及如何保护您的钥匙安全。我还将介绍代理转发及其工作方式。我将帮助您减少使用代理转发的风险,并分享通过堡垒访问内部主机时可以使用的代理转发替代方法。

什么是SSH代理


ssh-agent是SSH的密钥管理器。它将您的密钥和证书存储在内存中,未经加密,可以立即使用ssh这样就不必在每次连接服务器时都输入密码。它在系统的后台运行,与之分离ssh,通常在首次启动时启动ssh

SSH代理会保护秘密密钥的安全,因为它不会

  • 它不会将任何密钥信息写入磁盘。
  • 它不允许您导出私钥。

代理中存储的密钥只能用于一个目的:对消息进行签名。

但是,如果代理只能签名消息,那么SSH如何加密和解密流量?

在SSH公用密钥和专用密钥的第一个研究中,很自然地假设SSH使用这些密钥对来加密和解密流量。那正是我的想法。但这种情况并非如此。SSH密钥对仅在初始连接期间用于身份验证。

例如,从服务器的角度来看,这是在SSH连接期间验证用户密钥的方法:

  • 客户端向服务器提供公钥。
  • 服务器生成并发送一条简短的随机消息,要求客户端使用私钥对其进行签名。
  • 客户端要求SSH代理对消息进行签名,然后将结果发送回服务器。
  • 服务器使用客户端的公钥验证签名。
  • 现在,服务器可以证明客户端拥有私钥。

稍后,在连接过程中,将生成一组新的,短暂的和对称的密钥,用于加密SSH会话流量。这些密钥甚至可能不会持续整个会话。密钥更新事件会定期发生。

代理协议


SSH使用Unix域套接字通过SSH代理协议与代理进行通信大多数人使用ssh-agentOpenSSH随附的工具,但是有许多开源替代方法。

代理协议非常简单,您可以在一两天内编写一个基本的SSH代理。它只有几个基本操作:

  • 添加常规密钥对(公共密钥和解密的私钥)
  • 添加有限的密钥对(公共密钥和解密的私钥)
  • 从智能卡添加密钥(常规或受限)(仅公共密钥)
  • 删除键
  • 列出存储在代理中的密钥
  • 使用存储在代理中的密钥对消息进行签名
  • 使用密码锁定或解锁整个代理

什么是受限密钥?通常,这是一个寿命有限或需要用户在使用时进行明确确认的钥匙。

该命令ssh-add是您通往SSH代理的网关。除签名外,他执行所有这些操作。当您运行不带任何参数的ssh-add时,它将在主目录中扫描一些标准密钥并将其添加到代理中。默认情况下,它搜索:

  • ~/.ssh/id_rsa
  • ~/.ssh/id_ed25519
  • ~/.ssh/id_dsa
  • ~/.ssh/id_ecdsa

将钥匙添加到钥匙串后,它们将被自动使用ssh

ssh-并且macOS
ssh-agent随附的macOS Keychain可以在macOS Keychain中存储密钥的密码短语,这使得重新启动后将密钥重新添加到代理更加容易。根据您的钥匙串设置,您可能仍需要在重启后将其解锁。要将密钥密码短语保存到“钥匙串”,请运行命令ssh-add -K [ ]密码短语通常存储在“本地项”中。ssh-agent将根据需要自动使用这些保存的密码短语。

什么是代理转发


代理转发功能使您的本地SSH代理可以通过现有的SSH连接进行通信并透明地验证到更远程的服务器。例如,假设您通过SSH登录EC2,并希望从那里克隆私有GitHub存储库。如果没有代理转发,则必须将GitHub私钥的副本存储在EC2主机上。重定向代理后,EC2上的SSH客户端可以使用本地计算机上的密钥在GitHub上进行身份验证。

代理转发的工作方式


首先,有一点背景。 SSH连接可以具有多个通道。这是一个常见的示例:与堡垒主机(跳转框)的交互式连接是在一个通道上执行的。为连接启用代理转发后(通常使用ssh -A),第二个通道在后台打开,以将所有代理请求转发回本地计算机。

在方面ssh,远程与本地没有区别ssh-agent。 SSH始终查看环境变量$SSH_AUTH_SOCK以查找代理的Unix域套接字。当连接到启用了代理转发的远程主机时,SSHD将创建一个与代理转发通道关联的远程Unix域套接字,并导出$SSH_AUTH_SOCK指向该代理的通道

图片

代理转发与一定风险相关


当您将ssh-agentUnix 域套接字重定向到远程主机时,会带来安全风险:在远程主机上具有root访问权限的任何人都可以通过套接字谨慎地访问您的本地SSH代理。他们可以使用您的密钥在网络上的其他计算机上模拟您。

这是看起来的例子:

图片

如何通过代理转发降低风险


以下是使代理重定向更安全的一些方法:

  • ForwardAgent默认不启用


使用代理转发时阻止ssh代理。ssh-add -x使用密码阻止代理,然后将其ssh-add -X解锁。当您通过代理转发连接到远程主机时,没有密码就无法进入您的代理。

或使用备用SSH代理,在使用时询问您。Sekey在macOS上使用Touch ID将密钥存储在MacBook Pro安全区域中。

或者根本不使用代理转发。如果您尝试通过堡垒访问内部主机,则ProxyJump此用例有更安全的选择。(见下文)

用途 ProxyJump:更安全的替代品


当您想通过堡垒主机(跳箱)时,您实际上不需要代理转发。最好的方法是使用指令 ProxyJump

它不是通过单独的通道重定向代理,而是ProxyJump通过堡垒将本地SSH客户端的标准输入和输出重定向到远程主机,并进一步重定向到远程主机。运作方式如下:

  1. 运行ssh -J bastion.example.com cloud.computer.internalcloud.computer.internal通过您的堡垒主机进行连接bastion.example.comcloud.computer.internal是通过在上搜索DNS可以找到的主机名bastion.example.com
  2. SSH客户端使用代理程序中的密钥连接到bastion.example.com
  3. 将SSHD连接到堡垒后,它将连接到cloud.computer.internal本地SSH客户端并将其传输到本地SSH客户端。
  4. 您的本地SSH客户端再次通过连接,这一次 cloud.computer.internal

您可以在SSH会话中将其视为SSH。除了ssh永远不会在堡垒上运行。相反,它sshd连接到cloud.computer.internal本地SSH,并将对该连接(标准输入和输出)的控制权返回给本地SSH,然后进行第二连接。

配置ProxyJump

假设bastion-host this bastion.example.com我可以这样配置~/.ssh/config

Host bastion.example.com
	User carl

Host *.computer.internal
	ProxyJump bastion.example.com
	User carl

然后,我只是运行ssh cloud.computer.internal通过堡垒连接到内部目标-无需代理转发。

如果ProxyJump无法正常工作...

SSH和SSHD的旧版本(2016年发布的7.2版之前)不支持ProxyJump但是您可以使用ProxyCommandnetcat进行等效的操作这是一个例子:

ssh -o ProxyCommand="ssh bastion.example.com nc %h %p" cloud.computer.internal

这里的魔力在于SSH本身就是您用于SSH的代理服务器。该部分nc %h %p仅打开到cloud.computer.internal端口22上的原始套接字连接。parent ssh命令的标准输入/输出直接传递到,ProxyCommand以便父ssh可以通过代理连接向内部主机进行身份验证。



图片
通过参加SkillFactory在线课程,了解如何从头开始获得热门职业或技能和薪资水平提高的详细信息:



阅读更多



All Articles