Ghid de securitate · România

Cum gestionez utilizatorii și sudo pe server după principiul privilegiului minim?

Un singur cont „deploy” cu parola știută de toată echipa și sudo fără restricții e cea mai comună configurație pe serverele mici din România. Funcționează până când cineva pleacă, un laptop e furat sau trebuie să afli cine a rulat o comandă.

Actualizat la

Răspuns scurt

  1. Gestionezi utilizatorii după principiul privilegiului minim dând fiecărei persoane propriul cont, cu propria cheie SSH, și eliminând conturile partajate cu parolă.
  2. Drepturile de administrare le acorzi prin reguli precise în /etc/sudoers.d/, pe comenzi și grupuri, nu prin NOPASSWD: ALL pentru toți.
  3. Aplicațiile rulează sub conturi de serviciu fără shell și fără parolă, create cu nologin, care nu pot deschide sesiuni.
  4. La plecarea unui coleg dezactivezi contul, ștergi cheia și rotești secretele la care a avut acces, în aceeași zi, și verifici periodic conturile cu getent și lastlog.
Regula de bază
un cont per persoană, zero conturi partajate
Unde stau regulile sudo
/etc/sudoers.d/<rol>, editat cu visudo -f
Conturi de serviciu
shell /usr/sbin/nologin, fără parolă
Offboarding
usermod -L -e 1, ștergere cheie, rotire secrete

De ce un cont per persoană și sudo pe comenzi

Un cont partajat face imposibile două lucruri: să afli cine a făcut o schimbare și să retragi accesul unei singure persoane. Cu un cont per persoană, logul de sudo spune cine a rulat ce, iar plecarea cuiva înseamnă un singur cont dezactivat. Regula implicită de pe multe VPS-uri, grupul sudo poate rula orice fără parolă, transformă orice cheie SSH compromisă în root. Corect, definești roluri: cine face deploy repornește serviciul și îi citește logurile, cine administrează baza de date rulează comenzile ei, iar root complet rămân doi oameni.

Conturi de serviciu, offboarding și audit

Aplicația, serverul web și baza de date rulează fiecare sub un cont de sistem propriu, cu shell nologin și fără parolă: chiar dacă cineva află parola bazei de date, nu poate deschide o sesiune cu contul acela. Offboarding-ul e o procedură scrisă, executată în ziua plecării: blochezi contul, îi pui expirarea în trecut, ștergi cheia din authorized_keys de pe toate serverele, îl scoți din grupuri și rotești parolele și cheile API pe care le-a văzut. Audit lunar: conturile cu shell valid, grupul sudo, ultima autentificare. Un cont nefolosit de 90 de zile se dezactivează.

  • Regulile sudo cu cale completă a comenzii, fără wildcard-uri care permit argumente arbitrare
  • Comenzile care deschid un editor sau un shell nu se dau niciodată prin sudo restricționat
  • Comenzile care deschid un pager (journalctl, systemctl status, man) se dau doar cu --no-pager
  • Lista conturilor și a cheilor stă în managerul de configurație, nu în capul cuiva

Ce spune legislația din România

Art. 32 GDPR cere măsuri care să asigure că doar persoanele autorizate au acces la datele personale, iar la o breșă ANSPDCP verifică exact acest control: cine avea acces, pe ce bază, când a fost retras. Un cont partajat nu poate răspunde la niciuna dintre întrebări. Pentru entitățile de sub OUG 155/2024, transpunerea NIS2 aprobată prin Legea 124/2025, politicile de control al accesului și securitatea resurselor umane sunt măsuri minime explicite (art. 13 lit. f). Retragerea accesului în ziua plecării e și protecția firmei față de un fost angajat nemulțumit.

Tipuri de conturi pe un server de producție și drepturile lor
Tip de contShellAutentificaresudo
Administrator (doi oameni)bashcheie SSH personală, prin VPNALL, cu parolă la fiecare comandă
Deploy / dezvoltatorbashcheie SSH personalădoar comenzile de deploy, în sudoers.d
Cont de serviciu (app, www-data, postgres)/usr/sbin/nologinniciunaniciuna
CI / automatizarebash sau nologin cu ForceCommandcheie dedicată, restricționatăo singură comandă de deploy
rootbashdoar local sau prin consolă—

Comenzi și configurări

Cont personal cu cheie și cont de serviciu fără shell
sudo adduser --disabled-password --gecos "Ana Popescu" ana
sudo install -d -m 700 -o ana -g ana /home/ana/.ssh
echo "ssh-ed25519 AAAA...cheia Anei... ana@laptop" | sudo tee /home/ana/.ssh/authorized_keys
sudo chmod 600 /home/ana/.ssh/authorized_keys && sudo chown ana:ana /home/ana/.ssh/authorized_keys

