Потребител в Docker

Андрей Копылов, наш технически директор, активно използва и популяризира Docker. В новата статия той разказва как да създадете потребители в Docker. Правилната работа с тях, защо не бива да се оставят потребители с права root и как да решим проблема с несъответствието на индикаторите в Dockerfile.

Всички процеси в контейнера ще работят от потребител root, ако не се укаже по специален начин. Това изглежда много удобно, защото този потребител няма ограничения. Именно поради това, работата с root не е правилна от гледна точка на сигурността. Ако на локалния компютър никой не работи с root права в съзнателен ум, много хора стартират процеси под 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. Подробно сравнение на директивите тук.

Dockerfile

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

Можете да предадете аргументи през docker-compose така:

docker-compose

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

P.S. За да овладеете всички тънкости на docker, не е достатъчно да четете документация или статии. Необходимо е много практика, нужно е да усетите docker.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster