İçeriğe atla
0 XP 0
13 dkderinleşmeyle 14 dk50 XP7 etkinlik

Çalışan uygulamayı sınamak: DAST ve altyapı taraması

Bu derste
  • DAST çalışan uygulamaya dışarıdan istek yollar, IaC taraması altyapı tanımını yayından önce okur; ikisi SAST'ın göremediğini yakalar.
  • ZAP baseline raporunu ve Checkov çıktısını satır satır oku. Güvenlik grubunun hatalı ayarını düzelt. Gerçek ortam ile beklenen ayar arasındaki farkı terraform plan ile bul.

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

Önceki derste SAST'ın kör noktasını gördün: kod çalışırken ortaya çıkan davranışı göremiyordu. Altay Kargo'nun giriş sayfası buna iyi bir örnektir. Kodda hata yok, ama sunucu yanıtında birkaç güvenlik başlığı eksik.

Başlıkları önceden ters vekil sunucu ekliyordu ve son taşımada o ayar kayboldu. Bu tür hatayı dinamik uygulama güvenlik testi, kısaca DAST (Dynamic Application Security Testing) yakalar. DAST kaynak koda bakmaz.

Uygulamayı çalışır hâlde, dışarıdan bir kullanıcı gibi dener. Aynı ekip altyapısını da kodla yazıyor ve orada da benzer bir risk var. Terraform dosyasındaki tek bir satır, yönetim portunu bütün internete açabilir. Bu derste iki yöntemi birlikte görürsün: çalışan uygulamayı ZAP ile sınar, altyapı tanımını Checkov ile okursun.

DAST nasıl çalışır

DAST üç aşamada çalışır. Önce keşif yapar. Örümcek (spider) adı verilen bileşen başlangıç adresinden yola çıkar ve bağlantıları izleyerek uygulamanın haritasını çıkarır.

Klasik örümcek HTML'deki bağlantıları okur. Tek sayfa uygulamalarında bağlantıların çoğu JavaScript ile üretilir; onları ancak gerçek bir tarayıcı süren modern örümcek görür.

İkinci aşama pasif taramadır. Araç keşif sırasında akan istek ve yanıtları yalnız okur. Eksik başlık, güvensiz çerez ya da ayrıntı sızdıran hata sayfası bu aşamada çıkar ve uygulamaya fazladan istek gitmez.

Üçüncü aşama aktif taramadır. Araç parametrelere saldırı yükleri yerleştirir ve yanıttaki değişime bakar. Bir SQL hatası dönerse ya da yük sayfaya aynen yansırsa bulgu üretir.

Aktif tarama gerçek bir saldırı gibi davranır. Kayıt ekler, form gönderir, e-posta tetikleyebilir. Bu yüzden yalnız yalıtılmış bir test ortamında çalışır ve üretime aktif tarama yollanmaz. Test ortamında gerçek müşteri verisi de bulunmamalı, yoksa tarama sırasında kişisel veri gereksiz yere çoğalır.

Hız sınırı koymak da gerekir; sınırsız bir tarama test ortamını çökertebilir. DAST'ın bir bedeli daha var: dağıtılmış bir ortam ister ve SAST'tan yavaştır. Çoğu ekip hızlı pasif taramayı her dağıtımda, derin aktif taramayı gece ya da sürüm öncesinde çalıştırır. Aktif taramayı yalnız sahibi olduğun ya da yazılı iznin olan bir ortamda başlat.

Etkinlik 1 / 7

DAST bir açığı bulmak için neye ihtiyaç duyar?

ZAP ile baseline taraması

ZAP, en yaygın açık kaynak DAST araçlarından biridir. Hazır Docker imajı, aracı geliştirme hattına yerleştirmeyi kolaylaştıran betikler taşır. En hafifi zap-baseline.py betiğidir. Baseline taraması örümceği varsayılan olarak bir dakika çalıştırır, sonra pasif taramanın bitmesini bekler.

Aktif saldırı yapmaz, bu yüzden her dağıtımdan sonra güvenle koşabilir. Altay Kargo ekibi staging ortamına aşağıdaki komutu verir. -t seçeneği hedef adresi alır ve adres protokolüyle birlikte yazılır.

