![SSH:authorized_keys 中 no-pty 登录选项的影响](https://linux22.com/image/1535982/SSH%EF%BC%9Aauthorized_keys%20%E4%B8%AD%20no-pty%20%E7%99%BB%E5%BD%95%E9%80%89%E9%A1%B9%E7%9A%84%E5%BD%B1%E5%93%8D.png)
我对 中添加到密钥中的登录选项restrict
的行为感到困惑。no-pty
~/.ssh/authorized_keys
对于给定的密钥,我打算阻止任何相互作用除了启动到特定本地端口的 SSH 隧道:
restrict,permitopen="localhost:80" ssh-rsa AAAAB3NzaC1yc2EAAA[...]3c7rmJT5/ [email protected]
实际效果是,通过相应的私钥识别,我可以创建一个隧道,但显然还可以执行任意命令:
tunnel@a $ ssh -i tunnel_rsa [email protected]
PTY allocation request failed on channel 0
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-64-generic x86_64)
[...]
You have new mail.
ls .ssh/
authorized_keys
id_rsa
id_rsa.pub
known_hosts
注意PTY allocation request failed on channel 0
会话开始时的消息(表明登录选项具有一些效果)和ls .ssh/
带有其输出的命令。
没有提示,但这不是我想要做的。有人能解释一下吗?此外,将给定的密钥限制为仅创建隧道的首选方法是什么?
更新
隧道restrict
实际上没有工作:
$ curl localhost:8080
curl: (52) Empty reply from server
或者使用 HTTPie:
$ http :8080
http: error: ConnectionError: ('Connection aborted.', BadStatusLine("''",))
命令输出如下ssh -L ...
:
channel 2: open failed: administratively prohibited: open failed
它确实可以使用no-pty
选项而不是来工作restricted
,但是原始问题仍然存在。
答案1
经过一些研究和实验,这个选项的组合似乎可以起到作用:
command="",restrict,port-forwarding,permitopen="localhost:80"
让我逐一介绍一下它们:
command=""
禁止使用此键执行任何命令
restrict
一次禁用所有选项,例如 TTY 分配、端口转发、代理转发、user-rc 和 X11 转发。
port-forwarding
启用 TCP 端口转发,但请参见下文。
permitopen="localhost:80"
将 TCP 端口转发限制为本地端口
80
。这就是仅有的此键应允许的事情。
我主要通过阅读来弄清楚这一点OpenSSH WikiBook 的客户端配置文件章节,因此大部分功劳都归于作者(Lars Noodén 等人)。缺少的部分是port-forwarding
- 如果没有它,则禁止转发,尽管permitopen
会建议转发。