DevOps and Infrastructure

Tedarik Zincirini Güvence Altına Almak: Konteyner Güvenliği İçin Kapsamlı Bir Kılavuz

Konteynerler uygulamaları oluşturma, gönderme ve çalıştırma biçimimizi devrim niteliğinde değiştirdi. Kodu ve bağımlılıkları hafif, taşınabilir birimlere paketleyerek DevOps ekipleri eşsiz bir hız ve tutarlılık elde etti. Ancak bu çeviklik genellikle görünürlükten ödün vererek gelir. Uygulamalar geçici olduğunda ve yüzlerce mikroservisden oluştuğunda, saldırı yüzeyi dramatik bir şekilde genişler. Orta ve ileri düzey geliştiriciler için bu konteynerlerin güvenliğini sağlamak sadece iyi bir özellik değil; sistem bütünlüğünü ve uyumluluğunu korumak için kritik bir gerekliliktir. Bu kılavuz, temel hijyenin ötesine geçerek sağlam bir DevSecOps kültürü uygulamak amacıyla konteynerleştirilmiş ortamlarınızı güçlendirmek için uygulanabilir en iyi uygulamaları özetlemektedir.

1. Çok Aşamalı Derlemelerle Saldırı Yüzeyinizi Azaltın

Yapabileceğiniz en etkili değişiklik, konteyner görüntülerinizin boyutunu ve karmaşıklığını azaltmaktır. Her katman, her yüklenen paket ve her açık port potansiyel bir güvenlik açığıdır. Tam Linux dağıtımlarına dayalı büyük görüntüler, binlerce paket içerir; bunların çoğu uygulamanız tarafından hiç kullanılmaz ancak bilinen Yaygın Zafiyetler ve Açıklıklar (CVE) içerebilir. Çok aşamalı derlemeler kullanarak, derleme ortamını çalışma zamanı ortamından ayırabilirsiniz. Bu, yalnızca derlenmiş ikili dosyaların ve gerekli yapılandırma dosyalarının son görüntüye kopyalanmasını sağlayarak derleyicileri, derleme araçlarını ve kaynak kodunu atar.
# Aşama 1: Derleme
FROM golang:1.19 AS builder
WORKDIR /app
COPY . .
RUN go build -o main .

# Aşama 2: Çalıştırma
FROM alpine:latest
WORKDIR /root/
# Yalnızca ikili dosyayı kopyala, kaynak kodu veya derleme araçlarını değil
COPY --from=builder /app/main .
CMD ["./main"]
Yukarıdaki örnekte görüldüğü gibi, son Alpine tabanlı görüntü neredeyse yalnızca uygulama yürütülebilir dosyasını içerir. Bu, potansiyel güvenlik açıklarının sayısını önemli ölçüde azaltır ve çekme sürelerini iyileştirir.

2. En Az Ayrıcalık İlkelerini Uygulayın

Konteynerleri root kullanıcısı olarak çalıştırmak, ciddi riskler oluşturan yaygın bir yapılandırma hatasıdır. Bir saldırgan, root olarak çalışan bir konteynere erişim sağlarsa, konteynerden kaçabilir ve ana bilgisayara kontrol sağlayabilir. Bunu önlemek için işlemleri her zaman root olmayan bir kullanıcı olarak çalıştırmalısınız. Dockerfile'ınızda özel bir kullanıcı oluşturun ve uygulamayı çalıştırmadan önce bu kullanıcıya geçiş yapın:
FROM node:18-alpine
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nodejs -u 1001
USER nodejs
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
CMD ["node", "server.js"]
Bu yaklaşım, uygulama güvenliği ihlal edilse bile saldırganın, ana sistemde yönetici ayrıcalıklarına sahip olmayan `nodejs` kullanıcısının izinleriyle sınırlı kalmasını sağlar.

3. CI/CD Hatlarında Görüntü Taraması Uygulayın

Manuel güvenlik denetimleri, çevik ortamlarda artık mümkün değildir. Güvenlik, sürekli entegrasyon/sürekli dağıtım (CI/CD) hatlarınıza doğrudan entegre edilerek sola kaydırılmalıdır. Trivy, Snyk veya Clair gibi araçlar, dağıtımdan önce konteyner görüntülerini bilinen CVE'ler, yapılandırma hataları ve gizli bilgiler (API anahtarları gibi) için otomatik olarak tarayabilir. Kritik veya yüksek düzeyde güvenlik açıkları tespit edildiğinde derlemeyi başarısız kılacak şekilde hattanizi yapılandırın. Bu, güvensiz görüntülerin üretim ortamına asla ulaşmadığı bir politika uygular. Örneğin, GitHub Actions iş akışında Trivy kullanımı:
- name: Trivy güvenlik açığı tarayıcısını çalıştır
  uses: aquasecurity/trivy-action@master
  with:
    image-ref: 'my-app:latest'
    format: 'table'
    exit-code: '1'
    severity: 'CRITICAL,HIGH'

4. Çalışma Zamanı Ortamını Güvence Altına Alın

Güvenli görüntüleriniz olsa bile, çalışma zamanı koruması esastır. Kubernetes ortamlarında, ayrıcalıklı konteynerleri, ana ağ erişimini ve ayrıcalık yükseltmeyi kısıtlamak için Pod Güvenlik Standartlarını (PSS) kullanın. Ayrıca, mikroservisler arasındaki trafik akışını kontrol etmek için ağ politikaları uygulamayı düşünün; bu, yalnızca yetkili servislerin birbirleriyle iletişim kurmasını sağlar. Son olarak, temel görüntülerinizi düzenli olarak güncel tutun. Konteyner temel katmanlarındaki güvenlik açıklarını yamalamak için Dependabot veya Renovate gibi otomatik bağımlılık güncelleme araçlarına güvenin.

Sonuç

Konteyner güvenliği, görüntü optimizasyonu, izin yönetimi, otomatik tarama ve çalışma zamanı izleme içeren tek seferlik bir görev değil, sürekli bir süreçtir. Bu en iyi uygulamaları benimseyerek, altyapınızı kötü niyetli aktörlerden korumanın yanı sıra daha dayanıklı ve sürdürülebilir bir uygulama mimarisi de oluşturursunuz. Unutmayın, güvenlik kod düzeyinde başlayan ve tüm dağıtım yaşam döngüsüne uzanan paylaşılan bir sorumluluktur.
Share: