blog
Docker soketini dışarı açmak güvenli mi?
Yayın tarihi
Bu soru genelde pratik bir ihtiyaçtan doğar: “Konteynerlerimi dizüstümden yönetmek istiyorum, daemon’a nasıl ulaşırım?” Dürüst cevap şu: daemon soketi dışarı açılacak bir API değil ve gerekçesi çoğu kişinin beklediğinden güçlü.
Kısa cevap
Hayır. Tek başına da değil, bir port üzerinden hiç değil. Docker daemon’ına erişim, onu çalıştıran makinede root olmaya eşdeğerdir. Docker bunu kendi dokümanında söylüyor: daemon’a komut verebilen herkes “daemon’ı barındıran makinede root erişimi” elde eder.
Bu, olası bir açık hakkında uyarı değil. Daemon’ın yapmak üzere tasarlandığı şeyin tarifi.
Soket aslında neyi devrediyor
Daemon, host’taki herhangi bir dizini konteynerin erişim haklarını kısıtlamadan konteynere bağlayabilir. Yani daemon ile konuşabilen herkes host kök dosya sistemini bağlayıp içine geçebilir.
Yetki yükseltmenin tamamı bu. Exploit yok, ayrıcalık açığı yok — yalnızca belgelenmiş özelliklerin sana karşı kullanılması.
2375 portunda açık bir daemon, onu bulan herkese şunu verir
docker -H tcp://203.0.113.10:2375 run --rm -it \ -v /:/host alpine chroot /host sh
Bu komutu bir numara değil, tehdit modeli olarak oku: içinde kimlik doğrulama adımı yok. Port cevap veriyorsa çalışır.
İnsanları yakan port 2375
Şifresiz daemon portu 2375’tir. Kimlik doğrulaması ve taşıma güvenliği yoktur. Sana daemon bayraklarına -H tcp://0.0.0.0:2375 eklemeni söyleyen her rehber, aslında bir root kabuğu yayınlamanı söylüyordur.
Tarayıcılar bunları sürekli buluyor. 2375’i açık bir sunucu “IP’yi kimse bilmiyor, muhtemelen sorun olmaz” durumunda değildir — adres uzayının tamamı aralıksız taranıyor ve açık bir Docker portu bulunabilecek en değerli şeylerden biri.
2376’daki TLS kimlik doğrulamadır, zararsızlık değil
Daemon’ı dışarı açmanın desteklenen yolu, 2376 portunda karşılıklı sertifika doğrulamalı TLS’tir. Daemon o zaman “yalnızca o CA tarafından imzalanmış bir sertifikayla doğrulanan istemcilerin bağlanmasına izin verir”.
Bu, “portu bulan herkes” sorununu gerçekten çözer. Bağlanan bir istemcinin neler yapabileceğini ise değiştirmez. Docker’ın kendi talimatı sonucu net söylüyor: “Bu anahtarları bir root parolası gibi koru!”
Yani artık bir sertifika otoritesi işletiyorsun. İstemci sertifikaları üretir, dağıtır, ortak makinelerden uzak tutar, bir dizüstü kaybolunca döndürür, biri ayrılınca iptal edersin. Bu gerçek bir iş yükü; Docker da CA yönetimini ileri düzey bir konu olarak niteliyor.
Çoğu kişinin aslında istediği alternatif
O sunucuya giden, kimliği doğrulanmış ve şifreli, anahtar tabanlı bir kanalın zaten var: SSH. Docker bunu doğrudan kullanabilir — yeni port, daemon bayrağı ve sertifika otoritesi gerekmeden.
Uzak daemon’a, zaten sahip olduğun SSH erişimiyle ulaşmak
docker context create my-vps \ --docker "host=ssh://deploy@203.0.113.10" docker context use my-vps docker ps
Daemon yerel UNIX soketinde kalır. Ağda yeni hiçbir şey dinlemez ve erişimi zaten yönettiğin SSH anahtarları belirler.
Bu bir yönetim aracı için ne demek
Uzaktan konteyner yöneten her aracın bu soruya bir cevabı olmak zorunda. Cevaplar şunlar: daemon’ı aç ve CA yükünü üstlen, sunucuya kimlik bilgilerini tutan bir ajan kur, ya da makineyi elle yapacağın gibi SSH üzerinden sür.
MihraOps üçüncüsünü seçiyor. Kendi bilgisayarından sıradan bir SSH bağlantısı açıp sıradan komutlar çalıştırıyor. Açılacak bir daemon portu, işletilecek bir sertifika otoritesi ve anahtarlarını tutan sunucu tarafı bir panel yok — anahtarlar senin makinende, işletim sisteminin şifreli deposunda kalıyor.
Bu tercihin gerçek bir bedeli var ve söylemeye değer: uygulama kapalıyken bize ait hiçbir şey çalışmıyor, dolayısıyla telefonundan bakabileceğin sunucu tarafı bir panel yok. Buna ihtiyacın varsa sunucu tarafında çalışan bir platform daha doğru seçim — karşılaştırma sayfaları da bunu söylüyor.