Вопрос или проблема
У меня есть контейнерная команда, которую я хотел бы запустить: docker run my_docker_image. Вместо того чтобы устанавливать зависимости команды на основной компьютер, я упаковываю их все в образ, который затем пользователи могут запустить с помощью оболочного скрипта.
Мой вопрос: могут ли мои пользователи выполнить это без следующего?
- предоставления пользователям доступа sudo
- предоставления пользователям доступа к группе docker
Я стремлюсь не предоставлять доступ sudo, если у меня нет другого выбора. В идеале они просто запустят оболочный скрипт, который выполняет docker run, и у них не будет доступа к правам, чтобы упростить дальнейшее управление правами пользователей.
Тем более это верно для группы docker. Это слишком мощная группа, чтобы добавлять туда всех моих пользователей.
Возможно ли сделать так, чтобы сам оболочный скрипт мог выполнять docker run, не предоставляя возможность делать это пользователю?
Ответ или решение
Вопрос, который вы поднимаете, касается безопасности и управления доступом в экосистеме Docker. В частности, вы хотите позволить пользователям запускать контейнеры без предоставления им привилегий sudo или членства в группе docker. Это довольно сложная задача, однако существуют некоторые подходы, которые могут помочь в решении этой проблемы.
1. Использование sudo
с ограничениями
Хотя вы хотите избежать использования sudo, один из способов обойти эту проблему — настроить sudo таким образом, чтобы ваши пользователи имели возможность запускать только определённые команды Docker. Для этого вам понадобится:
-
Открыть файл конфигурации sudo, выполнив команду:
sudo visudo
-
Добавить следующую строку, заменяя
username
на имя пользователя и указывая полный путь к команде Docker:username ALL=(ALL) NOPASSWD: /usr/bin/docker run my_docker_image
Этот подход позволит пользователям запускать конкретную команду Docker без запроса пароля и без предоставления полного доступа к другим командам.
2. Docker с помощью API или отдельных сервисов
Другим вариантом является создание RESTful API для управления Docker-контейнерами. Вы можете использовать такие инструменты как Docker Remote API или разработать собственное решение на основе фреймворков, таких как Flask или Express.js. Этот метод требует дополнительных настроек, но позволяет более гибко управлять доступом и разрешениями.
3. Контейнеризация в контейнерах
Решение, которое набирает популярность, — это запуск контейнеров внутри других контейнеров (Nested Docker). Однако это также требует предоставления определённых разрешений, поэтому стоит рассмотреть применение совместимость с инструментами вроде gVisor
или Kata Containers
, которые обеспечивают большую безопасность.
4. Ansible или другие системы автоматизации
Для исполнения команд Docker без необходимости предоставления прав пользователям, вы можете использовать системы автоматизации, такие как Ansible. Создайте плейбук Ansible, который будет управлять запуском ваших контейнеров. Тогда пользователи могут запускать Ansible-скрипты без непосредственного доступа к Docker.
Заключение
Ваша задача заключается в нахождении баланса между удобством использования и безопасностью. Все предложенные подходы требуют определённой степени настройки и проверки на безопасность. Однако, мы рекомендуем избегать предоставления членства в группе docker, поскольку это может создавать большие риски для безопасности. В конечном счёте, использование ограниченных прав через sudo, REST API или Ansible может помочь вам достичь нужной цели без лишних компромиссов.
Если у вас есть дополнительные вопросы или требуется помощь в реализации одного из предложенных методов, не стесняйтесь обращаться!