Laborator 09 - Utilizatori și permisiuni

În acest laborator discutăm despre rolul utilizatorilor în sistemul de operare, utilizatorul privilegiat și permisiuni de access.

Accesul privilegiat

În sistemul de operare există acțiuni critice (critical / sensitive actions): configurarea rețelei, instalarea de aplicații, adăugarea de noi conturi de utilizatori, configurarea serviciilor sistemului. Aceste acțiuni afectează funcționarea sistemului de operare și pot cauza probleme (de funcționare, de securitate) la o utilizare necorespunzătoare; de exemplu, configurarea greșită a rețelei poate duce la lipsa de conectivitate la Internet; adăugarea unui cont nou poate permite accesul unor persoane nedorite la nivelul sistemului; instalarea unei aplicații poate duce la rularea de malware la nivelul sistemului. De aceea aceste acțiuni pot fi realizate doar într-un mod privilegiat.

Modul privilegiat este activat cel mai adesea prin accesarea unui cont de utilizator privilegiat. Spunem, așadar, că pe un sistem avem conturi de utilizator obișnuite (regular users) și conturi de utilizator privilegiat (privileged user). Utilizatorul privilegiat se mai numește administrator, admin sau superuser. În Linux, utilizatorul privilegiat se numește root.

Un utilizator obișnuit nu poate realiza acțiuni critice; doar utilizatorul privilegiat poate. De aceea, va trebui să accesăm utilizatorul privilegiat pentru realizarea acțiunilor critice.

Folosirea sudo

Accesarea contului privilegiat se realizează cel mai simplu, în Linux, cu ajutorul comenzii sudo. De exemplu, dacă dorim să instalăm o aplicație din contul obișnuit, vom primi eroare:

student@uso:~$ apt install nmap
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?

Această acțiune va reuși, însă, dacă prefixăm comanda cu sudo:

student@uso:~$ sudo apt install nmap
Reading package lists... Done
Building dependency tree
Reading state information... Done
nmap is already the newest version (7.60-1ubuntu5).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Contul privilegiat (root) accesat prin intermediul comenzii sudo are putere deplină asupra sistemului. Poate realiza toate acțiunile posibile (critice sau necritice). De aceea, este riscantă accesarea acestui cont: o comandă rulată greșit poate duce la probleme grave la nivelul sistemului.

O comandă celebră, destinată începătorilor, este sudo rm -rf /. În mod amuzant, se spune că această comandă citește e-mailuri foarte rapid (read mail really fast). În realitate comanda șterge întregul sistem de fișiere, de la rădăcină (/), făcând sistemul nefuncțional și ducând la pierderea datelor.

De aceea, contul privilegiat trebuie accesat cât mai rar, doar atunci când este nevoie. În mod implicit, un utilizator se autentifică în sistem cu un cont neprivilegiat (de exemplu student), urmând să acceseze contul privilegiat (root) doar la nevoie.

Exercițiu: Acțiuni privilegiate

Realizați următoarele acțiuni din contul de utilizator obișnuit student și vedeți care are nevoie de acces privilegiat. Explicați de ce unele au nevoie de acces privilegiat.

  • touch /home/student/a.txt
  • apt install strace
  • ip address show
  • cat /etc/passwd
  • cat /etc/shadow
  • touch /etc/test.conf
  • touch /tmp/my.data
  • service ssh restart
  • dmesg
  • dmesg -c

Erori de permisiuni și alte erori

O confuzie frecventă apare între erorile de permisiuni și erorile de altă natură. De exemplu, atunci când afișăm conținutul unui fișier, putem avea următoarele situații:

student@uso:~$ cat /var/log/boot.log
cat: /var/log/boot.log: Permission denied
 
student@uso:~$ cat /var/log/kill/them/all.log
cat: /var/log/kill/them/all.log: No such file or directory

Prima comandă afișează o eroare de permisiune (Permission denied). A doua afișează o eroare de sistem de fișiere: fișierul care se dorește afișat nu există (No such file or directory).

Doar erorile de permisiune sunt “rezolvabile” folosind contul privilegiat, care are acces complet în sistem. Celelalte tipuri de erori nu sunt rezolvate astfel, trebuie găsită sursa problemei. Astfel că, dacă prefixăm cele două comenzi de mai sus cu sudo, pentru folosirea contului privilegiat, vom obține:

student@uso:~$ sudo cat /var/log/boot.log
[  OK  ] Started Show Plymouth Boot Screen.
[  OK  ] Started Forward Password Requests to Plymouth Directory Watch.
[  OK  ] Reached target Local Encrypted Volumes.
[...]
student@uso:~$ sudo cat /var/log/kill/them/all.log
cat: /var/log/kill/them/all.log: No such file or directory

Observăm că prima comandă, care afișase eroare de permisiune, funcționează acum. În vreme ce a doua comandă, care afișase eroare de sistem de fișiere, nu își schimbă comportamentul: afișează în continuare aceeași eroare.

