AuthZ& AuthN - Docker Access Authorization Plugin
Docker'ın varsayılan yetkilendirme modeli "hepsi ya da hiçbiri" şeklindedir. Docker daemon'a erişim izni olan herhangi bir kullanıcı, herhangi bir Docker istemci komutunu çalıştırabilir. Aynısı, Docker'ın Engine API'sini kullanarak daemon ile iletişim kuran çağrılar için de geçerlidir. Daha fazla erişim kontrolü gerektiğinde, yetkilendirme eklentileri oluşturabilir ve bunları Docker daemon yapılandırmanıza ekleyebilirsiniz. Bir yetkilendirme eklentisi kullanarak, bir Docker yöneticisi Docker daemon'a erişimi yönetmek için ayrıntılı erişim politikaları yapılandırabilir.
Temel mimari
Docker Auth eklentileri, Docker Daemon'a yapılan isteklerin kullanıcıya ve istenen eyleme bağlı olarak Docker Daemon tarafından kabul edilip edilmeyeceğini belirleyen harici eklentilerdir.
Aşağıdaki bilgiler dokümantasyondan alınmıştır
CLI veya Engine API aracılığıyla Docker daemon'a yapılan bir HTTP isteği, kimlik doğrulama alt sistemi tarafından yüklü kimlik doğrulama eklentisine iletilir. İstek, kullanıcı (çağrı yapan) ve komut bağlamını içerir. Eklenti, isteği kabul etmek veya reddetmek için sorumludur.
Aşağıdaki sıra diyagramları, izin verme ve reddetme yetkilendirme akışını göstermektedir:
Eklentiye gönderilen her istek, kimlik doğrulanmış kullanıcıyı, HTTP başlıklarını ve istek/yanıt gövdesini içerir. Sadece kullanıcı adı ve kullanılan kimlik doğrulama yöntemi eklentiye iletilir. En önemlisi, kullanıcı kimlik bilgileri veya belirteçleri iletilmez. Son olarak, tüm istek/yanıt gövdeleri yetkilendirme eklentisine gönderilmez. Yalnızca Content-Type
'ı text/*
veya application/json
olan istek/yanıt gövdeleri gönderilir.
HTTP bağlantısını ele geçirebilecek komutlar (HTTP Upgrade
) için (örneğin exec
gibi), yetkilendirme eklentisi yalnızca başlangıç HTTP istekleri için çağrılır. Eklenti komutu onayladığında, yetkilendirme geri kalan akışa uygulanmaz. Özellikle, akış verileri yetkilendirme eklentilerine iletilmez. logs
ve events
gibi parçalı HTTP yanıtı döndüren komutlar için, yalnızca HTTP isteği yetkilendirme eklentilerine gönderilir.
İstek/yanıt işleme sırasında, bazı yetkilendirme akışlarının Docker daemon'a ek sorgular yapması gerekebilir. Bu tür akışları tamamlamak için, eklentiler düzenli bir kullanıcı gibi daemon API'sini çağırabilir. Bu ek sorguları etkinleştirmek için, eklenti, bir yöneticinin uygun kimlik doğrulama ve güvenlik politikalarını yapılandırabilmesi için araçlar sağlamalıdır.
Birden Fazla Eklenti
Eklentinizi Docker daemon başlangıcının bir parçası olarak kaydetmek sizin sorumluluğunuzdadır. Birden fazla eklenti kurabilir ve birbirine bağlayabilirsiniz. Bu zincir sıralanabilir. Her istek, zincir üzerinden sırayla geçer. Kaynağa erişim, tüm eklentilerin erişimi onaylaması durumunda sağlanır.
Eklenti Örnekleri
Twistlock AuthZ Broker
authz eklentisi, her kullanıcının hangi API uç noktalarına erişebileceğini çok kolay bir şekilde kontrol etmenizi sağlayan bir JSON dosyası oluşturmanıza izin verir.
İşte Alice ve Bob'un yeni konteynerler oluşturmasına izin veren bir örnek: {"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}
İstenen URL ile eylem arasındaki ilişkiyi route_parser.go sayfasında bulabilirsiniz. Eylem adı ile eylem arasındaki ilişkiyi types.go sayfasında bulabilirsiniz.
Basit Eklenti Öğretici
Kurulum ve hata ayıklama hakkında ayrıntılı bilgi içeren anlaşılması kolay bir eklentiyi https://github.com/carlospolop-forks/authobot adresinde bulabilirsiniz.
Nasıl çalıştığını anlamak için README
ve plugin.go
kodunu okuyun.
Docker Auth Eklenti Atlatma
Erişimi Sırala
Kontrol edilmesi gereken temel şeyler hangi uç noktaların izin verildiği ve Hangi HostConfig değerlerinin izin verildiğidir.
Bu sıralamayı yapmak için https://github.com/carlospolop/docker_auth_profiler aracını kullanabilirsiniz.
Yasaklanan run --privileged
run --privileged
Minimum Yetkiler
Bir konteyner çalıştırma ve ardından ayrıcalıklı bir oturum elde etme
Bu durumda sistem yöneticisi, kullanıcıların --privileged
bayrağıyla birlikte hacimleri bağlamasını ve konteynere herhangi bir ek yetenek vermesini yasakladı:
Ancak, bir kullanıcı çalışan konteyner içinde bir kabuk oluşturabilir ve ek ayrıcalıklar verebilir:
Şimdi, kullanıcı önceden tartışılan tekniklerden herhangi birini kullanarak konteynerden kaçabilir ve ana bilgisayarda ayrıcalıkları yükseltebilir.
Yazılabilir Klasörü Bağlama
Bu durumda sistem yöneticisi, kullanıcıların konteyneri --privileged
bayrağıyla çalıştırmalarını veya konteynere herhangi bir ek yetenek vermesini engelledi ve yalnızca /tmp
klasörünü bağlamalarına izin verdi:
Not: Belki /tmp
klasörünü bağlayamazsınız, ancak farklı yazılabilir bir klasörü bağlayabilirsiniz. Yazılabilir dizinleri şu komutla bulabilirsiniz: find / -writable -type d 2>/dev/null
Not: Bir Linux makinesindeki tüm dizinler suid bitini desteklemeyebilir! Suid bitini destekleyen dizinleri kontrol etmek için mount | grep -v "nosuid"
komutunu çalıştırın. Örneğin, genellikle /dev/shm
, /run
, /proc
, /sys/fs/cgroup
ve /var/lib/lxcfs
suid bitini desteklemez.
Ayrıca, /etc
veya yapılandırma dosyalarını içeren başka bir klasörü bağlayabilirseniz, kök olarak docker konteynerinden bu dosyaları kötüye kullanarak ayrıcalıkları yükseltebilirsiniz (belki /etc/shadow
dosyasını değiştirerek).
Kontrol Edilmeyen API Uç Noktası
Bu eklentiyi yapılandıran sistem yöneticisinin sorumluluğu, her kullanıcının hangi eylemleri ve hangi ayrıcalıklarla gerçekleştirebileceğini kontrol etmektir. Bu nedenle, yönetici uç noktaları ve özniteliklerle kara liste yaklaşımı benimserse, bazılarını unutabilir ve bu da saldırganın ayrıcalıkları yükseltmesine izin verebilir.
Docker API'sini https://docs.docker.com/engine/api/v1.40/# adresinden kontrol edebilirsiniz.
Kontrol Edilmeyen JSON Yapısı
Root'ta Bağlamalar
Sistem yöneticisi docker güvenlik duvarını yapılandırırken API gibi önemli bir parametreyi "Binds" unutmuş olabilir. Aşağıdaki örnekte, bu yapılandırma hatasını kötüye kullanarak ana bilgisayarın root (/) klasörünü bağlayan bir konteyner oluşturup çalıştırmak mümkündür:
Bu örnekte JSON'da Binds
parametresini kök düzey bir anahtar olarak kullanıyoruz, ancak API'de HostConfig
anahtarı altında görünüyor.
HostConfig'da Binds
Kök düzeydeki Binds ile aynı talimatları izleyerek Docker API'sine bu istemi gerçekleştirin:
Root'ta Mountlar
Root'ta Bağlantılar ile aynı talimatları izleyin ve Docker API'sine bu istemi gerçekleştirin:
HostConfig'da Mountlar
Docker API'ye bu istemi gerçekleştirerek root'ta Bağlantılar ile aynı talimatları izleyin:
Kontrol Edilmemiş JSON Özniteliği
Sistem yöneticisi docker güvenlik duvarını yapılandırırken, API içindeki "Capabilities" özelliği gibi bir parametrenin önemli bir özniteliğini unutmuş olabilir. Aşağıdaki örnekte, bu yanlış yapılandırmayı istismar ederek SYS_MODULE yeteneğine sahip bir konteyner oluşturup çalıştırmak mümkündür:
HostConfig
, genellikle konteynerden kaçmak için ilginç yetkilere sahip olan anahtar. Ancak, daha önce tartıştığımız gibi, dışında Binds kullanmanın da çalıştığını ve kısıtlamaları atlamak için izin verebileceğini unutmayın.
Eklentinin Devre Dışı Bırakılması
Eğer sistem yöneticisi, eklentiyi devre dışı bırakma yeteneğini yasaklamayı unutmuşsa, bunu tamamen devre dışı bırakmak için bundan faydalanabilirsiniz!
Yükseltme işleminden sonra eklentiyi yeniden etkinleştirmeyi unutmayın, aksi takdirde docker servisinin yeniden başlatılması çalışmayacaktır!
Auth Plugin Bypass yazıları
Referanslar
Last updated