Asosiy kontentga o‘tish
Innovialabs

Docker konteynerlari xavfsizligi: production uchun amaliyotlar

Amaliyot4 daq

Qisqacha

Xavfsiz konteyner root bo‘lmagan foydalanuvchi nomidan, minimal va tekshirilgan obrazdan ishlaydi, qatlamlarida sir saqlamaydi, ortiqcha capabilities’dan mahrum, resurslari cheklangan va Docker soketiga tashqaridan kirish yo‘q.

Eng muhimi

Konteyner virtual mashina emas: u yadroni host bilan bo‘lishadi. Ortiqcha huquqlarga ega buzilgan konteyner osongina buzilgan serverga aylanadi. Production uchun asosiy qoidalar:

  • Jarayonlarni root bo‘lmagan foydalanuvchi nomidan ishga tushiring.
  • Minimal bazaviy obrazlardan yig‘ing va versiyalarini qat’iy belgilang.
  • Deploydan oldin CI’da obrazlarni CVE ga skanerlang.
  • Hech qachon sirlarni obraz qatlamlariga joylamang.
  • Capabilities’ni kamaytiring, read-only fayl tizimi va resurs limitlaridan foydalaning.
  • Docker soketi va registry’ni himoyalang.

1. Root’siz ishga tushirish

Standart holatda konteynerdagi jarayon root nomidan ishlaydi. Hujumchi ilova chegarasidan chiqsa, konteyner ichidagi root keyingi qadamni ancha osonlashtiradi.

FROM node:20-alpine
WORKDIR /app
COPY --chown=node:node . .
RUN npm ci --omit=dev
USER node
CMD ["node", "server.js"]
  • Alohida foydalanuvchi yarating yoki bazaviy obrazdagisidan foydalaning.
  • Root kerak bo‘lmasligi uchun 1024 dan yuqori portlarni tinglang.
  • Hostda rootless Docker yoki user namespace remapping’ni ko‘rib chiqing.

2. Minimal bazaviy obrazlar

Har bir ortiqcha paket — ortiqcha hujum yuzasi va ortiqcha CVE.

VariantQachon mos keladi
alpine / -slimOddiy servislar, kichik hajm
DistrolessKompilyatsiya qilingan ilovalar va runtime’lar, shell’siz
scratchStatik binar fayllar (Go, Rust)
  • Multi-stage yig‘ishdan foydalaning: kompilyatorlar va dev-bog‘liqliklar yig‘ish bosqichida qoladi.
  • Bazaviy obrazni teg bo‘yicha, muhim servislar uchun esa digest bo‘yicha (image@sha256:...) belgilang.
  • Bazaviy obrazdagi xavfsizlik yamoqlari production’ga yetib borishi uchun obrazlarni muntazam qayta yig‘ing.

3. Obrazlarni CVE ga skanerlash

  • CI’ga skaner qo‘shing: Trivy, Grype yoki Docker Scout.
  • Tuzatishi mavjud bo‘lgan kritik zaifliklarda yig‘ishni to‘xtating.
  • Faqat yig‘ishda emas, allaqachon ishlayotgan obrazlarni ham skanerlang: yangi CVE’lar har kuni paydo bo‘ladi.
  • Tegishli bo‘lmagan topilmalar uchun qisqa, hujjatlashtirilgan istisnolar ro‘yxatini yuriting.
trivy image --severity HIGH,CRITICAL --exit-code 1 myapp:1.4.0

4. Sirlar qatlamlarga tushmasligi kerak

Qatlamga yozilgan hamma narsa, keyingi RUN rm faylni o‘chirgan bo‘lsa ham, obraz tarixida qoladi. ENV API_KEY=... va COPY .env obrazni yuklab ola oladigan har kimga ko‘rinadi.

  • .env, kalitlar va hisob ma’lumotlarini .dockerignore ga qo‘shing.
  • Yig‘ish bosqichidagi sirlar uchun BuildKit secret mounts dan foydalaning:
RUN --mount=type=secret,id=npmrc,target=/root/.npmrc npm ci
  • Ishlash uchun kerakli sirlarni orkestrator orqali uzating: Docker/Swarm secrets, Kubernetes Secrets yoki Vault, bulutli KMS kabi sirlar menejeri.
  • Sir bir marta bo‘lsa ham e’lon qilingan obrazga tushgan bo‘lsa — uni almashtiring: tegni o‘chirish yetarli emas.

5. Capabilities va resurslarni cheklash

docker run -d \
  --user 1000:1000 \
  --read-only --tmpfs /tmp \
  --cap-drop ALL --cap-add NET_BIND_SERVICE \
  --security-opt no-new-privileges \
  --memory 512m --cpus 1 --pids-limit 200 \
  myapp:1.4.0
  • --cap-drop ALL, keyin faqat keraklisini qaytaring.
  • Production’da hech qachon --privileged ishlatmang.
  • Ildiz fayl tizimi --read-only, yozish faqat aniq belgilangan volume yoki tmpfs’ga.
  • Xotira, CPU va PID limitlari bitta konteynerga butun hostni yiqitishga yo‘l qo‘ymaydi.
  • Standart seccomp va AppArmor/SELinux profillarini yoqilgan holda qoldiring.
  • Ma’lumotlar bazasi va ichki servislar portlarini 0.0.0.0 ga chiqarmang — ichki tarmoqlardan foydalaning.

6. Docker soketi va registry himoyasi

/var/run/docker.sock ga kirish hostdagi root’ga teng. Unga murojaat qila oladigan odam imtiyozli konteyner ishga tushirib, host fayl tizimini ulashi mumkin.

  • Soketni ilova konteynerlariga ulamang. Agar vositaga u haqiqatan kerak bo‘lsa, cheklovchi socket proxy’dan foydalaning.
  • Docker API’ni hech qachon mijoz autentifikatsiyali TLS’siz TCP orqali ochmang.
  • Hostdagi docker guruhiga a’zolikni cheklang.

Registry uchun:

  • Autentifikatsiya va loyihalar bo‘yicha huquqlarga ega xususiy registry’dan foydalaning.
  • CI push tokenini, serverlar esa faqat pull tokenini oladi.
  • Obrazlarni imzolang (masalan, cosign bilan) va deploydan oldin imzolarni tekshiring.
  • Agar mavjud bo‘lsa, registry’da avtomatik skanerlashni yoqing.

Ko‘p uchraydigan xatolar

  • Production’da latest tegi: aslida nima ishlayotgani noma’lum.
  • ENV dagi sirlar yoki nusxalangan .env fayllar.
  • «Faqat monitoring uchun» ulangan soket.
  • Resurs limitlari yo‘q, natijada bitta xotira sizishi hostdagi barcha servislarni yiqitadi.

Ko‘p beriladigan savollar

Har doim emas. U kichik, lekin glibc o‘rniga musl ishlatadi, bu ba’zi tillar va native kutubxonalarda moslik muammolarini keltirib chiqarishi mumkin. Ko‘pincha slim yoki distroless obrazlar yaxshiroq mos keladi.

Bunda yordam beramiz

O‘zingiz shug‘ullanmasdan natija olishni istasangiz — biz har kuni shu bilan shug‘ullanamiz.

Loyihani muhokama qilish

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.