Как я могу использовать Docker без sudo?

Вопрос или проблема

На страницах документации Docker все примерные команды показаны без sudo, как эта:

docker ps

На Ubuntu бинарный файл называется docker.io. Он также не работает без sudo:

sudo docker.io ps

Как я могу настроить Docker так, чтобы не нужно было добавлять sudo к каждой команде Docker?

Хорошая новость: новая версия Docker 19.03 (в настоящее время экспериментальная) будет способна работать без прав суперпользователя, устраняя проблемы, которые могут возникнуть при использовании пользователя root. Больше не нужно возиться с повышенными правами, root и тем, что может открыть ваш компьютер, когда вы этого не хотите.

Видео об этом от [DockerCon 2019] Укрепление демона Docker с помощью безкорневого режима

Несколько предупреждений о безкорневом режиме Docker

Инженеры Docker заявляют, что безкорневой режим нельзя считать заменой полного набора функций движка Docker. Некоторые ограничения безкорневого режима включают:

  • контроль ресурсов cgroups, профили безопасности apparmor, контрольная точка/восстановление, оверлейные сети и т. д. не работают в безкорневом режиме.
  • Выделение портов из контейнеров в настоящее время требует ручного процесса помощи socat.
  • Только дистрибутивы на базе Ubuntu поддерживают оверлейные файловые системы в безкорневом режиме.
  • Безкорневой режим в настоящее время предоставляется только для ночных сборок, которые могут быть менее стабильными, чем вы привыкли.

На данный момент это устарело (и более опасно, чем нужно):

В руководстве по Docker сказано следующее:

Предоставление доступа без прав суперпользователя

Демон Docker всегда работает от имени пользователя root, и с версии Docker 0.5.2 демон Docker связывается с Unix-сокетом вместо TCP-порта. По умолчанию этот Unix-сокет принадлежит пользователю root, и поэтому по умолчанию вы можете получить к нему доступ с помощью sudo.

Начиная с версии 0.5.3, если вы (или ваш установщик Docker) создадите Unix-группу с названием docker и добавите в нее пользователей, то демон Docker сделает сокет Unix доступным для записи/чтения группой docker при старте демона. Демон Docker всегда должен работать от имени пользователя root, но если вы запускаете клиент Docker от имени пользователя в группе docker, то вам не нужно добавлять sudo к каждой команде клиента. Начиная с 0.9.0, вы можете указать, что группа, отличная от docker, должна владеть сокетом Unix с помощью опции -G.

Предупреждение: Группа docker (или группа, указанная с помощью -G) эквивалентна root; смотрите подробности о поверхности атаки демона Docker и этот блог о почему мы не позволяем пользователям без прав суперпользователя запускать Docker в CentOS, Fedora или RHEL (спасибо michael-n).

В последнем релизе экспериментального безкорневого режима на GitHub инженеры упоминают, что безкорневой режим позволяет запускать dockerd как непривилегированного пользователя, используя user_namespaces(7), mount_namespaces(7), network_namespaces(7).

Пользователи должны запускать dockerd-rootless.sh вместо dockerd.

$ dockerd-rootless.sh --experimental

Так как безкорневой режим является экспериментальным, пользователи всегда должны запускать dockerd-rootless.sh с –experimental.


Важная информация для чтения: послеустановочные шаги для Linux (также содержит ссылку на подробности о поверхности атаки демона Docker).

Управление Docker как пользователем без прав суперпользователя

Демон Docker связывается с Unix-сокетом вместо TCP-порта. По умолчанию этот Unix-сокет принадлежит пользователю root, и другие пользователи могут получить к нему доступ только с помощью sudo. Демон Docker всегда работает от имени пользователя root.

Если вы не хотите использовать sudo при использовании команды docker, создайте Unix-группу с названием docker и добавьте в нее пользователей. Когда демон Docker запускается, он делает сокет Unix доступным для записи/чтения группой docker.


  • Добавьте группу docker, если она еще не существует:

     sudo groupadd docker
    
  • Добавьте подключенного пользователя “$USER” в группу docker. Измените имя пользователя на свое предпочтительное, если не хотите использовать текущего пользователя:

     sudo gpasswd -a $USER docker
    
  • Либо выполните newgrp docker, либо выйдите из системы и войдите снова, чтобы активировать изменения в группах.

  • Вы можете использовать

     docker run hello-world
    

    чтобы проверить, можете ли вы запустить Docker без sudo.

Чтобы запускать команды docker без sudo, вам нужно добавить своего пользователя (у которого есть права суперпользователя) в группу docker. Для этого выполните следующую команду:

 sudo usermod -aG docker $USER

Теперь пусть пользователь выйдет, а затем снова войдет в систему. Это решение хорошо объясняется здесь с подробной информацией о процессе установки.

Механизм, с помощью которого добавление пользователя в группу docker предоставляет разрешение на запуск docker, заключается в получении доступа к сокету Docker по адресу /var/run/docker.sock. Если файловая система, содержащая /var/run, была смонтирована с включенными ACL, это также можно достичь через ACL.

sudo setfacl -m user:$USER:rw /var/run/docker.sock

Я включаю это только для полноты картины.