$ docker run -t zaproxy/zap-stable zap-baseline.py -t https://staging.altaykargo.example
Total of 14 URLs
PASS: Cookie No HttpOnly Flag [10010]
PASS: Cookie Without Secure Flag [10011]
WARN-NEW: Missing Anti-clickjacking Header [10020] x 3
	https://staging.altaykargo.example/giris (200 OK)
	https://staging.altaykargo.example/takip (200 OK)
	https://staging.altaykargo.example/iade (200 OK)
WARN-NEW: X-Content-Type-Options Header Missing [10021] x 3
	https://staging.altaykargo.example/giris (200 OK)
	https://staging.altaykargo.example/takip (200 OK)
	https://staging.altaykargo.example/iade (200 OK)
WARN-NEW: Content Security Policy (CSP) Header Not Set [10038] x 3
	https://staging.altaykargo.example/giris (200 OK)
	https://staging.altaykargo.example/takip (200 OK)
	https://staging.altaykargo.example/iade (200 OK)
FAIL-NEW: 0	FAIL-INPROG: 0	WARN-NEW: 3	WARN-INPROG: 0	INFO: 0	IGNORE: 0	PASS: 56
Baseline taramasının çıktısı. PASS satırlarının çoğu kısaltıldı.

Çıktıyı yukarıdan aşağı oku. İlk satır örümceğin bulduğu adres sayısıdır. Sayı beklenenden azsa örümcek giriş arkasındaki sayfalara ulaşamamış olabilir.

PASS satırları sorun çıkmayan kurallardır. WARN-NEW yeni bir uyarıdır. Köşeli parantezdeki sayı kural kimliğidir, x 3 ise uyarının kaç adreste görüldüğünü söyler.

Altındaki satırlar örnek adreslerdir. 10020, sayfanın başka bir sitenin çerçevesine gömülmesini engelleyen başlığın eksik olduğunu bildirir. 10021, tarayıcının içerik türünü tahmin etmesini engelleyen başlığın yokluğudur. 10038, içerik güvenliği politikasının hiç tanımlanmadığını gösterir.

Son satır özettir. Betik en az bir FAIL varsa 1, yalnız WARN varsa 2 koduyla çıkar. -I seçeneği uyarıda başarısız dönmeyi kapatır. Hat bu kodlara bakarak durur ya da devam eder.

Bu üç bulgunun düzeltmesi kodda değil, yanıt başlıklarındadır. Altay Kargo başlıkları yeniden ters vekil sunucuda tanımladı. X-Content-Type-Options için tek geçerli değer nosniff'tir. Çerçeveye gömülmeyi engellemek için X-Frame-Options: DENY ya da içerik güvenliği politikasında frame-ancestors 'none' yönergesi kullanılır.

Modern tarayıcılar ikisini de tanır, CSP yönergesi daha esnektir. İçerik güvenliği politikası ayrıca uygulamanın hangi kaynaktan betik, stil ve görsel yükleyeceğini tek tek sayar. Düzeltmeden sonra aynı tarama yeniden koşar ve üç kuralın PASS satırına geçtiğini doğrular.

Etkinlik 2 / 7

Baseline çıktısında ekibin iş listesine alması gereken yeni uyarı satırlarını işaretle.

Şüpheli satırlara tıkla. Birden fazla olabilir.

Altyapı kodunu Checkov ile okumak

Altyapı da artık konsolda tıklanarak değil, kodla yazılır. Terraform, CloudFormation ya da Kubernetes tanım dosyaları hangi sunucunun, hangi ağ kuralının, hangi depolama biriminin kurulacağını satır satır tarif eder. Bu yaklaşımın adı altyapı kodudur (IaC, Infrastructure as Code). Tanım dosyası da bir kaynak koddur ve taramaya girer.

IaC tarayıcısı dosyayı bulut sağlayıcısına göndermez. Metni okur ve bilinen yanlış yapılandırma kalıplarını arar: herkese açık depolama kovası, aşırı geniş ağ kuralı, şifrelemesi kapalı veritabanı.

