设置 SSH 隧道用户时,authorized_keys 指令“command=”阻止“permitopen”(Ubuntu 19.10)

设置 SSH 隧道用户时,authorized_keys 指令“command=”阻止“permitopen”(Ubuntu 19.10)

我正在尝试在 Ubuntu 19.10 中设置一个用户帐户,该帐户只能在特定端口 (9229) 上设置用于端口转发的隧道。我创建了一个具有最小主文件夹(仅一个.ssh文件夹和.ssh/authorized_keys文件)的用户。我已经让私钥登录正常工作(并且从那时起禁用了密码登录)。现在这是我的authorized_keys文件:

permitopen="localhost:9229",no-pty,no-X11-forwarding,no-agent-forwarding,command="/bin/echo 'Remote shell access has been disabled'" ssh-rsa KEY USER@HOST

现在,当我尝试使用 设置隧道时ssh -i KEY -o ExitOnForwardFailure=yes -L 9229:127.0.0.1:9229 USER@HOST sleep 10,我只会得到Remote shell access has been disabled。如果我删除该command=...部分,则没有问题,但用户可能会得到各种各样的东西。

我究竟做错了什么?

我的方法基于https://stackoverflow.com/questions/8021/allow-user-to-set-up-an-ssh-tunnel-but-nothing-else

我尝试过将permitopen指令移到指令之后和之前command。我也尝试过permitopen=127.0.0.1:9229permitopen=:9229

答案1

TL;DR 运行此命令,同时还可选择-f添加选项:

ssh -N -i KEY -o ExitOnForwardFailure=yes -L 9229:localhost:9229 USER@HOST

还要注意,它正在使用localhost而不是127.0.0.1(见下文)。


在链接的答案中有一件事你没有遵循:这个答案是使用选项-N甚至不打开 SSH 通道来运行命令,而你正在使用命令sleep 10。根据使用上下文,-N最好使用-f在询问密码后(如果需要)分叉 ssh 运行并使其在后台运行的选项来补充该选项。

通常,使用sleep 10可以不堆积多个 SSH 连接,特别是在自动运行时,但由于您还使用了选项-o ExitOnForwardFailure=yes,因此这实现了相同的目标:任何进一步的命令只能失败并且不能保持连接,因为只有第一个 ssh 命令将能够监听本地端口 9229 并成功。

我说通常,因为你提供了一个command覆盖任何尝试过的命令的选项:显示的 echo 命令Remote shell access has been disabled

自从 SO 答案完成后,时间已经过去,并且出现了新的选择,例如restrict选项:

restrict,port-forwarding,permitopen="localhost:9229",command="/bin/echo 'Remote shell access has been disabled'" ssh-rsa ...

这使得没有什么(但奇怪的是仍然不使用该选项而授予 shell 访问command权限),包括未来版本的 openssh 中添加的未来未知功能,但之后的内容除外restrictport-forwarding本身受到限制permitopen="localhost:9229"

如果您仍想在尝试执行命令时显示一条消息,只需将其更改为对最终用户更有用的内容:

restrict,port-forwarding,permitopen="localhost:9229",command="/usr/bin/printf 'Remote shell access has been disabled\nPlease run ssh with the option -N (and optionally -f)\n'" ssh-rsa ...

最后,这仍然不适用于您的示例。有关permitopen状态:

可以应用多个 permitlisten 选项,并以逗号分隔。
[...]
不对指定的主机名执行模式匹配,它们必须是文字域或地址。

这意味着,如果您允许,localhost您必须提供localhost,而不是127.0.0.1在客户端的请求中。否则,您可能会在客户端收到此错误,仅有的尝试使用隧道后:

channel 2: open failed: administratively prohibited: open failed

以及服务器端对应的日志:

sshd[7851]: Received request to connect to host 127.0.0.1 port 9229, but the request was denied.

如果您想同时允许两者,请同时允许两者。这是我建议的最终版本:

restrict,port-forwarding,permitopen="localhost:9229",permitopen="127.0.0.1:9229",command="/usr/bin/printf 'Remote shell access has been disabled\nPlease run ssh with the option -N (and optionally -f)'" ssh-rsa ...

相关内容