Exercițiu: Erori de permisiune și erori de alte tipuri

Rulați următoarele comenzi fără sudo. Aceste comenzi vor afișa mesaje de eroare. Fără a folosi sudo, stabiliți care comenzi generează erori de permisiuni (rezolvabile cu sudo) și alte tipuri de erori (nerezolvabile folosind sudo). Apoi rulați folosind sudo pentru a confirma presupunerile.

  • apt install sports-illustrated
  • ip address show ether114
  • kill $(pidof chainsaw)
  • netcat -l -p 700
  • chown student:student /home/student
  • chown student:student /home/search/and/destroy
  • userdel hariseldon

În cazul comenzilor care afișează alte tipuri de erori, presupunând rezolvarea lor, este posibil, în continuare să fie nevoie de sudo. Care dintre comenzile de mai sus intră în această categorie?

Redirectare folosind sudo

Fie o situație în care dorim să scriem informație într-un fișier. Să presupunem că dorim să scriem informația All for the empire în fișierul /home/student/zealot.txt. Avem două opțiuni:

  1. Edităm fișierul folosind nano /home/student/zealot.txt, scriem informația All for the empire* și apoi salvăm.
  2. Folosim comanda echo "All for the empire" > /home/student/zealot.txt.

Ambele opțiuni vor funcționa, utilizatorul curent student (neprivilegiat) având permisiuni de editare / creare.

Dacă alegem un fișier la care utilizatorul curent nu are acces, intuiția ar fi să prefixăm comenzile de mai sus sudo. Adică, în cazul fișierului /etc/zealot.txt, am realiza acțiunile:

  1. Edităm fișierul folosind sudo nano /etc/zealot.txt, scriem informația All for the empire și apoi salvăm.
  2. Folosim comanda sudo echo "All for the empire" > /etc/zealot.txt.

Prima comandă (folosirea editorului) funcționează. A doua comandă însă nu funcționează.

A doua comandă nu funcționează pentru că doar comanda echo rulează în modul privilegiat. Redirectarea (dată de operatorul >) este realizată de proces shell, care aparține utilizatorului neprivilegiat student. Adică se deschide, cu ajutorul redirectării, fișierul /etc/zealot.txt cu permisiunile utilizatorului student; pentru că fișierul este deschis de un utilizator neprivilegiat, acțiunea eșuează.

Sunt două soluții:

  1. Folosirea unui proces shell privilegiat.
  2. Folosirea unei comenzi prefixată de comanda sudo, comandă care să deschidă fișierul /etc/zealot.txt fără redirectare. În felul acesta fișierul va fi deschis în modul privilegiat.

Pentru prima variantă, folosim comenzile:

student@uso:~$ sudo su
root@uso:/home/student# echo "All for the empire" > /etc/zealot.txt

În această situație, a doua comandă este rulată cu permisiunile contului privilegiat (root).

Pentru a doua variantă, putem folosi comanda tee care primește ca argument un fișier în care scrie informație. Prefixarea cu sudo va duce la rularea comenzii tee în mod privilegiat, adică și la deschiderea fișierului /etc/zealot.txt în mod privilegiat. Comanda folosită este:

student@uso:~$ echo "All for the empire" | sudo tee /etc/zealot.txt
All for the empire

Comanda tee are ca efect scrierea informației în fișierul primit ca argument și la ieșirea standard. Din acest motiv mesajul All for the empire apare și în fișierul /etc/zealot.txt și la ieșirea standard.

Comanda tee în modul append

În forma implicită de mai sus, comanda tee suprascrie conținutul fișierului primit ca argument. Dacă dorim să adăugăm conținut în fișier (append), folosim opțiunea -a a comenzii tee:

student@uso:~$ echo "All for the empire" | sudo tee -a /etc/zealot.txt

Shell privilegiat

Adesea dorim realizarea mai multor acțiuni critice, în forma rulării mai multor comenzi. Pentru aceasta, cel mai simplu este să folosim un proces shell care rulează în mod privilegiat.

Așa cum am văzut mai sus, folosim comanda sudo su pentru obținerea unui shell privilegiat:

student@uso:~$ sudo su
root@uso:/home/student#

Promptul ne indică prezența shellului privilegiat:

  • utilizatorul este root, utilizatorul privilegiat
  • promptul se încheie în caracterul # (diez), caracter care denotă, prin convenție, un shell privilegiat

Același efect poate fi obținut prin rularea comenzii sudo su root:

student@uso:~$ sudo su root
root@uso:/home/student#

Fiind mai mult de tastat, preferăm folosirea comenzii sudo su în loc de sudo su root.

Un alt mod de a obține un shell de root este cu ajutorul comenzii sudo bash, cu aceleași efecte ca mai sus:

student@uso:~$ sudo bash
root@uso:/home/student#

