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,但原始问题仍然存在。
经过一些研究和实验,这种选项组合似乎可以解决问题:
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会提出其他建议。