Docker’ı varsayılan ayarlarıyla kurup kullanmaya başladığınızda, arka planda root yetkisiyle çalışan bir daemon (dockerd) vardır ve çalıştırdığınız container’lar da genellikle root kullanıcısıyla başlar. Bu, günlük kullanım için sorun çıkarmaz, ama güvenlik açısından göz ardı edilmemesi gereken bir risktir. Rootless container, bu riski en baştan ortadan kaldırmayı hedefleyen bir çalışma biçimidir.

Neden önemli? “Container kaçışı” riski

Container’lar, host işletim sistemiyle çekirdeği (kernel) paylaşır — sanal makinelerin aksine tam izole değillerdir. Eğer bir container içinde çalışan uygulamada bir güvenlik açığı bulunur ve saldırgan container’dan “kaçmayı” başarırsa, container root yetkisiyle çalışıyorsa saldırgan doğrudan host makinede de root olabilir. Container rootless çalışıyorsa, aynı kaçış olsa bile saldırgan host’ta sıradan, yetkisiz bir kullanıcı olarak kalır — saldırı yüzeyi ciddi biçimde daralır.

İki farklı “rootless” kavramını ayırt edin

Bu konuda sık karışan iki farklı seviye vardır:

  • Container içinde root olmayan kullanıcı: İmajınızı, uygulamayı root yerine sıradan bir kullanıcıyla çalıştıracak şekilde yazarsınız (Dockerfile’da USER talimatı). Daemon yine root’tur, ama container’ın kendi içindeki süreç root değildir.
  • Rootless Docker daemon’ı: Docker daemon’ının kendisi hiç root yetkisi olmadan, sıradan bir kullanıcı hesabıyla çalışır. Bu, çok daha güçlü bir izolasyon sağlar ama bazı ağ ve depolama özellikleri kısıtlanabilir.

1. Adım: Dockerfile’da root olmayan kullanıcı tanımlamak

En basit ve en sık uygulanan adım budur — her image’da yapılabilir, ek kurulum gerektirmez:

FROM node:20-alpine

# Sistem tarafından hazır gelen 'node' kullanıcısına geç
WORKDIR /app
COPY --chown=node:node . .
RUN npm install --production

USER node
EXPOSE 3000
CMD ["node", "server.js"]

Hazır bir sistem kullanıcısı yoksa kendi kullanıcınızı da oluşturabilirsiniz:

RUN addgroup -S uygulama && adduser -S uygulama -G uygulama
USER uygulama

2. Adım: Rootless Docker daemon’ı kurmak

Docker, resmi olarak rootless kurulum modunu destekler. Kurulum betiği ile mevcut kullanıcı hesabınız altında, root yetkisi gerektirmeden ayrı bir daemon başlatılır:

curl -fsSL https://get.docker.com/rootless | sh

# Ortam değişkenlerini ayarlayın (kurulum betiği talimat verir)
export PATH=/home/kullanici/bin:$PATH
export DOCKER_HOST=unix:///run/user/1000/docker.sock

docker run hello-world

Bu modda daemon, host’ta hiçbir zaman root yetkisine sahip olmaz — kullanıcı ad alanları (user namespaces) sayesinde container içindeki “root” kullanıcı, host’ta sizin sıradan kullanıcı kimliğinize eşlenir.

i

Podman, rootless çalışmayı en başından beri varsayılan olarak sunar ve ayrıca bir daemon’a da ihtiyaç duymaz. Rootless güvenliği öncelikli bir gereksiniminiz varsa Docker’ı rootless modda çalıştırmakla Podman’a geçmek arasında seçim yapabilirsiniz — ikisinin karşılaştırmasını Docker vs Podman yazımızda bulabilirsiniz.

Nelere dikkat etmeli?

  • 1024 altı portlar: Rootless modda varsayılan olarak 80, 443 gibi “ayrıcalıklı” portlara doğrudan bağlanamazsınız; bunun yerine 8080 gibi bir port kullanıp önüne bir reverse proxy koymak yaygın çözümdür.
  • Performans: Ağ ve dosya sistemi katmanında ek bir soyutlama olduğu için rootless modda küçük bir performans farkı olabilir; çoğu uygulama için bu fark fark edilmez.
  • Üretimde kademeli geçiş: Önce container içi USER talimatını (1. adım) tüm imajlarınıza uygulamak, rootless daemon’a geçmekten (2. adım) çok daha kolay ve düşük riskli bir başlangıçtır.

Rootless çalışmak, saldırı yüzeyini daraltmanın sadece bir parçasıdır. Bir sonraki adım genellikle çalıştırdığınız imajların içinde bilinen güvenlik açığı olup olmadığını kontrol etmektir — bu konuyu bir sonraki yazıda, container image güvenliği başlığı altında ele alıyoruz.