Ambele comenzi (sudo su, respectiv sudo bash), duc la rularea unor comenzi în mod privilegiat: comanda su este rulată privilegiat, comanda bash este rulată privilegiat. Efectul este crearea unui proces shell Bash care rulează privilegiat; și, deci, un shell în cadrul căruia putem rula comenzi în mod privilegiat.

Pentru a închide procesul shell care rulează în mod privilegiat folosim comenzile uzuale de închidere a shellului: exit, logout sau combinația de taste Ctrl+d. După încheierea procesului shell privilegiat, vom reveni în procesul shell inițial.

Vom prezenta mai multe despre procese și utilizatori în secțiunea users_perms_processes.

Vom prezenta detalii despre comanda su în secțiunea users_perms_privileged_su.

Exerciții: Shell privilegiat

  1. Folosiți, pe rând, comenzile sudo su și sudo bash pentru a obține un shell privilegiat. Apoi folosiți comanda exit sau comanda logout sau combinația de taste Ctrl+d pentru a închide shellul curent.
  2. Folosiți comanda sudo su pentru a obține un shell privilegiat. În noul shell privilegiat folosiți comanda sudo su pentru a obține un nou shell privilegiat. Folosiți două instanțe de comenzi de închidere a shellului (exit sau logout sau Ctrl+d) pentru a reveni la shellul inițial (neprivilegiat).

Identificarea utilizatorului

Promptul shellului este configurabil și poate să nu ofere informații despre utilizatorul curent. Pentru siguranță, folosim comenzi dedicate pentru identificarea utilizatorului curent.

whoami

Cea mai directă comandă, pentru afișarea numelui utilizatorului curent (username) este comanda whoami:

student@uso:~$ whoami
student
student@uso:~$ sudo whoami
root

Rularea comenzii whoami duce la afișarea utilizatorului curent (student). Prefixarea comenzii cu sudo duce la afișarea numelui utilizatorului privilegiat (root).

id

O comandă care permite afișarea de informații despre utilizatori este comanda id. O utilizare simplă a comenzii afișează informații extinse despre utilizatorul curent:

student@uso:~$ id
uid=1000(student) gid=1000(razvan) groups=1000(student),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare),128(kvm),130(docker)

Pentru utilizatorul curent se afișează:

  • identificatorul utilizatorului (user id, uid), o valoare numerică, aici 1000
  • numele utilizatorului (username), șirul pe care îl folosim, aici student
  • identificatorul grupului utilizatorului (group id, gid) și numele grupului (group name), aici 1000 și student (poate fi considerată o coincidență egalitatea cu identificatorul utilizatorului și numele utilizatorului)
  • alte grupuri din care face parte utilizatorul (groups)

Relevante în acest moment sunt informațiile legate de identificatorul și de numele utilizatorului. Identificatorul utilizatorului (UID) este folosit de sistemul de operare pentru verificarea permisiunilor. Numele utilizatorului este folosit de noi, oamenii, care reținem mai ușor șiruri / nume în loc de numere. Similar se întâmplă și pentru procese: sistemul de operare le identifică după un număr numit PID (process identifier).

Orice utilizator are un identificator (pentru sistemul de operare) și un nume (pentru oameni). De obicei, primul utilizator obișnuit (neprivilegiat) de pe un sistem Linux are identificatorul 1000; este cazul utilizatorului student de mai sus.

Putem folosi comanda id pentru a afișa informații și despre alți utilizatori ai sistemului, de exemplu despre utilizatorul privilegiat (root):

razvan@uso:~$ id root
uid=0(root) gid=0(root) groups=0(root)
 
razvan@uso:~$ id -u root
0
 
razvan@uso:~$ id -un 0
root

În prima comandă rulată am afișat informații despre utilizatorul root. Utilizatorul are UID-ul 0; acesta este modul în care este recunoscut de sistemul de operare. Practic, numele root este o convenție; ceea ce oferă privilegii unui proces este prezența UID-ului 0 ca atribut al procesului.

Putem afișa doar UID-ul unui utilizator prin folosirea opțiunii -u a comenzii id, ca în a doua comandă de mai sus. La fel putem afișa doar numele corespunzător unui UID prin folosirea opțiunii -un, ca în a treia comanda de mai sus.

Exerciții: Identificarea utilizatorilor

  1. Obțineți un shell privilegiat. Folosiți comenzile whoami și id pentru a afișa informații despre utilizatorul curent (root).

    Folosiți comanda id pentru a afișa identificatorul utilizatorului student.

  2. Dintr-un shell de orice fel (privilegiat sau neprivilegiat), afișați:

    • UID-ul utilizatorului daemon.

    • UID-ul utilizatorului syslog.

    • Numele utilizatorului cu UID-ul 100.

    • Numele utilizatorului cu UID-ul 2.

    Acești utilizatori sunt utilizatori de sistem (system users), neinteractivi - adică nu sunt utilizatori cu care ne putem autentifica în sistem.

