Blog

Konteynerden Kaçmaya Karşı Savunma: Çok Kiracılı Barındırma İçin Docker İzolasyonu Üzerine Pratik Bir Rehber

Çok kiracılı ortamlarda konteynerden kaçma güvenlik açıklarına ve izolasyon hatalarına karşı Docker konteynerlerini nasıl güvence altına alacağınızı somut adımlar ve örneklerle öğrenin.

Özet

Docker konteynerleri ana makine çekirdeğini paylaşır, bu da izolasyonu kritik hale getirir—özellikle tek bir konteynerden kaçışın tüm kiracıları tehlikeye atabileceği çok kiracılı barındırmada. Birçok geliştirici, konteynerlerin mükemmel izole edilmiş sanal makineler olduğunu varsayar, ancak gerçek farklıdır. Bu makale, Docker izolasyonunun (isim uzayları, cgroups) arkasındaki Linux çekirdek özelliklerini ve bunları tehdit eden saldırı vektörlerini açıklar. Docker kurulumunuzu güçlendirmek için pratik adımlar öğreneceksiniz: ayrıcalıkları sınırlama, güvenli çalışma zamanı kullanma, görüntüleri tarama ve ağ segmentasyonu uygulama. Çok kiracılı bir WordPress barındırma sağlayıcısının gerçek dünya örneğini kullanarak, bu savunmaları nasıl uygulayacağınızı göreceksiniz. Ayrıca performans ödünleşmeleri ve seccomp/AppArmor kullanımı gibi uyarıları da ele alıyoruz. Amaç, konteynerden kaçışı önleyen ve kiracılarınızı güvende tutan sağlam bir izolasyon stratejisi sunmaktır.

Giriş

Paylaşımlı WordPress barındırma, bir SaaS uygulaması veya bir geliştirme ortamı hizmeti olsun, çok kiracılı bir barındırma platformu çalıştırıyorsanız, konteynerden kaçış kabus senaryosudur. Çekirdekteki bir güvenlik açığı veya yanlış yapılandırma, bir kiracının konteynerinden çıkıp diğer kiracıların verilerine veya ana makinenin kendisine erişmesine neden olabilir. Docker'ın izolasyonu, isim uzayları ve cgroups gibi Linux çekirdek özelliklerine dayanır, ancak kutudan çıktığı gibi yapılandırmalar genellikle sağlam güvenlik için yetersizdir. Bu makale, saldırı vektörlerini inceleyecek ve gerçek dünya çok kiracılı bir WordPress örneğiyle gösterilen Docker konteynerlerinizi kilitlemek için eyleme geçirilebilir adımlar sunacaktır. Üretim düzenlemesi hakkında daha geniş bir bakış için, Üretim Hazır Konteynerli Uygulamaları Düzenleme hakkındaki rehberimize bakın.

Docker İzolasyonunu Anlama

Docker konteynerleri, işlem düzeyinde izolasyon sağlamak için Linux isim uzaylarını kullanır: PID isim uzayları işlem ağaçlarını izole eder, ağ isim uzayları ağ arayüzlerini ayırır, bağlama isim uzayları dosya sistemi bağlamalarını izole eder ve kullanıcı isim uzayları konteyner kökünü ayrıcalıksız bir ana makine kullanıcısına eşlemeye izin verir. Kontrol grupları (cgroups), CPU, bellek ve disk G/Ç gibi kaynak kullanımını sınırlar. Bu özellikler birlikte her konteyner etrafında bir "sanal alan" oluşturur. Ancak, ayrı bir çekirdek çalıştıran bir sanal makinenin aksine, konteynerler ana makine çekirdeğini paylaşır. Bu, çekirdekteki bir güvenlik açığının (örneğin, CVE-2022-0492) konteynerin isim uzayı izolasyonundan kaçmak için istismar edilebileceği anlamına gelir. Ek olarak, konteyner içinde kök olarak konteyner çalıştırma, konteynere tüm yetenekleri verme veya gereksiz Linux yeteneklerini düşürmeme gibi yanlış yapılandırmalar saldırı yüzeyini genişletebilir.

Saldırı Vektörleri

