Я хочу использовать один сервер для размещения нескольких докер-контейнеров. Я хочу дать другому пользователю возможность управлять новыми docker-контейнерами, но я не хочу давать ему доступ ко всем другим контейнерам, которые я запустил, поскольку они могут содержать конфиденциальные данные.
Есть ли способ создать безопасную конфигурацию, не требующую создания виртуальной машины?
Это должно быть довольно просто запустить dockerd
для каждого пользователя и использование разрешений на файлы для разделения доступа пользователей.
Просто нашел учебник с использованием шаблонов systemd, чтобы получить эту настройку: https://www.jujens.eu/posts/en/2018/Feb/25/multiple-docker/
Исходный вопрос: как разрешить пользователю запускать новые контейнеры самостоятельно и не иметь доступа к другим контейнерам?
(Первоначально это был мой ответ, но, возможно, я неправильно понял вопрос или вопрос был не так ясен, я все равно сохранил исходное решение здесь)
Docker не предоставляет эту функцию самостоятельно, но есть несколько способов сделать это.
Идея состоит в том, что для выполнения команд докеров требуется, чтобы пользователь находился в группе sudo или docker, поэтому, если вы хотите, чтобы пользователь запускал только новый контейнер, вместо добавления пользователя в группу sudo или docker, которая обеспечивает полный доступ ко всем докерам команд, вы можете внести в белый список только несколько команд докеров для этого пользователя.
Например, если вы хотите разрешить пользователю tom запускать следующий контейнер:
sudo docker container run --it --name ubuntu-tom ubuntu:latest bash
Вы можете добавить следующую строку в свой файл sudoers, запустив sudo visudo:
tom ALL=NOPASSWD: /usr/bin/docker container run --it --name ubuntu-tom ubuntu:latest bash
Это позволяет пользователю Tom запускать эту конкретную команду docker от имени пользователя root без запроса пароля. Любые другие команды докера остаются недоступными для пользователя tom.
Другой альтернативой является установка оболочки с ограничениями, но я не буду здесь вдаваться в подробности.
Обновленный вопрос: как ограничить пользователя в управлении новыми контейнерами?
Мне неизвестно возможное решение, использующее только Docker.
Похоже, вам нужен оркестратор, такой как Kubernetes или ECS.
Таким образом, оркестратор владеет демоном докера, и вы можете использовать уровень разрешений, предоставляемый оркестратором. это статья представляет собой отличный пример ограничения доступа пользователей к пространству имен.
API-интерфейс docker не имеет такой возможности внутри, поэтому прямой доступ к нему можно рассматривать как возможность уровня системного администратора, поскольку он предоставляет пользователям root-доступ к серверу. Следовательно, чтобы реализовать это, вам нужно либо предоставить собственный косвенный доступ к API, либо использовать другой инструмент, который предоставляет эту функцию поверх docker.
Вы можете предоставить сценарий, к которому обращается sudo и который выполняет все проверки безопасности команд перед их выполнением. Самый простой способ реализовать это - добавить метку на каждый созданный объект (контейнер, том, сеть и т. Д.), А затем возвращать только объекты, соответствующие этому фильтру, в любых запросах и ограничивать выполнение команд только объектами с этими метками. Писать это нетривиально, поэтому я видел, как люди выбирают только более поздние варианты. Однако, если выполняемые команды и контейнеры очень ограничены, это может быть для вас достаточно хорошим решением.
Пространство имен Kubernetes обеспечивает эту функциональность и работает поверх докера. Этого сложно реализовать, поэтому большинство людей идут в этом направлении только в том случае, если им нужно гораздо больше функций, которые предоставляет Kubernetes.
Существуют различные сторонние инструменты, некоторые из которых являются коммерческими, которые обрабатывают доступ пользователей. Portainer и Rancher - две популярные, но у меня нет личного опыта с ними.
Docker предоставляет корпоративное предложение с включенным UCP. Вы можете предоставить пользователям доступ к docker api / cli, который проходит через UCP для проверки RBAC, прежде чем запрос будет отправлен в базовый механизм докера.
Почему бы вам не реализовать portainer? Он имеет множество функций, таких как пользовательское управление, графическое меню и многое другое, вам также не нужно создавать пользователя на сервере