考虑一个服务器 X,其上有用户 A 和 B。
我有ssh
作为用户 的权限A
,以及sudo
作为用户 的权限B
,但我没有ssh
作为用户 B 的权限。
有一个其路径的 Unix 域套接字/path/to/socket
,由用户 B 拥有。
我想将本地主机端口 7070 转发到/path/to/socket
。第一次尝试如下:
ssh -L7070:/path/to/socket A@X
当我尝试连接到 localhost 7070 时,出现预期的权限错误,因为用户 A 没有访问 Unix 域套接字的权限。
channel 2: open failed: administratively prohibited: open failed
有一种解决方法是socat
将端口转换为套接字,但它不安全,因为服务器 X 是共享的,登录到服务器 X 的其他用户不应该能够连接到该端口。
ssh -L7070:localhost:7070
sudo -iu B
socat tcp-listen:7070,fork,reuseaddr unix-connect:/path/to/socket
我可以将某些选项传递给 ssh 吗,以便它允许我以sudo
用户 B 的身份授予 ssh 服务器进程连接到 Unix 域套接字的权限?
答案1
不,你确实必须ssh B@X
这样做才能实现这一点。远程连接由接受你登录的同一个 sshd 处理程序进程建立 - 它不使用 nc/socat 之类的外部工具,因此无法“sudo”它。
socat
使用 Unix 套接字而不是 TCP 套接字来应用您的解决方法 -unix-listen:
用于在只有用户 A 和 B 可以访问的路径上建立“中间”套接字,并将 SSH 隧道指向该套接字。