Усе працэсы ў кантэйнеры будуць працаваць з-пад карыстача root, калі адмысловай выявай яго не паказаць. Гэта здаецца вельмі зручна, бо ў гэтага карыстальніка няма ніякіх абмежаванняў. Менавіта таму працаваць пад рутам няправільна з пункта гледжання бяспекі. Калі на лакальным кампутары ніхто ў разумным розуме не працуе з рутавымі правамі, то шматлікія запускаюць працэсы пад рутам у кантэйнерах.
Заўсёды ёсць багі, якія дазволяць зловреду абрацца з кантэйнера і патрапіць на хаставы кампутар. Мяркуючы горшае, мы павінны забяспечыць запуск працэсаў унутры кантэйнера ад карыстальніка, які не мае ніякіх правоў на хаставой машыне.
Стварэнне карыстальніка
Стварэнне карыстальніка ў кантэйнеры не адрозніваецца ад яго стварэння ў лінуксавых дыстрыбутывах. Аднак для розных базавых выяў каманды могуць адрознівацца.
Для дыстрыбутываў заснаваных на debian у Dockerfile неабходна дадаць:
RUN groupadd --gid 2000 node
&& useradd --uid 2000 --gid node --shell /bin/bash --create-home node
Для alpine:
RUN addgroup -g 2000 node
&& adduser -u 2000 -G node -s /bin/sh -D node
Запуск працэсаў ад карыстальніка
Для запуску ўсіх наступных працэсаў ад карыстальніка з UID 2000 выканайце:
USER 2000
Для запуску ўсіх наступных працэсаў ад карыстальніка node выканайце:
USER node
падрабязна у
Мантаванне тамоў
Пры мантаванні тамоў унутр кантэйнера забяспечце карыстачу магчымасць чытаць і (або) пісаць файлы. Для гэтага UID (GID) карыстальніка ў кантэйнеры і карыстальніка за межамі кантэйнера, у якога ёсць адпаведныя правы на доступ да файла, павінны адпавядаць. Пры гэтым імёны карыстальнікаў значэння не маюць.
Часта на лінуксавым кампутары ў карыстача UID і GID роўныя 1000. Гэтыя ідэнтыфікатары прысвойваюцца першаму карыстачу кампутара.
Даведацца свае ідэнтыфікатары проста:
id
Вы атрымаеце вычарпальную інфармацыю аб сваім карыстальніку.
Заменіце 2000 прыкладаў на свой ідэнтыфікатар і ўсё будзе ў парадку.
Прысваенне карыстачу UID і GID
Калі карыстач створаны раней, але неабходна змяніць ідэнтыфікатары, то можна зрабіць гэта так:
RUN usermod -u 1000 node
&& groupmod -g 1000 node
Калі вы выкарыстоўваеце базавую выяву alpine, то трэба ўсталяваць пакет shadow:
RUN apk add —no-cache shadow
Перадача ідэнтыфікатара карыстальніка ўнутр кантэйнера пры пабудове выявы
Калі ваш ідэнтыфікатар і ідэнтыфікатары ўсіх людзей, якія працуюць над праектам, супадаюць, то дастаткова пазначыць гэты ідэнтыфікатар у Dockerfile. Аднак часта ідэнтыфікатары карыстальнікаў не супадаюць.
Як ажыццявіць жаданае не адразу зразумела. Для мяне гэта было самым складаным у працэсе асваення docker. Шматлікія карыстачы docker не задумваюцца аб тым, што ёсць розныя этапы жыцця выявы. Спачатку выява збіраецца для гэтага выкарыстоўваюць Dockerfile. Пры запуску кантэйнера з выявы Dockerfile ужо не выкарыстоўваецца.
Стварэнне карыстачоў павінна адбывацца пры пабудове выявы. Гэта ж датычыцца і вызначэння карыстальніка, з-пад якога запускаюцца працэсы. Значыць, мы нейкім чынам павінны перадаць унутр кантэйнера UID (GID).
Для выкарыстання вонкавых зменных у Dockerfile служаць дырэктывы
Докер-файл
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node
&& groupmod -g $GID node
Перадаць аргументы праз docker-compose можна так:
докер-Compose
build:
context: ./src/backend
args:
UID: 1000
GID: 1000
PS Для засваення ўсіх прамудрасцяў docker нядосыць чытаць дакументацыю ці артыкулы. Трэба шмат практыкавацца, трэба адчуць docker.
Крыніца: habr.com