Tots els processos del contenidor s'executaran com a usuari root, tret que ho especifiqueu d'una manera especial. Això sembla molt convenient, perquè aquest usuari no té restriccions. És per això que treballar com a root és incorrecte des del punt de vista de la seguretat. Si ningú en el seu bon judici treballa a l'ordinador local amb drets d'arrel, molts executen processos amb root als contenidors.
Sempre hi ha errors que permetran que el programari maliciós escapi del contenidor i entri a l'ordinador amfitrió. Suposant el pitjor, hem d'assegurar-nos que els processos dins del contenidor els executa un usuari que no té cap dret a la màquina host.
Creació d'usuaris
Crear un usuari en un contenidor no és diferent de crear-lo en distribucions de Linux. Tanmateix, les ordres poden variar per a diferents imatges base.
Per a les distribucions basades en Debian, heu d'afegir el següent al fitxer Dockerfile:
RUN groupadd --gid 2000 node
&& useradd --uid 2000 --gid node --shell /bin/bash --create-home node
Per alpí:
RUN addgroup -g 2000 node
&& adduser -u 2000 -G node -s /bin/sh -D node
Execució de processos des de l'usuari
Per executar tots els processos posteriors com a usuari amb UID 2000, executeu:
USER 2000
Per executar tots els processos posteriors com a usuari del node, executeu:
USER node
Més informació a
Volums de muntatge
Quan munteu volums dins d'un contenidor, proporcioneu a l'usuari la possibilitat de llegir i/o escriure fitxers. Per fer-ho, l'UID (GID) de l'usuari del contenidor i l'usuari de fora del contenidor que tingui els permisos adequats per accedir al fitxer han de coincidir. En aquest cas, els noms d'usuari no tenen importància.
Sovint, en un ordinador Linux, l'UID i el GID d'un usuari són iguals a 1000. Aquests identificadors s'assignen al primer usuari de l'ordinador.
Esbrinar els vostres identificadors és fàcil:
id
Rebràs informació completa sobre el teu usuari.
Substituïu 2000 dels exemples pel vostre identificador i tot anirà bé.
Assignació d'un UID i GID a un usuari
Si l'usuari s'ha creat anteriorment, però necessiteu canviar els identificadors, podeu fer-ho així:
RUN usermod -u 1000 node
&& groupmod -g 1000 node
Si utilitzeu la imatge base alpina, heu d'instal·lar el paquet shadow:
RUN apk add —no-cache shadow
Passar l'identificador d'usuari dins del contenidor en crear la imatge
Si el vostre identificador i els identificadors de totes les persones que treballen en el projecte coincideixen, només heu d'especificar aquest identificador al fitxer Dockerfile. Tanmateix, sovint els ID d'usuari no coincideixen.
Com aconseguir el que voleu no està clar immediatament. Per a mi, això va ser el més difícil en el procés de dominar Docker. Molts usuaris de Docker no s'adonen que hi ha diferents etapes en la vida d'una imatge. Primer, la imatge s'assembla amb un Dockerfile. Quan s'executa un contenidor des d'una imatge, el Dockerfile ja no s'utilitza.
La creació de l'usuari s'ha de produir quan es construeix la imatge. El mateix s'aplica per determinar l'usuari sota el qual s'inicien els processos. Això vol dir que d'alguna manera hem de passar l'UID (GID) dins del contenidor.
Les directives s'utilitzen per utilitzar variables externes al Dockerfile
Dockerfile
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node
&& groupmod -g $GID node
Podeu passar arguments mitjançant docker-compose així:
docker-compose
build:
context: ./src/backend
args:
UID: 1000
GID: 1000
PS Per dominar totes les complexitats de Docker, no n'hi ha prou amb llegir la documentació o els articles. Necessites practicar molt, has de tenir una idea de Docker.
Font: www.habr.com