Răspuns scurt
- 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.
- Un secret ajuns în git rămâne în istoric chiar după ștergere, deci se rotește imediat și abia apoi se curăță istoricul.
- Î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.
- Scanează repository-ul automat cu un detector de secrete, la fiecare commit.
- 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 stocare | Risc principal | Verdict |
|---|
| Fișier .env în repo | rămâne în istoric pentru totdeauna | niciodată |
|---|
| ENV sau ARG în Dockerfile | citibil din straturile imaginii | niciodată |
|---|
| .env pe server, permisiuni 600, în afara repo-ului | citibil de oricine cu acces la cont | acceptabil pentru un singur server |
|---|
| Secretele platformei de CI | job-uri cu acces prea larg | bun, cu restricție pe mediu |
|---|
| Docker secrets sau /run/secrets | montare accidentală în alt container | bun |
|---|
| Manager de secrete cu audit și rotație | un singur punct de configurat corect | recomandat pentru echipe |
|---|
Comenzi și configurări
.gitignore și scanare înainte de commitprintf '.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 Composeservices:
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.