Comanda `sudo` îți oferă posibilitatea de a executa acțiuni în Linux cu identitatea unui alt utilizator, cum ar fi cel root. Mai mult, `sudo` permite controlul granular asupra celor care au acces la aceste funcții privilegiate. Poți acorda acces total sau doar pentru un set limitat de comenzi. Iată cum poți face asta.
Permisiunile `sudo` și Utilizatorul Root
Se spune adesea că, în Linux, totul este tratat ca un fișier (o simplificare a realității). De fapt, multe elemente ale sistemului de operare, de la procese la directoare, comunică cu nucleul folosind un descriptor de fișier. Chiar dacă nu toate sunt fișiere, o mare parte sunt tratate ca și cum ar fi. Această abordare este un principiu de bază în designul sistemelor de operare Linux și Unix.
Conceptul „totul este un fișier” este central în Linux. Prin urmare, permisiunile asociate fișierelor au devenit esențiale pentru gestionarea privilegiilor și a drepturilor utilizatorilor. Dacă ești proprietarul unui fișier sau director, poți face modificări, redenumiri, mutări sau chiar ștergeri. De asemenea, poți seta permisiuni astfel încât alți utilizatori sau grupuri să poată citi, modifica sau executa fișierul respectiv. Toată lumea, cu excepția unui singur utilizator, trebuie să respecte aceste reguli.
Excepția este superutilizatorul, cunoscut și ca root. Acesta este un cont special, privilegiat, care nu este legat de permisiunile obișnuite ale obiectelor din sistemul de operare. Utilizatorul root poate interveni asupra oricărui element, oricând și aproape în orice mod.
Evident, cel care cunoaște parola root poate face aceleași lucruri. Acesta poate cauza probleme, fie intenționat, fie accidental. De fapt, chiar și o eroare minoră a utilizatorului root poate duce la daune semnificative. Nimeni nu este imun la greșeli, și accesul root poate fi periculos.
Din acest motiv, practica recomandată este să nu te autentifici niciodată direct ca root. Conectează-te cu un cont de utilizator normal și folosește `sudo` pentru a obține temporar privilegiile necesare. De multe ori, acest lucru este suficient pentru o singură comandă.
Lista Utilizatorilor Sudo
`sudo` este preinstalat pe multe distribuții, ca Ubuntu 18.04.3, Manjaro 18.1.0 și Fedora 31, folosite pentru cercetările acestui articol. Nu e surprinzător, `sudo` există de la începutul anilor 1980 și a devenit standardul pentru operarea ca superutilizator în majoritatea distribuțiilor Linux.
Când instalezi o distribuție modernă, utilizatorul creat în timpul instalării este automat adăugat la lista „sudoers”. Acești utilizatori sunt cei care pot folosi comanda `sudo`. Fiind utilizator sudo, poți folosi aceste drepturi pentru a adăuga alți utilizatori la listă.
Desigur, nu este prudent să acorzi acces total de superutilizator oricui sau oricui are nevoie doar de acces parțial sau specific. Lista „sudoers” îți permite să specifici ce comenzi pot fi folosite cu `sudo` de către diferiți utilizatori. Astfel, nu oferi controlul total, dar le permiți să îndeplinească sarcinile necesare.
Executarea Comenzilor ca Alt Utilizator
Inițial, comanda se numea „super user do”, pentru că permitea efectuarea acțiunilor ca superutilizator. Acum, sfera de aplicare a fost extinsă, și poți folosi `sudo` pentru a executa o comandă cu identitatea oricărui utilizator. Acesta este motivul pentru care a fost redenumită, reflectând noua funcționalitate: „substitute user do”.
Pentru a folosi `sudo` și a rula o comandă cu identitatea unui alt utilizator, se folosește opțiunea `-u` (user). Exemplul următor va executa comanda `whoami` ca utilizatorul „mary”. Fără opțiunea `-u`, comanda este executată ca root.
Evident, deoarece folosești `sudo`, va trebui să introduci parola.
sudo -u mary whoami
Rezultatul comenzii `whoami` indică faptul că utilizatorul care a executat comanda este „mary”.
Poți folosi `sudo` pentru a te conecta cu identitatea altui utilizator fără să cunoști parola acestuia. Totuși, vei introduce propria ta parolă. Aici se folosește opțiunea `-i` (login).
sudo -i -u mary
pwd
whoami
ls -hl
exit

