Hvordan kan jeg bruke docker uten sudo?

På Dockers dokumentasjonssider vises alle eksempelkommandoer uten sudo, som denne:

docker ps

På Ubuntu heter den binære filen docker.io. Det fungerer heller ikke uten sudo:

sudo docker.io ps

Hvordan kan jeg konfigurere Docker slik at jeg ikke trenger å prefikse hver Docker-kommando med sudo?

Løsning

Gode nyheter: den nye docker (versjon 19.03 (for tiden eksperimentell)) vil kunne kjøre rootless og negere problemene som kan oppstå ved bruk av en root-bruker. Ikke mer rot med forhøyede tillatelser, root og alt som kan åpne maskinen din når du ikke vil.

Video om dette fra [DockerCon 2019] Hardening Docker daemon med Rootless-modus

Noen få advarsler til den rotløse Docker-modusen

Docker-ingeniører sier at den rotløse modusen ikke kan betraktes som en erstatning for den komplette pakken med Docker-motorfunksjoner. Noen begrensninger for den rotløse modusen inkluderer:

  • cgroups ressurskontroller, apparmor sikkerhetsprofiler, sjekkpunkt / gjenoppretting, overleggsnettverk etc. fungerer ikke i rotløs modus.
  • Eksponering av porter fra containere krever for øyeblikket manuell socat-hjelpeprosess.
  • Bare Ubuntu-baserte distroer støtter overlay-filsystemer i rotløs modus.
  • Rootless-modus er for øyeblikket bare tilgjengelig for nattlige bygg som kanskje ikke er så stabile som du er vant til.

Fra og med docker 19.3 er dette foreldet (og farligere enn nødvendig):

docker-manualen har dette å si om det:

Giving non-root access (Gi ikke-rot-tilgang)

Docker-demonen kjører alltid som root-brukeren, og siden Docker versjon 0.5.2 binder docker-demonen seg til en Unix-socket i stedet for en TCP-port. Som standard eies denne Unix-kontakten av brukeren root, og du kan derfor som standard få tilgang til den med sudo.

Fra og med versjon 0.5.3, hvis du (eller Docker-installatøren) oppretter en Unix-gruppe kalt docker og legger til brukere i den, vil docker-demonen gjøre eierskapet til Unix-sokkelen lesbar / skrivbar av docker-gruppen når demonen starter. Docker-demonen må alltid kjøre som root-bruker, men hvis du kjører docker-klienten som en bruker i docker-gruppen, trenger du ikke å legge til sudo i alle klientkommandoene. Fra og med 0.9.0 kan du spesifisere at en annen gruppe enn docker skal eie Unix-kontakten med alternativet -G.

Advarsel: Docker-gruppen (eller gruppen spesifisert med -G) er root-ekvivalent; se Docker Daemon Attack Surface-detaljer og dette blogginnlegget på Hvorfor vi ikke lar ikke-rotbrukere kjøre Docker i CentOS, Fedora eller RHEL (takk michael-n).

I den nylige utgivelsen av eksperimentell rootless-modus på GitHub, ingeniører nevner rootless-modus tillater å kjøre dockerd som en uprivilegert bruker, ved hjelp av user_namespaces(7), mount_namespaces(7), network_namespaces(7).

Brukere må kjøre dockerd-rootless.sh i stedet for dockerd.

$ dockerd-rootless.sh --eksperimentell

Ettersom Rootless-modus er eksperimentell, må brukerne alltid kjøre dockerd-rootless.sh med -experimental.


Viktig å lese: trinn etter installasjon for Linux (det lenker også til Docker Daemon Attack Surface-detaljer).

Administrer Docker som en ikke-root-bruker .

Docker-demonen binder seg til en Unix-socket i stedet for en TCP-port. Som standard eies Unix-kontakten av brukeren root, og andre brukere kan bare få tilgang til den ved hjelp av sudo. Docker-demonen kjører alltid som root-bruker.

Hvis du ikke vil bruke sudo når du bruker docker-kommandoen, oppretter du en Unix-gruppe som heter docker og legger til brukere i den. Når docker-demonen starter, gjør den eierskapet til Unix-kontakten lesbar / skrivbar av docker-gruppen.


  • Legg til docker-gruppen hvis den ikke allerede eksisterer:

     sudo groupadd docker
  • Legg til den tilkoblede brukeren "$USER" i docker-gruppen. Endre brukernavnet slik at det samsvarer med din foretrukne bruker hvis du ikke vil bruke din nåværende bruker:

     sudo gpasswd -a $USER docker
  • Gjør enten en newgrp docker eller logg ut / inn for å aktivere endringene i grupper.

  • Du kan bruke

     docker run hello-world

    for å sjekke om du kan kjøre docker uten sudo.

Kommentarer (22)

For å kjøre docker-kommandoen uten sudo, må du legge til brukeren din (som har root-rettigheter) i docker-gruppen. For dette kjører du følgende kommando:

 sudo usermod -aG docker $USER

La brukeren logge ut og deretter logge inn igjen. Denne løsningen er godt forklart her med riktig installasjonsprosess.

Kommentarer (6)

Mekanismen for å legge til en bruker i gruppen docker gir tillatelse til å kjøre docker er å få tilgang til sokkelen til docker på /var/run/docker.sock. Hvis filsystemet som inneholder /var/run er montert med ACL-er aktivert, kan dette også oppnås via ACL-er.

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

Jeg tar bare med dette for fullstendighetens skyld.

Generelt anbefaler jeg å unngå ACL-er når et godt alternativ basert på grupper er tilgjengelig: Det er bedre hvis rettighetene i et system kan forstås bare ved å se på gruppemedlemskap. Å måtte skanne filsystemet for ACL-oppføringer for å forstå systemprivilegier er en ekstra byrde for sikkerhetsrevisjoner.

Advarsel 1: Dette har samme root-ekvivalens som å legge til username i docker-gruppen. Du kan fortsatt starte en container på en måte som har root-tilgang til vertsfilsystemet.

Advarsel 2: ACL-er er betydelig vanskeligere for sikkerhetsrevisjoner enn gruppebasert sikkerhet. Unngå sannsynligvis ACL-er hvis det er mulig når du kan bruke grupper i stedet, i det minste i revisjonsrelevante miljøer.

Kommentarer (7)