Yaygın saldırı vektörleri şunları içerir:

  • Çekirdek istismarları: Ana makine erişimi elde etmek için ana makine çekirdeğindeki bir hatayı istismar etme.
  • Ayrıcalıklı konteynerler: --privileged ile çalıştırmak, tüm yetenekleri verir ve çoğu izolasyonu atlar.
  • Yetenek kötüye kullanımı: Tam ayrıcalıklı mod olmadan bile, CAP_SYS_ADMIN veya CAP_NET_ADMIN gibi tehlikeli yeteneklere sahip bir konteyner, dosya sistemlerini bağlayabilir veya ağ ayarlarını değiştirebilir.
  • Güvensiz görüntü uygulamaları: Bilinen güvenlik açıklarına sahip temel görüntüleri kullanma veya derleyiciler veya kabuk yorumlayıcıları gibi gereksiz araçlar dahil etme.
  • Paylaşılan bağlama isim uzayları: Ana makine dizinlerini konteynerlere bağlamak, salt okunur değilse kaçmaya izin verebilir.

Pratik Güvenlik Adımları

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

Varsayılan olarak Docker, konteynerleri konteyner içinde kök olarak çalıştırır. Bir saldırgan konteyner içinde kök erişimi elde ederse, daha fazla kaldıraç gücüne sahip olur. Dockerfile'ınızda bir kullanıcı oluşturun ve USER yönergesini kullanın. Mümkünse, keyfi bir ana makine kullanıcısına eşlemek için Docker Compose'da --user bayrağını kullanmaktan kaçının.

2. Tüm Yetenekleri Düşürün ve Yalnızca Gerekli Olanları Ekleyin

Linux yetenekleri, süper kullanıcı ayrıcalıklarını daha küçük birimlere ayırır. Docker Compose'da, cap_drop: ALL kullanın, ardından yalnızca gerekli olanları (NET_BIND_SERVICE gibi) cap_add ile ekleyin. SYS_ADMIN, NET_ADMIN, SYS_PTRACE gibi tehlikeli yeteneklerden kaçının.

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

Konteyner tanımınızda read_only: true olarak ayarlayın. Bu, saldırganların konteynerin dosya sistemine yazmasını engeller. Uygulamanızın geçici dosyalar yazması gerekiyorsa, o konuma bir tmpfs birimi bağlayın.

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

Kullanıcı ad alanı yeniden eşleme, konteynerin kök kullanıcısını kök olmayan bir ana makine kullanıcısına eşler. Bu, bir konteyner kökünün kaçması durumunda bile, yeniden eşlenen kullanıcının ayrıcalıklarına sahip olacağı için ek bir izolasyon katmanı ekler. /etc/docker/daemon.json dosyasında "userns-remap": "default" ile etkinleştirin. Bunun birim izinlerini karmaşıklaştırabileceğini unutmayın. Daha fazla ayrıntı için, Güvenli ve Verimli Web Barındırma İçin Docker İzolasyonunda Ustalaşma bölümüne bakın.

5. Seccomp ve AppArmor/AppArmor Profilleri Uygulayın

Seccomp, bir konteynerin yapabileceği sistem çağrılarını kısıtlar. Docker, tehlikeli sistem çağrılarını engelleyen varsayılan bir seccomp profili sağlar. Özel profiller de oluşturabilirsiniz. Benzer şekilde, AppArmor (veya SELinux) zorunlu erişim kontrolü sağlar. Konteynerinizi minimum izin verilen işlemler kümesine hapsetmek için AppArmor'u kullanın. Güvenlik profili Docker Compose'da security_opt aracılığıyla ayarlanabilir.

6. Minimal Temel Görüntüler Kullanın ve Güvenlik Açıklarını Tarayın

Saldırı yüzeyi daha küçük olan Alpine veya Distroless gibi küçük görüntüleri seçin. Docker Scout, Trivy veya Clair gibi araçlarla görüntüleri düzenli olarak tarayın. Güvenliği tehlikeye giren görüntülerin dağıtılmasını önlemek için taramayı CI/CD işlem hattınıza entegre edin.

7. Özel Köprü Ağlarıyla Ağ Segmentasyonu

Her kiracı veya uygulama katmanı için ayrı köprü ağları oluşturun. Bu, doğudan batıya trafiği sınırlar. Docker Compose'da ağları tanımlayın ve hizmetleri izole edin. Bir hizmetin giden İnternet erişimine ihtiyacı yoksa internal: true kullanın. Ana makinedeki güvenlik duvarı kuralları, konteynerler arası trafiği daha da kısıtlar.

8. Cgroups ile Kaynakları Sınırlandırın

Docker Compose'da deploy.resources.limits kullanarak CPU ve bellek sınırlarını ayarlayın. Bu, tehlikeye atılmış bir konteynerin kaynak tükenmesi saldırısı başlatmasını önler. Ek olarak, daha ince kontrol için kernel_memory ve memory_reservation ayarlayın.

Gerçek Dünya Örneği: Docker Compose ile Çok Kiracılı WordPress Barındırma

