运行 docker 通过 setuid 二进制文件的容器
Run docker container via a setuid binary
我正在尝试在我的 (debian stretch) 服务器上设置一个容器,并尽可能地锁定它。
容器my-container
只需要启动,然后做一些处理returns(整个过程大约需要一秒)。
我可以使用 docker start -a my-container
.
以 root 身份轻松完成
我的问题是此处理需要使用 php 脚本触发。我没有授予 www-data 启动 docker 容器的权利,而是创建了一个专用用户,带有一个执行 docker 命令的小型 setuid 二进制文件。
现在,从另一个用户执行 setuid 二进制文件不起作用,returns:
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 进程。
其实我自己想出来了。 setuid
位只是更改用户 ID,而不是进程的组 ID。因此,可执行文件具有新用户的权限,但不具有其所属组的权限。
作为一种变通方法,我将二进制文件更改为由 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
现在一切正常。
我正在尝试在我的 (debian stretch) 服务器上设置一个容器,并尽可能地锁定它。
容器my-container
只需要启动,然后做一些处理returns(整个过程大约需要一秒)。
我可以使用 docker start -a my-container
.
我的问题是此处理需要使用 php 脚本触发。我没有授予 www-data 启动 docker 容器的权利,而是创建了一个专用用户,带有一个执行 docker 命令的小型 setuid 二进制文件。
现在,从另一个用户执行 setuid 二进制文件不起作用,returns:
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 进程。
其实我自己想出来了。 setuid
位只是更改用户 ID,而不是进程的组 ID。因此,可执行文件具有新用户的权限,但不具有其所属组的权限。
作为一种变通方法,我将二进制文件更改为由 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
现在一切正常。