Container tabanlı platformlarda güvenlik tartışması çoğu zaman runtime tarafında başlıyor. Ancak zincirin daha erken halkalarında neyin üretildiği, kimin ürettiği ve dağıtıma neyin girdiği yeterince net değilse runtime korumaları tek başına yeterli olmaz. Cosign, container imajına kimlik ve bütünlük katmanı ekleyerek supply chain güvenliğini daha uygulanabilir hâle getirir. Bu rehberde imajı imzalama, doğrulama ve dağıtım kapısına bağlama adımlarını sade bir akışta kuracağız.
Hedef mimari
Amaç şu zinciri kurmak:
- CI pipeline imajı üretir
- İmaj registry’ye push edilir
- Cosign imzayı üretir ve registry yanında saklar
- Dağıtım öncesi admission veya pipeline adımı imzayı doğrular
Bu model sayesinde sadece “image tag var mı” değil, “bu imaj güvenilir üretim hattından mı çıktı” sorusu cevaplanır.
Cosign kurulumu
Yerel test için araç kurulumu yeterlidir:
brew install cosign
cosign version
Kurumsal kullanımda iki yaklaşım yaygındır:
keyless: OIDC tabanlı, CI kimliği ile imzalamakey pair: Özel anahtar ve şifre ile imzalama
Mümkünse keyless yaklaşımı daha sürdürülebilirdir. Anahtar döndürme ve saklama yükünü azaltır.
Örnek imaj üretimi ve imzalama
Basit bir imaj oluşturalım:
docker build -t registry.example.com/platform/demo-api:2026.04.09 .
docker push registry.example.com/platform/demo-api:2026.04.09
Anahtar çiftiyle imzalamak için:
cosign generate-key-pair
cosign sign --key cosign.key registry.example.com/platform/demo-api:2026.04.09
Bu komut imzayı registry tarafında ilgili artifact ile ilişkilendirir. İmajı yeniden etiketlemek ile içeriği değiştirmek aynı şey değildir; bu yüzden üretim akışında digest bazlı çalışma tercih edilmelidir.
Doğrulama adımı
İmajı doğrulamak için:
cosign verify --key cosign.pub registry.example.com/platform/demo-api:2026.04.09
Çıktıda sertifika veya imza bilgisi döner. Buradaki kritik nokta, yalnızca imzanın varlığı değil, beklediğiniz kimlik veya anahtarla uyumlu olmasıdır. Aksi hâlde herhangi bir imza sahte güven üretebilir.
Bir CI kapısı örneği:
IMAGE="registry.example.com/platform/demo-api@sha256:abc123..."
cosign verify --key cosign.pub "$IMAGE" >/tmp/cosign-verify.json
jq '.[0].critical.image.docker-manifest-digest' /tmp/cosign-verify.json
Bu yaklaşım deployment öncesi digest ve imza ilişkisinin net kalmasını sağlar.
Kubernetes dağıtım hattına bağlama
En basit model, deploy job içinde doğrulama yapmaktır. Daha güçlü model ise admission katmanında imzasız imajı reddetmektir. Örnek akış:
- CI imajı üretir ve imzalar
- GitOps veya deployment pipeline yalnızca doğrulanan digest’i geçirir
- Admission policy imzasız ya da yanlış kimlikli artifact’i engeller
Bu sayede insan hatasıyla yanlış registry ya da test imajı üretime kaçma ihtimali ciddi biçimde azalır.
Kurumsal kullanımda ek kontroller
Cosign tek başına tüm supply chain güvenliğini çözmez. Ben şu tamamlayıcı adımları öneriyorum:
- SBOM üretimi ve artifact ile ilişkilendirme
- Build ajanı kimliğini OIDC ile sınırlandırma
- İmzalama yetkisini yalnızca üretim pipeline’ına verme
- Registry tarafında yetkisiz overwrite davranışını kapatma
Bu çerçeve, imzayı dekorasyon olmaktan çıkarıp gerçek kontrol katmanına dönüştürür.
Sonuç
Cosign ile container supply chain imzalama, dağıtıma giden artifact’in kimliğini görünür kılar. İmajı üretmek, push etmek ve imzalamak aynı zincirin parçaları olarak çalıştığında güvenlik ekibi ile platform ekibi arasında ortak bir doğrulama dili oluşur. Sağlıklı başlangıç için küçük bir servis seçin, digest bazlı doğrulama kurun ve imzasız artifact’in üretime geçmesini sistematik olarak durdurun.