带有私钥、监禁用户和代理命令的堡垒

带有私钥、监禁用户和代理命令的堡垒

我想为 SSH 和隧道 HTTP 设置堡垒:

  • 让用户使用堡垒机上存储的私钥,但无需读取
  • 允许在客户端使用 proxyjump(或 proxycommand)

用例:

  • 客户(员工)
  • Bastion(拥有私钥)
  • ServerA、ServerB、ServerC、...(授权堡垒密钥)

我希望客户端像这样连接到服务 A:

Client ==[ldap]==> bastion ==[keys]==> serverA

我设法在堡垒上使用 sudo 来完成此操作:

# allow users to use bastion keys
%users ALL=(bastion) NOPASSWD: /usr/bin/ssh

然后我使用以下方式从客户端(与用户组中的用户)进行连接:

alias ssh-bastion="ssh -t myuser@bastion 'sudo -u bastion /usr/bin/ssh'" 
ssh-bastion serverA

对于身份验证,它工作正常。对于隧道,它的工作
有点复杂。 至于 ansible,我还没有设法让它工作……ssh-bastion -L8080:localhost:8080

有没有办法在.ssh/config客户端配置类似的东西?

Host serverA
    ProxyCommand ssh bastion -W %h:%p sudo -u bastion /usr/bin/ssh
    Port          22
    User          myuser

笔记:用户不可能拥有私钥。

答案1

我认为您正在寻找:

ProxyCommand ssh bastion sudo -u bastion /usr/bin/ssh -W %h:%p

使用 并不是一个好主意sudo ssh。有几种方法可以让 'ssh' 程序吐出它有权访问的任何文件的内容 - 例如通过 LocalCommand、PKCS11Provider、ProxyCommand、Include 或 SecurityKeyProvider... 只要访问其中任何一个选项,窃取 /home/bastion/.ssh/id_rsa 就很容易了。

好吧,至少 sudo 可以确保所有这些都被记录下来。

(相反,我可能会使用 ssh-agent。编译一个自定义版本,删除“peeruid”检查,以便允许任何 UID 连接到代理套接字。然后在“bastion”用户下运行自定义代理并将密钥加载到其中。现在设置SSH_AUTH_SOCK=/tmp/shared-agent,您可以使用密钥进行连接,而无需访问实际密钥。)

相关内容