Schimbarea utilizatorului

Mai sus am folosit comanda sudo su pentru a obține un proces shell privilegiat. Comanda duce, de fapt, la rularea privilegiată a comenzii su.

Comanda su este folosită pentru schimbarea utilizatorului. În forma sa simplă (fără argumente) schimbă utilizatorul în utilizatorul privilegiat (root). Schimbarea unui utilizator va cere parola utilizatorului schimbat. Astfel, în cazul comenzii de mai jos, se va cere parola contului root:

student@uso:~$ su
Password:
su: Authentication failure

Întrucât nu știm parola contului root, am apăsat Enter și a fost afișat mesaj de eroare de autentificare.

Comanda su poate fi folosită pentru a schimba utilizatorul în cel al cărui nume a fost primit ca argument. De exemplu, comanda de mai jos ar avea ca efect schimbarea utilizatorului curent în utilizatorul daemon. Din nou, necunoscând parola, nu vom reuși autentificarea:

student@uso:~$ su daemon
Password:
su: Authentication failure

Atunci când prefixăm comanda su de comanda sudo se rulează su în mod privilegiat și nu mai este necesară parola contului root:

student@uso:~$ sudo su
root@uso:/home/student#

O opțiune frecventă a comenzii su este - (semnul minus sau cratimă). Această opțiune duce la crearea unui mediu de lucru specific unui utilizator care se autentifică (login). Cel mai vizibil efect este schimbarea directorului curent în directorul home al utilizatorului către care dorim schimbarea. De aceea, în comanda de mai jos, noul director este directorul home al utilizatorului privilegiat (root), adică /root/:

razvan@uso:~$ sudo su -
root@uso:~# pwd
/root

sudo, su și parole

Se poate întâmpla ca în cazul folosirii sudo să fie solicitată o parolă. Este vorba de parola utilizatorului curent, cel care rulează comanda sudo. Pentru siguranță, este nevoie de confirmarea parolei utilizatorului pentru a realiza acțiunea presupus critică prefixată de comanda sudo. Solicitarea sau nu a parolei utilizatorului curent la rularea comenzii sudo, ține de configurarea acesteia.

Sumarizând:

  • Rularea comenzii su duce la solicitarea parolei contului de utilizator către care dorim schimbarea.
  • Rularea comenzii sudo (urmată de altă comandă) poate duce (depinde de configurație) la solicitarea parolei contului utilizatorului curent.

Exerciții: Folosirea su

  1. Obțineți un shell privilegiat. În shellul privilegiat, folosiți comanda su pentru a schimba utilizatorul în student. Închideți shellul utilizatorului student. Apoi închideți și shellul privilegiat. Ați revenit la punctul inițial.

  2. Obțineți un shell privilegiat. În shellul privilegiat, folosiți comanda su pentru a schimba utilizatorul în student inclusiv mediul de login: directorul să fie /home/student/. Închideți shellul utilizatorului student. Apoi închideți și shellul privilegiat. Ați revenit la punctul inițial.

  3. Obțineți un shell privilegiat. În shellul privilegiat, folosiți comanda su pentru a schimba utilizatorul în daemon. Primiți eroare.

    Încercați să schimbați utilizatorul în bin. La fel, primiți eroare.

    Aceste erori să întâmplă întrucât utilizatorii daemon și bin sunt utilizatori de sistem (system users) care nu sunt gândiți să fie utilizatori interactivi: adică se ne putem autentifica în sistem ca acei utilizatori și să rulăm procese shell (interactive).

Utilizatori și procese

Acțiunile unui cont de utilizator în cadrul sistemului de operare sunt realizate de procesele deținute de acel utilizator. Un cont de utilizator nu există ca entitate de sine stătătoare, ci este un atribut al unui proces.

Așa cum am indicat și anterior, un cont utilizator este identificat de un număr (UID); numele este folosit doar de oameni pentru identificarea facilă; sistemul de operare este preocupat doar de număr / UID. Un proces aparține unui cont utilizator dacă acel proces are atributul UID corespunzător acelui cont de utilizator. Ceea ce înseamnă că, în momentul creării, un proces primește un UID. Spunem, informal, că acel utilizator deține acel proces.

Un caz particular sunt procesele shell, procese interactive. Spunem, informa, că un utilizator poate rula comenzi sau că are acces în sistem, atunci când există un shell cu UID-ul acelui cont de utilizator. Cel mai adesea, shellul este primul proces care aparține unui utilizator. Apoi shellul creează alte procese aparținând acelui utilizator. Shellul este cel mai adesea creat la autentificarea utilizatorului.

Autentificarea utilizatorilor

