کاربر در داکر

آندری کوپیلوف، CTO ما، داکر را دوست دارد، فعالانه استفاده می کند و آن را تبلیغ می کند. او در مقاله ای جدید نحوه ایجاد کاربر در داکر را توضیح می دهد. کار صحیح با آنها، چرا کاربران نباید با حقوق ریشه باقی بمانند و چگونه مشکل عدم تطابق نشانگرها در Dockerfile را حل کنیم.

تمام فرآیندهای موجود در کانتینر به عنوان کاربر ریشه اجرا می شوند، مگر اینکه آن را به روش خاصی مشخص کنید. این بسیار راحت به نظر می رسد، زیرا این کاربر هیچ محدودیتی ندارد. به همین دلیل است که کار کردن به عنوان root از نقطه نظر امنیتی اشتباه است. اگر هیچ کس با عقل درست روی رایانه محلی با حقوق ریشه کار نکند، بسیاری از فرآیندها را تحت روت در کانتینرها اجرا می کنند.

همیشه باگ هایی وجود دارند که به بدافزار اجازه می دهند از ظرف خارج شده و وارد رایانه میزبان شوند. با فرض بدترین حالت، باید اطمینان حاصل کنیم که فرآیندهای داخل کانتینر توسط کاربری اجرا می شود که هیچ حقی بر روی ماشین میزبان ندارد.

ایجاد کاربر

ایجاد کاربر در یک کانتینر با ایجاد آن در توزیع های لینوکس تفاوتی ندارد. با این حال، دستورات ممکن است برای تصاویر پایه مختلف متفاوت باشد.

برای توزیع های مبتنی بر دبیان، باید موارد زیر را به Dockerfile اضافه کنید:

RUN groupadd --gid 2000 node 
  && useradd --uid 2000 --gid node --shell /bin/bash --create-home node

برای آلپاین:

RUN addgroup -g 2000 node 
    && adduser -u 2000 -G node -s /bin/sh -D node

اجرای فرآیندها از سوی کاربر

برای اجرای تمام فرآیندهای بعدی به عنوان کاربر با UID 2000، اجرا کنید:

USER 2000

برای اجرای تمام فرآیندهای بعدی به عنوان کاربر گره، اجرا کنید:

USER node

بیشتر در مستندات.

حجم های نصب

هنگام نصب ولوم ها در داخل ظرف، امکان خواندن و/یا نوشتن فایل ها را در اختیار کاربر قرار دهید. برای انجام این کار، UID (GID) کاربر در کانتینر و کاربر خارج از کانتینر که مجوزهای مناسب برای دسترسی به فایل را دارد باید مطابقت داشته باشد. در این مورد، نام کاربری مهم نیست.

اغلب در رایانه لینوکس، UID و GID کاربر برابر با 1000 است. این شناسه ها به اولین کاربر رایانه اختصاص داده می شوند.

پیدا کردن شناسه های شما آسان است:

id

اطلاعات جامعی در مورد کاربر خود دریافت خواهید کرد.
2000 از نمونه ها را با شناسه خود جایگزین کنید و همه چیز درست می شود.

اختصاص UID و GID به کاربر

اگر کاربر قبلاً ایجاد شده است، اما باید شناسه ها را تغییر دهید، می توانید این کار را به صورت زیر انجام دهید:

RUN usermod -u 1000 node 
  && groupmod -g 1000 node

اگر از تصویر پایه آلپاین استفاده می کنید، باید بسته سایه را نصب کنید:

RUN apk add —no-cache shadow

ارسال شناسه کاربری در داخل کانتینر هنگام ساخت تصویر

اگر شناسه شما و شناسه همه افرادی که روی پروژه کار می کنند مطابقت دارد، کافی است این شناسه را در Dockerfile مشخص کنید. با این حال، اغلب شناسه های کاربر مطابقت ندارند.

چگونگی رسیدن به آنچه می خواهید بلافاصله مشخص نیست. برای من، این سخت ترین کار در روند تسلط بر داکر بود. بسیاری از کاربران داکر متوجه نیستند که مراحل مختلفی در زندگی یک تصویر وجود دارد. ابتدا تصویر با استفاده از 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 به این صورت منتقل کنید:

کامیون

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

PS برای تسلط بر همه پیچیدگی های Docker، خواندن مستندات یا مقالات کافی نیست. شما نیاز به تمرین زیادی دارید، باید احساسی نسبت به Docker داشته باشید.

منبع: www.habr.com

اضافه کردن نظر