7.1 KiB
7.1 KiB
Go Backend API Güvenlik Raporu
1. Genel Değerlendirme
- Kapsam: Kod tabanı üzerinden statik güvenlik analizi ve
go vet ./...ile temel statik araç kontrolü. - Genel Sonuç: Mimari olarak sağlam bir temel var (JWT, rol tabanlı yetki, rate limit, CORS). En önemli eksik, refresh token güvenliğinin state-less olması (rotation/revoke yok) ve API tarafında token invalidation / logout akışının olmaması.
2. Güçlü Yönler
-
JWT ve Kimlik Doğrulama
- HS256 ile imzalama yapılıyor ve
SigningMethodHMACkontrolü var →alg: nonebenzeri saldırılara karşı temel koruma mevcut. - Access / refresh token ayrımı
TokenTypealanı ile net;RequireAuthyalnızca access token kabul ediyor. - Email doğrulaması yapılmadan login’e izin verilmiyor.
- HS256 ile imzalama yapılıyor ve
-
Rol ve Yetkilendirme
- Public API tarafında admin işlemleri
RequireAuth+RequireAdminmiddleware’leri ile korunuyor. - Admin panel altındaki
"/admin"rotaları global olarakRequireAuth+RequireAdminile kapalı.
- Public API tarafında admin işlemleri
-
CORS
- DB + Redis destekli whitelist/blacklist ile default deny yaklaşımı kullanılıyor.
- Same-origin istekler her zaman izinli, wildcard
*yok → klasik açık CORS yanlış konfigürasyonları görülmedi.
-
Rate Limiting
/api/v1için global;/auth/loginve/auth/refreshiçin isimlendirilmiş rate limit profilleri tanımlı.- Redis tabanlı sayaçlar ile limit aşıldığında
429veRetry-Afterheader’ı dönüyor.
-
Admin Oturumu (Browser)
admin_sessioncookie:HttpOnly,Secure,SameSite=Strict→ XSS sonrası cookie çalınması ve CSRF riskleri azaltılmış.- Admin login’de parolalar
bcryptile doğrulanıyor.
3. Tespit Edilen Riskler ve Öneriler
3.1 Refresh Token Rotation & Revoke Eksikliği (Kritik / Yüksek Öncelik)
- Durum:
/api/v1/auth/refreshendpoint’i yalnızca:- JWT imzasını,
TokenType == refresholmasını kontrol ediyor.
- Refresh token’lar için DB/Redis tabanlı bir “token store”, revoke listesi veya rotation takibi yok.
- Risk:
- Bir refresh token ele geçirilirse, süresi dolana kadar sınırsız sayıda yeni access token üretmek için yeniden kullanılabilir.
- Token reuse (aynı refresh token’ın birden fazla kez kullanılması) tespit edilemiyor.
- Öneri:
- Refresh token’lar için tablo veya Redis store tasarla:
- Her refresh isteğinde:
- Eski refresh token’ı geçersiz kıl (rotation),
- Yeni bir refresh token üret ve store’a kaydet.
- Aynı refresh token ikinci kez kullanılırsa:
- İlgili hesabı veya oturumu geçici olarak kilitle,
- Gerekirse tüm tokenlarını revoke et (global logout).
- Her refresh isteğinde:
- Mümkünse refresh token’ları HTTP-only cookie ile taşı (XSS’e karşı daha dirençli).
- Refresh token’lar için tablo veya Redis store tasarla:
3.2 API Logout / Token İptali Eksikliği (Orta–Yüksek)
- Durum:
- Public API’de
/api/v1/auth/logoutbenzeri bir endpoint yok. - Client tarafında yalnızca local storage / memory’den token silinerek logout yapılıyor; backend tarafında “session state” yok.
- Public API’de
- Risk:
- Bir access veya refresh token sızdığında, expire olana kadar backend tarafında bunu geçersiz kılma imkânı yok.
- Özellikle refresh token için kritik: saldırgan elinde refresh token olduğu sürece yeni access token üretebilir.
- Öneri:
/api/v1/auth/logoutendpoint’i ekle:- İlgili kullanıcının aktif refresh token kaydını (veya kayıtlardan birini) revoke listesine ekle ya da store’dan sil.
- İsteğe bağlı olarak access token için kısa süreli bir blacklist kullan (jti/subject bazlı).
- Admin panel logout şu an cookie temizliyor; bunu backend tarafında da bir “session invalidation” akışı ile desteklemek düşünülebilir.
3.3 Token İçeriğinin Loglanması (Düşük–Orta)
- Durum:
GenerateTokenPairiçinde development ortamında hem access hem refresh token string’leri loglanıyor.- Refresh akışında
fmt.Println(accessToken, "Access Token Yenilendi !!!")ile access token stdout’a yazılıyor.
- Risk:
- Production konfigürasyonu yanlış yapılırsa, log dosyalarında tam token değerleri yer alabilir.
- Öneri:
- Production ortamında:
- Token gövdesini asla loglama; yalnızca
userID,exp,tokenTypegibi meta verileri logla.
- Token gövdesini asla loglama; yalnızca
- Development ortamında bile mümkünse:
- Token’ı maskeleyerek veya kısmi göstererek logla (örneğin sadece ilk 6 + son 4 karakter).
- Production ortamında:
3.4 Admin Login – Captcha / Turnstile Doğrulaması Tamamlanmamış (Orta)
- Durum:
- Admin login formu
cf-turnstile-responsealanını okuyor ancak gerçek Cloudflare Turnstile doğrulaması yapılmıyor. - Rate limiting mevcut olsa da insan/makine ayrımı yok.
- Admin login formu
- Risk:
- Admin hesabı için brute force ve credential stuffing saldırılarına karşı savunma zayıf kalıyor.
- Öneri:
- Cloudflare Turnstile veya benzeri servis için gerçek HTTP doğrulamasını ekle:
- Turnstile token’ı backend’de doğrulanmadan login’e izin verme.
- Başarısız giriş denemelerine göre:
- IP ve hesap bazlı ek limitler veya geçici hesap kilitleme mekanizması eklemeyi değerlendir.
- Cloudflare Turnstile veya benzeri servis için gerçek HTTP doğrulamasını ekle:
3.5 Redis Yoksa Rate Limit & CORS Enforcement’ın Devre Dışı Kalması (Düşük–Orta)
- Durum:
- Redis bağlantısı yoksa, rate limit ve CORS cache tarafı graceful fail yapıyor ve bazı kontroller uygulanmayabiliyor.
- Risk:
- Production’da Redis yanlış konfigüre edilirse, rate limit fiilen devre dışı kalabilir; CORS kontrolleri de zayıflayabilir.
- Öneri:
- Production ortamında Redis’i zorunlu bağımlılık haline getir:
- Redis’e bağlanılamıyorsa servisi başlatma (fail-fast).
- Redis bağlantı hatalarını loglarda daha yüksek seviye (error) olarak işaretle.
- Production ortamında Redis’i zorunlu bağımlılık haline getir:
4. go vet Çıktısı Özeti
go vet ./...komutu çalıştırıldığında:scripts/seed.goiçinde aynı pakette birden fazlamainfonksiyonu olduğu için “main redeclared” uyarısı veriliyor.
- Not:
- Bu, güvenlikten ziyade script yapısına dair yapısal bir uyarı; istenirse ilgili script ayrı bir pakete veya dosya yapısına taşınarak temizlenebilir.
5. Önerilen İyileştirme Planı (Önceliklendirilmiş)
-
Kritik (kısa vadede):
- Refresh token için rotation + revoke mekanizması tasarlayıp uygulamak.
- Public API için
/api/v1/auth/logoutendpoint’i ekleyip refresh (ve gerekiyorsa access) token’larını server-side olarak da geçersiz kılmak. - Production’da token içeriğini loglamayı tamamen kapatmak; development’ta da maskelemek.
-
Orta vadede:
- Admin login için gerçek Turnstile (veya eşdeğer captcha) doğrulamasını devreye almak.
- Redis’i production ortamında zorunlu hale getirip rate limit/CORS’un Redis olmadan çalışmamasını sağlamak (fail-fast yaklaşımı).
-
Uzun vadede:
- Bu rapora göre hazırlanmış, dış pentest’e verilebilecek detaylı bir test senaryoları dokümanı oluşturmak (mevcut
guvenlik.mdşablonunu projeye özgü endpoint/roller ile doldurmak).
- Bu rapora göre hazırlanmış, dış pentest’e verilebilecek detaylı bir test senaryoları dokümanı oluşturmak (mevcut