Siber Güvenlik

Pentest Raporundaki IDOR Zafiyetlerini Kapatmak: Endpoint Bazlı Yamalar Yerine Mimari Yetkilendirme Katmanı Nasıl Kurulur?

26 Oct 2026
9 dakika okuma
Ininia Teknoloji

Pentest raporunuzda sıkça karşılaşılan "yetkisiz kayıt erişimi" veya "doğrudan nesne referansları" (IDOR) zafiyetleri, sisteminizdeki yetkilendirme mekanizmalarının yetersizliğini işaret eder. Bu tür bulguları her bir endpoint için ayrı ayrı kod yamalarıyla kapatmaya çalışmak, hem zaman alıcı hem de uzun vadede sürdürülemez bir yaklaşımdır. Daha sağlam ve yönetilebilir bir çözüm, uygulamanızın tamamını kapsayan, merkezi bir mimari yetkilendirme katmanı kurmaktır. Bu katman, erişim kontrolünü tek bir noktadan yöneterek tutarlılık sağlar ve gelecekteki güvenlik açıklarının önüne geçer.

Endpoint Bazlı Yamaların Yetersizliği ve IDOR'un Temel Kaynağı

IDOR (Insecure Direct Object References), bir kullanıcının kendisine ait olmayan bir kaynağa (örneğin bir kayıt, dosya veya başka bir veri nesnesi) doğrudan erişim sağlamasıyla ortaya çıkar. Genellikle URL parametrelerinde, POST verilerinde veya çerezlerde yer alan nesne ID'lerinin yeterince doğrulanmaması sonucu meydana gelir. Örneğin, /api/siparisler/12345 adresindeki 12345 ID'li siparişin, oturum açmış kullanıcının siparişi olup olmadığı kontrol edilmezse, saldırgan başka bir ID girerek başkasına ait sipariş bilgilerine erişebilir. Bu durum, pentest raporlarında sıkça karşılaşılan bir güvenlik açığıdır.

Her bir endpoint için bu tür bir zafiyeti kapatmaya çalışmak, kod tekrarına, geliştirme hızının yavaşlamasına ve en önemlisi, insan hatası potansiyelinin artmasına yol açar. Her yeni endpoint veya mevcut bir endpoint'in değişen gereksinimleri, manuel olarak yetkilendirme kontrollerinin eklenmesini gerektirir. Bu yaklaşım, sistem büyüdükçe veya ekip değiştikçe yönetilemez hale gelir. Bir endpoint'te yapılan yama, başka bir benzer endpoint'te unutulabilir veya farklı bir şekilde uygulanabilir, bu da yeni güvenlik boşluklarına zemin hazırlar. Bu nedenle, sorunu kökünden çözmek için daha bütünsel bir bakış açısı gereklidir.

Merkezi Yetkilendirme Katmanı (RBAC/ABAC) Mimarisi Kurulumunun Temelleri

Merkezi bir yetkilendirme katmanı, uygulamanızın farklı modülleri veya servisleri arasında tutarlı ve güvenli erişim kontrolü sağlamanın anahtarıdır. Bu katman genellikle bir middleware olarak uygulanır ve her gelen isteğin, kullanıcının belirli bir kaynağa erişim yetkisinin olup olmadığını kontrol eder. Temel olarak iki ana model kullanılır: Rol Tabanlı Erişim Kontrolü (RBAC) ve Nitelik Tabanlı Erişim Kontrolü (ABAC).

RBAC (Rol Tabanlı Erişim Kontrolü) ve ABAC (Nitelik Tabanlı Erişim Kontrolü) Arasındaki Seçim Kriterleri

Doğru yetkilendirme modelini seçmek, uygulamanızın karmaşıklığına, ölçeğine ve güvenlik gereksinimlerine bağlıdır. Her iki model de güçlü yönlere sahiptir:

Özellik RBAC (Rol Tabanlı Erişim Kontrolü) ABAC (Nitelik Tabanlı Erişim Kontrolü)
Tanım Kullanıcılar rollere atanır, roller izinlere atanır. Kullanıcı, kaynak, ortam ve eylem nitelikleri (attribute) temelinde erişim kararı verilir.
Karmaşıklık Daha basit, yönetimi kolaydır. Daha karmaşık, ancak daha esnektir.
Esneklik Sabit rol ve izin setleri için uygundur. Yeni senaryolar için rol/izin güncellemesi gerekebilir. Daha dinamik ve granüler kontrol sağlar. Yeni senaryolar için yeni politika tanımlamak yeterli olabilir.
Uygulama Alanı Kurumsal uygulamalar, yönetici-kullanıcı ayrımı gibi belirli rollerin olduğu sistemler. Mikroservis mimarileri, IoT, sağlık ve finans gibi yüksek güvenlik ve dinamik erişim gerektiren sistemler (bkz. HL7 FHIR R4).
Yönetim Yükü Rollerin ve izinlerin yönetimi basittir. Niteliklerin ve politikaların yönetimi daha karmaşıktır, ancak daha az rol tanımlama ihtiyacı doğurur.
Örnek Senaryo "Yönetici" rolü tüm siparişleri görebilir; "Müşteri" rolü yalnızca kendi siparişlerini görebilir. "Müşteri" rolündeki bir kullanıcı, siparişin durumu "ödendi" ise ve siparişin değeri "X" miktarının altındaysa kendi siparişini iptal edebilir.

