Reklam Alanı
Bulut & DevOps
Bulut & DevOps

Container Güvenliği: İmaj Tarama ve En Az Ayrıcalık İlkesi

28 Ağustos 2026 · 3 dk okuma · 19 okunma

Container'lar, uygulamaları ve bağımlılıklarını tek bir taşınabilir birimde paketleyerek dağıtımı basitleştirir; ancak bu kolaylık, genellikle görünmeyen bir maliyetle gelir: her imaj, üzerine inşa edildiği temel imajın (base image) ve eklenen her katmanın tüm güvenlik açıklarını miras alır. Bir uygulamanın kendi kodu güvenli olsa bile, kullandığı temel işletim sistemi imajında bilinen bir CVE varsa, o container üretimde saldırıya açık kalır.

İmaj Tarama: Katman Katman CVE Kontrolü

İmaj tarama araçları (Trivy, Grype, Clair gibi) bir imajın her katmanını ayrı ayrı inceleyerek yüklü paket sürümlerini bilinen zafiyet veritabanlarıyla (NVD, OS vendor advisories) karşılaştırır. Bu süreç CI/CD pipeline'ına gömülmelidir, üretime çıkmadan önce değil, imaj build edilir edilmez:

# Pipeline adımı: build sonrası zorunlu tarama
- name: Container imajını tara
  run: |
    trivy image --severity HIGH,CRITICAL --exit-code 1 myapp:latest

--exit-code 1 parametresi, kritik/yüksek seviye bir zafiyet bulunduğunda pipeline'ı başarısız kılarak imajın kayıt defterine (registry) itilmesini engeller. Bu, "shift-left" güvenlik yaklaşımının somut bir uygulamasıdır: sorun üretimde değil, geliştirme aşamasında yakalanır.

En Az Ayrıcalık: Root Kullanıcıdan Kaçınmak

Container'ların varsayılan olarak root kullanıcısıyla çalışması, en yaygın ve en tehlikeli yapılandırma hatalarından biridir. Container kaçışı (container escape) zafiyeti bulunması durumunda root yetkili bir process, host makinede de root yetkisi kazanabilir. Doğru yaklaşım, imaj içinde ayrıcalıksız bir kullanıcı tanımlamaktır:

FROM node:20-alpine

RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
COPY --chown=appuser:appgroup . .
RUN npm ci --omit=dev

USER appuser
CMD ["node", "server.js"]

Burada USER appuser satırı, container çalışma zamanında process'in root yerine kısıtlı bir kullanıcı kimliğiyle başlamasını garanti eder. Kubernetes ortamında bu ilke securityContext ile pod düzeyinde de zorunlu kılınabilir:

securityContext:
  runAsNonRoot: true
  runAsUser: 1000
  readOnlyRootFilesystem: true
  allowPrivilegeEscalation: false

readOnlyRootFilesystem: true, container içindeki dosya sisteminin salt okunur olmasını sağlayarak bir saldırganın kalıcı değişiklik (ör. arka kapı script'i) bırakmasını zorlaştırır; allowPrivilegeEscalation: false ise process'in çalışma zamanında ek yetki kazanmasını (setuid ikili dosyalar üzerinden) engeller.

Temel İmajı Küçük ve Güncel Tutmak

"Distroless" veya Alpine tabanlı küçük imajlar, gereksiz kütüphane ve araç barındırmadığı için hem saldırı yüzeyini küçültür hem de tarama sonuçlarında daha az CVE ile karşılaşılmasını sağlar. Temel imaj sürümünün düzenli olarak güncellenmesi (pinned ama periyodik olarak yükseltilen) tek seferlik bir görev değil, sürekli bir bakım disiplinidir.

Bir container imajı, en zayıf katmanı kadar güvenlidir; ekleme yaptığınız her katman, denetlemeniz gereken yeni bir yüzeydir.

Özetle container güvenliği; sürekli imaj taraması, root olmayan kullanıcı ile çalışma ve minimal temel imaj seçimi üzerine kurulan katmanlı bir disiplindir. Bu önlemler CI/CD pipeline'ına gömüldüğünde, güvenlik "sonradan eklenen kontrol" olmaktan çıkıp geliştirme sürecinin doğal bir parçası haline gelir.

İlgili Yazılar