Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
API Güvenlik Lab'ı: Multi-Tenant Sipariş API'si, Authorization Matrisi ve Güvenlik Testi Altyapısı
API güvenliğinin çoğu "kimin verisi" sorusunda bozulur ve bunu ancak endpoint × aktör × kaynak için beklenen durum kodunu yazan, koddan ayrı tutulan bir authorization matrisiyle sistematik olarak yakalarsın. İki tenant'lı, üç rollü bir Minimal API lab'ı kurup matrisi xUnit Theory, WebApplicationFactory ve test authentication handler ile koşturuyor, ilk koşuda sekiz BOLA açığını görüyoruz.
API1 BOLA'yı Sistematik Kapatmak: Tenant/Owner Scoped Sorgular, Global Query Filter ve Resource-Based Authorization
BOLA'yı her endpoint'e Where ekleyerek değil, kapsamı veri erişim katmanında zorunlu kılarak kapatırsın: EF Core 10'un named query filter'larıyla tenant ve owner filtresi, kapsamsız sorguyu tek bir işaretli class'a hapseden testler, alt kaynak ve toplu işlemlerde ilişki kontrolü, resource-based handler ile 403/404 ayrımı ve matristen otomatik üretilen başka tenant senaryoları.
API2 Machine-to-Machine Authentication: API Key Tasarımı, HMAC İmzalı İstekler ve Token Endpoint'lerini Korumak
Makineler arası bir API key; tanınabilir prefix'li, yalnız hash'i saklanan, tenant ve scope'a bağlı, iki aktif key ile rotation'a ve revocation'a izin veren bir formatla tasarlanır ve asla query string'de taşınmaz. Custom authentication handler, timestamp ve body hash'iyle HMAC imzalı istekler, replay koruması ve parola sıfırlama gibi endpoint'lerde IP ve hesap başına limitleri testleriyle kuruyoruz.
API3 BOPLA: Property Seviyesinde Yetkilendirme, PATCH İstekleri ve Response Shaping
BOPLA'yı serializer ayarıyla değil, rol başına ayrı response tipleri ve rol başına yazılabilir alan allowlist'iyle kapatırsın. Mapperly ile yeni alan eklenince build'i kıran projection'lar, farklı görünümü ayrı endpoint ve policy'ye taşımak, JSON Merge Patch'te kilitli alanları reddetmek ve OpenAPI şemasını testle korunan bir sözleşme olarak kullanmak.
API4 Unrestricted Resource Consumption: Sayfa Boyutu, Sorgu Karmaşıklığı, Timeout'lar, Kota ve Maliyetli Dış Çağrılar
API4'e karşı her parametreye, her endpoint'e ve para harcatan her dış çağrıya bir üst sınır koyar ve bunu testle korursun. 200 000 siparişle ölçülen sınırsız listeden yola çıkıp sayfa boyutu, offset ve sort allowlist'i, toplu işlem ve body limiti, request timeout ile CancellationToken, tenant ve plan bazlı rapor ve SMS kotası ile 429 ve Retry-After'ı kuruyoruz.
API5 BFLA: Endpoint Envanterinden Otomatik Yetkilendirme Testi ve Admin API'lerini Ayırmak
BFLA'yı, uygulamanın gerçekten yayımladığı endpoint'leri EndpointDataSource ile listeleyip her birinin açık bir yetki kararı taşıdığını ve matriste satırı olduğunu doğrulayan testlerle kalıcı olarak kapatırsın. Admin yüzeyini route group, policy ve ayrı port'la ayırıyor, RequireHost'un Host header'ıyla aşılabildiğini gösterip gerçek port kontrolü ekliyor, method bazlı yetkiyi ve method override header'larını ele alıyoruz.
API6 Sensitive Business Flows: Hassas Akışları Belirlemek, Idempotency-Key ve Akış Bazlı Limitler
API6'ya karşı önce hangi iş akışlarının otomasyonla zarar göreceğini belirler, sonra her akışa kendi kuralını koyarsın. Idempotency-Key taslağına göre tekrarlanan POST'ları tek kez işleyen bir filter, eşzamanlı tekrar testi, kupon ve sınırlı ürün kurallarını veritabanı constraint'leri ve koşullu UPDATE ile uygulamak, RFC 9470 biçiminde step-up ve müşteri başına akış limiti.
API7 ve API10: Dış Dünyayla Konuşan API'ler — Webhook'lar, Outbound URL Doğrulama ve Üçüncü Parti Yanıtlara Güvenmemek
Kullanıcının verdiği webhook URL'ini kayıtta biçim olarak, bağlantı anında ise SocketsHttpHandler.ConnectCallback ile çözülen her adres üzerinden doğrularsın; üçüncü parti yanıtlara da kullanıcı girdisi gibi davranırsın. DNS rebinding taklidi, redirect'siz teslimat, imzalı ve tek seferlik işlenen ödeme webhook'u, boyut limiti ve resilience ile doğrulanan kargo API yanıtı.
API8 ve API9: Yanlış Yapılandırma ve Envanter — OpenAPI'yi Envanter Olarak Kullanmak, Deprecation/Sunset Header'ları ve Shadow API'ler
API8'e karşı API'ye özgü bir kontrol listesini Production ortamında koşan testlere bağlarsın; API9'a karşı build sırasında üretilen OpenAPI dokümanını commit edilen bir envanter olarak kullanır ve eski sürümleri RFC 9745 Deprecation ve RFC 8594 Sunset header'larıyla emekliye ayırırsın. CORS ve middleware sırası, git diff ile habersiz endpoint ve saat dilimi tuzağı.
API Güvenliğini Sürekli Test Etmek ve İzlemek: Authorization Regresyonu, OpenAPI Tabanlı Tarama ve Abuse Telemetry
API güvenliğini sürekli korumak için kontrolleri bir test piramidine yerleştirir, OpenAPI tabanlı bir tarayıcıyı yalnız kendi ortamına karşı çalıştırıp bulgularını regresyon testine çevirir ve reddedilen istekleri tenant bazında ölçersin. Schemathesis'in bulduğu sözleşme farkları ve iki 500, RespectNullableAnnotations ile sistematik düzeltme, OpenTelemetry metric'leri ve tek sayfalık kontrol listesi.
OWASP API Security Top 10: 2019'dan 2023'e Ne Değişti ve Eski Raporları Bugünün Diliyle Okumak
2023 sürümünde Excessive Data Exposure ile Mass Assignment BOPLA'da birleşti, API2, API4 ve API9'un adı değişti, Injection ve Logging listeden çıktı, hassas iş akışları, SSRF ve güvensiz tüketim eklendi; bu yüzden eski bulgular numaraya göre değil anlama göre eşlenir. Eşleme tablosu, eski raporları çeviren ve değerlendirilmemiş kategorileri gösteren küçük bir araç ve yeni sürüm geldiğinde ne yapacağımız.