Genel bir kural olarak, eğer uygulamanızdaki erişim kontrolü senaryoları belirli, iyi tanımlanmış roller etrafında dönecekse RBAC iyi bir başlangıç noktasıdır. Ancak, erişim kararlarının kullanıcının konumu, zaman, kaynak verisinin hassasiyeti (örneğin, HBYS sistemlerindeki hasta verileri) veya işlemin değeri gibi dinamik niteliklere bağlı olması gerekiyorsa ABAC daha uygun bir seçenektir.

Yetkilendirme Katmanının Tasarım ve Entegrasyon Adımları

Merkezi bir yetkilendirme katmanı kurmak, dikkatli bir planlama ve adım adım uygulama gerektirir. İşte temel adımlar:

  1. Yetkilendirme İhtiyaçlarının Belirlenmesi: Uygulamanızdaki her bir kaynağa (API endpoint'leri, veri nesneleri, kullanıcı arayüzü bileşenleri) kimlerin, hangi koşullar altında erişebileceğini detaylıca listeleyin. CRUD (Oluşturma, Okuma, Güncelleme, Silme) operasyonlarını ve özel iş akışlarını göz önünde bulundurun. Örneğin, bir kargo entegrasyonu için hangi kullanıcının hangi kargo bilgilerine erişebileceği veya gönderi oluşturabileceği gibi API yetkilendirme gereksinimlerini netleştirin.
  2. Politika Modeli Seçimi (RBAC/ABAC): Yukarıdaki tabloya göre uygulamanız için en uygun modeli seçin. RBAC için rol hiyerarşilerini ve izin setlerini, ABAC için ise kullanılacak nitelikleri (kullanıcı nitelikleri, kaynak nitelikleri, eylem nitelikleri, ortam nitelikleri) tanımlayın.
  3. Yetkilendirme Katmanının Tasarımı:
    • Politika Motoru: Seçtiğiniz modele uygun bir politika motoru (Policy Decision Point - PDP) tasarlayın veya mevcut bir kütüphaneyi/çerçeveyi (örneğin, OPA - Open Policy Agent, Casbin) entegre edin. Bu motor, gelen istekleri ve politikaları değerlendirerek erişim kararı verecektir.
    • Politika Bilgi Noktası (PIP): Politikaların uygulanması için gereken nitelik bilgilerini (örneğin, kullanıcının rolleri, kullanıcının departmanı, kaynağın sahibi) sağlayacak bir mekanizma (PIP - Policy Information Point) oluşturun. Bu genellikle veritabanı sorguları, kullanıcı servisleri veya diğer veri kaynakları aracılığıyla yapılır.
    • Politika Uygulama Noktası (PEP): Uygulamanızın her isteği yetkilendirme katmanına yönlendiren bir arayüz (PEP - Policy Enforcement Point) oluşturun. Bu genellikle bir HTTP middleware'i, bir API ağ geçidi (API Gateway) veya bir servis kafesi (service mesh) içerisinde yer alır.
  4. Entegrasyon Stratejisi: Yetkilendirme katmanını uygulamanıza nasıl entegre edeceğinizi belirleyin. Monolitik uygulamalar için bir middleware katmanı yeterli olabilirken, mikroservis mimarileri için API Gateway veya her servisin kendi içerisinde bir PEP bulundurması daha uygun olabilir.
  5. Politika Tanımlama ve Yönetimi: Tanımladığınız yetkilendirme politikalarını (örneğin, "Yönetici rolüne sahip kullanıcılar tüm siparişleri okuyabilir", "Siparişin sahibi olan kullanıcı siparişi güncelleyebilir") politika motorunun anlayacağı bir formatta yazın ve sürdürülebilir bir şekilde yönetin. Bu politikaların sürüm kontrolünü sağlamak önemlidir.
  6. Denetim ve İzleme: Yetkilendirme kararlarını (erişim izni verildi/reddedildi) ve bu kararlara yol açan nedenleri loglayın. Bu loglar, güvenlik denetimleri için kritik öneme sahiptir ve potansiyel güvenlik olaylarının tespiti için kullanılabilir.
# Örnek Python Flask uygulaması için basit bir yetkilendirme middleware'i (sözde kod)
from functools import wraps
from flask import request, abort

# Bu fonksiyon, politika motorunuzla etkileşime girer
def check_authorization(user_id, resource_id, action, resource_type):
    # Gerçek uygulamada, bu kısım RBAC/ABAC politikalarını değerlendirir
    # Örnek: Kullanıcının rolü, kaynağın sahibi, kaynağın hassasiyeti vb.
    if resource_type == "siparis" and action == "oku":
        # Basit bir IDOR kontrolü: Sadece kendi siparişini okuyabilir
        if str(user_id) == str(resource_id): # Burada resource_id'nin sipariş sahibi ID'si olduğunu varsayalım
            return True
        # RBAC örneği: Yöneticiler tüm siparişleri okuyabilir
        # if "admin" in get_user_roles(user_id): return True
    return False

def authorize(resource_type, action):
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            user_id = request.headers.get("X-User-ID") # Kimlik doğrulama sonrası gelen kullanıcı ID'si
            resource_id = kwargs.get("id") # URL'den gelen kaynak ID'si
            
            if not user_id:
                abort(401) # Yetkisiz
            
            if not check_authorization(user_id, resource_id, action, resource_type):
                abort(403) # Yasak
            
            return f(*args, **kwargs)
        return decorated_function
    return decorator

# Kullanım örneği
# @app.route("/api/siparisler/", methods=["GET"])
# @authorize("siparis", "oku")
# def get_siparis_detay(id):
#     # Sipariş detaylarını döndür
#     pass

Yetkilendirme katmanının kendisinin güvenlik açıkları barındırmaması kritik öneme sahiptir. Bu katmanın tasarımı, geliştirilmesi ve denetimi en yüksek güvenlik standartlarına uygun olmalıdır. Aksi takdirde, merkezi bir zafiyet noktası haline gelebilir.

Süreçteki Tuzaklar ve Sürdürülebilirlik

Merkezi bir yetkilendirme katmanı kurarken karşılaşılabilecek bazı tuzaklar ve bu tuzaklardan kaçınmak için dikkat edilmesi gerekenler şunlardır:

  1. Performans Düşüşü: Her isteğin yetkilendirme katmanından geçmesi, ek gecikmeye neden olabilir. Politika motorunun optimize edilmesi, nitelik bilgilerinin önbelleğe alınması ve yetkilendirme kararlarının hassasiyetine göre uygun bir seviyede uygulanması (örneğin, her mikroservis yerine API Gateway'de temel kontroller) bu etkiyi azaltabilir.
  2. Politika Karmaşıklığı: ABAC gibi esnek modeller, çok sayıda nitelik ve kural içerdiğinde politikaların yönetimini zorlaştırabilir. Politikaları modüler tutmak, iyi belgelendirmek ve otomatik testlerle doğrulamak, bu karmaşıklığı yönetmeye yardımcı olur.
  3. Geliştirici Eğitimi ve Benimseme: Yeni yetkilendirme mimarisi, geliştiricilerin alışık olduğu "her endpoint'te manuel kontrol" yaklaşımından farklıdır. Geliştiricilere yeterli eğitim vermek, örnek kodlar ve şablonlar sunmak, sistemin doğru bir şekilde benimsenmesini sağlar.
  4. Denetim Eksikliği: Kimin neye, ne zaman ve neden eriştiğini gösteren yeterli denetim loglarının olmaması, güvenlik olaylarını tespit etmeyi ve kök neden analizini yapmayı imkansız hale getirir. Detaylı, bağlamsal loglama kritik öneme sahiptir.

Merkezi bir yetkilendirme katmanı, uygulamanızın güvenlik duruşunu önemli ölçüde güçlendirir ve pentest raporlarında sürekli karşınıza çıkan IDOR gibi zafiyetlerin kökünden çözülmesini sağlar. Bu mimari, geliştirme süreçlerini hızlandırır, tutarlılığı artırır ve uzun vadede güvenlik yönetimini basitleştirir. Eğer bu karmaşık mimari dönüşümü kendi ekibinizle yönetmekte zorlanıyorsanız, Ininia Teknoloji gibi bu alanda uzmanlaşmış dış kaynaklardan destek almak, projenizin başarısı için kritik yetkinlikleri sağlayabilir.

Bu konuda bir yazılım projesi mi planlıyorsunuz?

Projenizi birlikte analiz edip teknik yol haritasını çıkarabiliriz. Ücretsiz keşif görüşmesi için hemen yazın.

İlgili Hizmetlerimiz

Ininia Teknoloji

İstanbul Teknik Üniversitesi ARI Teknokent'te kurulu Ininia Teknoloji, 12+ yıllık deneyimle AR/VR, yapay zeka ve mobil uygulama alanlarında yenilikçi çözümler sunmaktadır.

Projeniz için profesyonel destek mi arıyorsunuz?

12+ yıllık deneyimimizle dijital dönüşümünüzü hızlandıralım.

Ücretsiz Görüşme Talep Et