ClinicOS ClinicOS
  • Funcționalități
  • Pentru cabinete
  • Prețuri
  • Contact
  • Începe trial
Începe trial

Securitate & protecție date

Ultima actualizare: 28.04.2026

ClinicOS stochează date medicale sensibile. Securitatea nu e o opțiune premium — e fundație, aplicată pe toate planurile fără diferențiere. Această pagină explică cum, fără jargon de marketing.


1. Multi-tenancy: izolare totală între cabinete

Folosim schema-per-tenant (django-tenants). Concret:

  • Fiecare cabinet are propriul „spațiu" (schemă PostgreSQL) — un namespace separat în baza de date.
  • Query-urile sunt scope-uite automat la schema cabinetului prin middleware (derivat din subdomain). Imposibil să returnezi date dintr-un alt cabinet.
  • Fișierele media (logo cabinet, documente PDF pacienți) sunt izolate per cabinet pe disk: media/<schema>/.... Acces servit prin view Django care verifică tenantul curent — nu prin nginx static (defense in depth).
  • Ștergerea unui cabinet (GDPR Art. 17) execută DROP SCHEMA CASCADE — datele dispar complet, inclusiv media, cu backup final automat în arhivă.

Test în continuu: avem teste end-to-end care verifică că o cerere pe cabinetA.clinicos.ro/media/<file> de la cabinetB.clinicos.ro întoarce HTTP 404. Cross-tenant access = imposibil prin design, nu prin obscuritate.

2. Criptare

2.1 Per-tenant DEK (Data Encryption Key)

Fiecare cabinet primește la creare o cheie unică Fernet (256-bit AES) generată din os.urandom. Această cheie e stocată în DB criptată cu un master KEK (Key Encryption Key) ținut în .env server-side.

Beneficiu: dacă ar exista vreodată un leak al unei chei de cabinet, datele celorlalte cabinete rămân indecriptabile — fiecare are propria cheie izolată.

2.2 Field-level encryption pe câmpuri sensibile

Câmpuri marcate ca foarte sensibile (ex: notițe confidențiale despre pacient — antecedente psihiatrice, HIV etc.) sunt criptate cu DEK-ul cabinetului înainte de a fi scrise în DB. În baza de date apar ca ciphertext Fernet (gAAAAA...), nu plaintext. Decriptarea se face automat la read, doar pentru userii cabinetului care le-a scris.

2.3 HTTPS forțat + HSTS preload
  • Redirect HTTP→HTTPS la nivel de nginx + Django SECURE_SSL_REDIRECT.
  • HSTS 1 an cu includeSubDomains; preload — browserele forțează HTTPS chiar înainte de prima conexiune.
  • Certificat wildcard Let's Encrypt cu auto-renew prin DNS-01 (Cloudflare API).

3. Backup off-site encrypted

Backup-ul cloud nu e add-on premium — e activ pe toate cabinetele, indiferent de plan. Detalii tehnice:

  • Frecvență: zilnic la 03:30 (după backup-ul local de 02:00).
  • Conținut: pg_dump per schemă (+gzip) + tar al fișierelor media per cabinet.
  • Tool: restic 0.18.x — encrypt & deduplicate la nivel de chunk.
  • Encryption: client-side cu master password 48 chars random, cunoscut DOAR de operatorul ClinicOS. Furnizorul de stocare cloud (provider terț) NU poate citi datele.
  • Stocare: off-site, la alt provider de UE (România) — separat fizic de VPS-ul de producție.
  • Retenție automată: 7 zile (daily) + 6 luni (1 per lună) + 2 ani (1 per an) ≈ 16 puncte de restore active simultan.
  • Dedup: chunk-uri identice se urcă o singură dată — backup-urile incremenetale sunt extrem de rapide.
  • Restore test: verificat lunar cu diff -r byte-perfect între snapshot recuperat și sursă.

Note pentru DR (Disaster Recovery): chiar dacă VPS-ul de producție arde complet, backup-ul rămâne disponibil pe stocarea off-site. RTO țintă pentru restore complet (DB + media): < 4 ore.

4. Autentificare & sesiuni

  • Hashing parole: Django PBKDF2-SHA256 cu 600.000 iterații (default 4.2). Imposibil de inversat practic.
  • Sesiuni: cookie HttpOnly + Secure + SameSite=Lax, semnate criptografic.
  • Rate limiting: 5 încercări login eșuate / 15 min per IP. Signup public 5/h. Contact form 10/h.
  • Email-based password reset cu token signed expirable (24h).
  • Onboarding nou cabinet: userul admin e creat inactiv; primește email cu link signed (24h) pentru setare parolă; abia după aceea contul devine activ.

