İçeriğe atla
0 XP 0
13 dkderinleşmeyle 14 dk55 XP8 etkinlik

İmaj tarama ve imzalama

Bu derste
  • Tarama imajdaki bilinen açıkları bulur; imza ise imajın beklenen boru hattından geldiğini ve sonradan değişmediğini kanıtlar.
  • İki denetim farklı soruya yanıt verir ve birbirinin yerine geçmez.
  • Kapıyı hem derlemede hem kümede kurmak, atlanan her kontrolü son anda yakalar.

Puan bütün etkinlikleri cevaplayınca hesaba yazılır. Bu dersi tamamlayınca +55 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.

Bir imajı üretime almadan önce iki soru sorulur. İçinde bilinen açık var mı? Ve bu imaj gerçekten bizim boru hattımızdan mı çıktı? Birinci soruyu tarama, ikincisini imza yanıtlar.

Bu derste taramayı bir dağıtım kapısına, imzayı köken kanıtına çevirirsin. Yüzlerce açık arasından hangisine önce yama yapacağını seçmeyi, imzayı boru hattına takmayı ve kapıyı iki katmanda kurmayı görürsün. En sonda tedarik zincirini bir bütün olarak ele alırsın.

Tarama: içeriğin sağlığı

Tarama araçları imajın katmanlarını açar, paket listesini çıkarır ve bilinen açık veritabanlarıyla karşılaştırır. trivy ve grype bu işi yapar; ikisi de kayıt defterindeki imajı doğrudan okur. Çıktıyı ham hâlde okumak yorucudur. Derece süzgeci uygulanır ve düzeltilmiş sürümü olan açıklara öncelik verilir.

Yaması olmayan bir açık için yükseltme yapamazsın, başka bir azaltıcı önlem ararsın. Taramanın sınırı da bilinir: bilinen açıkları bulur, bilinmeyeni bulmaz. İmaja bilerek konmuş zararlı bir betiği de paket veritabanı yakalamaz; sır taraması ayrı bir tarayıcıyla çalışır.

$ trivy image --severity HIGH,CRITICAL --exit-code 1 uygulama:1.4
uygulama:1.4 (debian 12.5)
Total: 3 (HIGH: 2, CRITICAL: 1)

| Library | Vulnerability | Severity | Status | Installed Version | Fixed Version |
| openssl | CVE-2024-XXXX | CRITICAL | fixed  | 3.0.11            | 3.0.13        |
| zlib    | CVE-2024-YYYY | HIGH     | fixed  | 1.2.13            | 1.3.1         |
...
$ echo $?
1
--exit-code 1 yüksek ya da kritik açık bulununca çıkış kodunu bir yapar; boru hattı burada durur.

Çıktıyı satır satır oku. Üst satır imajı ve taban dağıtımını yazar. Total satırı derece dağılımını verir: iki yüksek, bir kritik.

Tablo her açığı Library, Vulnerability, Severity, Installed Version ve Fixed Version sütunlarıyla listeler. Status sütunundaki fixed, açığın yamalı bir sürümü olduğunu söyler. Fixed Version sütunu en değerlisidir, çünkü yükseltmenin hangi sürüme yapılacağını doğrudan yazar.

Son iki satır çıkış kodunu gösterir. --exit-code 1 bayrağı taramayı bir kapıya çevirir: yüksek ya da kritik açık bulununca çıkış kodu bir olur ve boru hattı adımı hatayla durur. Böylece sorunlu imaj dağıtıma hiç geçmez.

Etkinlik 1 / 8

uygulama:1.4 imajını yalnız yüksek ve kritik açıklar için tara.

ogrenci@lab

Önceliklendirme ve sır taraması

İlk taramanın listesi çoğu zaman uzun çıkar. Hepsini aynı gün kapatmak yerine önceliklendirirsin. CVSS derecesi tek başına yetmez; bir açığın gerçek dünyada istismar edilip edilmediği de sayılır.

EPSS, bir açığın önümüzdeki otuz günde istismar edilme olasılığını sıfır ile bir arasında bir değerle tahmin eder. CISA'nın KEV listesi ise gerçekten istismar edildiği doğrulanmış açıkları toplar. Derece, EPSS ve KEV birlikte okunduğunda gürültü azalır: yüksek dereceli ama istismarı olası olmayan bir açık beklerken, KEV listesindeki bir açık öne geçer.

