Gebruiker in Docker

Andrey Kopylov, onze technische directeur, houdt ervan Docker actief te gebruiken en te promoten. In zijn nieuwe artikel legt hij uit hoe je gebruikers in Docker kunt aanmaken. Het is belangrijk om correct met hen om te gaan, waarom je gebruikers niet als root moet aanmaken, en hoe je de inconsistentie van indicatoren in Dockerfile kunt oplossen.

Alle processen in de container zullen als rootgebruiker draaien, tenzij je op een speciale manier een andere gebruiker opgeeft. Dit lijkt erg handig, want deze gebruiker heeft geen beperkingen. Daarom is het onjuist om als root te werken vanuit beveiligingsperspectief. Als niemand op een lokale computer gezond verstand gebruikt om met root-rechten te werken, starten velen processen als root in containers.

Er zijn altijd bugs die een kwaadwillende in staat stellen om uit de container te ontsnappen en op de hostcomputer te komen. Door het slechtste te veronderstellen, moeten we ervoor zorgen dat processen binnen de container worden uitgevoerd door een gebruiker zonder rechten op de hostmachine.

Gebruiker aanmaken

Het aanmaken van een gebruiker in de container verschilt niet van het aanmaken van een gebruiker in Linux-distributies. Voor verschillende basisimages kunnen de commando's echter verschillen.

Voor Debian-gebaseerde distributies moet je in de Dockerfile toevoegen:

RUN groupadd --gid 2000 node 
  && useradd --uid 2000 --gid node --shell /bin/bash --create-home node

Voor Alpine:

RUN addgroup -g 2000 node 
    && adduser -u 2000 -G node -s /bin/sh -D node

Processen uitvoeren als gebruiker

Om alle volgende processen als gebruiker met UID 2000 uit te voeren, voer je uit:

USER 2000

Om alle volgende processen als de gebruiker node uit te voeren, voer je uit:

USER node

Meer details in de documentatie.

Volumes inladen

Bij het inladen van volumes in de container, zorg ervoor dat de gebruiker de mogelijkheid heeft om bestanden te lezen en (of) te schrijven. Hiervoor moeten de UID (GID) van de gebruiker in de container en de gebruiker buiten de container, die de juiste toegangsrechten heeft tot het bestand, overeenkomen. In dit geval doen de gebruikersnamen er niet toe.

Vaak heeft een gebruiker op een Linux computer UID en GID gelijk aan 1000. Deze identificatoren worden toegekend aan de eerste gebruiker van de computer.

Je kunt eenvoudig je identificatoren achterhalen:

id

Je krijgt uitgebreide informatie over je gebruiker.
Vervang 2000 in de voorbeelden door je eigen identificatienummer en alles komt goed.

Het toekennen van UID en GID aan de gebruiker

Als de gebruiker eerder is aangemaakt, maar de identificaties moeten worden gewijzigd, kan dit als volgt:

RUN usermod -u 1000 node 
  && groupmod -g 1000 node

Als je een basis afbeelding van alpine gebruikt, moet je het shadow-pakket installeren:

RUN apk add --no-cache shadow

Het doorgeven van de gebruikersidentificatie aan de container tijdens het bouwen van de afbeelding

Als jouw identificatie en de identificaties van alle mensen die aan het project werken overeenkomen, is het voldoende om deze identificatie in de Dockerfile op te geven. Vaak komen de gebruikersidentificaties echter niet overeen.

Hoe je dit wilt bereiken is niet meteen duidelijk. Voor mij was dit het moeilijkste aspect bij het leren van Docker. Veel Docker-gebruikers denken niet na over het feit dat er verschillende fasen in het leven van een afbeelding zijn. Eerst wordt de afbeelding opgebouwd met behulp van de Dockerfile. Wanneer de container uit de afbeelding wordt gestart, wordt de Dockerfile al niet meer gebruikt.

Het aanmaken van gebruikers moet plaatsvinden tijdens het bouwen van de afbeelding. Dit geldt ook voor het definiƫren van de gebruiker waaronder processen worden uitgevoerd. Dit betekent dat we op de een of andere manier de UID (GID) in de container moeten doorgeven.

Voor het gebruik van externe variabelen in de Dockerfile worden de instructies ENV enĀ ARG. Een gedetailleerde vergelijking van de instructies here.

Dockerfile

ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node 
  && groupmod -g $GID node

Argumenten via docker-compose kunnen als volgt worden doorgegeven:

docker-compose

build:
  context: ./src/backend
  args:
    UID: 1000
    GID: 1000

P.S. Om alle geheimen van Docker te begrijpen, is het niet voldoende om documentatie of artikelen te lezen. Je moet veel oefenen en de Docker zelf voelen.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster