通过setuid二进制文件运行docker容器

时间:2017-09-23 22:17:37

标签: docker setuid

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

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

我可以使用docker start -a my-container以root身份轻松完成。

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

现在,从另一个用户执行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权限:

-r-s--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进程。

1 个答案:

答案 0 :(得分:3)

我实际上是自己想出来的。 driver.findElement(By.className("dmUDNavigationItem_03")).click(); driver.findElement(By.className("dmUDNavigationItem_00")).click(); driver.findElement(By.className("dmUDNavigationItem_02")).click(); 位只更改用户ID,而不是进程的组ID。因此,可执行文件具有新用户的权限,但不具有其所属组的权限。

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

root:docker

我还将权限更改为srw-rw---- 1 root docker 0 sept. 23 23:09 /var/run/docker.sock 2111,可由任何人执行,因为它不是我系统上的安全问题;如果是,我认为我可以使用ACL):< / p>

setgid

现在一切正常。