Her biri kendi Docker konteynerinde olmak üzere farklı müşteriler için birden fazla WordPress sitesini barındırdığınız bir senaryoyu ele alın. Güvensiz bir kurulum şöyle görünebilir:

version: '3'
services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - ./wp-content:/var/www/html/wp-content
  db:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_ROOT_PASSWORD: somewordpress
    volumes:
      - db_data:/var/lib/mysql
volumes:
  db_data:

Bu kurulum savunmasızdır: WordPress konteyneri içinde kök olarak çalışır, tüm yeteneklere sahiptir (çünkü hiçbiri düşürülmemiştir), ana makine dizinini yazma erişimiyle bağlar ve sınırsız ağ erişimine sahiptir.

Şimdi bunu güçlendirelim:

version: '3'
services:
  wordpress:
    image: wordpress:latest
    user: www-data
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
    read_only: true
    tmpfs:
      - /var/www/html/wp-content/plugins
    security_opt:
      - seccomp=seccomp-profile.json
      - apparmor=wordpress-profile
    networks:
      - frontend
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wp-uploads:/var/www/html/wp-content/uploads
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 256M
  db:
    image: mysql:5.7
    user: mysql
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
    networks:
      - backend
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_ROOT_PASSWORD: somewordpress
    volumes:
      - db_data:/var/lib/mysql
    deploy:
      resources:
        limits:
          cpus: '0.25'
          memory: 128M
networks:
  frontend:
    driver: bridge
    internal: false
  backend:
    driver: bridge
    internal: true
volumes:
  wp-uploads:
  db_data:

Temel iyileştirmeler:

  • Her iki konteyner de kök olmayan kullanıcılar (www-data ve mysql) olarak çalışır.
  • Tüm yetenekler düşürülür, yalnızca NET_BIND_SERVICE eklenir.
  • WordPress dosya sistemi, bir tmpfs bağlaması ve yüklemeler birimi hariç salt okunurdur.
  • Seccomp ve AppArmor profilleri uygulanır (özel profiller sağlamanız gerekir).
  • Ayrı ağlar web'i veritabanından ayırır, veritabanı ağı dahili olarak.
  • Kaynak sınırları kaynak tükenmesini önler.

WordPress'e özgü Docker güçlendirmesi hakkında daha fazla bilgi için, WordPress için Docker: İzolasyonlu Konteynerler Her Şeyi Nasıl Değiştirir bölümüne bakın.

Uyarılar

  • Kullanıcı Ad Alanı Yeniden Eşleme: Güçlü olmasına rağmen, yeniden eşlenen ana makine UID'si konteyner UID'si ile aynı olmadığından birim bağlamayı bozar. Doğru izinlerle önceden dizinler oluşturmanız veya yeniden eşleme desteği olan Docker birimlerini kullanmanız gerekebilir.
  • Seccomp/AppArmor Profilleri: Özel profiller, uygulamanızın sistem çağrısı ve dosya erişim modellerini anlamayı gerektirir. Aşırı kısıtlayıcı profiller işlevselliği bozabilir. Kapsamlı bir şekilde test edin.
  • Performans: Seccomp ve AppArmor gibi ek güvenlik katmanlarının minimum ek yükü vardır, ancak kaynak sınırları ve salt okunur dosya sistemleri yazma ağırlıklı uygulamaları etkileyebilir.
  • Düzenleme Karmaşıklığı: Çok kiracılı bir ortamda, kiracı başına Docker Compose dosyalarını yönetmek zorlaşabilir. Kubernetes gibi daha üst düzey bir düzenleme aracı kullanmayı düşünün, ancak bu kendi güvenlik hususlarını beraberinde getirir.

Sonuç

Konteynerden kaçış, çok kiracılı Docker barındırmada gerçek bir tehdittir, ancak önlenebilir. İzolasyon mekanizmalarını anlayarak ve savunma derinliği uygulayarak—yeteneği düşürme, kök olmayan olarak çalıştırma, kullanıcı ad alanlarını etkinleştirme, seccomp, AppArmor, ağ segmentasyonu ve düzenli görüntü taraması—riski önemli ölçüde azaltabilirsiniz. Docker'ın varsayılan ayarlarının çok kiracılı iş yükleri için üretim düzeyinde olmadığını unutmayın. Kiracılarınızı ve altyapınızı korumak için bu adımları bugün uygulayın. Docker güvenliği en iyi uygulamalarına kapsamlı bir genel bakış için, Docker ile Web Uygulamalarınızı Güvence Altına Alma: İzolasyon ve En İyi Uygulamalar İçin Pratik Bir Rehber bölümüne bakın.

Sources (5)