Autentificarea unui utilizator (login, authentication) în sistem presupune următoarea secvență de pași:

  1. Furnizarea unor elemente de autentificare (numite și credențiale - login credentials), în mod tipic un nume de utilizator (username) și o parolă (password)
  2. Verificarea credențialelor de sistemul de operare
  3. În cazul verificării cu succes, crearea unui proces cu UID-ul utilizatorului astfel autentific, cel mai adesea un proces shell

Furnizarea credențialelor

Primul pas se realizează într-o interfața de autentificare (grafică sau în linia de comandă). Se furnizează un prompt unde utilizatorul transmite credențialele.

Un mod de a simula acest prompt în linia de comandă este cu ajutorul comenzii login, comandă care este apelată în momentul autentificării CLI:

student@uso:~$ sudo login
uso login: student
Password: 
student@uso:~$

Avem creat astfel, un nou proces shell. E o abordare strict didactică, având acum un shell creat dintr-un shell existent, pentru același utilizator.

Comanda login poate fi folosită și transmițând ca argument numele de utilizator:

student@uso:~$ sudo login student
Password:
student@uso:~$

Pentru a închide shellul nou creat folosim comanda exit sau comanda logout sau combinația de taste Ctrld+d.

Este nevoie de folosirea sudo în fața comenzii login pentru că această comandă este privilegiată: are acces la baza de date autentificare, folosită în pasul de verificare a credențialelor.

Verificarea credențialelor

Verificarea credențialelor este realizată de interfața de autentificare, în general printr-un proces de autentificare, precum login. Acest proces citește credențialele și apoi le validează cu o bază de date de autentificare (authentication database) disponibilă în sistem. Această baza de date de autentificare este o resursă critică a sistemului; accesul la această bază de date, chiar și de citire, este considerat o acțiune critică ce poate fi realizată doar privilegiat. De aceea, comanda login trebuie rulată în mod privilegiat și trebuie prefixată de sudo.

Baza de date de autentificare este o resursă critică pentru că reține credențialele tuturor utilizatorilor disponibili în sistem. Faza de verificare presupune compararea credențialelor furnizate cu cele din baza de date de autentificare. Dacă aceasta nu s-ar realiza privilegiat, orice utilizator ar putea avea acces la credențialele celorlalți utilizatori (posibil inclusiv root); ceea ce ar fi o problemă de securitate în sistem.

În Linux, baza de date de autentificare este în mod tipic fișierul /etc/shadow:

razvan@uso:~$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1334 Jul  2  2020 /etc/shadow

Observăm că acest fișier poate fi accesat doar de utilizatorul root și de grupul shadow. Vom discuta despre permisiuni de acces și grupuri în secțiunile următoare.

Conturi de utilizator fără parolă

Anumite conturi de utilizator pot să nu aibă parolă. Ceea ce înseamnă că acele conturi nu pot fi accesate în acest mod: autentificare cu parolă. Pot fi însă autentificate în alte moduri, cum ar fi schimbarea utilizatorului.

Crearea unui proces

Ulterior autentificării, se creează un prim proces care are UID-ul utilizatorului autentificat. Acest prim proces este configurabil, cel mai adesea este shellul (grafic sau CLI - depinzând de modul de autentificare).

În cazul autentificării în linia de comandă, procesul creat este descris în fișierul /etc/passwd:

student@uso:~$ grep student /etc/passwd
student:x:1000:1000:Student User,,,:/home/student:/bin/bash

Acest fișier conține informații despre un utilizator: numele de utilizator, UID-ul său, directorul home și primul proces pornit în cazul autentificării (adesea shellul). În cazul utilizatorul student, conform așteptărilor, primul proces este creat din executabilul /bin/bash, corespunzător shellului Bash.

După autentificare există un proces în sistem care aparține unui cont de utilizator. Dacă acest proces este shellul, spunem adesea că, un utilizator are acces în sistem.

Anumite conturi de utilizator (daemon, bin etc.) au configurat în fișierul /etc/passwd ca executabil pentru pornirea primului proces /bin/false sau /usr/sbin/nologin. Acest lucru înseamnă că aceste conturi de utilizator nu pot fi accesate prin autentificare. Ci doar prin crearea, în moduri specifice, a unor procese cu UID-ul acelor utilizatori. Nu intrăm în detalii aici despre aceste moduri.

Vizualizarea și gestiunea informațiilor despre utilizatori

În Linux, fișierul /etc/passwd reține informațiile despre conturile de utilizatori. Fișierul /etc/shadow reține credențialele (parolele) despre conturile de utilizatori.

Fișierul /etc/passwd nu este critic și poate fi citit de oricine. Fișierul /etc/shadow este critic și poate fi citit doar de utilizatorul privilegiat. În continuare, fișierul /etc/passwd poate fi modificat doar de utilizatorul privilegiat: acțiunea de citire este necritică, dar cea de scriere este critică.

