Jak korzystać z dokera bez sudo?

767

Na stronach dokumentacji Dockera wszystkie przykładowe polecenia są pokazane bez sudo, jak na przykład:

docker ps

W Ubuntu plik binarny jest nazywany docker.io. Nie działa również bez sudo:

sudo docker.io ps

Jak skonfigurować Docker, aby nie trzeba było poprzedzać każdego polecenia Docker poleceniem sudo?

Flimm
źródło
1
Nie zapomnij włączyć ufw;)
Rinzwind
2
Na Ubuntu 14.04 jest także plik binarny „docker”.
anatoly techtonik
@anatolytechtonik Użyłem również „docker” zamiast „docker.io” w Ubuntu 14.04 LTS
Nabin
2
Zalecana instalacja nie jest dokerem w domyślnych repozytoriach Ubuntu; zamiast tego instrukcje tutaj ( docs.docker.com/engine/installation/linux/ubuntulinux ) zalecają użycie repozytorium dokera . Usuń wszystkie istniejące elementy dokera i sprawdź, czy otrzymujesz ten z właściwego źródła: apt-cache policy docker-engine(adres URL powinien pochodzić z dockerproject.org)
michael
2
A co z aliasem :? W ten sposób nadal używasz sudo z ochroną hasłem. alias docker = "sudo
docker

Odpowiedzi:

1136

Dobra wiadomość: nowy doker (wersja 19.03 (obecnie w fazie eksperymentalnej)) będzie mógł uruchamiać się bez rootowania, negując problemy, które mogą wystąpić przy użyciu użytkownika root. Nigdy więcej bałaganu z podwyższonymi uprawnieniami, rootowania i wszystkiego, co może otworzyć twoją maszynę, gdy nie chcesz.

Film na ten temat z [DockerCon 2019] Hardening Docker Daemon w trybie Rootless

Kilka ostrzeżeń do trybu rootera Docker

Inżynierowie Docker twierdzą, że tryb rootowania nie może być uważany za zamiennik pełnego zestawu funkcji silnika Docker. Niektóre ograniczenia trybu bez rootowania obejmują:

  • cgroups kontrola zasobów, profile bezpieczeństwa apparmor, punkty kontrolne / przywracanie, sieci nakładek itp. nie działają w trybie rootowania.
  • Odsłonięcie portów z kontenerów wymaga obecnie ręcznego procesu pomocnika socat.
  • Tylko dystrybucje oparte na Ubuntu obsługują systemy plików nakładek w trybie bez rootowania.
  • Tryb rootowania jest obecnie dostępny tylko dla kompilacji nocnych, które mogą nie być tak stabilne, jak zwykle.

Od wersji dokowanej 19.3 jest to przestarzałe (i bardziej niebezpieczne niż to konieczne):

W instrukcji dokera można to powiedzieć:

Udzielanie dostępu innego niż root

Demon dokera zawsze działa jako użytkownik root, a od wersji Docker 0.5.2 demon dokera wiąże się z gniazdem Unix zamiast z portem TCP. Domyślnie gniazdo uniksowe jest własnością użytkownika root, więc domyślnie można uzyskać do niego dostęp za pomocą sudo.

Począwszy od wersji 0.5.3, jeśli Ty (lub Twój instalator Docker) utworzysz grupę Unix o nazwie docker i dodasz do niej użytkowników, demon dokera sprawi, że własność gniazda Unix zostanie odczytana / zapisana przez grupę dokerów podczas uruchamiania demona . Demon dokera musi zawsze działać jako użytkownik root, ale jeśli uruchamiasz klienta dokera jako użytkownik w grupie dokerów, nie musisz dodawać sudo do wszystkich poleceń klienta. Od wersji 0.9.0 możesz określić, że grupa inna niż doker powinna mieć gniazdo Unix za pomocą opcji -G.

Ostrzeżenie: Grupa dokerów (lub grupa określona przez -G) jest równoważna z rootem; zobacz szczegóły Docker Daemon Attack Surface i ten post na blogu: Dlaczego nie pozwalamy użytkownikom innym niż root uruchamiać Dockera w CentOS, Fedorze lub RHEL (dzięki michael-n).

W najnowszej wersji eksperymentalnego trybu bez rootowania na GitHub inżynierowie wspominają, że tryb bez rootowania pozwala na uruchamianie dockerd jako nieuprzywilejowanego użytkownika, używając user_namespaces (7), mount_namespaces (7), network_namespaces (7).

Użytkownicy muszą uruchomić dockerd-rootless.sh zamiast dockerd.

$ dockerd-rootless.sh --experimental

Ponieważ tryb rootowania jest eksperymentalny, użytkownicy muszą zawsze uruchamiać dockerd-rootless.sh z opcją –experimental.


Ważne do przeczytania: kroki poinstalacyjne dla systemu Linux (zawiera także szczegółowe informacje na temat powierzchni Docker Daemon Attack Surface ).

Zarządzaj Dockerem jako użytkownik inny niż root

Demon dokera wiąże się z gniazdem Unix zamiast z portem TCP. Domyślnie gniazdo Unix jest własnością użytkownika root, a inni użytkownicy mogą uzyskać do niego dostęp tylko za pomocą sudo. Demon dokera zawsze działa jako użytkownik root.

