Blog

Çok Kiracılı Barındırma için Pratik Bir Docker Yalıtım Güvenlik Kontrol Listesi

Çok kiracılı Docker barındırmanızı, kök olmayan kullanıcılar, yetenekler, seccomp, kullanıcı ad alanları, kaynak sınırlamaları ve salt okunur dosya sistemlerini kapsayan bu pratik kontrol listesiyle güvence altına alın.

Özet

Çok kiracılı Docker barındırma, konteyner kaçışlarını önlemek için güçlü yalıtım gerektirir. Bu makale, altı temel alanı kapsayan pratik bir güvenlik kontrol listesi sunar: kök olmayan kullanıcı olarak çalıştırma, yetenekleri kaldırma, seccomp profilleri uygulama, kullanıcı ad alanı yeniden eşlemesini etkinleştirme, kaynak sınırları belirleme ve salt okunur kök dosya sistemleri kullanma. Her adım, Docker Compose için somut bir yapılandırma örneği içerir. Ayrıca, kullanıcı ad alanlarıyla ilgili çekirdek uyumluluk sorunları ve seccomp uygularken performans ödünleşimleri gibi yaygın tuzakları da öğreneceksiniz. Bu kontrol listesini izleyerek, gereksiz karmaşıklık eklemeden saldırı yüzeyini önemli ölçüde azaltabilirsiniz. Makale, üretim çok kiracılı ortamları için önerilen bir temel yapılandırma ile sona eriyor.

