first commit

This commit is contained in:
Beyhan Oğur
2026-04-26 21:40:14 +03:00
commit e04ba85564
129 changed files with 17541 additions and 0 deletions

View File

@@ -0,0 +1,125 @@
## 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 `SigningMethodHMAC` kontrolü var → `alg: none` benzeri saldırılara karşı temel koruma mevcut.
- Access / refresh token ayrımı `TokenType` alanı ile net; `RequireAuth` yalnızca access token kabul ediyor.
- Email doğrulaması yapılmadan logine izin verilmiyor.
- **Rol ve Yetkilendirme**
- Public API tarafında admin işlemleri `RequireAuth` + `RequireAdmin` middlewareleri ile korunuyor.
- Admin panel altındaki `"/admin"` rotaları global olarak `RequireAuth` + `RequireAdmin` ile kapalı.
- **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/v1` için global; `/auth/login` ve `/auth/refresh` için isimlendirilmiş rate limit profilleri tanımlı.
- Redis tabanlı sayaçlar ile limit aşıldığında `429` ve `Retry-After` headerı dönüyor.
- **Admin Oturumu (Browser)**
- `admin_session` cookie: `HttpOnly`, `Secure`, `SameSite=Strict` → XSS sonrası cookie çalınması ve CSRF riskleri azaltılmış.
- Admin loginde parolalar `bcrypt` ile 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/refresh` endpointi yalnızca:
- JWT imzasını,
- `TokenType == refresh` olmasını
kontrol ediyor.
- Refresh tokenlar 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 tokenlar 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 storea 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).
- Mümkünse refresh tokenları **HTTP-only cookie** ile taşı (XSSe karşı daha dirençli).
#### 3.2 API Logout / Token İptali Eksikliği (OrtaYüksek)
- **Durum**:
- Public APIde `/api/v1/auth/logout` benzeri bir endpoint yok.
- Client tarafında yalnızca local storage / memoryden token silinerek logout yapılıyor; backend tarafında “session state” yok.
- **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/logout` endpointi ekle:
- İlgili kullanıcının aktif refresh token kaydını (veya kayıtlardan birini) revoke listesine ekle ya da storedan 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üşükOrta)
- **Durum**:
- `GenerateTokenPair` içinde development ortamında hem access hem refresh token stringleri loglanıyor.
- Refresh akışında `fmt.Println(accessToken, "Access Token Yenilendi !!!")` ile access token stdouta 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`, `tokenType` gibi meta verileri logla.
- Development ortamında bile mümkünse:
- Tokenı maskeleyerek veya kısmi göstererek logla (örneğin sadece ilk 6 + son 4 karakter).
#### 3.4 Admin Login Captcha / Turnstile Doğrulaması Tamamlanmamış (Orta)
- **Durum**:
- Admin login formu `cf-turnstile-response` alanını okuyor ancak gerçek Cloudflare Turnstile doğrulaması yapılmıyor.
- Rate limiting mevcut olsa da insan/makine ayrımı yok.
- **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ı backendde doğrulanmadan logine 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.
#### 3.5 Redis Yoksa Rate Limit & CORS Enforcementın Devre Dışı Kalması (DüşükOrta)
- **Durum**:
- Redis bağlantısı yoksa, rate limit ve CORS cache tarafı graceful fail yapıyor ve bazı kontroller uygulanmayabiliyor.
- **Risk**:
- Productionda Redis yanlış konfigüre edilirse, rate limit fiilen devre dışı kalabilir; CORS kontrolleri de zayıflayabilir.
- **Öneri**:
- Production ortamında Redisi **zorunlu bağımlılık** haline getir:
- Redise bağlanılamıyorsa servisi başlatma (fail-fast).
- Redis bağlantı hatalarını loglarda daha yüksek seviye (error) olarak işaretle.
### 4. `go vet` Çıktısı Özeti
- `go vet ./...` komutu çalıştırıldığında:
- `scripts/seed.go` içinde aynı pakette birden fazla `main` fonksiyonu 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ş)
1. **Kritik (kısa vadede)**:
- Refresh token için rotation + revoke mekanizması tasarlayıp uygulamak.
- Public API için `/api/v1/auth/logout` endpointi ekleyip refresh (ve gerekiyorsa access) tokenlarını server-side olarak da geçersiz kılmak.
- Productionda token içeriğini loglamayı tamamen kapatmak; developmentta da maskelemek.
2. **Orta vadede**:
- Admin login için gerçek Turnstile (veya eşdeğer captcha) doğrulamasını devreye almak.
- Redisi production ortamında zorunlu hale getirip rate limit/CORSun Redis olmadan çalışmamasını sağlamak (fail-fast yaklaşımı).
3. **Uzun vadede**:
- Bu rapora göre hazırlanmış, dış penteste verilebilecek detaylı bir test senaryoları dokümanı oluşturmak (mevcut `guvenlik.md` şablonunu projeye özgü endpoint/roller ile doldurmak).