通过setuid二进制运行docker容器

我正在尝试在我的(debian stretch)服务器上设置一个容器,并尽可能将其locking。

只需要启动容器my-container ,然后执行一些处理并返回(整个过程大概需要一秒)。

我可以很容易地做到这一点与docker start -a my-container

我的问题是这个处理需要用一个php脚本触发。 我没有给www-data启动docker容器的权利,而是用一个小的setuid二进制文件创build了一个专用的用户,执行docker命令。

现在,从其他用户执行setuid二进制文件不起作用并返回:

 FATA[0000] Get http:///var/run/docker.sock/v1.18/containers/my-container/json: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS? 

从特殊用户帐户执行二进制文件的工作。

我使用4510权限:

 -rs--x--- 1 docker-proxy-launcher another-user 8448 sept. 23 23:43 /home/docker-proxy-launcher/docker-prestage 

二进制是一个非常简单的程序,从execve手册页派生:

 #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]) { char *newenviron[] = { NULL }; char * newargv[] = {NULL, "start", "-a", "my-container", NULL}; char * exec="/usr/bin/docker"; newargv[0] = exec; execve(exec, newargv, newenviron); perror("execve"); /* execve() only returns on error */ exit(EXIT_FAILURE); } 

我真的没有得到什么阻止我启动这个setuid二进制docker进程。

我其实是自己想出来的。 setuid位只是更改用户标识,而不是进程的组标识。 因此,可执行文件具有新用户的权限,但不具有其所属组的权限。

作为一种解决方法,我将二进制文件更改为由root:docker拥有root:docker (属于docker组赋予在docker套接字上写入的权限):

 srw-rw---- 1 root docker 0 sept. 23 23:09 /var/run/docker.sock 

我还将权限更改为2111setgid ,可由任何人执行,因为它不是我系统上的安全问题;如果是这样,我想我可以使用ACL):

 ---x--s--x 1 root docker 8448 sept. 24 10:58 /home/docker-proxy-launcher/docker-prestage 

现在一切正常。