Як я можу використовувати докер без судо?


767

На сторінках документації Докера всі приклади команд відображаються без такої sudo, як ця:

docker ps

У Ubuntu двійковий називається docker.io. Без судо це також не працює:

sudo docker.io ps

Як я можу налаштувати Docker так, що мені не потрібно префіксувати кожну команду Docker за допомогою sudo?


1
Не забудьте включити ufw;)
Rinzwind

2
На Ubuntu 14.04 також є двійковий файл 'docker'.
anatoly techtonik

@anatolytechtonik Я також використовував 'docker' замість 'docker.io' в Ubuntu 14.04 LTS
Nabin

2
Рекомендована установка - це не докер у стандартних репортах ubuntu; натомість тут інструкції ( docs.docker.com/engine/installation/linux/ubuntulinux ) рекомендують використовувати docker repo. Видаліть усі наявні докерські речі та переконайтеся, що отримуєте потрібний джерело: apt-cache policy docker-engine(apt URL має бути з dockerproject.org)
michael

2
Як щодо псевдоніма:? Таким чином, ви все ще використовуєте sudo, захищаючи пароль. alias docker = "sudo docker"
Андрій Пандков

Відповіді:


1137

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

Відео про це з [DockerCon 2019] Загартовування демона Докера в режимі без корів

Кілька застережень до безкорисного режиму Докера

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

  • Контроль ресурсів для груп, профілі безпеки apparmor, контрольно-пропускний пункт / відновлення, накладення мереж тощо не працюють у режимі без корів.
  • Розкриття портів з контейнерів вимагає вручну помічників вручну.
  • Лише дистрибуції на основі Ubuntu підтримують файлові системи накладень у режимі без корінь.
  • Режим без корінь наразі передбачений лише для нічних збірок, які можуть бути не настільки стабільними, як ви звикли.

Станом на docker 19.3 це застаріло (і небезпечніше, ніж потрібно):

У посібнику докера про це сказано:

Надання некореневого доступу

Демон докера завжди працює як користувач root, а оскільки версія Docker 0.5.2, демон докера прив'язується до сокета Unix замість порту TCP. За замовчуванням Unix-сокет належить користувальницьким корінцем, і, за замовчуванням, ви можете отримати доступ до нього за допомогою sudo.

Починаючи з версії 0.5.3, якщо ви (або ваш інсталятор Docker) створили групу Unix під назвою docker і додаєте до неї користувачів, демон демон докера зробить право власності на сокет Unix зчитувати / записувати групою docker, коли демон запускається . Демон докера завжди повинен працювати як користувач root, але якщо ви запускаєте докер-клієнт як користувач у групі докер, то вам не потрібно додавати sudo до всіх команд клієнта. Починаючи з 0,9.0, ви можете вказати, що група, яка не є докером, повинна володіти гніздом Unix з опцією -G.

Попередження: група докера (або група, вказана з -G), є кореневою еквівалентом; перегляньте деталі Docker Daemon Attack Surface та цей поштовий блог на тему Чому ми не дозволяємо користувачам, що не входять до програми, запускати Docker у CentOS, Fedora чи RHEL (спасибі michael-n).

В останньому випуску експериментального режиму без корінь на GitHub інженери згадують режим без корінь, який дозволяє запускати dockerd як непривілейований користувач, використовуючи користувацькі простори імен (7), простори mount_names (7), простори мережі імен (7).

Користувачам потрібно запустити dockerd-rootless.sh замість dockerd.

$ dockerd-rootless.sh --experimental

Оскільки режим Rootless експериментальний, користувачам потрібно завжди запускати dockerd-rootless.sh за допомогою –experimental.


Важливо прочитати: кроки після встановлення для Linux (він також посилається на деталі Docker Daemon Attack Surface ).

Керуйте Docker як некористувацький користувач

Демон докера прив'язується до сокета Unix замість порту TCP. За замовчуванням Unix-сокет належить користувачу root, а інші користувачі можуть отримати доступ до нього лише за допомогою sudo. Демон докера завжди працює як користувач root.