În mod obișnuit, principiile de securitate într-un sistem de operare, relativ la accesarea informațiilor despre conturile de utilizatori, sunt:

  • Un utilizator neprivilegiat (obișnuit) poate să vizualizeze informațiile proprii, mai puțin parola.
  • Un utilizator neprivilegiat (obișnuit) poate să modifice informațiile proprii, inclusiv parola.
  • Un utilizator neprivilegiat (obișnuit) poate să vizualizeze informațiile altor utilizatori, mai puțin parola.
  • Un utilizator neprivilegiat (obișnuit) NU poate să modifice informațiile altor utilizatori.
  • Un utilizator (de orice tip) NU poate vizualiza parolele plain-text ale utilizatorilor. Parolele sunt ținute criptat.
  • Un utilizator privilegiat poate să modifice orice informație a altor utilizatori, inclusiv parola.

Vizualizare

Așa cum am precizat anterior, un utilizator poate folosi comenzile whoami și id pentru a afișa informații despre sine sau alți utilizatori. Un alt mod este de a parcurge direct conținutul fișierului /etc/passwd, fișier care este consultat și de aceste comenzi. Un mod mai simplu este folosirea comenzii finger care afișează informații detaliate:

student@uso:~$ finger student
Login: student                  Name: Student User
Directory: /home/student                Shell: /bin/bash

Gestiune

Un utilizator își poate modifica 3 informații:

  • Shellul de login, folosind comanda chsh
  • Informațiile legate de nume, folosind comanda chfn
  • Parola, folosind comanda passwd

Nu insistăm pe primele două, doar pe modificarea parolei. Un utilizator își poate schimba parola prin simpla invocare a comenzii passwd:

student@uso:~$ passwd
Changing password for student.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Acum utilizator are o nouă parolă.

Evident, utilizatorul privilegiat poate schimba parolele tuturor utilizatorilor.

Exerciții: Gestiunea utilizatorului curent

  1. Din contul utilizatorului curent (student), folosiți comanda passwd pentru a schimba parola utilizatorului. GRIJĂ MARE să nu uitați parola schimbată. Folosiți într-un nou shell comanda sudo login student pentru a testa noua parolă.
  2. Dintr-un shell de root folosiți comanda passwd student pentru a schimba parola utilizatorului student GRIJĂ MARE să nu uitați parola schimbată. Folosiți într-un nou shell comanda sudo login student pentru a testa noua parolă.

Vizualizarea proceselor

Putem vizualiza evoluția proceselor (privilegiate, neprivilegiate) folosind comanda ps pentru a înțelege funcționarea comenzilor și apartenența acestora la un anumit utilizator.

Comanda simplă ps afișează procesele din terminalul curent, în vreme ce comanda ps -f afișează inclusiv numele de utilizator:

student@uso:~$ ps
  PID TTY          TIME CMD
18900 pts/2    00:00:00 ps
28892 pts/2    00:00:00 bash
student@uso:~$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
student   18907 28892  0 22:38 pts/2    00:00:00 ps -f
student   28892 20845  0 14:02 pts/2    00:00:00 /bin/bash

Se afișează procesul shell (bash) și procesul ps însuși, ambele aparținând utilizatorului student.

Putem personaliza afișarea pentru a prezenta și UID-ul:

student@uso:~$ ps -o uid,user,pid,ppid,cmd
  UID USER       PID  PPID CMD
 1000 student   19083 28892 ps -o uid,user,pid,ppid,cmd
 1000 student   28892 20845 /bin/bash

Folosirea comenzii ps ajută la înțelegerea comenzilor sudo sau su.

Atunci când creăm un shell privilegiat folosind sudo bash, avem următoarea situație:

student@uso:~$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
student   19153 28892  0 22:46 pts/2    00:00:00 ps -f
student   28892 20845  0 14:02 pts/2    00:00:00 /bin/bash
 
student@uso:~$ sudo bash
 
root@uso:~# ps -H
  PID TTY          TIME CMD
19154 pts/2    00:00:00 sudo
19155 pts/2    00:00:00   bash
19163 pts/2    00:00:00     ps
 
root@uso:~# ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
root     19154 28892  0 22:46 pts/2    00:00:00 sudo bash
root     19155 19154  0 22:46 pts/2    00:00:00 bash
root     19173 19155  0 22:46 pts/2    00:00:00 ps -f
 
root@uso:~# pstree -Aup 28892
bash(28892,student)---sudo(19154,root)---bash(19155)---pstree(19198)
 
root@uso:~# exit
exit
 
student@uso:~$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
student   19205 28892  0 22:47 pts/2    00:00:00 ps -f
student   28892 20845  0 14:02 pts/2    00:00:00 /bin/bash

Observăm că există un proces sudo și un proces bash care aparțin utilizatorului root. Aceste procese sunt create în urma comenzii sudo bash. Procesul părinte (PPID) pentru procesul sudo este 28892 adică shellul inițial al utilizatorului student, cel care a rulat comanda sudo bash. Practic dintr-un shell al utilizatorului student, folosind sudo se generează un shell al utilizatorului root. Comanda pstree afișează ierarhia de procese și schimbările de conturi de utilizator.

