لینوکس ۳۰۵؛ شب ۴۶: سقف منابع، capability و مسیر rootless در Docker
فهرست نوشته
سرویس سادهٔ HTTP نیازی به اختیار همهٔ دستگاههای میزبان ندارد. امشب image خودمان را با filesystem فقطخواندنی و سقف منابع اجرا و process میزبان را بررسی میکنیم.
این جلسه بخشی از دورهٔ لینوکس ۳۰۵ در ۶۰ شب است.
جایگاه در دوره: هدفهای 352.3، 352.1 آزمون 305-300.
محیط: docker-a، web305 قبلی حذف شده، lab305-web:v1 از شب ۴۳. daemon rootful است؛ در این آزمایش OOM عمدی نمیسازیم.
sudo docker run --name web305 -d \
-p 127.0.0.1:18050:8080 \
--memory=128m --cpus=0.5 --pids-limit=64 \
--cap-drop=ALL --security-opt=no-new-privileges:true \
--read-only --tmpfs /tmp:rw,noexec,nosuid,size=16m \
lab305-web:v1
curl --fail http://127.0.0.1:18050/
sudo docker stats --no-stream web305
sudo docker inspect web305 --format '{{json .HostConfig}}'
LAB_PID=$(sudo docker inspect web305 --format '{{.State.Pid}}')
sudo cat "/proc/$LAB_PID/status"
پورت 8080 نیاز به CAP_NET_BIND_SERVICE ندارد. پاسخ HTTP، سقف config و CapEff/NoNewPrivs/Seccomp را با هم ثبت کن؛ خواندن config بدون بررسی process شاهد کامل نیست. tmpfs محل writable موقت است و با حذف container پایدار نمیماند.
swap را همراه سقف RAM بررسی کن؛ –memory بهتنهایی تمام سیاست swap را مشخص نمیکند. محدودیت CPU بهمعنی تضمین latency نیست.
rootless قرارداد جدا دارد#
در VM clone مستقل، دستور نصب rootless متناسب با package/version رسمی، subuid/subgid و ابزارهای شبکهٔ آن را دنبال کن. بعد docker context ls، docker info و owner process را ثبت کن. client باید به socket کاربر وصل شود؛ sudo docker معمولاً دوباره daemon سیستم را هدف میگیرد.
rootless بخشی از اختیار host را کم میکند، ولی kernel مشترک، mountهای داده و آسیبپذیری برنامه باقیاند. –privileged، mount socket Docker یا bind writable /etc مرزهای این آزمایش را از بین میبرند؛ خطای برنامه را با فعال کردن آنها رفع نکن.
بازگشت: web305 را stop/rm کن. profile seccomp پیشفرض و MAC میزبان فعال بمانند؛ تغییر daemon rootless را با حذف container rootful یکی ندان.
منبع: resource constraints ، rootless ، seccomp .