ssh ForceCommand 与 ProxyCommand

ssh ForceCommand 与 ProxyCommand

我需要让一组用户通过 ssh 跳转到一台服务器(“堡垒”)进入另一台机器(“目标”)来提交代码。

看来我的选择是:

  1. 告诉用户在他们的 .ssh/config 文件中使用ProxyCommand类似的内容:

    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 [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 的朋友们。

相关内容