我需要让一组用户通过 ssh 跳转到一台服务器(“堡垒”)进入另一台机器(“目标”)来提交代码。
看来我的选择是:
告诉用户在他们的 .ssh/config 文件中使用
ProxyCommand
类似的内容:Host dest
ProxyCommand ssh -q bastion nc -q0 dest 22
ForceCommand
在 sshd 配置文件中使用,例如Match Group hopUsers
ForceCommand ssh dest $SSH_ORIGINAL_COMMAND
使用用户文件
command
中的选项.ssh/authorized_keys
,例如command="ssh dest"
第一个解决方案很棒,它适用于 mercual 提交等。——问题是我不想给我的用户一个bastion
机器上的有效 shell。我可以将他们的登录 shell 设置为 /bin/false,但这会留下一系列无人看管的问题(请参阅这里sshd
)——除非可能与配置文件中某一节内的一组专用选项(如noX11Forwarding)相结合Match
。
第二和第三种解决方案的问题是公钥认证“丢失”,即,除非客户端-A
在启动 ssh 时使用该选项,否则服务器将响应:
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering public key: .ssh/XXXXXX
debug1: Server accepts key: pkalg ssh-rsa blen 277
debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LC_ALL = en_US.UTF-8
debug1: Sending env LANG = en_US.UTF-8
因此要求输入用户密码。这是不可接受的。
我认为在代理模式下可以做一些事情nc
,但我似乎无法让它工作。
任何帮助将不胜感激。
答案1
解决方案如下:
在客户端,在.ssh/config
:
Host dest
ProxyCommand ssh -q bastion
在服务器端,在sshd_config
:
Match Group hopUsers
ForceCommand nc -q0 dest port
服务器上的用户authorized_keys
不需要任何command=
。
现在,如果用户尝试执行其他任何操作(例如,不使用 ProxyCommand 启动 ssh),他们得到的只是 netcat 的输出
$ ssh user@bastion
SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1.2
感谢 freenode 上的 #openssh 的朋友们。