ssh ForceCommand 与 ProxyCommand

lor*_*zog 5 shell sshd

我需要让一组用户通过 ssh 通过服务器('bastion')跳转到另一台机器('dest')以提交代码。

好像我的选择是:

  1. 告诉用户ProxyCommand在他们的 .ssh/config 文件中使用,例如:

    Host dest
    ProxyCommand ssh -q bastion nc -q0 dest 22

  2. 使用ForceCommand在sshd的配置文件,如

    Match Group hopUsers
    ForceCommand ssh dest $SSH_ORIGINAL_COMMAND

  3. 使用用户文件中的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 no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LC_ALL = en_US.UTF-8
debug1: Sending env LANG = en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)

因此请求用户密码。这是不可接受的。

我认为nc在代理模式下可以做一些事情,但我似乎无法让它工作。

任何帮助将不胜感激。

lor*_*zog 3

解决方案结果是:

在客户端,在.ssh/config

Host dest
    ProxyCommand ssh -q bastion
Run Code Online (Sandbox Code Playgroud)

在服务器端,在sshd_config

Match Group hopUsers
        ForceCommand nc -q0 dest port
Run Code Online (Sandbox Code Playgroud)

服务器上的用户authorized_keys不需要任何command=.

现在,如果用户尝试执行其他操作(例如,在没有 ProxyCommand 的情况下启动 ssh),他们得到的只是 netcat 的输出

$ ssh user@bastion
SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1.2
Run Code Online (Sandbox Code Playgroud)

感谢 freenode 上 #openssh 的人们。