trivy ile grype aynı işi biraz farklı yollarla yapar; ikisini birlikte kullanmak yanlış negatifleri azaltır. Tarayıcıya imajı doğrudan verebileceğin gibi, önce üretilmiş bir malzeme listesini de verebilirsin. Liste bir kez çıkarıldığında, yeni bir açık duyulduğunda imajı yeniden açmadan yalnız listeyi yeniden tararsın. Büyük bir kayıt defterinde bu yol tarama süresini belirgin kısaltır.

grype sbom:./sbom.json komutu listeyi okur ve bilinen açıklarla karşılaştırır. Bazı açıklar düzeltme beklerken geçici olarak kabul edilir. Bu kararı gerekçesi ve bitiş tarihiyle bir istisna dosyasına yazarsın, böylece kabul sessizce kalıcı hâle gelmez.

Sır taraması taramanın ayrı bir dalıdır. Paket tarayıcısı bilinen açıkları bulur, ama imaja ya da katman geçmişine düşmüş bir belirteci, parolayı ya da özel anahtarı yakalamaz. Bunun için desen tabanlı bir sır tarayıcısı çalıştırılır; kaynak koda, derleme bağlamına ve imaj katmanlarına bakar.

Bir sır bulunduğunda tek doğru yol onu iptal etmektir. İmajdan silmek yetmez, çünkü eski katman ve eski imaj kopyaları o sırrı hâlâ taşır.

Etkinlik 2 / 8

Tarama yüzlerce açık döndürdü. Yamayı önceliklendirmede hangi ölçüt en iyi yardımcı olur?

İmza: kökenin kanıtı

İkinci soru köken sorusudur. Kayıt defterindeki bir etiket taşınabilir bir işaretçidir; aynı ad yarın başka bir imaja işaret edebilir. Bu yüzden değişmez referans için sha256 özet değeri kullanılır ve imza da etiketi değil bu özet değerini imzalar. İmzanın ne kanıtladığını doğru anlamak gerekir.

İmza imajın açıksız olduğunu söylemez. Söylediği şudur: imajı belirli bir kimlik imzalamıştır ve imaj o günden beri değişmemiştir. Tedarik zinciri saldırılarına karşı asıl koruma budur.

Etkinlik 3 / 8

Doğru mu, yanlış mı?

Kayıt defterindeki bir etiket, özet değeri gibi değişmez bir referanstır; aynı etiket yarın da bugünkü imajı gösterir.

# İmzalama: boru hattının kısa ömürlü kimliğiyle (anahtarsız)
$ cosign sign kayit.ornek.example/uygulama@sha256:9f2c...

# Doğrulama: kümeye almadan önce, imzalayan kimlikle birlikte
$ cosign verify \
    --certificate-identity-regexp '^https://github.com/ornek-org/uygulama/' \
    --certificate-oidc-issuer https://token.actions.githubusercontent.com \
    kayit.ornek.example/uygulama@sha256:9f2c...
Etiket değil özet değeri imzalanır; doğrulama imzalayan kimliği de kontrol eder.

cosign imzalamayı boru hattına takmayı kolaylaştırır. Anahtarsız modda kalıcı bir imza anahtarı saklamazsın; boru hattının kısa ömürlü kimlik jetonu kullanılır ve imza kaydı genel bir şeffaflık günlüğüne yazılır. Doğrulama tarafında iki şey birden kontrol edilir: imzanın geçerliliği ve imzalayan kimliğin beklenen kaynak olması.

Yalnız imza var mı diye bakmak, herhangi birinin imzasını kabul etmek anlamına gelir. Komuttaki --certificate-oidc-issuer imzanın hangi sağlayıcıdan geldiğini, --certificate-identity-regexp ise hangi deponun iş akışının imzaladığını sabitler.

İmza ile taramanın neden ayrı durduğunu bir örnek netleştirir. Bir imaj imzalı olabilir ama içinde kritik bir açık taşıyabilir; imza yalnız o imajı beklenen kimliğin ürettiğini söyler. Tersine, taranıp temiz çıkmış bir imaj imzasız olabilir ve o zaman kimin ürettiğini bilemezsin. İki soru farklıdır, bu yüzden iki denetim birlikte çalışır.

