Docker Socket Riskine Karşı: Podman ve Buildah ile Rootless CI/CD
Docker socket'ini pipeline'da paylaşmak, edge donanımına giden yollarda ciddi risk oluşturur. Podman ve Buildah'ın rootless, daemonsuz mimarisi bu tehdidi nasıl azaltıyor?
Docker'ın kök yetkili daemon soketini (/var/run/docker.sock) doğrudan CI/CD runner'larına bağlamak, özellikle IIoT, SCADA veya edge AI donanımına erişimi olan pipeline'larda kritik bir tedarik zinciri riski oluşturuyor. Bu mimaride runner ele geçirildiğinde saldırgan tek bir API çağrısıyla host'ta root yetkisi kazanabiliyor; Ocak 2024'te açıklanan CVE-2024-21626 ('Leaky Vessels') bu senaryonun teorik olmadığını gösterdi. runc'taki bir dosya tanımlayıcısı sızıntısı, kötü niyetli bir imajın konteyner sınırlarının dışına çıkıp host dosya sistemine erişmesine izin veriyordu.
Podman ve Buildah, dockerd gibi sürekli çalışan bir merkezi daemon yerine fork-exec modeliyle çalışıyor: her komut kernel ile doğrudan OCI runtime (crun/runc) üzerinden konuşup işini bitirince sonlanıyor, arkada kalıcı bir API soketi bırakmıyor. Rootless çalışma biçimi Linux user namespace mekanizmasına dayanıyor; host'taki düşük yetkili bir kullanıcı konteyner içinde UID 0 gibi görünse de, sınır dışına çıkan her işlem host'ta gerçek düşük UID'sine geri eşleniyor. Böylece aynı runtime açığı istismar edilse bile saldırgan host'ta root değil, sınırlı bir servis hesabı olarak kalıyor.
Pratikte bu izolasyonun çalışması /etc/subuid ve /etc/subgid dosyalarındaki subordinate UID/GID bloklarının doğru tanımlanmasına bağlı; IaC araçlarıyla oluşturulan servis hesaplarında bu ayarın elle doğrulanması gerekiyor. Depolama katmanında da önemli bir gelişme yaşandı: rootless konteynerler uzun süre performans maliyeti olan fuse-overlayfs'e mecburdu; Linux 5.13 ile kernel'in native overlay dosya sistemi rootless kullanıcılar için güvenli hale geldi ve Podman artık destekleniyorsa doğrudan native overlay'i tercih ediyor.
Mühendisler için sonuç net: fiziksel donanıma erişimi olan pipeline'larda root'lu Docker soketi paylaşımından kaçınmak ve Podman/Buildah'ın daemonsuz, namespace tabanlı mimarisine geçmek, olası bir runtime açığının host'u ele geçirmeden düşük yetkili bir hesapla sınırlı kalmasını sağlıyor.