Noțiuni introductive Sudoers:
Separarea privilegiilor este una dintre principalele paradigme de securitate implementate în sistemele de operare Linux și Unix. Utilizatorii obișnuiți operează cu privilegii limitate cu scopul de a limita configurarea doar la mediul lor de lucru și nu la nivelul sistemului de operare.
Sunt situații în care avem nevoie de permisiuni mai mult decât de obicei, pentru instalări/ dezinstalări, update-uri, modificări fișiere din afara directorului nostru /home/user. Putem obține permisiuni suplimentare atât în linia de comandă cât și în interfața grafică.
Un utilizator cu puteri depline este denumit utilizator root. Acesta este un cont administrativ fără restricțiile unui utilizator obișnuit. Utilizatorii pot executa comenzi cu „super-user” sau „root” în diferite moduri.
În acest articol, vom discuta despre cum se obține în mod corect și în deplină siguranță, privilegii root punând accent pe editarea fișierului /etc/sudoers.
Vom realiza acești pași pe un server Ubuntu 16.04 dar și pe variantele recente de Linux ar trebui să funcționeze în mod similar.
Acest ghid presupune că ați finalizat deja configurarea inițială a serverului discutată aici.
Conectați-vă la serverul dumneavoastră ca user obișnuit, utilizator non-root și continuați cu pașii următori:
Cum obțineți privilegiile utilizatorului root:
Sunt trei modalități de bază pentru a obține privilegiile utilizatorului root care variază în funcție de nivelul lor de complexitate.
➢ Logați-vă ca root
Cel mai simplu mod de a obține privilegii de root este de a vă conecta din start ca utilizator root.
Dacă vă conectați pe o mașină locală folosiți la logare numele de utilizator „root” și introduceți parola root când vă este solicitată.
Dacă vă conectați prin SSH, specificați utilizatorul root înainte de adresa IP sau numele domeniului în șirul conexiunii SSH.
ssh root@server_domain_or_IP
Dacă nu ați configurat cheile SSH pentru utilizatorul root, introduceți parola de root când vi se solicită.
➢ Folosirea comenzii „su” pentru a deveni utilizator root
SU (switch user sau substitute user) este comanda cu ajutorul căreia putem schimba contul curent.
Logarea cu utilizatorul root nu este de obicei recomandată deoarece folosirea sistemului pentru sarcini non-administrative este facilă dar în același timp periculoasă.
Următoarea modalitate de a obține privilegii de super user vă permite să deveniți utilizator root în orice moment.
Pentru a obține acest utilizator prin folosirea comenzii su tastați:
su –
Acum vi se va solicita parola utilizatorului root și veți fi transferat într-o sesiune shell cu drepturi de root.
După ce ați terminat sarcinile care necesită avantajele utilizatorului root reveniți la shell-ul utilizatorului normal.
exit
➢ Folosirea comenzii „sudo” pentru executarea comenzilor ca utilizator root
Ultima și cea mai complexă modalitate de a obține avantajele utilizatorului root este prin folosirea comenzii sudo.
Comanda sudo permite executarea unei comenzi ca utilizator root fără a fi nevoie să creăm un nou shell. Această comandă se execută astfel:
sudo command_to_execute
Spre deosebire de comanda su, comanda sudo vă solicită parola utilizatorului care a executat comanda și nu parola utilizatorului root.
Ce este Visudo?
Comanda visudo este configurată printr-un fișier localizat la /etc/sudoers.
Atenție! Nu modificați niciodată acest fișier cu un editor de text normal! Folosiți întotdeauna comanda visudo!
Pentru că sintaxele necorespunzătoare în fișierul /etc/sudoers vă pot lăsa cu un sistem în care este imposibil să obțineți privilegii elevate, este important să editați fișierele folosind comanda visudo.
Comanda visudo, deschide un editor de text normal dar validează sintaxa fișierului după salvare. Acest lucru previne erorile de configurare de la blocarea operațiilor sudo, care ar putea fi singura modalitate de a obține privilegii de root.
În mod obișnuit, visudo deschide fișierul /etc/sudoers cu editorul de text vi. Cu toate acestea Ubuntu are configurat visudo să utilizeze editorul de text nano.
Dacă doriți să-l schimbați în vi, folosiți următoarea comandă:
sudo update-alternatives –config editor
Output
There are 4 choices for the alternative editor (providing /usr/bin/editor).
Selection Path Priority Status
––––––––––––––––––––
* 0 /bin/nano 40 auto mode
1 /bin/ed -100 manual mode
2 /bin/nano 40 manual mode
3 /usr/bin/vim.basic 30 manual mode
4 /usr/bin/vim.tiny 10 manual mode
Press <enter> to keep the current choice[*], or type selection number:
Selectați numărul care corespunde cu alegerea dumneavoastră.
În CentOS, puteți modifica această valoare prin adăugarea liniei următoare în ~/.bashrc:
export EDITOR=`which name_of_editor`
Aplicați modificările:
~/.bashrc
După ce ați configurat visudo, executați comanda /etc/sudoers pentru a accesa fișierul:
~sudo visudo
Cum modificați fișierul sudoers:
Fișierul /etc/sudoers va fi afișat în editorul de text selectat.
Am copiat și inserat fișierul din Ubuntu 16.04 și am eliminat comentariile. Fișierul CentOS /etc/sudoers are mai multe linii, pe care nu le vom discuta în acest ghid.
/etc/sudoers
Defaults env_reset
Defaults mail_badpass
Defaults secure_path=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin”
root ALL=(ALL:ALL) ALL
%admin ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL
#includedir /etc/sudoers.d
Să aruncăm o privire la aceste linii de comandă:
Liniile standard:
- Prima linie „Defaults env_reset” resetează terminalul pentru a elimina toate variabilele utilizatorului. Aceasta este o măsură de siguranță utilizată pentru a șterge din memoria sudo variabilele potențial dăunătoare.
- A doua linie “Defaults mail_badpass” solicită sistemului să trimită notificări pentru încercări repetate de introducere greșită a parolei sudo adresei de mail a utilizatorului. Standard, acesta este un cont root.
- A treia linie, care începe cu „Defaults secure_path=…”, specifică calea (locurile din sistemul de fișiere în care sistemul de operare va căuta aplicații) care va fi folosită pentru aplicații sudo. Acest lucru previne utilizarea comenzilor care pot fi dăunătoare.
Liniile de permisiuni ale utilizatorului:
- Cea de-a patra linie, care impune privilegii sudo utilizatorului root, este diferită de liniile precedente. Să aruncăm o privire:
~root ALL=(ALL:ALL) ALL
- Primul câmp indică numele utilizatorului la care se va aplica regula (root).
~demo ALL=(ALL:ALL) ALL
- Primul „ALL” indică faptul că această regulă se aplică tuturor gazdelor.
~demo ALL=(ALL:ALL) ALL
- Acest „ALL” indică faptul că utilizatorul root poate rula comenzi ca toți utilizatorii.
~demo ALL=(ALL:ALL) ALL
- Acest „ALL” indică faptul că utilizatorul root poate rula comenzi ca toate grupurile.
~demo ALL=(ALL:ALL) ALL
- Ultimul „ALL” indică că aceste reguli se aplică tuturor comenzilor.
Acest lucru înseamnă că utilizatorul root poate executa orice comandă folosind sudo, atâta timp cât acesta oferă parola.
Liniile de permisiuni ale grupului:
Următoarele două linii sunt similare cu liniile de permisiuni ale utilizatorului, dar specifică reguli sudo pentru grupuri.
Numele începând cu „%” indică numele de grup.
Aici, observăm că grupul “admin” poate executa orice comandă folosind orice utilizator sau host.
Linia /etc/sudoers.d:
Ultima linie ar putea arăta ca un comentariu la prima vedere:
/etc/sudoers
. . .
#includedir /etc/sudoers.d
Începe cu un # care de obicei indică un comentariu însă această linie indică de fapt că fişierele din directorul /etc/sudoers vor fi folosite şi aplicate.
Fişierele din acel director urmează aceleaşi reguli ca şi fişierul /etc/sudoers în sine. Orice fişier care nu se termină în ~ şi nu are . va fi citit şi aplicat în configuraţia sudo.
Acest lucru este destinat aplicaţiilor care modifică permisiile sudo la instalare. Punerea tuturor fişierelor asociate într-un singur fişier al directorului /etc/sudoers.d facilitează corelaţia permisiilor asociate fiecărui utilizator şi poate inversa cu uşurinţă datele de conectare, fără să manipuleze direct fişierul /etc/sudoers.
Ca şi în cazul fişierului /etc/sudoers, trebuie să editaţi fişiere în cadrul directorului /etc/sudoers.d cu visudo. Sintaxa pentru editarea acestor fişiere este:
~sudo visudo -f /etc/sudoers.d/file_to_edit
Cum setăm permisiuni pentru utilizatori sudo:
Cea mai uzuală comandă pe care utilizatorii doresc să o efectueze atunci când gestionează permisiuni sudo este de a acorda unui nou utilizator permisiuni generale sudo. Acest lucru este util dacă doriţi să setaţi unui cont de utilizator acces administrativ complet la sistem.
Cel mai simplu mod de a face acest lucru pe un sistem configurat pentru un grup administrativ de uz general este să adăugaţi utilizatorul în cauză în acel grup.
De exemplu, pe Ubuntu 16.04 grupul sudo are permisiuni depline de administrator. Putem obţine aceleaşi permisiuni pentru un utilizator prin adăugarea lui ca grup astfel:
~sudo usermod -aG sudo username
Comanda gpasswd poate fi de asemenea utilizată:
~sudo gpasswd -a username sudo
Ambele comenzi realizează acelaşi lucru.
În CentOS grupul wheel este de obicei în locul grupului sudo.
~sudo usermod -aG wheel username
Sau folosind gpasswd:
~sudo gpasswd -a username wheel
În CentOS, dacă adăugarea utilizatorului în grup nu are efect imediat, trebuie să editaţi fişierul /etc/sudoers şi să activaţi numele grupului.
~sudo visudo
/etc/sudoers
. . .
%wheel ALL=(ALL) ALL
. . .
Cum creăm reguli personalizate:
Acum că ne-am familiarizat cu sintaxele generale ale fişierului, să creăm nişte reguli noi.
Cum creăm pseudonime (Aliases):
Fişierele sudoers pot fi organizate mai eficient prin gruparea diferitelor tipuri de “alias”. De exemplu, putem crea trei grupuri diferite de utilizatori, cu suprapunerea membrilor.
/etc/sudoers
. . .
User_Alias GROUPONE = abby, brent, carl
User_Alias GROUPTWO = brent, doris, eric,
User_Alias GROUPTHREE = doris, felicia, grant
. . .
Dacă numele grupurilor încep cu o majusculă, atunci putem permite membrilor grupului GROUPTWO să-şi actualizeze baza de date prin crearea următoarelor reguli:
/etc/sudoers
. . .
GROUPTWO ALL = /usr/bin/apt-get update
. . .
Dacă nu specificăm un utilizator/grup pentru a rula, ca mai sus, utilizatorului sudo i se aplică implicit regulile sudo.
Putem permite membrilor GROUPTHREE să pornească sau să oprească unitatea prin crearea comenzii “command alias” şi utilizarea comenzii pentru GROUPTHREE
/etc/sudoers
. . .
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE ALL = POWER
. . .
Putem crea un pseudonim numit POWER care conţine comenzi pentru a închide şi reporni aparatul. Apoi vom permite membrilor GROUPTHREE să execute aceste comenzi.
Putem de asemenea să creăm pseudonimul “Run as” care poate înlocui porţiunea regulii care specifică utilizatorului să execute comanda ca:
/etc/sudoers
. . .
Runas_Alias WEB = www-data, apache
GROUPONE ALL = (WEB) ALL
. . .
Acest lucru va permite oricărui utilizator din grupul GROUPONE să execute comenzi, ca utilizator www de date sau apache.
Rețineți că normele viitoare vor înlocui regulile anterioare, atunci când există un conflict între cele două.
Cum blocăm regulile:
Există o serie de moduri în care puteți deține control asupra modului în care sudo reacționează. De exemplu, comanda updated asociată cu pachetul mlocate este relativ inofensivă pe un sistem cu un singur utilizator. Pentru a permite utilizatorilor să execute această comandă cu permisiuni de root fără parolă, este nevoie de o regulă ca aceasta:
/etc/sudoers
. . .
GROUPONE ALL = NOPASSWD: /usr/bin/updatedb
. . .
NOPASSWD este un “tag” (etichetă) care înseamnă că parola nu este solicitată. PASSWD este “tag”-ul companion care solicită parola. Eticheta este relevantă pentru cazul în care nu există altă etichetă în josul liniei. De exemplu, putem avea o linie de genul:
/etc/sudoers
. . .
GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
. . .
O altă etichetă este NOEXEC care poate fi folosită pentru a preveni comportamentul periculos în anumite programe. De exemplu, unele programe ca “less” pot da naștere altor comenzi prin tastarea următoarei comenzi în cadrul interfeței lor:
!command_to_run
Practic executarea oricărei comenzi dată de utilizatorul cu aceleași permisiuni mai puțin “less” poate fi periculos. Pentru restricționarea acesteia putem folosi următoarea linie:
/etc/sudoers
. . .
username ALL = NOEXEC: /usr/bin/less
. . .
Informații diverse:
Există câteva informații care pot fi utile atunci când se lucrează cu sudo. Dacă ați specificat un utilizator sau un grup de utilizatori să “run as” în fișierul de configurare, puteți executa comenzi precum acei utilizatori prin folosirea etichetelor “–u” sau “–g” respectiv:
sudo -u run_as_user command
sudo -g run_as_group command
Pentru comoditate, sudo va salva detaliile de autentificare pentru o anumită perioadă de timp, într-un terminal. Acest lucru înseamnă că nu trebuie să introduceți parola din nou până când cronometrul va expira. Din motive de siguranță dacă doriți să ștergeți acest cronometru când terminați de executat comenzile administrative, puteți rula comanda:
sudo -k
În cazul în care doriți să setați comanda sudo astfel încât să nu vi se solicite ulterior, sau să reînnoiți sesiunea sudo, puteți tasta:
sudo -v
Vi se va solicita parola, care va fi salvată în memoria cache pentru utilizări ulterioare până când va expira intervalul de timp.
Dacă pur și simplu, doriți să aflați ce permisiuni sunt definite pentru contul dumneavoastră de utilizator, tastați:
sudo -l
Această comandă va lista toate regulile din fișierul /etc/sudoers care se aplică contului tău de utilizator. Acest lucru, vă va oferi o imagine de ansamblu asupra a ce sau ce nu vă este permis să faceți cu sudo ca orice utilizator.
Vor fi multe dăți în care veți eșua să executați o comandă, deoarece nu ați folosit sudo inițial. Pentru a evita să reintroduceți comanda, puteți profita de o funcționalitate bash “repeat the last command”:
sudo !!
Dublarea semnului exclamării indică că va repeta ultima comandă. Am folosit sudo pentru a schimba starea comenzii din comandă neprivilegiată în privilegiată.
Putem adăuga următoarea linie în fișierul /etc/sudoers/ cu visudo:
sudo visudo
/etc/sudoers
. . .
Defaults insults
. . .
Acest lucru va determina sudo să returneze o eroare atunci când utilizatorul introduce o parolă greșită.
Putem folosi comanda sudo –k pentru a șterge parola sudo anterioară salvată în memoria cache a terminalului astfel:
sudo -k
sudo ls
Output
[sudo] password for demo: # enter an incorrect password here to see the results
Your mind just hasn’t been the same since the electro-shock, has it?
[sudo] password for demo:
My mind is going. I can feel it.
Concluzie:
Parcurgând acest ghid înseamnă că în acest moment cunoașteți modul în care se citește și modifică fișierul sudoers dar și modul în care puteți obține permisiuni de root.