我想为 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
,您可以使用密钥进行连接,而无需访问实际密钥。)