sudo useradd --system --shell /usr/sbin/nologin --home /var/lib/app --create-home app
/etc/sudoers.d/deploy, editat cu: sudo visudo -f /etc/sudoers.d/deploy
# grupul deploy poate reporni aplicația și îi poate citi logurile, nimic altceva.
# ATENȚIE: journalctl și systemctl status deschid un pager, iar pager-ul rulat ca root
# permite evadarea în shell cu !sh. De aceea forțăm --no-pager și interzicem argumentele libere.
Cmnd_Alias APP_OPS = /usr/bin/systemctl --no-pager restart app.service, \
                     /usr/bin/systemctl --no-pager --full status app.service, \
                     /usr/bin/journalctl --no-pager -n 200 -u app.service
Defaults!APP_OPS env_reset, env_delete += "PAGER SYSTEMD_PAGER LESS LESSOPEN LESSSECURE"
%deploy ALL=(root) NOPASSWD: APP_OPS
Offboarding în aceeași zi și audit lunar
# offboarding
sudo usermod -L -e 1 ana
sudo gpasswd -d ana sudo; sudo gpasswd -d ana deploy
sudo rm -f /home/ana/.ssh/authorized_keys
# apoi rotești parolele și cheile API pe care le-a văzut

# audit
getent passwd | awk -F: '$7 !~ /(nologin|false)$/ {print $1, $7}'
getent group sudo deploy
sudo lastlog -b 90 | grep -v "Never"

Exemple practice

Agenție web din Timișoara cu contul „deploy” la toți

Zece oameni, un cont, o parolă din 2021 și NOPASSWD: ALL. Când un fost angajat a șters un director de client, nimeni nu a putut spune cine. Agenția a creat conturi personale cu chei, a limitat sudo la comenzile de deploy și a scris procedura de offboarding.

Firmă de logistică din Constanța cu aplicație rulată ca root

Aplicația Java rula ca root „pentru că avea nevoie de portul 443”. O vulnerabilitate de deserializare a dat atacatorului root pe server. Acum aplicația rulează sub un cont nologin, pe un port înalt, iar nginx stă în față pe 443.

Greșeli frecvente

  • Toți membrii echipei sunt în grupul sudo cu NOPASSWD: ALL, deci o cheie SSH pierdută înseamnă root.
  • Folosești un cont partajat de om, cu parolă știută de toți, în loc de conturi nominale plus un cont de automatizare separat pentru CI.
  • Dai prin sudo o comandă care deschide un editor sau un shell și crezi că e restricționată.
  • Colegul a plecat de trei luni, iar cheia lui e încă pe cinci servere.

Cum te ajută 4hosting

  • Serviciul Hardening & Compliance definește rolurile, regulile sudo și procedura de offboarding, în orele incluse: 1–8 lunar la VPS, 10 la dedicate și GPU, cerute din panoul de client, secțiunea „Servicii DevOps”; orele se consumă în luna calendaristică și nu se reportează.
  • Serviciul SIEM & Incident Response centralizează logurile de sudo și de autentificare și alertează la un cont nou sau la o comandă neobișnuită rulată ca root.
  • Serviciul Infrastructure as Code pune conturile, cheile și regulile sudo în cod, ca fiecare server nou să pornească cu aceeași listă de acces.

Întrebări conexe

  • De ce nu e bine NOPASSWD: ALL, dacă oricum folosim chei SSH?

    Pentru că cheia SSH e singurul lucru dintre atacator și root. Un laptop furat deblocat, un agent SSH redirecționat pe un server compromis sau o cheie copiată dintr-un backup devin imediat root. Parola la sudo e un al doilea factor local; regulile pe comenzi limitează pagubele.

  • Cum dau unui dezvoltator dreptul să facă deploy fără să-i dau root?

    Printr-un grup deploy cu reguli sudo pe comenzile exacte de care are nevoie: repornirea serviciului, citirea logurilor lui, eventual un script de deploy cu cale fixă și fără argumente libere. În CI, aceleași comenzi le rulează un cont dedicat, cu cheie proprie.

  • Cât de des verific conturile?

    Lunar pe serverele cu date personale sau cu obligații NIS2, trimestrial pe restul, plus după fiecare plecare din echipă. Verificarea durează cinci minute cu comenzile de audit și prinde conturile uitate, cheile în plus și membrii nejustificați ai grupului sudo.

Cere o verificare de securitate

Un server de producție e atacat automat din primele minute după ce primește IP public, indiferent cât de mic e proiectul. Ghidul ordonează controalele după impact, de la accesul SSH până la răspunsul la incident, cu legislația din România care se aplică. Fiecare temă are o pagină dedicată, cu răspuns scurt, exemple și configurări.

Ghiduri pentru firme din România