Çok kiracılı bir Docker ortamı işletiyorsanız, bir konteyner kaçış saldırısı hayaleti sizi geceleri uykusuz bırakır. Tek bir çekirdek istismarı, bir konteynerden çıkıp saldırgana ana bilgisayara ve diğer tüm kiracıların verilerine sınırsız erişim sağlayabilir. Docker güçlü yalıtım ilkelleri (ad alanları, cgroup'lar ve yetenekler) sağlarken, yanlış yapılandırma boşluklar bırakır. Bu makale, bugün uygulayabileceğiniz adım adım bir güvenlik kontrol listesi sunar. Her adım, çalışan bir Docker Compose parçacığı ve önemli uyarılar içerir. Sonunda, güvenlik ve performansı dengeleyen sağlamlaştırılmış bir temele sahip olacaksınız.

1. Konteynerleri Kök Olmayan Kullanıcı Olarak Çalıştırın

Konteynerler varsayılan olarak konteyner içinde kök olarak çalışır. Bir saldırgan konteynerde kök erişimi elde ederse, kaçış için avantajlı konumda olur. Dockerfile'ınızda her zaman kök olmayan bir kullanıcı tanımlayın.

FROM alpine:3.18
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

Compose'da kullanıcıyı doğrudan da ayarlayabilirsiniz:

services:
  app:
    image: myapp
    user: "1000:1000"

Uyarı: Bazı uygulamalar meşru işlemler için kök gerektirir (örn. 1024 altındaki portlara bağlanma). Konteynerin tamamını kök olarak çalıştırmak yerine CAP_NET_BIND_SERVICE kullanın. Yalıtım temelleri hakkında daha derinlemesine bilgi için, Docker'da gerçek çok kiracılı yalıtım elde etme kılavuzumuza bakın.

2. Tüm Yetenekleri Kaldırın ve Yalnızca Gerekenleri Ekleyin

Linux yetenekleri, konteynerlere ince taneli ayrıcalıklar verir. Docker varsayılan olarak bir dizi yetenek verir. Hepsini kaldırın ve yalnızca gerekli olanları ekleyin.

services:
  app:
    image: myapp
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE  # gerekirse

Uyarı: SYS_ADMIN veya NET_RAW gibi yeteneklere nadiren ihtiyaç duyulur. Minimum seti belirlemek için uygulamanızı denetleyin. Tüm yetenekleri kaldırmak birçok kaçış vektörünü engeller.

3. Bir Seccomp Profili Uygulayın

Seccomp (güvenli hesaplama modu), bir konteynerin kullanabileceği sistem çağrılarını filtreler. Docker, belirli bayraklarla clone gibi tehlikeli syscall'ları engelleyen varsayılan bir seccomp profiliyle birlikte gelir. Bunu daha da özelleştirebilirsiniz.

services:
  app:
    image: myapp
    security_opt:
      - seccomp=/path/to/custom-profile.json

Sertleştirilmiş bir profil unshare, ptrace ve mount'u engelleyebilir. Docker'ın varsayılanıyla başlayın ve daha fazla kısıtlayın. Uyarı: Aşırı katı profiller uygulamaları bozabilir. Bir hazırlık ortamında iyice test edin. Konteyner kaçış savunmaları hakkında daha fazla bilgi için konteyner kaçışına karşı savunma yazısını okuyun.

4. Kullanıcı Ad Alanı Yeniden Eşlemesini Etkinleştirin

Kullanıcı ad alanları, konteynerin kök kullanıcısını ayrıcalıksız bir ana bilgisayar kullanıcısına eşler. Bu, bir saldırgan konteyner içinde kök yetkisi alsa bile ana bilgisayarda özel ayrıcalıkları olmayacağı anlamına gelir.

Docker daemonunda /etc/docker/daemon.json dosyasını düzenleyerek etkinleştirin:

{
  "userns-remap": "default"
}

Ardından Docker'ı yeniden başlatın. Uyarı: Kullanıcı ad alanı yeniden eşlemesinin iki dezavantajı vardır: dikkatli yapılandırılmadığında birim bağlamalarını bozar (dosyalar yeniden eşlenen kullanıcıya aittir) ve eski çekirdeklerde overlay2 gibi bazı depolama sürücüleriyle uyumsuzdur. İyice test edin.

5. Cgroup'lar ile Kaynak Sınırları Belirleyin

Kaynak sınırları, güvenliği ihlal edilmiş bir konteynerin ana bilgisayara yönelik bir hizmet reddi saldırısı başlatmasını önler. CPU, bellek ve disk G/Ç'sini sınırlamak için cgroup'ları kullanın.

services:
  app:
    image: myapp
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M

Docker Compose v3 için deploy bölümünü kullanın (swarm veya compose v2 ile çalışır). Düz Docker için --memory ve --cpus kullanın. Uyarı: Limitleri çok düşük ayarlamak OOM öldürmelerine neden olabilir. Kullanımı izleyin ve buna göre ayarlayın.

6. Salt Okunur Kök Dosya Sistemi Kullanın

Salt okunur bir kök dosya sistemi, saldırganların konteyner içinde kötü amaçlı ikili dosyalar yazmasını veya yapılandırma dosyalarını değiştirmesini önler.

services:
  app:
    image: myapp
    read_only: true
    tmpfs:
      - /tmp:noexec,nosuid,size=64m

Yazma erişimi gereken dizinlere (/tmp gibi) tmpfs bağlayın. Bu, tüm yazılabilir verileri geçici hale getirir. Uyarı: Bazı uygulamalar kalıcı depolama gerektirir; bunun için adlandırılmış birimler kullanın.

Yaygın Tuzaklar

  • Çekirdek uyumluluğu: Kullanıcı ad alanı yeniden eşlemesi ve bazı seccomp kuralları, yakın tarihli bir Linux çekirdeği (4.14+) gerektirir. Çekirdek sürümünüzü kontrol edin.
  • Performans etkisi: Seccomp ve kullanıcı ad alanları küçük bir ek yük ekler, ancak çoğu iş yükü için ihmal edilebilir düzeydedir. Belirli uygulamanızı kıyaslayın.
  • Karmaşıklık: Altı önlemin tamamını aynı anda eklemek işleri bozabilir. Bunları tek tek uygulayın, her değişikliği test edin.

Daha geniş bir orkestrasyon desenleri görünümü için çok kiracılı Docker mimarisi tasarlama kılavuzumuza bakın.

Sonuç

Güvenli bir çok kiracılı Docker ana bilgisayarı egzotik araçlar gerektirmez; yalnızca Docker'ın yerleşik özelliklerinin doğru kullanımını gerektirir. Kök olmayan bir kullanıcıyla başlayın, tüm yetenekleri kaldırın, bir seccomp profili uygulayın, kullanıcı ad alanı yeniden eşlemesini etkinleştirin, kaynak sınırları belirleyin ve salt okunur bir dosya sistemi kullanın. Bu kontrol listesi, en yaygın kaçış tekniklerini engelleyen güçlü bir temel oluşturur. Uyguladıktan sonra, yapılandırmanızı doğrulamak için docker-bench-security gibi güvenlik araçlarını çalıştırın. Unutmayın: güvenlik bir süreçtir, bir ürün değil. Yeni çekirdek güvenlik açıkları ortaya çıktıkça ayarlarınızı tekrar gözden geçirin. Barındırma hizmetinizi sergileyen otomatik açılış sayfaları için sitenizi dakikalar içinde yayına almak üzere Pagenza'yı kullanın.

Sources (5)