Clone
1
Bezbednost
Dasko edited this page 2026-06-21 02:16:00 +02:00

Bezbednost

Autentifikacija

Lozinke

  • bcrypt, cost faktor 12
  • Heš se čuva u bazi, nikad u plaintext-u
  • Anti-enumeracija: IzjednaciVremeProvere izvršava bcrypt poređenje i kad korisnik ne postoji — vreme odgovora je identično
// internal/auth/auth.go
const bcryptCost = 12

func HashujLozinku(lozinka string) (string, error) {
    return bcrypt.GenerateFromPassword([]byte(lozinka), bcryptCost)
}

func IzjednaciVremeProvere(lozinka string) {
    _ = bcrypt.CompareHashAndPassword(dummyHash, []byte(lozinka))
}

Dvofaktorska autentifikacija (2FA)

  • TOTP (Time-based One-Time Password) — RFC 6238
  • 6-cifreni kodovi, rotiraju na 30 sekundi
  • Tajna se šifruje AES-256-GCM pre upisa u bazu
  • QR kod za podešavanje u autentifikator aplikaciji
  • Rezervni kodovi za oporavak (jednokratni, bcrypt heširani)

Sesije

  • Server-side — token u HTTP-only kolačiću ntech_sesija
  • Token je UUID v4 (github.com/google/uuid)
  • Podaci sesije: korisnik_id, token, created_at, expires_at
  • Nema osetljivih podataka u kolačiću — samo nasumični token
  • Secure flag u produkciji i demo modu
  • HttpOnly — JavaScript ne može da čita kolačić
  • SameSite=Lax — zaštita od CSRF-a na nivou brauzera

Brute-force zaštita

5 neuspelih pokušaja sa iste IP adrese u 15 minuta → IP se blokira
  • Evidencija u tabeli pokusaji_prijave
  • Auth log u fail2ban formatu (/var/log/ntech/auth.log)
  • Pogodan za integraciju sa spoljnim fail2ban-om

CSRF zaštita

  • Double-submit cookie obrazac
  • CSRF token se generiše na serveru i ubacuje u svaki <form>
  • Token se upoređuje sa kolačićem pri svakoj POST/PUT/DELETE mutaciji
  • Implementacija: internal/middleware/csrf.go
<!-- Automatski ubacuje renderer -->
<form method="post" action="/magacin/novi">
  <input type="hidden" name="csrf_token" value="...">
  ...
</form>

RBAC — Kontrola pristupa zasnovana na ulogama

Uloge

Uloga Opis
superadmin Pun pristup — sve dozvole + dodela uloga
admin Upravljanje korisnicima, podešavanja, svi moduli
radnik Ograničen pristup — dodeljene dozvole po modulu

Dozvole (39 akcija)

Akcije su granularne: modul.akcija (npr. artikal.dodaj, servis.obrisi, izvestaj.pregled).

Neke rute su namerno javne (bez dozvole):

  • /magacin — pregled magacina
  • /podsetnici — svi prijavljeni vide svoje podsetnike
  • /prijava, /setup — neautentifikovani pristup

Middleware zaštita

// Mutirajuće rute — vraća 403 na odbijanje
r.With(doz("prodaja.dodaj")).Post("/prodaja/nova", ...)

// GET rute — redirektuje na odbijanje
r.With(doz("nabavka.pregled")).Get("/nabavke", ...)

// Admin rute — po ulozi
r.Group(RequireAdmin)     /admin/korisnici*, /admin/dozvole*
r.Group(RequireSuperAdmin)  /admin/dozvole/uloga/{id}

Security headeri

Svaki HTTP odgovor dobija:

Header Vrednost
Content-Security-Policy Dinamički: style-src, script-src, img-src, font-src
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-XSS-Protection 0 (zastarelo, CSP preuzima)
Referrer-Policy strict-origin-when-cross-origin
Strict-Transport-Security max-age=63072000 (samo u produkciji)

Ostale mere

  • XSS zaštitantechToast koristi textContent (ne innerHTML)
  • Open redirect — validacija _next parametra kroz whitelist
  • Limit upload-ahttp.MaxBytesReader za sve POST zahteve
  • Anti-MIME-sniffingX-Content-Type-Options: nosniff
  • CSP font-src — dozvoljava samo 'self' (rešava problem sa Chart.js fontovima u Operi/Chrome-u)
  • Secure kolačićiSecure=true u produkciji i demo modu
  • OIE zaštitaSameSite=Lax na svim kolačićima