Docker konteynerlari xavfsizligi: production uchun amaliyotlar
Amaliyot4 daqInnovialabs tahririyati
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.
| Variant | Qachon mos keladi |
|---|---|
alpine / -slim | Oddiy servislar, kichik hajm |
| Distroless | Kompilyatsiya qilingan ilovalar va runtime’lar, shell’siz |
scratch | Statik 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.dockerignorega 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
--privilegedishlatmang. - 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.0ga 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
dockerguruhiga 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
latesttegi: aslida nima ishlayotgani noma’lum. ENVdagi sirlar yoki nusxalangan.envfayllar.- «Faqat monitoring uchun» ulangan soket.
- Resurs limitlari yo‘q, natijada bitta xotira sizishi hostdagi barcha servislarni yiqitadi.