Răspuns scurt
- Gestionezi utilizatorii după principiul privilegiului minim dând fiecărei persoane propriul cont, cu propria cheie SSH, și eliminând conturile partajate cu parolă.
- Drepturile de administrare le acorzi prin reguli precise în /etc/sudoers.d/, pe comenzi și grupuri, nu prin NOPASSWD: ALL pentru toți.
- Aplicațiile rulează sub conturi de serviciu fără shell și fără parolă, create cu nologin, care nu pot deschide sesiuni.
- 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 cont | Shell | Autentificare | sudo |
|---|
| Administrator (doi oameni) | bash | cheie SSH personală, prin VPN | ALL, cu parolă la fiecare comandă |
|---|
| Deploy / dezvoltator | bash | cheie SSH personală | doar comenzile de deploy, în sudoers.d |
|---|
| Cont de serviciu (app, www-data, postgres) | /usr/sbin/nologin | niciuna | niciuna |
|---|
| CI / automatizare | bash sau nologin cu ForceCommand | cheie dedicată, restricționată | o singură comandă de deploy |
|---|
| root | bash | doar local sau prin consolă | — |
|---|
Comenzi și configurări
Cont personal cu cheie și cont de serviciu fără shellsudo 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.