pppd、docker、socat 和权限

pppd、docker、socat 和权限

我们有一个 [Ubuntu 20.04] Docker 映像,用作测试系统的一部分,我需要在其中运行pppd(以测试拨号连接),其中pppd 通过循环连接到物理调制解调器socat。我的问题是,当 Docker 容器的 [非 root] 用户(我们称之为用户usera)执行时pppd(即setuid,该部分工作正常),pppd无法访问相同的 用户刚刚使用设置socatusera成功执行:

socat pty,link=/tmp/ppp0,echo=0,raw,b115200 pty,link=/tmp/tty0,echo=0,raw,b115200

...运行良好,其中 Dockerfile 已设置权限/tmp为:

chmod 1777 /tmp

...即tmp具有权限drwxrwxrwt

命令socat行成功创建:

ls -l /tmp
total 0
lrwxrwxrwx 1 ubxlib ubxlib 10 Mar  8 15:33 ppp0 -> /dev/pts/1
lrwxrwxrwx 1 ubxlib ubxlib 10 Mar  8 15:33 tty0 -> /dev/pts/2

...但是当usera执行pppd连接到循环的一端时,我们得到:

pppd /tmp/ppp0 115200 passive debug local nodetach
pppd: Couldn't stat /tmp/ppp0: Permission denied

相反,如果usera知道/dev/pts/x刚刚socat创建的,而不是使用通过的链接/tmp/ppp0,那么就pppd可以工作:

pppd /dev/pts/1 115200 passive debug local nodetach
using channel 1
Using interface ppp0
Connect: ppp0 <--> /dev/pts/1
...

我如何使用用户提供的pppd链接进行工作,而不必知道做了什么?socatuserauserasocat

为了完整起见,的权限pppd-rwsr-xr-xsudo这里不是一个选项,因为这是在 Jenkins 通过 SSH 运行的 Docker 容器内,所以没有密码的 TTY/响应器。

答案1

答案是,我需要sudo sysctl fs.protected_symlinks=0在主机 Linux 系统中进行设置(在 中永久设置/usr/lib/sysctl.d/protect-links.conf)。至于这是否是一个明智的无论是否该做,但对于我们的测试系统而言,这样做是可以的。

相关内容