Files
aresv2/guvenlik-raporu.md
Beyhan Oğur 4362c3b83f first commit
2026-04-26 21:33:39 +03:00

126 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 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).