Docker Security
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
Trickest kullanarak dünyanın en gelişmiş topluluk araçlarıyla 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'unu kullanarak temel bir güvenlik katmanı sunar. Ek koruma, Capabilities dropping, Seccomp ve SELinux/AppArmor ile sağlanarak konteyner izolasyonu artırılır. Bir auth plugin kullanıcı eylemlerini daha da kısıtlayabilir.
Docker motoruna, yerel olarak bir Unix soketi üzerinden veya uzaktan HTTP kullanarak erişilebilir. Uzaktan erişim için, gizlilik, bütünlük ve kimlik doğrulamasını sağlamak amacıyla HTTPS ve TLS kullanmak önemlidir.
Docker motoru, varsayılan olarak unix:///var/run/docker.sock
adresindeki Unix soketinde dinler. Ubuntu sistemlerinde, Docker'ın başlangıç seçenekleri /etc/default/docker
dosyasında tanımlanmıştır. Docker API'sine ve istemcisine uzaktan erişimi etkinleştirmek için, Docker daemon'unu bir 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ı HTTPS kullanarak güvence altına almak tavsiye edilir. Bağlantıyı güvence altına almanın iki ana yaklaşımı vardır:
İstemci, sunucunun kimliğini doğrular.
Hem istemci hem de sunucu, birbirlerinin kimliğini karşılıklı olarak doğrular.
Sunucunun kimliğini doğrulamak için sertifikalar kullanılır. Her iki yöntem için ayrıntılı örnekler için bu kılavuza bakın.
Konteyner görüntüleri özel veya genel depolarda saklanabilir. Docker, konteyner görüntüleri için birkaç depolama seçeneği sunar:
Docker Hub: Docker'dan bir genel kayıt hizmeti.
Docker Registry: Kullanıcıların kendi kayıtlarını barındırmalarına olanak tanıyan açık kaynaklı bir proje.
Docker Trusted Registry: Rol tabanlı kullanıcı kimlik doğrulaması ve LDAP dizin hizmetleri ile entegrasyon sunan Docker'ın ticari kayıt teklifi.
Konteynerler, ya temel görüntü nedeniyle ya da temel görüntünün üzerine kurulu yazılım nedeniyle güvenlik açıklarına sahip olabilir. Docker, konteynerlerin güvenlik taramasını yapan ve açıkları listeleyen Nautilus adlı bir proje üzerinde çalışıyor. Nautilus, her konteyner görüntü katmanını güvenlik açıkları deposu ile karşılaştırarak güvenlik açıklarını tanımlar.
Daha fazla bilgi için bunu okuyun.
docker scan
docker scan
komutu, mevcut Docker görüntülerini görüntü adı veya kimliği kullanarak 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 kısaca 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üklemesi, kök ve etiketleme anahtarları için şifreler ayarlamayı gerektirir; Docker ayrıca artırılmış güvenlik için Yubikey'i de destekler. Daha fazla ayrıntı burada bulunabilir.
İçerik güveni etkinken imzasız bir imaj çekmeye çalışmak "No trust data for latest" hatası ile sonuçlanır.
İlk imaj yüklemesinden sonraki imaj yüklemeleri için, Docker imajı imzalamak için depo anahtarının şifresini ister.
Özel anahtarlarınızı yedeklemek için şu komutu kullanın:
Docker ana bilgisayarlarını değiştirirken, işlemleri sürdürmek için kök ve depo anahtarlarını taşımak gereklidir.
Dünyanın en gelişmiş topluluk araçlarıyla desteklenen iş akışlarını kolayca oluşturmak ve otomatikleştirmek için Trickest kullanın. Bugün Erişim Alın:
Namespaces, çekirdek kaynaklarını bölümlere ayıran Linux çekirdek özelliğidir; böylece bir işlem kümesi bir kaynak kümesini görürken, diğer bir işlem kümesi farklı bir kaynak kümesini görür. Bu özellik, bir kaynak ve işlem kümesi için aynı namespace'e sahip olarak çalışır, ancak bu namespace'ler farklı kaynaklara atıfta bulunur. Kaynaklar birden fazla alanda var olabilir.
Docker, konteyner izolasyonu sağlamak için aşağıdaki Linux çekirdek Namespaces'lerini kullanır:
pid namespace
mount namespace
network namespace
ipc namespace
UTS namespace
Namespaces hakkında daha fazla bilgi için aşağıdaki sayfayı kontrol edin:
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 bir Konteyner için kaynak kontrolü sağlayan cgroup özelliğini kullanarak Konteynerler oluşturmanıza olanak tanır. Aşağıda, kullanıcı alanı belleği 500m ile sınırlı, çekirdek belleği 50m ile sınırlı, cpu payı 512, blkioweight 400 olan bir Konteyner oluşturulmuştur. CPU payı, Konteyner’in 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. Üç Konteyner 1024 CPU payına sahipse, her Konteyner CPU kaynak rekabeti durumunda %33'e kadar CPU alabilir. blkio-weight, Konteyner’in 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'unu almak için şunu yapabilirsiniz:
Daha fazla bilgi için kontrol edin:
CGroupsYetenekler, root kullanıcısı için izin verilebilecek yetenekler üzerinde daha ince bir kontrol sağlar. Docker, bir konteyner içinde yapılabilecek işlemleri sınırlamak için Linux çekirdek yetenek özelliğini kullanır, kullanıcı türünden bağımsız olarak.
Bir docker konteyneri çalıştırıldığında, işlem, izolasyondan kaçmak için kullanabileceği hassas yetenekleri düşürür. Bu, işlemin hassas eylemleri gerçekleştiremeyeceğini ve kaçamayacağını sağlamaya çalışır:
Linux CapabilitiesBu, Docker'ın konteyner içinde kullanılabilecek sistem çağrılarını sınırlamasına olanak tanıyan bir güvenlik özelliğidir:
SeccompAppArmor, konteynerleri sınırlı bir kaynak setine program başına profillerle hapsetmek için bir çekirdek geliştirmesidir.:
AppArmorEtiketleme Sistemi: SELinux, her işleme ve dosya sistemi nesnesine benzersiz bir etiket atar.
Politika Uygulaması: Bir işlem etiketinin sistem içindeki 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, yaygın olarak container_t
atanır.
Konteyner İçindeki Dosya Etiketleme: Konteyner içindeki dosyalar genellikle container_file_t
olarak etiketlenir.
Politika Kuralları: SELinux politikası esasen container_t
etiketine sahip işlemlerin yalnızca container_file_t
olarak etiketlenmiş dosyalarla etkileşimde bulunabileceğini garanti eder.
Bu mekanizma, bir konteyner içindeki bir işlem tehlikeye girse bile, yalnızca karşılık gelen etiketlere sahip nesnelerle etkileşimde bulunmakla sınırlı kalmasını sağlar ve bu tür tehlikelerin potansiyel zararını önemli ölçüde sınırlar.
SELinuxDocker'da, bir yetkilendirme eklentisi, Docker daemon'una yapılan istekleri kabul etme veya engelleme kararını vererek güvenlikte kritik bir rol oynar. Bu karar, iki ana bağlamı inceleyerek verilir:
Kimlik Doğrulama Bağlamı: Bu, kullanıcının kim olduğu ve kendini nasıl kimlik doğruladığı gibi kapsamlı bilgileri içerir.
Komut Bağlamı: Bu, yapılan istekle ilgili tüm ilgili verileri içerir.
Bu bağlamlar, yalnızca kimlik doğrulaması yapılmış kullanıcıların meşru isteklerinin işlenmesini sağlamaya yardımcı olur ve Docker işlemlerinin güvenliğini artırır.
AuthZ& AuthN - Docker Access Authorization PluginEğer bir konteynerin kullanabileceği kaynakları düzgün bir şekilde sınırlamazsanız, tehlikeye giren bir konteyner, çalıştığı ana makineyi DoS yapabilir.
CPU DoS
Bant Genişliği DoS
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 sağladığı bir konteyner çalıştırıyorsanız. Eğer yanlış yapılandırılmış bir suid ikili dosyanız varsa, saldırgan bunu kötüye kullanabilir ve konteyner içinde ayrıcalıkları artırabilir. Bu, onun oradan kaçmasına izin verebilir.
Konteyneri no-new-privileges
seçeneği etkinleştirilmiş olarak çalıştırmak, bu tür ayrıcalık artışlarını önleyecektir.
For more --security-opt
options check: https://docs.docker.com/engine/reference/run/#security-configuration
Gizli bilgileri doğrudan Docker imajlarına gömmekten veya ortam değişkenleri kullanmaktan kaçınmak çok önemlidir, çünkü bu yöntemler hassas bilgilerinizi docker inspect
veya exec
gibi komutlar aracılığıyla konteynıra erişimi olan herkesin erişimine açar.
Docker hacimleri, hassas bilgilere erişim için önerilen daha güvenli bir alternatiftir. Bunlar, docker inspect
ve günlükleme ile ilişkili riskleri azaltarak, bellek içinde geçici bir dosya sistemi olarak kullanılabilir. Ancak, kök kullanıcılar ve konteynıra exec
erişimi olanlar yine de gizli bilgilere erişebilir.
Docker gizli bilgileri, hassas bilgileri yönetmek için daha güvenli bir yöntem sunar. İmaj oluşturma aşamasında gizli bilgilere ihtiyaç duyan örnekler için, BuildKit yapı zamanı gizli bilgileri destekleyerek, yapı hızını artıran ve ek özellikler sunan etkili bir çözüm sunar.
BuildKit'i kullanmak için üç şekilde etkinleştirilebilir:
Bir ortam değişkeni aracılığıyla: export DOCKER_BUILDKIT=1
Komutları ön ekleyerek: DOCKER_BUILDKIT=1 docker build .
Docker yapılandırmasında varsayılan olarak etkinleştirerek: { "features": { "buildkit": true } }
, ardından Docker'ı yeniden başlatarak.
BuildKit, --secret
seçeneği ile yapı zamanı gizli bilgilerin kullanılmasına olanak tanır ve bu gizli bilgilerin imaj oluşturma önbelleğine veya nihai imaja dahil edilmemesini sağlar, şu komutla:
Çalışan bir konteynerde gereken gizli bilgiler 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; bu, bir docker-compose.yml
örneğinde gösterilmiştir:
Bu yapılandırma, Docker Compose ile hizmetleri başlatırken gizli bilgilerin kullanılmasına olanak tanır.
Kubernetes ortamlarında, gizli bilgiler yerel olarak desteklenir ve Helm-Secrets gibi araçlarla daha fazla yönetilebilir. Kubernetes'in Rol Tabanlı Erişim Kontrolleri (RBAC), gizli bilgi yönetimi güvenliğini artırır, bu Docker Enterprise'a benzer.
gVisor, Go dilinde yazılmış bir uygulama çekirdeğidir ve Linux sistem yüzeyinin önemli bir kısmını uygular. Uygulama ile ana makine çekirdeği arasında izolasyon sınırı sağlayan runsc
adlı bir Open Container Initiative (OCI) çalışma zamanı içerir. runsc
çalışma zamanı, Docker ve Kubernetes ile entegre olur ve kumanda edilmiş konteynerleri çalıştırmayı basit hale getirir.
Kata Containers, hafif sanal makinelerle güvenli bir konteyner çalışma zamanı oluşturmak için çalışan açık kaynak topluluğudur. Bu sanal makineler, konteynerler gibi hissettiren ve performans gösteren, ancak donanım sanallaştırma teknolojisini ikinci bir savunma katmanı olarak kullanarak daha güçlü iş yükü izolasyonu sağlayan bir yapıdır.
--privileged
bayrağını kullanmayın veya konteyner içinde Docker soketini monte etmeyin. Docker soketi, konteynerlerin başlatılmasına olanak tanır, bu nedenle başka bir konteyneri --privileged
bayrağı ile çalıştırarak ana makinenin tam kontrolünü ele geçirmenin kolay bir yoludur.
Konteyner içinde root olarak çalışmayın. Farklı bir kullanıcı kullanın ve kullanıcı ad alanları. Konteynerdeki root, kullanıcı ad alanları ile yeniden haritalanmadıkça ana makinedeki ile aynıdır. Sadece, esasen, Linux ad alanları, yetenekler ve cgroups tarafından hafifçe kısıtlanmıştır.
Tüm yetenekleri kaldırın (--cap-drop=all
) ve yalnızca gerekli olanları etkinleştirin (--cap-add=...
). Birçok iş yükü herhangi bir yetenek gerektirmez ve bunları eklemek, potansiyel bir saldırının kapsamını artırır.
“no-new-privileges” güvenlik seçeneğini kullanın süreçlerin daha fazla yetki kazanmasını önlemek için, örneğin suid ikili dosyaları aracılığıyla.
Konteynere sunulan kaynakları sınırlayın. Kaynak sınırları, makineyi hizmet reddi saldırılarından koruyabilir.
Resmi docker görüntülerini kullanın ve imzaları gerektirin veya bunlara dayanarak kendi görüntülerinizi oluşturun. Arka kapılı görüntüleri miras almayın veya kullanmayın. Ayrıca, root anahtarlarını ve şifreleri güvenli bir yerde saklayın. Docker, anahtarları UCP ile yönetmeyi planlıyor.
Düzenli olarak görüntülerinizi yeniden oluşturun güvenlik yamalarını ana makineye ve görüntülere uygulamak için.
Gizli bilgilerinizi akıllıca yönetin böylece saldırganın bunlara erişmesi zor olur.
Eğer docker daemon'u açığa çıkarıyorsanız HTTPS kullanın istemci ve sunucu kimlik doğrulaması ile.
Dockerfile'ınızda, ADD yerine COPY'yi tercih edin. ADD, otomatik olarak sıkıştırılmış dosyaları çıkarır ve URL'lerden dosya kopyalayabilir. COPY bu yeteneklere sahip değildir. Mümkün olduğunca, uzaktan URL'ler ve Zip dosyaları aracılığıyla saldırılara maruz kalmamak için ADD kullanmaktan kaçının.
Her mikro hizmet için ayrı konteynerler bulundurun.
Konteyner içinde ssh bulundurmayın, “docker exec” kullanılarak konteynere ssh yapılabilir.
Daha küçük konteyner görüntüleri bulundurun.
Eğer bir docker konteynerinin içindeyseniz veya docker grubunda bir kullanıcıya erişiminiz varsa, kaçmayı ve yetkileri yükseltmeyi deneyebilirsiniz:
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 kısıtlanıyorsa, bunu atlatıp atlatamayacağınıza bakın:
AuthZ& AuthN - Docker Access Authorization Plugindocker-bench-security aracı, üretimde Docker konteynerlerini dağıtma ile ilgili birçok yaygın en iyi uygulamayı kontrol eden bir betiktir. Testler tamamen otomatik olup, CIS Docker Benchmark v1.3.1 temel alınarak yapılmaktadır. Aracı, docker'ı çalıştıran ana makineden veya yeterli yetkilere sahip bir konteynerden çalıştırmalısınız. 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ıyla iş akışlarını kolayca oluşturun ve otomatikleştirin. Bugün Erişim Alın:
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)