Acum ești autentificat ca „mary”. Fișierele „.bashrc”, „.bash_aliases” și „.profile” ale utilizatorului „mary” sunt procesate, exact ca și cum utilizatorul s-ar fi autentificat direct.
Linia de comandă s-a modificat, reflectând sesiunea contului de utilizator „mary”.
Comanda `pwd` arată că te afli în directorul home al utilizatorului „mary”.
`whoami` confirmă că lucrezi cu contul „mary”.
Fișierele din directorul curent aparțin utilizatorului „mary”.
Comanda `exit` te readuce la sesiunea ta normală.
Editarea Fișierului `sudoers`
Pentru a acorda drepturi `sudo` unor utilizatori, trebuie să modifici fișierul `sudoers`. Este important să folosești întotdeauna comanda `visudo` pentru aceasta. `visudo` previne modificările simultane ale fișierului de către mai mulți utilizatori. În plus, ea verifică sintaxa fișierului în timpul salvării.
Dacă modificările tale nu trec testele, fișierul nu va fi salvat automat. Ai mai multe opțiuni: poți renunța la modificări, le poți edita din nou sau poți forța salvarea, chiar dacă aceasta este o idee foarte rea. Evită să faci asta, pentru că riști să blochezi accesul la `sudo` pentru toată lumea.
Deși folosești `visudo` pentru a începe modificările, `visudo` nu este un editor propriu-zis. Ea apelează unul dintre editorii tăi pentru a face editările necesare. Pe Manjaro și Ubuntu, comanda `visudo` folosește editorul simplu nano. Pe Fedora, `visudo` deschide editorul mai complex vim.
Dacă preferi să folosești nano pe Fedora, poți face acest lucru simplu. Înainte de toate, instalează nano:
sudo dnf install nano
Și apoi, `visudo` trebuie invocat astfel:
sudo EDITOR=nano visudo

Această comandă ar putea fi un bun candidat pentru un alias. Editorul nano va fi deschis, cu fișierul `sudoers` gata de editare.

Adăugarea Utilizatorilor la Grupul `sudo`
Folosește `visudo` pentru a deschide fișierul `sudoers`. Poți folosi fie comanda simplă, fie cea descrisă mai sus, specificând editorul preferat:
sudo visudo

Derulează prin fișierul `sudoers` până găsești definiția pentru `%sudo`.

Semnul procentual indică faptul că este o definiție de grup, nu de utilizator. În unele distribuții, linia `%sudo` are un caracter `#` la început, transformând-o într-un comentariu. Dacă este cazul, elimină `#` și salvează fișierul.
Linia `%sudo` se descompune astfel:
`%sudo`: Numele grupului.
`ALL=`: Regula se aplică tuturor gazdelor din rețea.
`(ALL:ALL)`: Membrii grupului pot rula comenzi ca toți utilizatorii și toate grupurile.
`ALL`: Membrii grupului pot rula toate comenzile.
Altfel spus, membrii grupului pot rula orice comandă, ca orice utilizator sau grup, pe calculatorul local sau orice altă gazdă din rețea. Cea mai simplă metodă de a acorda cuiva drepturi root și capacitatea de a folosi `sudo` este să îl adaugi la grupul `sudo`.
Avem doi utilizatori, Tom și Mary, cu conturile „tom” și „mary”. Vom adăuga contul lui Tom la grupul `sudo` folosind comanda `usermod`. Opțiunea `-G` specifică grupul la care se va adăuga Tom. Opțiunea `-a` adaugă grupul la lista grupurilor în care contul „tom” se află deja. Fără această opțiune, contul lui Tom ar fi mutat în noul grup, fiind scos din orice alt grup.
sudo usermod -a -G sudo tom

Să verificăm grupurile lui Mary:
groups

Contul lui „mary” aparține doar grupului „mary”.
Să verificăm grupurile lui Tom:
groups

Contul „tom”, și implicit Tom, face parte din grupurile „tom” și „sudo”.
Să încercăm să-o convingem pe Mary să facă ceva care necesită privilegii `sudo`.
sudo less /etc/shadow

Mary nu poate accesa fișierul restricționat „/etc/shadow”. Ea primește un mesaj de eroare pentru că a încercat să folosească `sudo` fără permisiune. Iată cum se descurcă Tom:
sudo less /etc/shadow

De îndată ce Tom introduce parola, el are acces la conținutul fișierului `/etc/shadow`.

Prin simpla adăugare la grupul `sudo`, Tom a fost ridicat la nivelul celor care pot folosi `sudo`, fără nicio restricție.
Acordarea de Drepturi Sudo Restricționate Utilizatorilor
Tom a primit toate drepturile `sudo`. El poate face orice poate face root, sau orice alt membru al grupului `sudo`. Acesta i-ar putea acorda mai multă putere decât vrei să-i oferi. Uneori, este necesar ca un utilizator să efectueze o acțiune care necesită privilegii root, dar nu este cazul ca acesta să aibă acces total la `sudo`. Poți rezolva asta adăugându-i în fișierul `sudoers` și specificând comenzile pe care le poate folosi.
Să-l cunoaștem pe Harry, proprietarul contului „harry”. Acesta nu face parte din grupul `sudo` și nu are niciun fel de privilegii `sudo`.
groups

