通过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
我还将权限更改为2111
( setgid
,可由任何人执行,因为它不是我系统上的安全问题;如果是这样,我想我可以使用ACL):
---x--s--x 1 root docker 8448 sept. 24 10:58 /home/docker-proxy-launcher/docker-prestage
现在一切正常。