![设置 SSH 隧道用户时,authorized_keys 指令“command=”阻止“permitopen”(Ubuntu 19.10)](https://linux22.com/image/1619921/%E8%AE%BE%E7%BD%AE%20SSH%20%E9%9A%A7%E9%81%93%E7%94%A8%E6%88%B7%E6%97%B6%EF%BC%8Cauthorized_keys%20%E6%8C%87%E4%BB%A4%E2%80%9Ccommand%3D%E2%80%9D%E9%98%BB%E6%AD%A2%E2%80%9Cpermitopen%E2%80%9D%EF%BC%88Ubuntu%2019.10%EF%BC%89.png)
我正在尝试在 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:9229
和permitopen=: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 中添加的未来未知功能,但之后的内容除外restrict
:port-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 ...