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