Doğrulama komutunu yakından okumak da imzanın neyi güvence altına aldığını gösterir. İyi yazılmış bir doğrulama yalnız imza var mı diye bakmaz. İmzayı, imzalayan kimliği ve o kimliğin geldiği kaynağı birlikte kontrol eder. Kimlik kalıbını dar yazmak, yalnız beklenen deponun iş akışından çıkan imzaları kabul etmek demektir.

Etkinlik 4 / 8

Bu komut ne yapar?

Önce kodu oku, sonra çıktıyı seç.

$ cosign verify --certificate-identity-regexp '^https://github.com/ornek-org/uygulama/' \
    --certificate-oidc-issuer https://token.actions.githubusercontent.com \
    kayit.ornek.example/uygulama:1.4
Derinleş:Anahtarsız imza nasıl çalışır

Klasik imzalamada kalıcı bir özel anahtar tutarsın ve onunla imzalarsın. Sorun şudur: o anahtar sızarsa, saldırgan da geçerli imza üretir. Anahtarsız imzalama bu kalıcı anahtarı ortadan kaldırır. Boru hattı imzalama anında kimlik sağlayıcısından kısa ömürlü bir jeton alır; bir sertifika yetkilisi bu jetona dayanarak yalnız birkaç dakika geçerli bir sertifika verir.

İmza bu geçici sertifikayla atılır ve imza kaydı genel bir şeffaflık günlüğüne yazılır. Anahtar dakikalar içinde geçersiz olduğu için saklanacak bir sır kalmaz. Doğrulama tarafında imzayı kimin attığını sertifikadaki kimlik ve kaynak bilgisinden okursun; şeffaflık günlüğü de imzanın gerçekten o anda kaydedildiğini kanıtlar. Böylece hem imzalayanı hem imzanın zamanını, kalıcı bir anahtar taşımadan doğrularsın.

İki kapı: derleme ve küme

Kapıyı nerede kuracağın bir karardır. Derleme sırasında çalışan tarama hatayı erken yakalar ve geliştiriciye hızlı geri bildirim verir. Ama boru hattını atlayan bir dağıtım o kapıyı hiç görmez. Bu yüzden ikinci kapı kümede kurulur.

Kabul denetleyicisi, imzasız ya da kritik açıklı imajı kümeye almadan reddeder. İki kapı birbirini yedekler.

Politikayı katı yazmak baştan mümkün olmayabilir; yaygın yol aşamalı geçiştir. Önce uyarı modunda çalıştırılır, listeler temizlenir, sonra ret moduna alınır. Doğrudan ret moduyla başlamak ekibi kapıyı devre dışı bırakmaya iter.

Kabul denetleyicisini kurarken politika bir kez yazılır, ama üç modda çalıştırılır. Uyarı modu imzasız ya da açıklı bir dağıtımı geçirir, yalnız bir uyarı üretir; böylece var olan iş yüklerinin ne kadarının kurala uymadığını ölçersin.

Kayıt modu kararı denetim kaydına yazar ama uygulamaz. Ret modu ise kurala uymayan isteği API sunucusunda, iş yükü hiç oluşturulmadan reddeder. Bu sıra sayesinde ret moduna geçmeden önce listeyi temizlersin.

Etkinlik 5 / 8

Her denetimi tedarik zincirinin hangi aşamasına ait olduğuna göre ayır.

Önce bir seçeneğe, sonra aşağıdaki uygun kutuya bas. İstersen seçeneği kutuya sürükleyip bırak. Yerini değiştirmek için aynı işlemi tekrarla.

0/5 seçenek yerleşti.

Ölçmeyi de unutmamak gerekir. Kaç imaj imzalı, kaçı kritik açık taşıyor, kapıdan kaç dağıtım geri döndü? Bu üç sayı zaman içinde izlendiğinde tedarik zinciri güvenliğinin ilerleyip ilerlemediğini gösterir.

Kapı her dağıtımda iki ayrı soruyu birlikte sorar: imaj temiz mi ve beklenen kimlikten mi geldi? Kapıdan geri dönen dağıtımların nedenini de sınıflarsın: imza eksikliği mi, kritik açık mı, yanlış kayıt defteri mi? Bu dağılım, ekiplere hangi konuda destek gerektiğini gösterir. Taramayı tek seferlik bir iş sanmamak da gerekir: dün temiz çıkan imaj, bugün duyurulan bir açıkla riskli hâle gelir, bu yüzden kayıt defterindeki imajlar düzenli aralıkla yeniden taranır.

