Запустите контейнер Docker через бинарный файл setuid

Я пытаюсь настроить контейнер на моем сервере (debian stretch) и максимально заблокировать его.

Контейнер my-container нужно только запустить, затем он выполняет некоторую обработку и возвращает результат (все это занимает около одной секунды).

Я могу легко сделать это как root с docker start -a my-container.

Моя проблема в том, что эту обработку нужно запускать с помощью php-скрипта. Вместо того, чтобы давать www-data право запускать контейнеры docker, я создал выделенного пользователя с небольшим двоичным файлом setuid, который выполняет команду 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 разрешения:

-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.


person MayeulC    schedule 23.09.2017    source источник


Ответы (1)


Я на самом деле понял это сам. Бит setuid просто изменяет идентификатор пользователя, а не идентификатор группы процесса. В результате исполняемый файл имеет права нового пользователя, а не тех групп, к которым он принадлежит.

В качестве обходного пути я изменил двоичный файл, чтобы он принадлежал root: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

Теперь все работает корректно.

person MayeulC    schedule 24.09.2017
comment
Через два часа (лимит SO, я не могу принять его менее чем через 48 часов после того, как вопрос был задан) ;) - person MayeulC; 25.09.2017
comment
Оки, я не знал об этом до сих пор :-) - person Tarun Lalwani; 25.09.2017