Merhaba arkadaşlar, bugün sizlere Docker güvenliğinde çok kritik bir konu olan Docker Content Trust (DCT) mekanizmasını anlatacağım. Özellikle production ortamlarında, çalıştırdığınız konteynerlerin imzalı ve güvenilir image'lardan oluştuğundan emin olmak istiyorsanız, bu rehber tam size göre. Benim sunucularda da özellikle hassas servisler için mutlaka aktif ettiğim bir güvenlik katmanıdır.
Docker Content Trust (DCT) Nedir?
Basitçe anlatmak gerekirse, DCT, Docker image'ları için bir dijital imzalama ve doğrulama sistemidir. Notary Server adı verilen bir servis ile çalışır. Bir geliştirici veya CI/CD pipeline'ı bir image'ı push ederken onu imzalar. Siz de bu image'ı çekerken (pull) Docker istemciniz, image'ın bu imzayı taşıyıp taşımadığını ve güvenilir olduğunu otomatik olarak kontrol eder. Eğer imza yoksa veya geçersizse, image'ı çekmez. Bu sayede sahte, değiştirilmiş veya beklenmeyen bir image'ı çalıştırma riskiniz ortadan kalkar.
Ortam Değişkeni ile İstemci Tarafında Zorlama
DCT'yi etkinleştirmenin en kolay ve kalıcı yolu, istemci tarafında bir ortam değişkeni tanımlamaktır. Bu, docker pull veya docker run gibi tüm image ile ilgili komutları etkiler. Aşağıdaki komutla bunu bash oturumunuz için aktif edebilirsiniz:
Bu ayarı kalıcı hale getirmek için, kullandığınız kabuğun konfigürasyon dosyasına (örn. ~/.bashrc veya ~/.zshrc) ekleyebilirsiniz.
Artık DCT aktif. Şimdi imzasız bir image çekmeye çalışalım ve ne olacağını görelim:
Eğer resmi nginx image'ı Notary Server'da imzalanmamışsa (ki genelde resmi image'ların `latest` tag'i imzalı değildir), aşağıdaki gibi bir hata alırsınız:
Bu, sistemin beklendiği gibi çalıştığının kanıtıdır! Image güvenilir olarak işaretlenmemiş ve Docker da onu çekmeyi reddetti.
Image'ı İmzalayarak Push Etmek
Kendi image'larınızı oluşturup güvenilir hale getirmek isterseniz, öncelikle DCT'yi aktif etmeniz ve ardından image'ınızı push etmeniz gerekir. Push işlemi sırasında, Docker sizden bir kök (root) key ve bir repository (tags) key için şifre belirlemenizi isteyecektir. Bu anahtarlar ~/.docker/trust/ dizini altında saklanır.
Komutu çalıştırdığınızda, terminal sizi imzalama anahtarlarınızı oluşturmanız ve şifrelerini belirlemeniz için yönlendirecektir. Bu adımları takip edin. İlk kez yapıyorsanız biraz zaman alabilir, şu ayara çok dikkat etmelisiniz: Anahtar şifrelerinizi kaybetmeyin, özellikle kök anahtarın (root key) yedeğini alın. Çünkü bunu kaybederseniz, o repository için tüm imzalama yetkinizi kaybedersiniz.
Dikkat Edilmesi Gerekenler ve Pratik Bilgiler
- `latest` Tag Sorunu: DCT, tag bazlı çalışır. Bir image'ın `latest` tag'i imzalı olmayabilir, ancak `1.0-alpine` gibi spesifik bir tag imzalı olabilir. Production'da `latest` tag kullanmamaya zaten özen gösterin, DCT de bunu bir kez daha hatırlatıyor.
- Performans: İlk pull işleminde imza doğrulaması ve trust metadata'sının indirilmesi ekstra bir zaman alabilir.
- Private Registry: Eğer kendi private registry'niz (örn. Harbor, Quay) ile kullanacaksanız, bu registry'nin de bir Notary servisi barındırdığından veya dış bir Notary Server'a entegre olduğundan emin olmalısınız.
- Geçici Devre Dışı Bırakma: Sadece bir komut için DCT'yi devre dışı bırakmak isterseniz, ortam değişkenini geçici olarak sıfırlayabilirsiniz:
Sonuç ve Tavsiyeler
Docker Content Trust, container güvenliği zincirindeki önemli bir halkadır. Kötü niyetli veya yanlışlıkla değiştirilmiş image'ların production ortamınıza sızmasını engeller. Özellikle finans, sağlık gibi regülasyonlu sektörlerde veya hassas veri işleyen sistemlerde mutlaka değerlendirilmelidir.
Ben genellikle CI/CD pipeline'ımda build sonrası image'ları imzalayacak şekilde konfigüre ediyorum ve production sunucularında da `DOCKER_CONTENT_TRUST=1` değişkenini global olarak tanımlıyorum. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı bir güvenlik katmanı olarak Harbor gibi araçlar mı kullanıyorsunuz? Deneyimlerinizi ve sorularınızı aşağıya yazmaktan çekinmeyin. Hep birlikte öğrenelim!
Basitçe anlatmak gerekirse, DCT, Docker image'ları için bir dijital imzalama ve doğrulama sistemidir. Notary Server adı verilen bir servis ile çalışır. Bir geliştirici veya CI/CD pipeline'ı bir image'ı push ederken onu imzalar. Siz de bu image'ı çekerken (pull) Docker istemciniz, image'ın bu imzayı taşıyıp taşımadığını ve güvenilir olduğunu otomatik olarak kontrol eder. Eğer imza yoksa veya geçersizse, image'ı çekmez. Bu sayede sahte, değiştirilmiş veya beklenmeyen bir image'ı çalıştırma riskiniz ortadan kalkar.
DCT'yi etkinleştirmenin en kolay ve kalıcı yolu, istemci tarafında bir ortam değişkeni tanımlamaktır. Bu, docker pull veya docker run gibi tüm image ile ilgili komutları etkiler. Aşağıdaki komutla bunu bash oturumunuz için aktif edebilirsiniz:
Bash:
export DOCKER_CONTENT_TRUST=1
Bu ayarı kalıcı hale getirmek için, kullandığınız kabuğun konfigürasyon dosyasına (örn. ~/.bashrc veya ~/.zshrc) ekleyebilirsiniz.
Bash:
echo "export DOCKER_CONTENT_TRUST=1" >> ~/.bashrc
source ~/.bashrc
Artık DCT aktif. Şimdi imzasız bir image çekmeye çalışalım ve ne olacağını görelim:
Bash:
docker pull nginx:latest
Eğer resmi nginx image'ı Notary Server'da imzalanmamışsa (ki genelde resmi image'ların `latest` tag'i imzalı değildir), aşağıdaki gibi bir hata alırsınız:
Kod:
Error: remote trust data does not exist for docker.io/library/nginx: notary.docker.io does not have trust data for docker.io/library/nginx
Bu, sistemin beklendiği gibi çalıştığının kanıtıdır! Image güvenilir olarak işaretlenmemiş ve Docker da onu çekmeyi reddetti.
Kendi image'larınızı oluşturup güvenilir hale getirmek isterseniz, öncelikle DCT'yi aktif etmeniz ve ardından image'ınızı push etmeniz gerekir. Push işlemi sırasında, Docker sizden bir kök (root) key ve bir repository (tags) key için şifre belirlemenizi isteyecektir. Bu anahtarlar ~/.docker/trust/ dizini altında saklanır.
Bash:
docker build -t benimregistryim/uygulamam:1.0 .
docker push benimregistryim/uygulamam:1.0
Komutu çalıştırdığınızda, terminal sizi imzalama anahtarlarınızı oluşturmanız ve şifrelerini belirlemeniz için yönlendirecektir. Bu adımları takip edin. İlk kez yapıyorsanız biraz zaman alabilir, şu ayara çok dikkat etmelisiniz: Anahtar şifrelerinizi kaybetmeyin, özellikle kök anahtarın (root key) yedeğini alın. Çünkü bunu kaybederseniz, o repository için tüm imzalama yetkinizi kaybedersiniz.
- `latest` Tag Sorunu: DCT, tag bazlı çalışır. Bir image'ın `latest` tag'i imzalı olmayabilir, ancak `1.0-alpine` gibi spesifik bir tag imzalı olabilir. Production'da `latest` tag kullanmamaya zaten özen gösterin, DCT de bunu bir kez daha hatırlatıyor.
- Performans: İlk pull işleminde imza doğrulaması ve trust metadata'sının indirilmesi ekstra bir zaman alabilir.
- Private Registry: Eğer kendi private registry'niz (örn. Harbor, Quay) ile kullanacaksanız, bu registry'nin de bir Notary servisi barındırdığından veya dış bir Notary Server'a entegre olduğundan emin olmalısınız.
- Geçici Devre Dışı Bırakma: Sadece bir komut için DCT'yi devre dışı bırakmak isterseniz, ortam değişkenini geçici olarak sıfırlayabilirsiniz:
Bash:
DOCKER_CONTENT_TRUST=0 docker pull imzasiz-image:tag
Docker Content Trust, container güvenliği zincirindeki önemli bir halkadır. Kötü niyetli veya yanlışlıkla değiştirilmiş image'ların production ortamınıza sızmasını engeller. Özellikle finans, sağlık gibi regülasyonlu sektörlerde veya hassas veri işleyen sistemlerde mutlaka değerlendirilmelidir.
Ben genellikle CI/CD pipeline'ımda build sonrası image'ları imzalayacak şekilde konfigüre ediyorum ve production sunucularında da `DOCKER_CONTENT_TRUST=1` değişkenini global olarak tanımlıyorum. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı bir güvenlik katmanı olarak Harbor gibi araçlar mı kullanıyorsunuz? Deneyimlerinizi ve sorularınızı aşağıya yazmaktan çekinmeyin. Hep birlikte öğrenelim!