Docker Security
Last updated
AWS Hacking'i öğrenin ve uygulayın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve uygulayın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
Trickest'i kullanarak dünyanın en gelişmiş topluluk araçları tarafından desteklenen iş akışlarını kolayca oluşturun ve otomatikleştirin. Bugün Erişim Alın:
Docker motoru, konteynerleri izole etmek için Linux çekirdeğinin Namespaces ve Cgroups'ını kullanır, temel bir güvenlik katmanı sunar. Yeteneklerin düşürülmesi, Seccomp ve SELinux/AppArmor ile ek koruma sağlanır, konteyner izolasyonu artırılır. Bir auth eklentisi kullanıcı işlemlerini daha da kısıtlayabilir.
Docker motoruna yerel olarak Unix soketi aracılığıyla veya uzaktan HTTP kullanılarak erişilebilir. Uzaktan erişim için gizlilik, bütünlük ve kimlik doğrulamasını sağlamak için HTTPS ve TLS kullanmak önemlidir.
Ubuntu sistemlerinde Docker varsayılan olarak unix:///var/run/docker.sock
adresinde Unix soketinde dinler. Docker'ın başlangıç seçenekleri /etc/default/docker
dosyasında tanımlanmıştır. Docker API ve istemciye uzaktan erişimi etkinleştirmek için Docker daemon'ını HTTP soketi üzerinden açmak için aşağıdaki ayarları ekleyin:
Ancak, Docker daemon'ını HTTP üzerinden açmak güvenlik endişeleri nedeniyle önerilmez. Bağlantıların güvenliğini sağlamak için HTTPS kullanılması tavsiye edilir. Bağlantıyı güvence altına almanın iki temel yaklaşımı vardır:
İstemci sunucunun kimliğini doğrular.
Hem istemci hem de sunucu birbirlerinin kimliğini karşılıklı olarak doğrular.
Sertifikalar, bir sunucunun kimliğini doğrulamak için kullanılır. Her iki yöntemin detaylı örnekleri için bu kılavuza başvurun.
Konteyner görüntüleri ya özel ya da genel depolama alanlarında saklanabilir. Docker, konteyner görüntüleri için birkaç depolama seçeneği sunar:
Docker Hub: Docker'dan genel bir kayıt servisi.
Docker Registry: Kullanıcıların kendi kayıtlarını barındırmasına izin veren açık kaynaklı bir proje.
Docker Trusted Registry: Rol tabanlı kullanıcı kimlik doğrulaması ve LDAP dizin hizmetleriyle entegrasyon sunan Docker'ın ticari kayıt sunumu.
Konteynerler, temel görüntü veya temel görüntü üzerine kurulan yazılım nedeniyle güvenlik açıklarına sahip olabilir. Docker, konteynerlerin güvenlik taramasını yapabilen ve güvenlik açıklarını listeleyen Nautilus adlı bir proje üzerinde çalışmaktadır. Nautilus, her Konteyner görüntü katmanını güvenlik açığı havuzunu karşılaştırarak güvenlik açıklarını belirlemek için çalışır.
Daha fazla bilgi için burayı okuyun.
docker scan
docker scan
komutu, görüntü adını veya kimliğini kullanarak mevcut Docker görüntülerini taramanıza olanak tanır. Örneğin, hello-world görüntüsünü taramak için aşağıdaki komutu çalıştırın:
Docker imaj imzalama, konteynerlerde kullanılan imajların güvenliğini ve bütünlüğünü sağlar. İşte özet bir açıklama:
Docker içerik güvenini etkinleştirmek için export DOCKER_CONTENT_TRUST=1
ayarını yapın. Bu özellik, Docker sürümü 1.10 ve sonrasında varsayılan olarak kapalıdır.
Bu özellik etkinleştirildiğinde, yalnızca imzalı imajlar indirilebilir. İlk imaj yükleme işlemi, kök ve etiketleme anahtarları için parola belirlemeyi gerektirir; Docker ayrıca gelişmiş güvenlik için Yubikey'i de destekler. Daha fazla ayrıntıya buradan ulaşabilirsiniz.
İçerik güveni etkinleştirilmiş bir imzasız imajı çekmeye çalışmak, "No trust data for latest" hatasıyla sonuçlanır.
İlk imaj yüklemeden sonra imajı imzalamak için Docker, depo anahtarının parolasını ister.
Özel anahtarlarınızı yedeklemek için aşağıdaki komutu kullanın:
Docker ana bilgisayarlar arasında geçiş yaparken işlemleri sürdürebilmek için kök ve depo anahtarlarını taşımak gereklidir.
Trickest kullanarak dünyanın en gelişmiş topluluk araçları tarafından desteklenen otomatikleştirilmiş iş akışları oluşturun ve yönetin. Bugün Erişim Alın:
Ad alanları, Linux çekirdeğinin bir özelliğidir ve çekirdek kaynaklarını bölümlere ayırır, böylece bir set işlem, bir set kaynak görürken başka bir set işlem farklı bir set kaynak görür. Bu özellik, bir dizi kaynak ve işlem için aynı ad alanına sahip olmakla birlikte, bu ad alanları farklı kaynaklara işaret eder. Kaynaklar birden çok alanda bulunabilir.
Docker, Konteyner izolasyonunu sağlamak için aşağıdaki Linux çekirdek Ad Alanlarını kullanır:
pid ad alanı
mount ad alanı
network ad alanı
ipc ad alanı
UTS ad alanı
Ad alanları hakkında daha fazla bilgi için aşağıdaki sayfaya bakın:
NamespacesLinux çekirdek özelliği cgroups, bir dizi işlem arasında cpu, bellek, io, ağ bant genişliği gibi kaynakları kısıtlama yeteneği sağlar. Docker, belirli Konteyner için kaynak kontrolü sağlayan cgroup özelliğini kullanarak Konteyner'lar oluşturmanıza izin verir. Aşağıda, kullanıcı alanı belleği 500m'ye, çekirdek belleği 50m'ye, cpu payını 512'ye, blkioweight'i 400'e sınırlayan bir Konteyner oluşturulmuştur. CPU payı, Konteyner'ın CPU kullanımını kontrol eden bir orandır. Varsayılan değeri 1024'tür ve 0 ile 1024 arasında bir aralığa sahiptir. Üç Konteynerin aynı CPU payına (1024) sahip olduğunu varsayarsak, CPU kaynağı çatışması durumunda her Konteyner, CPU'nun %33'üne kadar alabilir. blkio-weight, Konteyner'ın IO'sunu kontrol eden bir orandır. Varsayılan değeri 500'dür ve 10 ile 1000 arasında bir aralığa sahiptir.
Bir konteynerin cgroup'una erişmek için şunu yapabilirsiniz:
Daha fazla bilgi için kontrol edin:
CGroupsYetenekler, kök kullanıcı için izin verilebilecek yetenekler için daha ince kontrol sağlar. Docker, kullanıcı türünden bağımsız olarak bir Konteyner içinde yapılabilen işlemleri sınırlamak için Linux çekirdek yetenek özelliğini kullanır.
Docker konteyneri çalıştırıldığında, işlem, izolasyondan kaçınmak için kullanabileceği hassas yetenekleri bırakır. Bu, işlemin hassas eylemleri gerçekleştiremeyeceğinden ve kaçamayacağından emin olmaya çalışır:
Linux CapabilitiesBu, Docker'ın konteyner içinde kullanılabilecek sistem çağrılarını sınırlamasına izin veren bir güvenlik özelliğidir:
SeccompAppArmor, konteynerleri sınırlı bir dizi kaynağa per-program profilleri ile sınırlamak için bir çekirdek geliştirmesidir.:
AppArmorEtiketleme Sistemi: SELinux, her işlem ve dosya sistemi nesnesine benzersiz bir etiket atar.
Politika Uygulaması: Sistem içinde bir işlem etiketinin diğer etiketler üzerinde hangi eylemleri gerçekleştirebileceğini tanımlayan güvenlik politikalarını uygular.
Konteyner İşlem Etiketleri: Konteyner motorları konteyner işlemlerini başlattığında genellikle sınırlı bir SELinux etiketi atarlar, genellikle container_t
.
Konteyner İçindeki Dosya Etiketleme: Konteyner içindeki dosyalar genellikle container_file_t
olarak etiketlenir.
Politika Kuralları: SELinux politikası, container_t
etiketine sahip işlemlerin yalnızca container_file_t
olarak etiketlenmiş dosyalarla etkileşime geçebileceğini (okuma, yazma, yürütme) sağlar.
Bu mekanizma, bir konteyner içindeki bir işlem bile tehlikeye atılmış olsa bile, yalnızca ilgili etiketlere sahip nesnelerle etkileşimde bulunabileceğinden, bu tür tehlikelerden kaynaklanan potansiyel hasarı önemli ölçüde sınırlar.
SELinuxDocker'da bir yetkilendirme eklentisi, Docker daemonına yapılan istekleri izin verip engelleyerek güvenlikte önemli bir rol oynar. Bu karar, iki temel bağlamı inceleyerek verilir:
Kimlik Doğrulama Bağlamı: Bu, kullanıcı hakkında kapsamlı bilgileri içerir, kim oldukları ve nasıl kimlik doğruladıkları gibi.
Komut Bağlamı: Yapılan isteğe ilişkin tüm ilgili verileri içerir.
Bu bağlamlar, yalnızca kimlik doğrulaması yapılmış kullanıcılardan gelen meşru isteklerin işlenmesini sağlayarak Docker işlemlerinin güvenliğini artırır.
AuthZ& AuthN - Docker Access Authorization PluginBir konteynerin kullanabileceği kaynakları doğru bir şekilde sınırlamıyorsanız, tehlikeye atılmış bir konteyner, çalıştığı ana bilgisayarı DoS edebilir.
CPU DoS
Bant Genişliği DDoS
Aşağıdaki sayfada --privileged
bayrağının ne anlama geldiğini öğrenebilirsiniz:
Eğer bir saldırganın düşük ayrıcalıklı bir kullanıcı olarak erişim elde etmeyi başardığı bir konteyner çalıştırıyorsanız ve hatalı yapılandırılmış suid ikili dosyasına sahipseniz, saldırgan bunu kötüye kullanabilir ve konteyner içinde ayrıcalıkları yükseltebilir. Bu da ona kaçmasına izin verebilir.
Konteyneri no-new-privileges
seçeneği etkinleştirilmiş olarak çalıştırmak, bu tür ayrıcalık yükseltmelerini engelleyecektir.
Daha fazla --security-opt
seçeneği için kontrol edin: https://docs.docker.com/engine/reference/run/#security-configuration
Docker görüntülerine doğrudan şifre gömmek veya çevresel değişkenler kullanmak önemli değildir, çünkü bu yöntemler, docker inspect
veya exec
gibi komutlar aracılığıyla konteynıra erişimi olan herkese hassas bilgilerinizi açığa çıkarır.
Docker birimleri, hassas bilgilere erişim için önerilen daha güvenli bir alternatiftir. Bunlar, riskleri azaltmak için geçici bir dosya sistemi olarak bellekte kullanılabilir ve docker inspect
ve günlüğe kaydetme ile ilişkili riskleri hafifletir. Ancak, kök kullanıcılar ve konteynıra exec
erişimi olanlar hala şifrelere erişebilir.
Docker secrets, hassas bilgileri ele almak için daha güvenli bir yöntem sunar. Görüntü oluşturma aşamasında şifreler gerektiren durumlar için, BuildKit ek özellikler sunarak görüntü oluşturma hızını artırır ve ek özellikler sağlar.
BuildKit'ten yararlanmak için üç şekilde etkinleştirilebilir:
Bir çevresel değişken aracılığıyla: export DOCKER_BUILDKIT=1
Komutlara önek ekleyerek: DOCKER_BUILDKIT=1 docker build .
Docker yapılandırmasında varsayılan olarak etkinleştirilerek: { "features": { "buildkit": true } }
, ardından bir Docker yeniden başlatma.
BuildKit, --secret
seçeneği ile yapı zamanı şifrelerin kullanımına izin verir, bu sayede bu şifrelerin görüntü oluşturma önbelleğine veya nihai görüntüye dahil edilmediğinden emin olunur, şu şekilde bir komut kullanılarak:
Çalışan bir konteyner için gerekli olan sırlar için Docker Compose ve Kubernetes sağlam çözümler sunar. Docker Compose, gizli dosyaları belirtmek için hizmet tanımında bir secrets
anahtarı kullanır, aşağıdaki docker-compose.yml
örneğinde olduğu gibi:
Bu yapılandırma, Docker Compose ile hizmetleri başlatırken secrets kullanımına izin verir.
Kubernetes ortamlarında, secrets doğal olarak desteklenir ve Helm-Secrets gibi araçlarla daha fazla yönetilebilir. Kubernetes'in Rol Tabanlı Erişim Kontrolleri (RBAC), Docker Enterprise ile benzer şekilde secret yönetimi güvenliğini artırır.
gVisor, Linux sistem yüzeyinin önemli bir kısmını uygulayan, Go'da yazılmış bir uygulama çekirdeğidir. Uygulama ile ana bilgisayar çekirdeği arasında bir izolasyon sınırı sağlayan runsc
adında bir Open Container Initiative (OCI) çalışma zamanını içerir. runsc
çalışma zamanı, Docker ve Kubernetes ile entegre olarak, kum havuzlu konteynerleri çalıştırmayı kolaylaştırır.
Kata Containers, konteynerler gibi hissedip performans gösteren hafif sanal makinelerle güvenli bir konteyner çalışma zamanı oluşturmak için çalışan açık kaynak topluluğudur, ancak ikinci bir savunma katmanı olarak donanım sanallaştırma teknolojisini kullanarak daha güçlü iş yükü izolasyonu sağlar.
--privileged
bayrağını kullanmayın veya konteyner içinde bir Docker soketi bağlamayın. Docker soketi, konteynerlerin başlatılmasına izin verir, bu nedenle örneğin, --privileged
bayrağı ile başka bir konteyner çalıştırarak ana bilgisayarın tam kontrolünü ele geçirmek kolaydır.
Konteyner içinde kök olarak çalıştırmayın. Farklı bir kullanıcı ve kullanıcı ad alanları** kullanın.** Konteynerdeki kök, kullanıcı ad alanları ile yeniden eşlenene kadar ana bilgisayardakiyle aynıdır. Yalnızca Linux ad alanları, yetenekler ve cgroups tarafından hafifçe kısıtlanır.
Tüm yetenekleri bırakın (--cap-drop=all
) ve yalnızca gerekenleri etkinleştirin (--cap-add=...
). Birçok iş yükü hiçbir yetenek gerektirmez ve bunları eklemek bir saldırı alanının kapsamını artırır.
"no-new-privileges" güvenlik seçeneğini kullanın süid ikili dosyalar aracılığıyla örneğin daha fazla ayrıcalık kazanmalarını önlemek için.
Konteynere sağlanan kaynakları sınırlayın. Kaynak sınırları, makinenin hizmet reddi saldırılarından korunmasına yardımcı olabilir.
Resmi docker görüntülerini kullanın ve imzaları gerektirin veya bunlara dayalı kendi görüntülerinizi oluşturun. Geriye dönük veya arka kapılı görüntülerden miras almayın veya kullanmayın. Ayrıca kök anahtarları, parola güvenli bir yerde saklayın. Docker, anahtarları UCP ile yönetme planları yapmaktadır.
Güvenlik yamalarını uygulamak için düzenli olarak görüntülerinizi yeniden oluşturun.
Secret'larınızı akıllıca yönetin böylece saldırganın bunlara erişmesi zor olur.
Docker daemon'ı HTTPS ile açıklarsanız, istemci ve sunucu kimlik doğrulaması yapın.
Dockerfile'ınızda ADD yerine COPY'yi tercih edin. ADD otomatik olarak sıkıştırılmış dosyaları çıkarır ve dosyaları URL'lerden kopyalayabilir. COPY'nin bu yetenekleri yoktur. Mümkün olduğunca ADD kullanmaktan kaçının, böylece uzak URL'ler ve Zip dosyaları aracılığıyla yapılan saldırılara karşı savunmasız olmazsınız.
Her mikro hizmet için ayrı konteynerler kullanın
Konteyner görüntülerini daha küçük yapın
Eğer bir docker konteynerinin içindeyseniz veya docker grubunda bir kullanıcıya erişiminiz varsa, kaçmaya ve ayrıcalıkları yükseltmeye çalışabilirsiniz:
Docker Breakout / Privilege EscalationEğer docker soketine erişiminiz varsa veya docker grubunda bir kullanıcıya erişiminiz varsa ancak eylemleriniz bir docker kimlik doğrulama eklentisi tarafından sınırlanıyorsa, bunu atlayıp atlayamayacağınızı kontrol edin:
AuthZ& AuthN - Docker Access Authorization Plugindocker-bench-security aracı, Docker konteynerlerini üretimde dağıtma etrafında onlarca yaygın en iyi uygulamayı kontrol eden bir betik. Testlerin hepsi otomatiktir ve CIS Docker Benchmark v1.3.1 temel alınmıştır. Araç, docker çalıştıran ana bilgisayardan veya yeterli ayrıcalıklara sahip bir konteynerden çalıştırmanız gerekir. README'de nasıl çalıştırılacağını öğrenin: https://github.com/docker/docker-bench-security.
Trickest kullanarak dünyanın en gelişmiş topluluk araçları tarafından desteklenen iş akışlarını kolayca oluşturun ve otomatikleştirin. Bugün Erişim Alın:
AWS Hacking'i öğrenin ve uygulayın: HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve uygulayın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)