Ghid de securitate · Moldova

Cum gestionez secretele (.env, chei API) în producție fără să ajungă în git?

Cheia de la procesatorul de plăți, parola bazei de date, tokenul către API-ul SFS: toate trăiesc într-un .env pe undeva. Problema nu este fișierul, ci drumul lui: prin git, prin imaginea Docker, prin chat-ul echipei, către oameni care nu ar trebui să îl vadă.

Actualizat la

Răspuns scurt

  1. Gestionezi secretele ținându-le în afara codului: .env în .gitignore, valorile în secretele platformei de CI sau într-un manager de secrete, injectate la rulare, nu la build.
  2. Un secret ajuns în git rămâne în istoric chiar după ștergere, deci se rotește imediat și abia apoi se curăță istoricul.
  3. În Docker, secretele nu intră în ARG sau ENV din Dockerfile; folosești montări de tip secret la build și Docker secrets sau variabile la rulare.
  4. Scanează repository-ul automat cu un detector de secrete, la fiecare commit.
  5. Acordă fiecărui secret un proprietar și o dată de rotație.
Prima regulă
.env și *.pem în .gitignore, cu .env.example versionat
După o scurgere
rotație imediată; curățarea istoricului nu ajunge
În Dockerfile
fără secrete în ARG/ENV; RUN --mount=type=secret
Detectare
gitleaks sau echivalent, în pre-commit și în CI

Unde ajung secretele fără să vrei

Traseul obișnuit: un dezvoltator copiază .env în repo ca să pornească proiectul mai repede pe alt laptop. Repository-ul este privat, deci pare inofensiv. Peste un an, repo-ul devine public pentru un portofoliu, sau un fost coleg îl are clonat, sau o cheie de CI cu acces la tot codul se scurge. Al doilea traseu este imaginea Docker: o valoare pusă în ENV sau ARG rămâne în straturi și se citește cu o comandă din registry. Al treilea este chat-ul: cheia lipită într-un mesaj rămâne căutabilă ani.

Rotația este singurul răspuns la un secret scurs

Când un secret a ajuns într-un commit, primul pas nu este ștergerea lui, ci generarea unuia nou și invalidarea celui vechi la furnizor. Git păstrează fiecare versiune; un git rm nu schimbă nimic pentru cine a clonat sau pentru boții care scanează platformele de cod în minute. Abia după rotație rescrii istoricul cu git filter-repo, forțezi push-ul și anunți echipa să recloneze. Pentru clienții din UE, o cheie scursă care dă acces la date personale poate fi o breșă de raportat conform contractului.

Secrete în Docker și în CI, fără să rămână urme

La build, dacă ai nevoie de un token pentru un registry privat de pachete, folosește RUN --mount=type=secret: fișierul este disponibil doar în acea comandă și nu ajunge în niciun strat. La rulare, în Docker Compose sau Swarm folosește secrets, care montează valorile ca fișiere în /run/secrets, sau injectează variabilele din platforma de orchestrare. În CI, secretele stau în seiful platformei, mascate în jurnale, disponibile doar job-urilor care le cer. Pentru echipe cu mulți clienți, un manager de secrete cu audit și rotație elimină fișierele .env de pe laptopuri.

Locuri în care ajung secretele și cât de acceptabile sunt
Loc de stocareRisc principalVerdict
Fișier .env în reporămâne în istoric pentru totdeaunaniciodată
ENV sau ARG în Dockerfilecitibil din straturile imaginiiniciodată
.env pe server, permisiuni 600, în afara repo-uluicitibil de oricine cu acces la contacceptabil pentru un singur server
Secretele platformei de CIjob-uri cu acces prea largbun, cu restricție pe mediu
Docker secrets sau /run/secretsmontare accidentală în alt containerbun
Manager de secrete cu audit și rotațieun singur punct de configurat corectrecomandat pentru echipe

Comenzi și configurări

.gitignore și scanare înainte de commit
printf '.env\n.env.*\n!.env.example\n*.pem\n*.key\n' >> .gitignore
gitleaks detect --source . --redact
gitleaks git --log-opts='--all' --redact
Token la build, fără urme în imagine (BuildKit)
# Dockerfile
RUN --mount=type=secret,id=npmrc,target=/root/.npmrc npm ci --ignore-scripts

# build
docker build --secret id=npmrc,src=$HOME/.npmrc -t exemplu.md/app:1.4.0 .
Secret la rulare în Docker Compose
services:
  app:
    image: exemplu.md/app:1.4.0
    secrets: [db_password]
    environment:
      DB_PASSWORD_FILE: /run/secrets/db_password
secrets:
  db_password:
    file: ./secrets/db_password.txt

Exemple din practică

Echipă de outsourcing din Chișinău cu repo făcut public

Un proiect vechi a fost publicat ca exemplu de portofoliu. În istoricul lui, un .env cu cheia de producție a procesatorului de plăți al clientului. Boții l-au găsit în minute. Rotația a durat o oră; explicația către client, mai mult.

Retail cu integrare la SFS

Tokenul către serviciul de facturare electronică era în ENV în Dockerfile. Imaginea stătea în registry-ul intern, accesibil tuturor dezvoltatorilor și unui fost contractor. A fost mutat în Docker secrets și rotit, iar accesul la registry a fost restrâns.

Greșeli frecvente

  • Ștergi .env din repo și consideri problema rezolvată, fără să rotești cheia.
  • Pui parola bazei de date în ARG în Dockerfile „doar pentru build” și rămâne în straturi.
  • Folosești aceeași cheie API pentru dezvoltare, staging și producție.
  • Dai runner-ului de CI acces la toate secretele, indiferent de branch sau de mediu.

Cum te ajută 4hosting

  • Hardening & Compliance acoperă explicit gestionarea accesului, a secretelor și a cheilor pe serverele tale, cu inventar și plan de rotație.
  • Orele de DevOps incluse pot muta secretele din .env în secretele pipeline-ului CI/CD; ceri lucrarea din panoul de client.
  • SIEM & Incident Response detectează utilizarea unei chei vechi după rotație, din jurnalele aplicației.

Întrebări conexe

  • Este .env pe server, în afara repo-ului, suficient de sigur?

    Pentru un singur server cu o echipă mică, da, cu permisiuni 600 și proprietar contul aplicației. Devine insuficient când ai mai multe servere, mai mulți oameni sau un client care cere audit: atunci nu mai poți răspunde cine a văzut ce și când s-a schimbat.

  • Cum împart secrete cu un coleg fără chat?

    Prin managerul de secrete al echipei sau prin platforma de CI, unde colegul primește acces la valoarea de care are nevoie, cu jurnal. Dacă nu ai niciunul, criptează fișierul cu age sau SOPS către cheia lui publică și trimite fișierul criptat, nu valoarea.

Cere o verificare de securitate

Acest ghid adună într-un singur loc măsurile care contează pentru un server de producție al unei firme din Moldova: de la cheia SSH până la copia de backup pe care nimeni nu o poate șterge. Fiecare capitol trimite la o pagină de întrebare cu pași, comenzi și exemple. Este scris pentru echipe care livrează clienților din UE, raportează la instituții locale sau vând online și nu își permit o zi de indisponibilitate.