Sunucu ayağa kalkmadığı için tarama saniyeler sürer. Checkov bu işi yapan açık kaynak araçlardan biridir; Trivy de trivy config komutuyla aynı işi yapar. Altay Kargo'nun web sunucusu için yazılmış güvenlik grubu şöyle:

resource "aws_security_group" "web_sunucu" {
  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
terraform/main.tf: web sunucusunun güvenlik grubu.
$ checkov -d terraform/ --compact
terraform scan results:

Passed checks: 4, Failed checks: 3, Skipped checks: 0

Check: CKV_AWS_24: "Ensure no security groups allow ingress from 0.0.0.0:0 to port 22"
	FAILED for resource: aws_security_group.web_sunucu
	File: /main.tf:1-8
Check: CKV_AWS_23: "Ensure every security group and rule has a description"
	FAILED for resource: aws_security_group.web_sunucu
	File: /main.tf:1-8
Check: CKV2_AWS_5: "Ensure that Security Groups are attached to another resource"
	FAILED for resource: aws_security_group.web_sunucu
	File: /main.tf:1-8
Checkov 3 çıktısı. PASSED satırları ve rehber bağlantıları kısaltıldı.

İlk satırlar özettir: dört kontrol geçti, üçü kaldı. Her bulgu üç satırdır. Check satırı kontrol kimliğini ve ne istediğini verir. FAILED satırı kalan kaynağı, File satırı dosyayı ve satır aralığını gösterir.

Üç bulgunun ağırlığı aynı değildir. CKV_AWS_24 gerçek bir maruziyettir: 22 numaralı SSH portu bütün internete açık. CKV_AWS_23 kurallara açıklama ister. Denetim ve bakım için yararlıdır ama saldırı yüzeyi açmaz.

CKV2_AWS_5, grubun hiçbir kaynağa bağlı olmadığını söyler. Tek dosyalık örnekte bu doğrudur; gerçek projede bağlantı aynı dizindeyse kontrol geçer. Checkov kalan kontrol varsa 1 koduyla çıkar ve hat durur. --soft-fail seçeneği her durumda 0 döndürür ve kapıyı devre dışı bırakır.

Etkinlik 3 / 7

IaC tarayıcısı bu güvenlik grubu tanımında hangi satırı işaretler?

Zafiyetli satıra tıkla.

Düzeltmenin iki yolu var. Birincisi kaynağı daraltmaktır: SSH yalnız yönetim ağından gelsin. İkincisi SSH'yi hiç açmamaktır.

Bulut sağlayıcısının oturum yöneticisi gibi bir hizmetle sunucuya açık port olmadan bağlanırsın. Altay Kargo ilk yolu seçti ve kurallara açıklama da ekledi. Yeniden taramada CKV_AWS_24 ve CKV_AWS_23 geçer.

Kalan tek bulgu CKV2_AWS_5'tir ve sunucu tanımı eklenince o da kapanır. Bir kontrolü bilerek kabul ediyorsan, kaynağın içine #checkov:skip=CKV_AWS_24:gerekçe biçiminde bir satır yazarsın. Checkov o kontrolü SKIPPED olarak gösterir ve gerekçeyi çıktıya taşır.

resource "aws_security_group" "web_sunucu" {
  description = "Web sunucusu yonetim erisimi"
  ingress {
    description = "SSH yalniz yonetim agindan"
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["192.0.2.0/24"]
  }
}
Düzeltilmiş tanım. AWS güvenlik grubu açıklamasında Türkçe karakter kullanılamaz.

Etkinlik 4 / 7

Altay Kargo'nun terraform klasöründeki tanım dosyalarını Checkov ile tarayan komutu yaz.

ogrenci@lab

Yöntemleri hatta yerleştirmek

Şimdi dört yöntemi yan yana koyabilirsin. Üçünü gördün: SAST, DAST ve IaC taraması. Dördüncüsü IAST'tır (Interactive Application Security Testing). IAST çalışan uygulamanın içine bir ajan yerleştirir.

Fonksiyonel testler koşarken ajan, isteğin koddaki yolunu içeriden izler. Böylece DAST gibi çalışan uygulamayı, SAST gibi kodun içini görür ve az yanlış pozitif üretir. Bedeli, ajanın dile ve çalışma ortamına bağlı olmasıdır. Aşağıdaki tablo her yöntemin neye baktığını, neye ihtiyaç duyduğunu ve hattın neresinde koştuğunu özetler.

Yöntem  Neye bakar          İhtiyacı              Hattaki yeri            Tipik yanlış pozitif
SAST    Kaynak kod          Depodaki kod          Editör, çekme isteği    Tanınmayan temizleyici
DAST    Çalışan uygulama    Ayakta test ortamı    Dağıtım sonrası, gece   Zararsız yansıma
IAST    Uygulama içi akış   Ajanlı test ortamı    Test aşaması            Az, akışı içeriden görür
IaC     Altyapı tanımı      Tanım dosyası         Çekme isteği            Bağlamı bilinmeyen kural
Dört test yönteminin karşılaştırması.

Altay Kargo'nun hattında DAST her gece staging ortamına karşı çalışır, çünkü yavaştır ve dağıtım ister. IaC taraması ise terraform klasörüne dokunan her çekme isteğinde devreye girer. Saniyeler sürer ve dosya okumaktan öteye gitmez.

Herkese açık bir depolama kovası ya da internete açık bir yönetim portu bulunursa kapı birleşmeyi durdurur. İki hız bilinçli bir tasarım kararıdır: sık ve hızlı kontrol erken durağa, seyrek ve derin kontrol geç durağa oturur.

Modern uygulamaların büyük kısmı API'dir. Örümcek API uçlarını bulamaz, çünkü uçlar birbirine bağlantıyla bağlı değildir. ZAP bunun için zap-api-scan.py betiğini sunar. Betik OpenAPI, SOAP ya da GraphQL tanımını içe aktarır ve tanımdaki uçlara aktif tarama yapar.

-S seçeneği aktif taramayı atlar ve yalnız pasif kontrolleri bırakır. Giriş arkasındaki sayfalar için kimlik doğrulamalı tarama gerekir. Araca bir test kullanıcısı verirsin, oturumun nasıl tanınacağını tarif edersin ve çıkış bağlantısını kapsam dışına alırsın. Yoksa örümcek ilk dakikada çıkışa tıklar ve taramanın geri kalanı giriş sayfasında döner.

$ docker run -t zaproxy/zap-stable zap-api-scan.py \
    -t https://staging.altaykargo.example/openapi.json -f openapi
API taraması aktif saldırı yapar. Yalnız sahibi olduğun test ortamına yönelt.

Etkinlik 5 / 7

Her tarama yöntemini neye baktığıyla eşle.

Soldan bir tane seç, sağdan eşini seç. Kullanılmış bir seçeneği yeniden seçersen yeni öğeye taşınır.

Altay Kargo baseline taramasını bir kapıya çevirdi. Önce -g seçeneğiyle varsayılan kural dosyasını üretti; dosyada her kural WARN düzeyinde gelir. Ekip, giriş sayfasını çerçeveye gömülmekten korumak için 10020'yi FAIL yaptı ve dosyayı -c ile taramaya verdi.

Artık başlık eksikse betik 1 koduyla çıkar ve dağıtım durur. Satırın sonuna sekmeyle ayrılmış bir not da eklenebilir; uyarı çıktısında bu not görünür ve geliştirici neden durduğunu hemen anlar.

# zap-baseline rule configuration file
10020	FAIL	(Anti-clickjacking Header)	Giriş sayfası çerçeveye gömülemez
10021	WARN	(X-Content-Type-Options Header Missing)
10038	WARN	(Content Security Policy (CSP) Header Not Set)
zap-kurallari.conf: alanlar sekmeyle ayrılır. Kural adı yalnız bilgi içindir, eşleşme kimlikle yapılır.

Etkinlik 6 / 7

DAST aracı Altay Kargo'nun giriş sayfasına istek yolladı. Yanıtta, sayfanın başka bir sitenin çerçevesine gömülmesini engelleyen başlık eksik. Eksik başlığı ekle.

İsteği tamamla ve gönder.

GET /giris HTTP/1.1
Host: altaykargo.example
Eksik yanıt başlığı

Yapılandırma kayması

IaC taraması depodaki dosyayı okur, buluttaki gerçek durumu okumaz. Bir gece olay müdahalesi sırasında biri konsoldan güvenlik grubuna 0.0.0.0/0 kuralını elle ekledi. Depodaki dosya temiz kaldı, Checkov da yeşil yandı. Kod ile gerçek ortamın böyle ayrışmasına yapılandırma kayması (drift) denir.

Kaymayı yakalamanın yolu, gerçek ortamı düzenli okumaktır. terraform plan -refresh-only komutu buluttaki nesneleri okur ve son uygulamadan beri dışarıda yapılan değişiklikleri listeler. Altyapıda hiçbir şeyi değiştirmez.

$ terraform plan -refresh-only
aws_security_group.web_sunucu: Refreshing state... [id=sg-0a1b2c3d4e5f60718]

Note: Objects have changed outside of Terraform

Terraform detected the following changes made outside of Terraform since the
last "terraform apply" which may have affected this plan:

  # aws_security_group.web_sunucu has changed
  ~ resource "aws_security_group" "web_sunucu" {
        id          = "sg-0a1b2c3d4e5f60718"
      ~ ingress     = [
          + {
              + cidr_blocks = [
                  + "0.0.0.0/0",
                ]
              + from_port   = 22
              + protocol    = "tcp"
              + to_port     = 22
            },
            # (1 unchanged element hidden)
        ]
        # (7 unchanged attributes hidden)
    }

This is a refresh-only plan, so Terraform will not take any actions to undo
these. If you were expecting these changes then you can apply this plan to
record the updated values in the Terraform state without changing any remote
objects.
Yenileme planı, kısaltılmış. Artı işaretli blok konsoldan eklenen kuraldır.

Note satırı kaymanın kendisidir. has changed satırı hangi kaynağın değiştiğini söyler. Artı işaretli blok konsoldan eklenen kuraldır: 22 numaralı port, bütün adreslere açık.

Son paragrafa dikkat et. Bu yenileme planını uygularsan Terraform yalnız kendi durum kaydını günceller ve elle eklenen kural kayda meşru bir değer olarak girer. Doğru tepki çoğu zaman tersidir: normal plan ve apply ile ortamı koddaki tanıma geri çekersin.

Altay Kargo bu kontrolü her gece terraform plan -detailed-exitcode ile çalıştırır. Ortam kodla aynıysa komut 0, fark varsa 2 koduyla döner ve iş bir alarm açar. Bulut sağlayıcısının kendi yapılandırma denetim hizmeti de çalışan ortamı ayrıca izler.

Etkinlik 7 / 7

Doğru mu, yanlış mı?

IaC taraması, bulut konsolundan elle yapılan bir değişikliği otomatik olarak görür.

Derinleş:Kimlik doğrulamalı tarama ve Otomasyon Çerçevesi

Baseline ve API betikleri hızlı başlangıç içindir. Daha karmaşık senaryolar için ZAP'ın Otomasyon Çerçevesi (Automation Framework) kullanılır. Tarama planı bir YAML dosyasıdır ve zap.sh -cmd -autorun plan.yaml komutuyla çalışır. Planın ilk bölümü ortamı tanımlar: hedef adresler, bağlamlar, kimlik doğrulama yöntemi ve test kullanıcıları.

İkinci bölüm işleri sıralar. Tipik bir plan önce spider ya da tarayıcı süren spiderClient ile keşif yapar, openapi işiyle API tanımını içe aktarır, passiveScan-wait ile pasif taramanın bitmesini bekler, activeScan ile saldırı aşamasını çalıştırır ve report ile raporu yazar. Plan bir dosya olduğu için depoda sürümlenir ve her çalıştırmada aynı taramayı üretir. Test kullanıcısının parolası planın içine yazılmaz, ortam değişkeninden okunur.

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