Jeśli nie chcesz używać sudo podczas korzystania z polecenia dokera, utwórz grupę uniksową o nazwie doker i dodaj do niej użytkowników. Po uruchomieniu demona dokera powoduje, że własność gniazda Unix jest odczytywana / zapisywana przez grupę dokerów.


  • Dodaj grupę dokerów, jeśli jeszcze nie istnieje:

    sudo groupadd docker
    
  • Dodaj podłączonego użytkownika „$ USER” do grupy dokerów. Zmień nazwę użytkownika, aby pasowała do preferowanego użytkownika, jeśli nie chcesz korzystać z bieżącego użytkownika:

    sudo gpasswd -a $USER docker
    
  • Wykonaj a newgrp dockerlub wyloguj się / zaloguj, aby aktywować zmiany w grupach.

  • Możesz użyć

    docker run hello-world
    

    aby sprawdzić, czy możesz uruchomić dokera bez sudo.

Rinzwind
źródło
3
Tak, ale każdy uprzywilejowany proces otwiera potencjał do wykorzystania. Czy doker zaczepia się tak głęboko w systemie operacyjnym, aby naprawdę wprowadzić taki poziom uprawnień?
mat.
3
newgrp dockernie działało dla mnie, musiałem się wylogować.
Lolmaus - Andrey Mikhaylov
43
Warto zauważyć, że daje to użytkownikowi nieograniczony dostęp do roota bez ochrony hasłem . Zobacz szczegóły podatności tutaj
Chris Foster
2
NIE musisz ponownie uruchamiać demona dokera, aby ta zmiana miała miejsce !! po prostu dodaj użytkownika, który właśnie dodałeś, wyloguj się, a następnie zaloguj ponownie
Tommy
4
jeśli używasz docker login, może się okazać, że .dockerfolder utworzony w folderze domowym należy do root. w ten sposób będzie można spotkać tego ostrzeżenia podczas uruchamiania poleceń Döcker: WARNING: Error loading config file:/home/myuser/.docker/config.json - stat /home/myuser/.docker/config.json: permission denied. Zrobiłem autora .dockerFolder dostępny bez sudo tak: sudo chgrp -hR docker ~/.docker && sudo chown -R myuser ~/.docker. chgrpnie wydaje się, aby pomóc choć, więc prawdopodobnie mam tylko polecić chown krok.
Birchlabs,
202

Aby uruchomić polecenie dokera bez sudo, musisz dodać użytkownika (który ma uprawnienia roota) do grupy dokerów. W tym celu uruchom następujące polecenie:

 sudo usermod -aG docker $USER

Teraz wyloguj się, a następnie zaloguj ponownie. Takie rozwiązanie jest dobrze wyjaśnione tutaj z właściwego procesu instalacji.

Rohini Choudhary
źródło
14
po dodaniu użytkownika do grupy uruchom następującą komendę: sg nazwa_grupy -c "bash"
madjardi
4
nie trzeba ponownie uruchamiać systemu operacyjnego, aby ta zmiana miała miejsce! To zbombarduje wszystkie działające kontenery! Wystarczy, że dodany użytkownik wyloguje się, a następnie zaloguje.
Tommy
5
Czym różni się to polecenie od „sudo gpasswd -a $ {USER} doker” w innej odpowiedzi? Jeśli w ogóle ...
Ashley Aitken
9
Czy możesz dodać ostrzeżenie wydane przez dokumentację: „Grupa dokerów [...] jest równoważna z rootem”, więc ludzie mają szansę się nad tym
zastanowić
2
Ten sam efekt, co 2 lata starsza zaakceptowana odpowiedź, ale bez ostrzeżeń o zagrożeniach bezpieczeństwa
Gert van den Berg
56

Mechanizmem, za pomocą którego dodanie użytkownika do grupy dockerdaje uprawnienia do uruchomienia okna dokowanego, jest uzyskanie dostępu do gniazda okna dokowanego /var/run/docker.sock. Jeśli system plików, który zawiera /var/run, został podłączony z włączonymi listami ACL, można to również osiągnąć za pomocą list ACL.

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

Podaję to tylko dla kompletności.

Zasadniczo zalecam unikanie list ACL, gdy dostępna jest dobra alternatywa oparta na grupach: Lepiej, jeśli uprawnienia w systemie można zrozumieć, patrząc tylko na członkostwo w grupie. Konieczność skanowania systemu plików w poszukiwaniu wpisów ACL w celu zrozumienia uprawnień systemowych stanowi dodatkowe obciążenie dla audytów bezpieczeństwa.

Ostrzeżenie 1 : ma taką samą rootrównoważność jak dodawanie usernamedo dockergrupy. Nadal możesz uruchomić kontener w sposób, który ma rootdostęp do systemu plików hosta.

Ostrzeżenie 2 : Listy kontroli dostępu są znacznie trudniejsze dla audytów bezpieczeństwa niż zabezpieczenia grupowe. Prawdopodobnie unikaj list ACL, jeśli to możliwe, jeśli możesz zamiast tego używać grup, przynajmniej w środowiskach związanych z audytem.

Christian Hujer
źródło
5
Działa 16.04
edib
Właśnie tego potrzebowałem, inne odpowiedzi wymagają od użytkownika uprawnień roota. Dzięki, zrób wiele!
Mrinal Saurabh
1
Imo lepszy sposób. Okno dokowane grupy jest ekwiwalentem roota i zawsze oznacza to niebezpieczeństwo. I nie widzę żadnej wady przejęcia na własność tego jednego pliku.
Xerus
5
@ Xerus, jeśli dobrze rozumiem, każdy , kto może pisać do tego gniazda, może również uzyskać uprawnienia równoważne z uprawnieniami administratora . Tak więc udzielenie komuś dostępu do tego gniazda przez ACL ma taki sam efekt bezpieczeństwa, jak dodanie tej osoby do grupy dokerów.
Paŭlo Ebermann
1
Pracowałem dla Linux Mint 19 dla mnie. Dzięki.
Jesteśmy Borg,