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)
- Docker and Container Isolation
- Chapter 2. Container Hosts and Multi-tenancy | Container Security Guide | OpenShift Container Platform | 3.6 | Red Hat Documentation
- What is Container Escape? - Aqua Security
- Container escape vulnerabilities allow attackers to break out of isolated environments and gain unauthorized access to host systems.
- Enhanced Container Isolation - Docker Docs