O situație similară avem în cazul sudo su:

student@uso:~$ sudo su
 
root@uso:/home/student# ps -H
  PID TTY          TIME CMD
19432 pts/2    00:00:00 sudo
19433 pts/2    00:00:00   su
19434 pts/2    00:00:00     bash
19445 pts/2    00:00:00       ps
 
root@uso:/home/student# ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
root     19432 28892  0 22:54 pts/2    00:00:00 sudo su
root     19433 19432  0 22:54 pts/2    00:00:00 su
root     19434 19433  0 22:54 pts/2    00:00:00 bash
root     19455 19434  0 22:54 pts/2    00:00:00 ps -f
 
root@uso:/home/student# pstree -Aup 28892
bash(28892,student)---sudo(19432,root)---su(19433)---bash(19434)---pstree(19460)
 
root@uso:/home/student# exit
 
student@uso:~$

Exerciții: Vizualizarea proceselor

Realizați un scenariu în care accesați contul root apoi contul student și apoi iar contul de root. Afișați procesele create la fiecare pas. Folosiți comanda pstree ca să afișați arborescența de procese astfel create.

Apoi închideți procesele astfel create (folosind exit, logout sau Ctrl+d). Afișați, la fiecare pas, ierarhia de procese.

Permisiuni de acces

Atât utilizatorii cât și grupurile de utilizatori sunt folosiți în Linux pentru controlul accesului. Controlul accesului presupune restricționarea operațiilor pe care utilizatorii le pot executa asupra resurselor sistemului (crearea de fișiere și directoare, modificarea și ștergerea acestora, execuția de programe, etc.).

Astfel, niciun utilizator nu poate să modifice/folosească un fișier dacă el, grupul din care face parte sau grupul others nu au acest drept (vom detalia imediat).

În Linux, exista două concepte ce sunt folosite pentru a oferi securitate la nivelul sistemului de fișiere:

  • file ownership
  • permisiuni

Fiecare fișier este deținut de un singur utilizator și de un singur grup, și are anumite permisiuni. Fiecare utilizator sau grup poate să dețină mai multe fișiere.

Fiecare resursă din sistemul de fișiere are permisiuni pentru trei categorii de utilizatori:

  • utilizator (owner): utilizatorul care este deținătorul fișierului/directorului
  • grup (group): grupul de utilizatori care deține fișierul/directorul
  • ceilalți (others): utilizatorii care nu intră în niciuna dintre categoriile anterioare

Pentru fiecare dintre cele trei categorii există trei permisiuni, care oferă următoarele drepturi:

  • de citire: utilizatorul/grupul poate citi conținutul fișierului, respectiv poate lista conținutul directorului
  • de scriere: utilizatorul/grupul poate modifica/șterge conținutul fișierului, respectiv poate crea/șterge/redenumi fișiere din director
  • de execuție: utilizatorul/grupul poate lansa fișierul în execuție, respectiv poate parcurge directorul

Ordinea în care se aplică aceste permisiuni este următoarea:

  1. dacă utilizatorul este deținătorul fișierului, atunci se aplică permisiunile pentru owner
  2. dacă face parte din grupul deținător, atunci se aplică permisiunile pentru grup
  3. dacă niciuna dintre condițiile precedente nu este adevărată, atunci se aplică permisiunile pentru others

Ownership și permisiuni

Pentru a inspecta permisiunile și deținătorii unui anumit director sau fișier folosim comanda ls, împreună cu argumentul -l.

student@uso:~$ ls -l /home/student
total 56
drwxr-xr-x  2 student student 4096 aug  6 17:41 Desktop
drwxr-xr-x  3 student student 4096 aug 20 21:00 Documents
drwxr-xr-x  2 student student 4096 aug  6 17:41 Downloads
drwxr-xr-x  2 student student 4096 aug  6 17:41 Music
drwxr-xr-x  2 student student 4096 aug  6 17:41 Pictures
drwxr-xr-x  2 student student 4096 aug  6 17:41 Public
drwxr-xr-x  2 student student 4096 aug  6 17:41 Templates
drwxr-xr-x  2 student student 4096 aug  6 17:41 Videos
-rw-r--r--  1 student student 8980 aug  6 17:37 examples.desktop
drwxr-xr-x 14 student student 4096 aug 20 20:57 uso.git
-rw-r--r--  1 student student 4827 aug 21 14:37 vm-actions-log.txt

Dacă rulăm comanda pe un director, implicit se vor lista fișierele din director și nu vom vedea permisiunile acestuia. Pentru a vedea permisiunile directorului, putem folosi argumentul -d pentru comanda ls, împreună cu calea către director.

student@uso:~$ ls -ld uso-lab/
drwxr-xr-x 14 student student 4096 aug 20 20:57 uso-lab/