Якщо ви не хочете використовувати sudo під час використання команди docker, створіть групу Unix під назвою docker і додайте до неї користувачів. Коли запускається демон докера, він робить право власності на сокет Unix читати / записувати групою докер.


  • Додайте групу докерів, якщо вона ще не існує:

    sudo groupadd docker
    
  • Додайте підключеного користувача "$ USER" до групи докерів. Змініть ім’я користувача, щоб відповідати бажаному користувачеві, якщо ви не хочете використовувати свого поточного користувача:

    sudo gpasswd -a $USER docker
    
  • Або newgrp dockerактивуйте або вийдіть із системи, щоб активувати зміни в групах.

  • Можна використовувати

    docker run hello-world
    

    щоб перевірити, чи можна запускати докер без судо.


3
Так, але кожен привілейований процес відкриває потенціал для експлуатації. Чи докер підключається так глибоко в операційну систему, щоб дійсно мандат цього рівня привілеїв?
мат

3
newgrp dockerне працювало для мене, мені довелося вийти.
lolmaus - Андрій Михайлов

43
Варто зазначити, що це дає користувачеві необмежений, захищений паролем кореневий доступ . Деталі про вразливість див. Тут
Кріс Фостер,

2
вам не потрібно перезапускати демон-докер, щоб ця зміна відбулася !! просто у користувача, який ви тільки що додали, вийдіть, а потім знову
Tommy

4
якщо ви використовуєте docker login, ви можете виявити, що .dockerпапка, створена у вашій домашній папці, належить root. Таким чином , ви зіткнулися б це попередження при виконанні команд Docker: WARNING: Error loading config file:/home/myuser/.docker/config.json - stat /home/myuser/.docker/config.json: permission denied. Я зробив мій профіль .dockerпапки доступні без Судо так: sudo chgrp -hR docker ~/.docker && sudo chown -R myuser ~/.docker. chgrpне схожий , щоб допомогти , хоча, так що, ймовірно , я повинен рекомендувати тільки CHOWN крок.
Birchlabs

202

Щоб запустити команду docker без цього sudo, потрібно додати свого користувача (який має привілеї root) до групи докер. Для цього виконайте наступну команду:

 sudo usermod -aG docker $USER

Тепер увійдіть у систему, а потім увійдіть знову. Це рішення добре пояснено тут з правильною установкою.


14
після додавання користувача до групи, запустіть цю команду: sg group_name -c "bash"
madjardi

4
вам не потрібно перезавантажувати ОС, щоб відбулася ця зміна! Це бомбить усі запущені контейнери! Просто є користувач , який ви тільки що додали вийти потім в.
Томмі

5
Чим ця команда відрізняється від "sudo gpasswd -a $ {USER} docker" в іншій відповіді? Якщо взагалі ...
Ешлі Айткен

9
Чи можете ви, будь ласка, додати попередження, яке дають документи: "Докерська група [...] еквівалентна
кореням

2
Той самий ефект, що і на 2 роки старший прийняв відповідь, але без попереджень про ризики для безпеки
Герт ван ден Берг,

57

Механізм, за допомогою якого додавання користувача до групи dockerнадає дозвіл на запуск docker, - це отримати доступ до сокета докера за адресою /var/run/docker.sock. Якщо файлова система, що містить /var/run, змонтована з включеними ACL, це також можна досягти за допомогою ACL.

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

Я включаю це лише для повноти.

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

Попередження 1 : Це має таку саму rootеквівалентність, що й додавання usernameдо dockerгрупи. Ви все ще можете запустити контейнер у спосіб, що має rootдоступ до хост-файлової системи.

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


5
Він працював на 16.04
edib

Це те, що мені було потрібно, інші відповіді вимагають від користувача права доступу до кореня. Дякую, робимо багато!
Mrinal Saurabh

1
Набагато кращий спосіб imo. Груповий докер еквівалентний кореням, і це завжди є ознакою небезпеки. І я не бачу жодних недоліків взяти право власності на цей один файл.
Xerus

5
@Xerus, якщо я правильно розумію, той , хто може записатись у цей сокет, також може отримати привілеї, котрі еквівалентні кореням . Таким чином, надання комусь доступу до цього сокета через ACL має такий самий ефект захисту, як і додавання цієї людини до докерної групи.
Paŭlo Ebermann

1
Для мене працював на Linux Mint 19. Дякую.
Ми Борг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.