Повышаем привилегии юзера через docker

В очередной раз в очередной статье попалось упоминание о том, "как запустить docker контейнер без sudo".

В самом деле, можно же сделать так, чтобы вместо ввода пароля просто написать "docker start ..." прямо под пользователем, и всё будет работать.
Для этого достаточно внести пользователя в группу docker любым удобным способом, хоть прямым редактированием файла /etc/group, и сделать это один раз.

А теперь - почему так не стоит делать:

Для начала - внесем таки пользователя в группу docker:
$ sudo vi /etc/group
/docker
shift-A username
:wq

Ну или "правильный" способ - sudo usermod -aG docker $USER

Перелогиниваемся - docker ps -a - прекрасно, вот наши контейнеры, можно запускать, создавать новые.
Не нужно больше противное sudo со своим "введите пароль". Удобно.

Лишний раз проверим, что мы по-прежнему простой юзер, которому не положены рутовые права:

$ ls -l /root
ls: cannot open directory '/root': Permission denied

Теперь создаем новый контейнер, ну например такой:

$ docker run -ti --name hack -v /root:/x debian
root@9ec4ae4e9277:/#

Теперь мы, зайдя как простой юзер, сидим внутри контейнера.
И проверяем:

# ls -l /x

Оп-па! Видим домашний каталог "настоящего" рута, можем там что-нибудь писать и менять, скажем, сделать себе удаленный доступ через .ssh/authorized_keys, или подмонтировать при создании контейнера любой другой интересный каталог, которого как юзер видеть не могли...

То есть простое добавление юзера в группу docker не только удобно, но и помогает обойти все эти пароли и права доступа.

Понятно, что если это ваша единоличная машина, и доступ к шеллу никто посторонний никогда не получит - всё это не проблема, но наверное не стоит так делать?

Вероятно, это можно как-то закрыть дополнительно, но "из коробки" оно как-то вот так работает...

@JBFW
07.09.2025 04:33 UTC
Первоисточник

Комментарии

@Lainhard
07.09.2025 01:13 UTC
0

Был один момент, когда я будучи в группе docker (осуждаю конечно, но как есть) забыл/потерял пароль от рута, а sudo не был установлен. Пришлось менять пароль через контейнер😅

Спасибо дыркам в безопасности получается🤔

@wl2776
07.09.2025 01:57 UTC
0

Для таких случаев есть single user mode

@Dmitri-D
07.09.2025 03:48 UTC
0

Ну так docker - это не виртуальная машина и не совсем контейнер. Это просто namespace на основные подсистемы в user space. Так себе изоляция. Ядро одно. Все процессы видны снаружи, просто под другими pid, все сетевые компоненты видны снаружи, просто в соотв. namespace, пользователи в namespace итп.

@baldr
07.09.2025 05:59 UTC
0

Более того - команда "docker", которую вы вводите в консоли - это просто клиентское приложение на Go, которое просто отправляет запрос на API докер-демона, который как раз и выполняется в вашей системе из-под root. Добавляя вашего юзера в группу docker вы просто разрешаете доступ к этому API (сокет-файл с ограниченными по-дефолту правами).

И благодаря этому фокус из статьи и возможен. Все операции выполняет демон, у которого прав достаточно на всё.

@detree21
07.09.2025 06:20 UTC
0

А какое решение считается оптимальным? Работать с контейнерами прямо из-под рута? Потому что получается доступ к Docker CLI в любых случаях дает возможность повысить свои привилегии, кроме как если работа и так уже не выполняется из-под рута

@baldr
07.09.2025 06:52 UTC
+2

В зависимости от того, что вам нужно, можно использовать разные стратегии.

В документации много всего описано. Например, есть rootless режим, когда демон запускается не под рутом. Естественно, там куча ограничений.

На своём ноутбуке для экспериментов достаточно обычного способа, когда демон под рутом и вы через sudo запускаете команды. Смотрите аккуратнее что вы запускаете - и всё. Малвари трудно будет пролезть.

На продакшене возможны варианты. Очень многие приложения просто предлагают дать им доступ к докер-сокету, чтобы они что-то делали. Например Traefik - он мониторит состояние контейнеров через API докера, но ему совсем не нужен полный доступ - достаточно только readonly на ограниченное количество операций. Для этого можно прокинуть сокет через, например, reverse-proxy типа nginx, сделать там basic авторизацию и разрешить отдельным пользователям типа Traefik только GET запросы. Можно погуглить по "docker socket proxy" и будут варианты типа Tecnativa или другие. Я сделал вручную через nginx.

07.09.2025 10:51 UTC
0

Спасибо, интересная информация

@podvox23
11.09.2025 09:00 UTC
+1

rootless docker, podman, firecracker

@Zhuravlev-A-E
07.09.2025 10:39 UTC
+1

remap не поможет?

@a1excoder
08.09.2025 04:09 UTC
0

Ну да, ну да, пошел я на хер - https://gtfobins.github.io/