Semnificația fiecărui câmp din outuput-ul anterior este prezentată în tabelul de mai jos, folosind ca exemplu informațiile afișate pentru directorul Desktop.

Tip Permisiuni Număr de referințe Owner Grup Dimensiunea în octeți Data și ora ultimei modificări Nume
d rwxr-xr-x 2 student student 4096 aug 6 17:41 Desktop

Coloanele din tabel au următoarea semnificație:

  • Tip: indică dacă intrarea este un fișier (-) sau director (d)
  • Permisiuni: specifică ce drepturi au asupra fișierului cele trei categorii de utilizatori (owner, grup și others). Fiecărui grup îi corespund 3 caractere (r – read; w – write, x – execute). În acest caz, owner-ul fișierului (utilizatorul student) are toate cele trei permisiuni (rwx), iar utilizatorii din grupul ce deține fișierul (grupul student) și toți ceilalți utilizatori din sistem (others) au permisiuni de citire și execuție (r-x).
  • Owner/Grup - utilizatorul/grupul care dețin fișierul

Permisiunile se pot specifica și folosind cifre (notație în baza 8 – octal):

  • r = 4
  • w = 2
  • x = 1

Pentru a determina permisiunile unei anumite categorii, adunăm cele 3 valori. Astfel, pentru exemplul de mai sus, permisiunile sunt 755 (7 pentru owner, 5 pentru grup și 5 pentru others).

Modificarea permisiunilor

La crearea unui fișier sau director se atribuie valori implicite pentru permisiuni. Acestea se pot modifica ulterior.

Pentru a demonstra modul de lucru cu permisiunile, vom crea un fișier nou, după care îi vom modifica permisiunile. Permisiunile noi se pot specifica folosind comanda chmod, folosind oricare din cele doua notații:

  1. În octal: 777 (drepturi depline: rwx), 740 (drepturi depline pentru owner, de citire pentru utilizatorii din grup și nicio permisiune pentru alți utilizatori).
  2. Alfabetică: +/-[rwx] – o folosim de obicei atunci când dorim să modificăm o singură permisiune. De exemplu, +r permite accesul de citire, iar -w șterge accesul de scriere.
student@uso:~$ touch testfile.sh
student@uso:~$ ls -l testfile.sh 
-rw-r--r-- 1 student student 0 sep 16 16:47 testfile.sh

După cum observăm, nu vom putea executa scriptul nou creat, deoarece utilizatorul student nu are drepturi de execuție asupra lui. Ne propunem să permitem execuția, folosind ambele metode.

#1

student@uso:~$ chmod +x testfile.sh
student@uso:~$ ls -l testfile.sh
-rwxr-xr-x 1 student student 0 sep 16 16:47 testfile.sh
 
student@uso:~$ chmod -x testfile.sh
student@uso:~$ ls -l testfile.sh
-rw-r--r-- 1 student student 0 sep 16 16:47 testfile.sh

#2

student@uso:~$ ls -l testfile.sh
-rw-r--r-- 1 student student 0 sep 16 16:47 testfile.sh
student@uso:~$ chmod 755 testfile.sh
student@uso:~$ ls -l testfile.sh
-rwxr-xr-x 1 student student 0 sep 16 16:47 testfile.sh

Exercițiu: Adăugați utilizatorul andrei folosind comanda sudo adduser andrei. Folosiți o parolă la alegere și țineți-o minte.

Exercițiu: Adăugați utilizatorul maria în sistem folosind comanda sudo adduser maria. Folosiți o parolă la alegere și țineți-o minte. Autentificați-vă ca maria folosind su sau login.

Exercițiu: Din contul utilizatorului maria, creați fișierul /home/maria/todo_list și scrieți în el Maria's TODO list.

Exercițiu: Configurați permisiunile acestui fișier astfel încât doar utilizatorul maria să aibă drepturi de citire, scriere și execuție pe el. Verificați că ați configurat permisiunile corect, folosind contul utilizatorului andrei.

Exercițiu: Modificați configurările făcute anterior astfel încât toți utilizatorii din grupul maria să poată vizualiza conținutul fișierului /home/maria/todo_list. În continuare, utilizatorii al căror nume nu este maria și care nu se află în grupul maria nu trebuie să aibă niciun drept pe acest fișier.

Exercițiu: Verificați configurarea făcută la exercițiul anterior. Pentru aceasta, adăugați utilizatorul student în grupul maria folosind comanda sudo adduser student maria, autentificați-vă ca utilizatorul student și încercați să vizualizați conținutul fișierului. Autentificați-vă apoi și ca utilizatorul andrei și încercați să vizualizați conținutul fișierului. andrei nu ar trebui să aibă drept să citească fișierul /home/maria/todo_list.

Cuprins

uso/laboratoare/ac/laborator-09.txt · Last modified: 2021/12/10 15:19 by liza_elena.babu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0