, 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 nodeVoor 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 2000Om alle volgende processen als de gebruiker node uit te voeren, voer je uit:
USER nodeMeer details in .
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:
idJe 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 shadowHet 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 enĀ . Een gedetailleerde vergelijking van de instructies .
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
