SSH:authorized_keys 中 no-pty 登录选项的影响

Tad*_*spy 5 security ssh openssh ssh-tunnel authorized-keys

我的行为感到困惑restrict或者no-pty预先考虑的关键登录选项~/.ssh/authorized_keys

对于给定的密钥,我打算阻止任何交互,除了启动到特定本地端口的 SSH 隧道:

restrict,permitopen="localhost:80" ssh-rsa AAAAB3NzaC1yc2EAAA[...]3c7rmJT5/ tunnel@a.example.com
Run Code Online (Sandbox Code Playgroud)

实际效果是用对应的私钥识别我可以创建隧道,但显然也可以执行任意命令

tunnel@a $ ssh -i tunnel_rsa user@b.example.com

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
Run Code Online (Sandbox Code Playgroud)

注意PTY allocation request failed on channel 0会话开始时的消息(这表明登录选项会产生一些效果)和ls .ssh/带有它的输出的命令。

没有提示,但这不是我打算做的。有人可以对此有所了解吗?另外,将给定密钥限制为仅创建隧道的首选方法是什么?

更新

restrict隧道是不是真的工作:

$ curl localhost:8080
curl: (52) Empty reply from server
Run Code Online (Sandbox Code Playgroud)

或使用 HTTPie:

$ http :8080
http: error: ConnectionError: ('Connection aborted.', BadStatusLine("''",))
Run Code Online (Sandbox Code Playgroud)

ssh -L ...命令的输出如下:

channel 2: open failed: administratively prohibited: open failed
Run Code Online (Sandbox Code Playgroud)

它确实适用于no-ptyoption 而不是restricted,但原始问题仍然存在。

Tad*_*spy 5

经过一些研究和实验,这种选项组合似乎可以解决问题:

command="",restrict,port-forwarding,permitopen="localhost:80"
Run Code Online (Sandbox Code Playgroud)

让我逐一介绍它们:

  • command=""

    禁止使用此键执行任何命令

  • restrict

    一次性禁用所有选项,例如 TTY 分配、端口转发、代理转发、user-rc 和 X11 转发。

  • port-forwarding

    启用 TCP 端口转发,但请参见下文。

  • permitopen="localhost:80"

    将 TCP 端口转发限制为本地端口80。这是这个密钥应该允许的唯一事情。

我主要通过阅读OpenSSH WikiBook 的客户端配置文件章节来解决这个问题,因此大部分功劳归功于它的作者(Lars Noodén 等人)。缺少的部分是port-forwarding- 没有它转发是被禁止的,即使permitopen会提出其他建议。

  • 感谢使用`restrict`代替`no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty`的提示 (2认同)