Ar fi util dacă Harry ar putea instala programe, dar nu vrem să aibă drepturi complete `sudo`. OK, nicio problemă. Vom deschide `visudo`:
sudo visudo

Derulează în fișier până ce treci de definițiile grupurilor. Vom adăuga o linie pentru Harry. Fiind o definiție de utilizator, nu trebuie să înceapă cu semnul procentual.

Intrarea pentru utilizatorul Harry este:
harry ALL=/usr/bin/apt-get
Observă tab-ul dintre „harry” și „ALL=”.
Această linie arată că Harry poate folosi comenzile enumerate pe orice gazdă conectată la rețea. În cazul nostru, există o singură comandă: „/usr/bin/apt-get”. Îi putem oferi lui Harry acces la mai multe comenzi adăugându-le la această listă, separate prin virgulă.
Adaugă linia în fișierul `sudoers` și salvează-l. Pentru a verifica dacă linia introdusă este corectă sintactic, putem cere lui `visudo` să scaneze fișierul și să verifice sintaxa folosind opțiunea `-c` (check):
sudo visudo -c

Verificările au loc și `visudo` raportează că totul este în regulă. Harry ar trebui să poată folosi acum `apt-get` pentru a instala software, dar i s-ar refuza accesul la orice altă comandă ce necesită `sudo`.
sudo apt-get install finger

Lui Harry i-au fost acordate permisiunile `sudo` necesare și poate instala programe.
Ce se întâmplă dacă Harry încearcă să folosească o comandă diferită care necesită `sudo`?
sudo shutdown now

Harry este împiedicat să execute comanda. I-am acordat cu succes acces limitat și specific. El poate folosi doar comanda specificată și nimic altceva.
Folosirea Aliasurilor de Utilizator `sudoers`
Dacă vrem să-i acordăm lui Mary aceleași privilegii, am putea adăuga o linie în fișierul `sudoers`, similar cu cea pentru Harry. O altă metodă, mai ordonată, este folosirea unui `User_Alias`.
În fișierul `sudoers`, un `User_Alias` conține o listă de nume de utilizatori. Numele `User_Alias` poate fi folosit într-o definiție pentru a reprezenta toate conturile listate. Dacă dorești să modifici privilegiile pentru aceste conturi, va trebui să modifici doar o singură linie.
Să creăm un `User_Alias` și să-l folosim în fișierul nostru `sudoers`.
sudo visudo

Derulează până găsești linia de specificație `User_Alias`.

Adaugă `User_Alias` tastând:
User_Alias INSTALLERS = harry, mary
Fiecare element este separat printr-un spațiu, nu de un tab. Logica se descompune astfel:
`User_Alias`: Îi spune lui `Visudo` că urmează o definiție de `User_Alias`.
`INSTALLERS`: Este un nume arbitrar pentru acest alias.
`= harry, mary`: Lista de utilizatori ce vor fi incluși în acest alias.
Acum vom edita linia adăugată anterior pentru Harry:
harry ALL=/usr/bin/apt-get
Înlocuiește-o cu:
INSTALLERS ALL=/usr/bin/apt-get
Aceasta înseamnă că toate conturile de utilizator incluse în definiția `INSTALLERS` pot executa comanda `apt-get`. Putem testa acest lucru cu Mary, care acum ar trebui să poată instala programe.
sudo apt-get install colordiff

Mary poate instala programe pentru că se află în `User_Alias` „INSTALLERS” și acestui alias i-au fost acordate drepturile necesare.
Trei Scurtături Utile `sudo`
Când uiți să adaugi `sudo` unei comenzi, tastează:
sudo !!
Astfel, ultima comandă va fi repetată, cu `sudo` adăugat la început.
După folosirea comenzii `sudo` și introducerea parolei, nu va trebui să introduci parola din nou pentru alte comenzi `sudo` timp de 15 minute. Dacă vrei să-ți dezactivezi sesiunea imediat, folosește:
sudo -k
Te-ai întrebat unde poți vedea încercările eșuate de a folosi comanda `sudo`? Acestea sunt înregistrate în fișierul „/var/log/auth.log”. Poți să-l vizualizezi folosind:
less /var/log/auth.log

Aici, poți vedea acțiunea lui Mary, care s-a conectat prin TTY pts/1 și a încercat să execute comanda de închidere ca utilizatorul „root”.
Cu Putere Mare…
… vine și abilitatea de a delega părți din ea altora. Acum știi cum să împutern