Rootless container nedir, neden gündemde?
Container dünyası uzun süre “Docker kur, daemon root çalışsın, bitti” kolaylığıyla yürüdü. Ancak güvenlik tarafında bu yaklaşımın maliyeti var: root yetkisiyle çalışan bir servis, yanlış yapılandırma veya zafiyet durumunda sistemin tamamını riske atabilir. Rootless container yaklaşımı ise container’ları ve ilgili süreçleri root olmayan kullanıcıyla çalıştırarak saldırı yüzeyini ciddi biçimde küçültür. Son yıllarda Podman’ın popülerleşmesi ve Docker’ın rootless modunun olgunlaşmasıyla bu yaklaşım masaüstünde ve sunucuda daha ulaşılabilir hale geldi.
Bu yazıda, Linux üzerinde hem Docker Rootless hem de Podman ile rootless çalışmayı kurup günlük kullanım için pratik hale getireceğiz. Hedefimiz “kurulum bitti” demek değil; ağ, port, volume ve servis yönetimi gibi gerçek hayatta takılınan noktaları da ele almak.
Ön koşullar ve temel kavramlar
Rootless çalışmanın temelinde Linux’un user namespace kabiliyeti yatar. Kısaca, container içindeki “root” kullanıcı kimliği, host üzerinde normal bir kullanıcıya eşlenir. Bu sayede container içi root yetkileri host’a taşınmaz. Rootless kurulumlarda ayrıca genellikle slirp4netns (kullanıcı modunda ağ), fuse-overlayfs (overlay dosya sistemi) ve uid/gid map yapılandırması gibi parçalar devreye girer.
Kontrol etmeniz gereken ilk şey, sistemde yeterli kullanıcı ID aralığının tanımlı olmasıdır. Aşağıdaki dosyalarda kullanıcı adınıza ait satırların olması idealdir: /etc/subuid ve /etc/subgid. Örnek bir satır şu şekildedir: kullanici:100000:65536. Bu, rootless container’ların içerideki kullanıcılarını host üzerinde izole bir ID aralığına eşlemeyi sağlar.
Seçenek 1: Docker Rootless kurulumu ve kullanımı
Docker’ı rootless kullanmak istiyorsanız, dağıtımınızın paketleriyle Docker Engine kurulu olmalı ve ardından rootless “setup tool” çalıştırılmalıdır. Kurulum mantığı şudur: root yetkisiyle çalışan sistem servisi yerine, kullanıcı oturumunuz altında çalışan bir Docker daemon devreye girer. Bu sayede docker komutları da root olmadan çalışır.
Kurulumdan sonra iki kritik nokta vardır: Birincisi, Docker istemcisinin hangi sockete bağlanacağını bilmesi. Rootless modda genellikle socket yolu kullanıcı dizini altındadır. Bu yüzden DOCKER_HOST değişkenini ayarlamak gerekebilir. İkincisi, rootless ağ sürücüsü nedeniyle bazı port yönlendirmelerinde farklı davranışlar görülebilir.
Günlük kullanımda en çok karşılaşılan konu 80/443 gibi düşük portlardır. Root olmayan bir süreç bu portları doğrudan açamaz. Çözüm olarak 8080/8443 gibi portlar kullanılabilir veya sistemde düşük portlara izin veren bir ayar yapılabilir. Alternatif olarak ters proxy (Nginx/Caddy) root yetkisiyle değil, yetkili bir servis olarak konumlandırılıp backend’e yüksek porttan bağlanabilir.
Volume tarafında ise rootless modda dosya izinleri daha görünür hale gelir. Host’taki dosya sahipliği, container içi kullanıcı eşleşmesine göre yorumlanır. Eğer “container yazamıyor” gibi bir durum yaşıyorsanız, çoğu zaman mesele uygulamanın container içindeki kullanıcı UID’si ile host’taki dizin izinlerinin uyuşmamasıdır. Çözüm, uygulamayı uygun kullanıcıyla çalıştırmak veya host dizin sahipliğini/izinlerini düzenlemektir.
Seçenek 2: Podman ile daemon’suz rootless deneyim
Podman’ın en güçlü tarafı, daemon gerektirmeden çalışmasıdır. Rootless senaryoda bu avantaj daha da anlam kazanır: kullanıcı oturumunuz altında, her şey “normal bir süreç” gibi çalışır. Podman ayrıca Docker’a benzer bir CLI sunduğu için geçiş bariyeri düşüktür. Birçok komut birebir aynıdır; hatta isterseniz “docker” alışkanlıklarınızı sürdürmek için uyumluluk katmanları kullanabilirsiniz.
Podman ile rootless kullanımda ağ genellikle slirp4netns ile sağlanır. Bu, performans olarak kernel seviyesindeki bridge çözümlerinden bir miktar geride olabilir; ama masaüstü geliştirme, CI işleri ve çok sayıda servis çalıştırmayan senaryolarda gayet yeterlidir. Eğer daha ileri seviye ağ ihtiyaçlarınız varsa, Podman ekosisteminde farklı ağ sürücüleri ve sistem entegrasyon seçenekleri bulunur.
Podman’ın pratik bir artısı da podman generate systemd yaklaşımıdır. Rootless container’larınızı bir systemd user servisi gibi yönetebilir, oturum açınca otomatik başlatabilirsiniz. Bu sayede “terminali kapatınca container duruyor” derdi azalır. Bunun için kullanıcı systemd biriminin etkin olduğundan emin olmak ve “linger” benzeri ayarlarla oturum kapalıyken de çalıştırmak isteyebilirsiniz (sunucu senaryosunda faydalı).
Hangisini seçmeli? Karar matrisi
Docker Rootless, Docker ekosistemiyle sıkı bağlı ekipler için mantıklıdır. Compose dosyaları, üçüncü parti araçlar ve CI şablonları Docker merkezliyse, rootless moda geçiş görece kolay olur. Öte yandan rootless kısıtlarıyla uyumlu hale getirmek için port, volume ve ağ tarafında biraz disiplin gerekir.
Podman ise “daemon istemiyorum, kullanıcı oturumumda yalın çalışsın” diyenler için güçlü bir alternatiftir. Ayrıca systemd entegrasyonu ve rootless felsefesi daha doğal bir çizgide ilerler. Eğer yeni bir proje başlatıyor, yerel geliştirmede güvenliği varsayılan yapmak istiyorsanız Podman ciddi bir adaydır.
İleri seviye ipuçları: Güvenlik ve bakım
Rootless kullanıyorsanız yine de bazı iyi pratikleri uygulamak gerekir. Öncelikle container’larda minimum yetki yaklaşımını sürdürün: gereksiz capability’leri kapatın, “privileged” moddan kaçının. İkinci olarak imaj kaynağına dikkat edin; resmi veya güvenilir registry’lerden çekin ve imajları düzenli güncelleyin. Üçüncü olarak log ve veri dizinlerini kontrol altında tutun; kullanıcı dizini altında büyüyen loglar zamanla disk sorunlarına yol açabilir.
Son olarak, rootless container’lar her derde deva değildir. Örneğin çok düşük port gereksinimi, kernel modülleriyle etkileşim, özel ağ topolojileri veya yüksek performanslı network senaryolarında rootful kurulum daha uygun olabilir. Ancak modern geliştirme akışlarının büyük çoğunluğu için rootless yaklaşım, güvenlik-kullanışlılık dengesinde çok iyi bir noktaya oturur.
Özet: Rootless container, “güvenliği sonradan eklemek” yerine varsayılan yapmak isteyenler için güncel ve güçlü bir yaklaşım. Docker Rootless daha tanıdık bir ekosistem sunarken, Podman daha yalın ve daemon’suz bir deneyim vadediyor. İkisini de denedikten sonra kendi iş akışınıza en iyi uyanı seçmeniz, uzun vadede daha az sürpriz ve daha güvenli bir çalışma ortamı anlamına gelir.