Карыстальнік у Docker

Андрэй Капылоў, наш тэхнічны дырэктар, любіць, актыўна выкарыстоўвае і прапагандуе Docker. У новым артыкуле ён расказвае, як стварыць карыстальнікаў у Docker. Правільная праца з імі, чаму карыстачоў нельга пакідаць з root правамі і, як вырашыць задачу несупадзення індыкатараў у Dockerfile.

Усе працэсы ў кантэйнеры будуць працаваць з-пад карыстача 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 служаць дырэктывы ENV и ARG. Падрабязнае параўнанне дырэктыў тут.

Докер-файл

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

Дадаць каментар