Blog
Docker Konteynerlerini Çok Kiracılı Barındırma için Güçlendirme: Adım Adım İzolasyon Rehberi
Root olmayan kullanıcılar, kaldırılmış yetenekler, salt okunur dosya sistemleri ve ağ izolasyonu gibi pratik güvenlik önlemleriyle Docker konteynerlerini çok kiracılı ortamlarda nasıl kilitleyeceğinizi öğrenin.

Özet
Çok kiracılı bir Docker barındırma platformu işletmek, kiracıların birbirine müdahale etmesini veya ana bilgisayara kaçmasını önlemek için hava geçirmez konteyner izolasyonu gerektirir. Bu kılavuz, bugün uygulayabileceğiniz somut, adım adım bir güçlendirme süreci sunar. Root olmayan kullanıcılar yapılandırmayı, gereksiz Linux yeteneklerini kaldırmayı, dosya sistemlerini salt okunur olarak bağlamayı, cgroups aracılığıyla kaynak sınırlarını uygulamayı, ağları segmentlere ayırmayı ve seccomp veya AppArmor profilleri uygulamayı öğreneceksiniz. Ayrıca, maksimum güvenlik için konteynerleri sanal makinelerle ne zaman güçlendireceğinizi de ele alacağız. Sonunda, yaygın konteyner kaçış vektörlerini sistematik olarak ortadan kaldırmak ve çok kiracılı altyapınızı gerçekten izole tutmak için bir kontrol listeniz olacak.
Çok Kiracılı Konteynerlerle Gerçek Dünya Sorunu
Docker konteynerleri ana bilgisayar çekirdeğini paylaşır ve izolasyon yanlış yapılandırılırsa, bir kiracı teorik olarak diğerinin verilerine erişebilir, tüm CPU'yu tüketebilir veya ana bilgisayara kaçabilir. Bir barındırma sağlayıcısı olarak, konteynerlerin performans avantajlarından ödün vermeden hava geçirmez sınırlara ihtiyacınız var. Birçok ekip, geliştirme için tasarlanmış, üretim çok kiracılığı için tasarlanmamış varsayılan Docker ayarlarıyla başlar. İyi haber: sistematik bir güçlendirme kontrol listesi ile her konteyneri neredeyse VM seviyesinde izolasyona kilitleyebilir ve Docker'ın hızını koruyabilirsiniz.
Bu makale, pratik örnekler ve uyarılarla her güçlendirme adımında size yol gösterir. Sonunda, güvenli çok kiracılı konteynerler dağıtmak için tekrarlanabilir bir süreciniz olacak.
Adım 1: Konteynerleri Root Olmayan Kullanıcı Olarak Çalıştırın
Varsayılan olarak, Docker konteynerleri root olarak çalışır. Bir konteyner tehlikeye girerse, saldırgan konteyner içinde root ayrıcalıkları kazanır ve bir konteyner kaçışı deneyebilir. İlk olarak, Dockerfile'ınızda özel bir kullanıcı oluşturun ve ona geçin:
FROM ubuntu:22.04
RUN useradd -m appuser
USER appuser
Uyarı: Bazı işlemler (örneğin, 1024'ten küçük bağlantı noktalarına bağlanma) root gerektirir. Bu durumlarda, yalnızca gerekli yeteneği vermek için --cap-add bayrağını kullanın, örneğin --cap-add=NET_BIND_SERVICE, ve işlemi yine root olmayan bir kullanıcı altında çalıştırın.
Temel izolasyon hakkında daha fazla bilgi için, Docker'da gerçek çok kiracılı izolasyon sağlama kılavuzumuza bakın.
Adım 2: Tüm Linux Yeteneklerini Kaldırın ve Yalnızca İhtiyacınız Olanı Geri Ekleyin
Linux yetenekleri, root ayrıcalıklarını küçük birimlere ayırır. Docker konteynerleri, çok kiracılı barındırma için çok izin verici olan varsayılan bir yetenek setiyle gelir. Tümünü kaldırın ve yalnızca uygulamanızın gerektirdiği yetenekleri geri ekleyin:
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE my-app
Kaçınılması gereken yaygın yetenekler: SYS_ADMIN (konteyner kaçışı), NET_RAW (paket koklama), SYS_PTRACE (süreç hata ayıklama). setuid ikili dosyaları aracılığıyla ayrıcalık yükseltmeyi önlemek için --security-opt no-new-privileges ile docker run kullanın.
Adım 3: Kök Dosya Sistemini Salt Okunur Olarak Bağlayın
Saldırganlar genellikle konteyner dosya sistemine kötü amaçlı betikler yazar. Kök dosya sistemini salt okunur yaparak bunu önlersiniz:
docker run --read-only --tmpfs /tmp:rw,noexec,nosuid,size=64m my-app
--tmpfs, /tmp ve /var/run gibi dizinler için geçici yazılabilir bir bağlama noktası oluşturur. noexec bayrağı, bu bağlama noktasından yürütmeyi engeller. Bu yaklaşım, saldırganları izleyebileceğiniz yazılabilir dizinler üzerinden geçmeye zorlar.
Adım 4: cgroups ile Kaynak Sınırlarını Uygulayın
Sınırsız konteynerler, ana bilgisayar belleğini veya CPU'sunu tüketerek hizmet reddi saldırıları gerçekleştirebilir. Docker'ın çalışma zamanı kısıtlamalarını kullanın:
docker run --memory=512m --memory-swap=512m --cpus=0.5 --pids-limit=100 my-app
--memoryve--memory-swapkatı sınırlar belirler (takas yok).--cpusCPU'yu sınırlar.--pids-limit, işlem sayısını sınırlayarak fork bombalarını önler.
Uyarı: Kaynak sınırları cgroups tarafından uygulanır, ancak ağ üzerinden veri sızmasını engellemez. Ağ izolasyonu ile birleştirin (sonraki adım).
Adım 5: Docker Özel Ağları ile Ağları Segmentlere Ayırın
Varsayılan olarak, Docker konteynerleri bir köprü ağını paylaşır. Çok kiracılı bir kurulumda, her kiracının ağ yığınını izole etmelisiniz. Her kiracı için özel bir ağ oluşturun:
docker network create tenant-alpha --internal
docker run --network tenant-alpha my-app
Giden internet erişimini engellemek için --internal bayrağını kullanın, ardından yalnızca gerekli bağlantı noktalarını -p ile açığa çıkarın. Daha gelişmiş ağ segmentasyonu için, Docker izolasyonu ile web uygulamalarını güvence altına alma konusunu değerlendirin.
Uyarı: Dahili ağlar, kiracılar arasında doğrudan konteyner-konteyner iletişimini engeller, ancak ana bilgisayar ağını kullanırsanız DNS sızıntıları hala meydana gelebilir. Köprü veya overlay ağlarına bağlı kalın.
Adım 6: Seccomp ve AppArmor Profilleri Uygulayın
Seccomp sistem çağrılarını filtreler ve AppArmor (veya SELinux) zorunlu erişim kontrollerini uygular. Docker, belirli bayraklarla clone gibi tehlikeli sistem çağrılarını engelleyen varsayılan bir seccomp profili sağlar. Daha sıkı izolasyon için özel bir profil oluşturun:
docker run --security-opt seccomp=./custom.json --security-opt apparmor=docker-default my-app
Temel bir profili docker run --rm -it --security-opt seccomp=unconfined my-app strace -c -S time ile oluşturabilir ve ardından kırpabilirsiniz. Uyarı: Aşırı kısıtlayıcı profiller meşru işlevselliği bozabilir. Hazırlık ortamında iyice test edin.
Adım 7: Sanal Makinelerle Hibrit İzolasyonu Değerlendirin
Kiracılarınız mutlak izolasyon gerektiriyorsa (örneğin, düzenlemeye tabi sektör), konteynerleri hafif bir sanal makine içinde çalıştırın. Sysbox veya Kata Containers gibi araçlar, konteyner hızından ödün vermeden donanım düzeyinde ayırma sağlar. Bu, Docker'ın Gelişmiş Konteyner İzolasyonu (ECI) tarafından kullanılan yaklaşımdır. Yük, çıplak konteynerlerden daha yüksek olsa da, iş yükü başına tam VM'lerden çok daha düşüktür.
Doğru izolasyon seviyesini seçme hakkında daha fazla bilgi için, çok kiracılı bir Docker mimarisi tasarlama makalesini okuyun.
Hepsini Bir Araya Getirmek: Bir Güçlendirme Kontrol Listesi
- Konteynerleri root olmayan kullanıcı ile oluşturun.
- Tüm yetenekleri kaldırın, yalnızca gerekli olanı ekleyin.
- Dosya sistemini geçici yazılabilir bağlama noktalarıyla salt okunur bağlayın.
- Bellek, CPU ve PID sınırları belirleyin.
- Kiracı başına izole Docker ağları oluşturun.
- Özel seccomp ve AppArmor profilleri uygulayın.
- Yüksek güvenlik ihtiyaçları için hibrit VM konteynerlerini değerlendirin.
Sonuç
Konteyner güçlendirme tek seferlik bir görev değildir—sürekli bir disiplindir. Yukarıdaki adımlar, çok kiracılı barındırma için bir güvenlik temeli oluşturur. Hiçbir önlemin tek başına güvenliği garanti etmediğini unutmayın; derinlemesine savunma anahtardır. Temel bilgilerle başlayın: root olmayan kullanıcılar ve kaldırılmış yetenekler. Ardından kaynak sınırları ve ağ segmentasyonunu katmanlayın. En hassas iş yükleri için konteynerleri VM'lerle birleştirin. Bu kılavuzla, hem verimli hem de güvenli çok kiracılı Docker ortamlarını güvenle dağıtabilirsiniz.