Etkinlik 6 / 8

İmaj imzalamanın taramadan farklı olarak verdiği güvence nedir?

Tedarik zinciri ve gerçek olaylar

SLSA çerçevesi derleme olgunluğunu seviyelerle anlatır. En alt seviyede hiçbir güvence yoktur. Bir üst seviye, imajın nasıl üretildiğini yazan bir köken belgesi ister. Sonraki seviye bu belgenin barındırılan ve imzalı bir platformdan gelmesini şart koşar.

En üst seviye ise derlemelerin birbirini etkilemesini engelleyen ve imza malzemesini koruyan güçlü denetimler ister. Yükseldikçe, üretilen imajın kökenine duyduğun güven artar. SLSA v1.2 bu derleme izinin yanına, kaynak kodunun nasıl korunduğunu anlatan ayrı bir kaynak izi de ekler.

Köken belgesi tek başına bir dosya değildir; imzalı bir ektir ve imajın özet değerine bağlanır. İçinde hangi kaynak kodundan, hangi derleme adımlarıyla ve hangi ortamda üretildiği yazar.

Doğrulama tarafında bu ek de kontrol edilir: imaj beklenen boru hattından mı çıktı, beklenen adımlarla mı üretildi? Böylece yalnız kimin imzaladığını değil, imajın nasıl üretildiğini de doğrularsın. Kümedeki kabul denetleyicisi imzaya ek olarak bu belgeyi de denetleyebilir; beklenen boru hattından çıkmayan imaj kümeye girmez.

Tedarik zincirini bir bütün olarak görmek gerekir. Kaynak kodu, bağımlılıklar, derleme ortamı, imaj ve dağıtım kapısı tek bir zincirdir.

Zincirin en zayıf halkası korumasız bir derleme makinesiyse, imzalar da o makinenin ürettiğini imzalar. Bu yüzden derleme ortamının kendisi sertleştirilir: işler yalıtılmış ve geçici ortamlarda koşar, dışarıya çıkışı sınırlıdır ve kalıcı sır taşımaz. Kayıt defteri de korunur.

Yazma yetkisi yalnız boru hattına verilir, geliştirici dizüstünden doğrudan gönderim kapatılır. Aksi hâlde kapılardan geçmemiş bir imaj üretime sızar ve kimse farkı görmez. Değişmez etiketler de aynı amaca hizmet eder: bir kez yayımlanan etiketin üstüne yazılamaz, böylece var olan bir etiket sessizce değiştirilemez.

Gerçek olaylar bu dersi somutlaştırır. 2024'te xz sıkıştırma kütüphanesine bir arka kapı yerleştirildi. CVE-2024-3094 koduyla izlenen bu olay, açık kaynak bir bileşenin ele geçirilmesinin ne kadar derine inebildiğini gösterdi. 2026 Mart'ında ise yaygın bir imaj tarama aracının yayın zinciri ele geçirildi.

Saldırganlar önceki bir olaydan kalan ve tam iptal edilmemiş bir erişimle kötü niyetli bir sürüm yayımladı. Aracın boru hattı eklentisinin sürüm etiketlerini de zararlı commit'lere taşıdılar.

Etiketle çekilen her boru hattı, farkında olmadan sır çalan kodu çalıştırdı. İki olayın dersi aynıdır: tarama ve imza araçları da tedarik zincirinin parçasıdır. Bu yüzden araçları da özet değeriyle sabitler, değişmez etiket ve köken kanıtı kullanırsın.

Etkinlik 7 / 8

Doğru mu, yanlış mı?

Tarama ve imza araçlarının kendi dağıtım zinciri de saldırıya uğrayabilir; bu yüzden bu araçların sürümlerini de özet değeriyle sabitler ve köken kanıtını doğrularsın.

Etkinlik 8 / 8

Kubernetes'te imzasız ya da kritik açıklı imajı kümeye almadan reddeden bileşenin genel adı: ____

Bu derste bir hata mı gördün? Bildir