В целом, я рекомендую избегать ACL, когда доступна хорошая альтернатива на основе групп: лучше, если привилегии в системе можно понять, взглянув только на членство в группах. Необходимость сканировать файловую систему на наличие записей ACL, чтобы понять системные привилегии, является дополнительной нагрузкой для аудита безопасности.

Предупреждение 1: Это имеет такое же root эквивалент, как и добавление $USER в группу docker. Вы все равно можете запустить контейнер таким образом, что он имеет root доступ к файловой системе хоста.

Предупреждение 2: ACL значительно сложнее для аудита безопасности, чем безопасность на основе групп. Вероятно, стоит избегать ACL, если это возможно, когда вы можете использовать группы вместо этого, по крайней мере в средах, имеющих отношение к аудиту.

Создав группу docker и добавив моего пользователя в нее с помощью

sudo groupadd docker
sudo usermod -aG docker $USER

… мне все равно пришлось предоставить сокету /var/run/docker.sock и директории /var/run/docker соответствующие разрешения, чтобы все работало:

sudo chown root:docker /var/run/docker.sock
sudo chown -R root:docker /var/run/docker

Выйдите из системы и войдите снова (с этим пользователем), тогда вы сможете запускать команды docker без sudo:

docker run hello-world

Кстати: Это было исправлено в Ubuntu 21.10 и необходимо только для версий Ubuntu ниже этой.
Обновление 2024-12-11: Похоже, что это проблема снова с новыми версиями Ubuntu (согласно @overbyte – смотрите комментарий).

Контейнеры Docker должны запускаться суперпользователем. Вы можете добавить себя в группу docker (например, запустив sudo usermod -aG docker $USER), но это дает возможность любому, у кого есть доступ к аккаунту $USER, получить root-доступ к машине (например, смонтировав корневой том в привилегированном контейнере).

Более безопасный способ запуска контейнеров Docker от имени пользователя без прав суперпользователя – это использовать Podman. С его сайта:

Podman – это контейнерный движок без демона для разработки, управления и запуска OCI контейнеров на вашей системе Linux. Контейнеры могут запускаться либо от имени root, либо в безкорневом режиме. Проще говоря: alias docker=podman.

Другой альтернативой является Singularity, который чаще всего используется в средах HPC.

Ответ или решение

Для использования Docker без префикса sudo в операционной системе Ubuntu необходимо выполнить несколько шагов, которые относятся как к конфигурации пользователя, так и к установке Docker. В большинстве случаев проблема заключается в правах доступа к сокету Docker, который по умолчанию доступен только пользователю root. В этой статье мы рассмотрим, как настроить Docker для работы без sudo, а также обсудим некоторые ограничения и альтернативы.

Шаги для настройки Docker без sudo

  1. Создание группы Docker: Убедитесь, что группа docker существует на вашей системе. Это можно сделать с помощью команды:

    sudo groupadd docker

    Если группа уже существует, эта команда не вызовет ошибки.

  2. Добавление пользователя в группу:
    Чтобы ваш пользователь мог выполнять команды Docker без sudo, добавьте его в группу docker:

    sudo usermod -aG docker $USER

    Эта команда добавляет текущего пользователя ($USER) в группу docker.

  3. Активирование изменений: После внесения изменений в группы необходимо выйти из учетной записи пользователя и войти снова, чтобы изменения вступили в силу. Альтернативно, можно выполнить команду:

    newgrp docker

    Обратите внимание, что не всегда все изменения вступают в силу без перезагрузки терминала.

  4. Проверка работы Docker: После выполнения вышеуказанных команд проверьте, сможете ли вы выполнять команды Docker без sudo:

    docker run hello-world

Альтернативные методы

  • Использование ACL (Access Control Lists): В некоторых случаях возможно использовать ACL для предоставления прав доступа к сокету Docker:

    sudo setfacl -m user:$USER:rw /var/run/docker.sock

    Однако важно помнить, что это решение может усложнить аудит безопасности системы.

  • Проверка прав на сокет Docker: Если по-прежнему возникают проблемы, возможно, вам потребуется изменить собственника сокета:

    sudo chown root:docker /var/run/docker.sock

Важно помнить о безопасности

Добавление пользователя в группу docker предоставляет пользователю доступ к правам root, так как любой пользователь этой группы может управлять контейнерами Docker, что может предоставить возможность выполнить команды с правами суперпользователя. Следовательно, будьте осторожны с тем, кто имеет доступ к вашей системе и кому вы предоставляете права на использование Docker.

Альтернативы Docker

Для тех, кто ищет более безопасные способы управления контейнерами, рекомендуется рассмотреть другие инструменты, такие как Podman или Singularity. Эти инструменты предлагают функции работы с контейнерами в "безрутовом" режиме и могут быть хорошей альтернативой Docker, особенно в окружениях, где безопасность имеет критическое значение.

Заключение

Настройка Docker для работы без sudo требует добавления пользователя в группу docker и, возможно, некоторых дополнительных настроек прав доступа. Обязательно учитывайте меры безопасности, чтобы минимизировать риски, связанные с управлением контейнерами. При необходимости оценки безопасности рассмотрите альтернативные решения, такие как Podman или Singularity.

Оцените материал
Добавить комментарий

Капча загружается...