5. Audit & observabilitate

  • Audit log (tabela AuditLog) — orice acțiune sensibilă (vizualizare CNP, export pacient, ștergere, schimbare permisiuni etc.) e înregistrată cu user, IP, user-agent, timestamp.
  • Retenție 7 ani conform legislației medicale RO. Arhivare automată lunară a log-urilor mai vechi (CSV gz off-line).
  • Logging server aplicat strict pe ce-i necesar pentru debugging — fără PII (date personale identificabile).
  • Suspendare automată cabinet expirat: trecere în mod read-only (POST blocat). Nu pierdere de date.

6. Defense in depth

  • Django admin BLOCAT pe tenant subdomain. 3 nivele: (1) URL config nu îl include, (2) middleware Http404 explicit pe /admin*, (3) sidebar fără link. Asta previne ca un superuser de cabinet să ocolească audit log-ul + encryption modificând direct tabelele DB.
  • Honeypot pe formularele publice (signup, contact) — câmp invizibil pentru useri, dar bot-urile îl completează automat.
  • Domenii throwaway (mailinator, guerrillamail etc.) blocate la signup.
  • CSP (Content Security Policy) permițând doar resurse de pe clinicos.ro + js.stripe.com pentru checkout.
  • CSRF protection pe toate POST-urile (Django default).
  • SQL injection exclus prin folosirea exclusivă a Django ORM (queries parametrizate). Niciun raw SQL cu user input.

7. GDPR & drepturile tale

  • Drept de acces / portabilitate: super-admin poate genera oricând un export complet (zip cu pg_dump + tar media + plan info) — răspuns < 30 zile.
  • Drept la ștergere: management command gdpr_delete care face backup final, anulează abonamentul Stripe, execută DROP SCHEMA CASCADE și salvează un audit record (DeletionLog) cu cine, ce, când.
  • Sub-procesatori transparenți: lista completă în Politica de confidențialitate.
  • DPA (Data Processing Agreement) pre-semnat disponibil la /dpa/.

8. Incident response

În caz de breach (acces neautorizat, leak de date), activăm procedura GDPR Art. 33-34:

  1. 72 ore: notificare ANSPDCP cu detalii.
  2. Notificare clienți afectați direct prin email + dashboard banner.
  3. Post-mortem public pe clinicos.ro cu cauza, fix-ul, lessons learned.
  4. Contact urgent: dpo@clinicos.ro (răspuns < 24h în zilele lucrătoare).

9. Open-source & auditabilitate

Implementarea ClinicOS folosește componente open-source bine cunoscute (Django, PostgreSQL, restic, Fernet/cryptography). Pentru clienți Enterprise care vor audit independent, putem facilita acces la documentația arhitecturală sub NDA.


Ai întrebări tehnice de securitate sau vrei un audit? Scrie la dpo@clinicos.ro. Pentru vulnerabilități, te rugăm responsible disclosure — ne dai 30 zile să fixăm înainte de publish, recunoaștem efortul tău cu mențiune publică (cu acordul tău).

ClinicOS

Platformă SaaS multi-tenant pentru cabinete medicale moderne. Date izolate per cabinet, criptare individuală, conformitate GDPR.

Produs
  • Funcționalități
  • Programări online
  • Fișe digitale
  • Portal pacient
  • Workflow analize
  • Pentru cabinete medicale
  • Prețuri
Companie
  • Contact
  • Înregistrare cabinet
  • contact@clinicos.ro
Legal
  • Confidențialitate
  • Politica Cookies
  • Preferințe cookies
  • Termeni și condiții
  • DPA (GDPR)
  • Securitate
© ClinicOS 2026 · Toate drepturile rezervate
Made with care în România · Hosting în UE
Folosim cookies pentru analiză și marketing. Ne ajută să înțelegem ce pagini sunt utile pentru cabinete și ce îi convinge pe medici să înceapă perioada de probă. Poți accepta toate cookies neesențiale, le poți respinge sau îți poți alege preferințele. Află mai multe.
Necesare Securitate, formulare, sesiune și memorarea preferinței. Sunt mereu active.
Mereu active