În acest laborator discutăm despre rolul utilizatorilor în sistemul de operare, utilizatorul privilegiat și permisiuni de access.
Î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.
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.
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
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.
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?
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:
nano /home/student/zealot.txt
, scriem informația All for the empire* și apoi salvăm.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:
sudo nano /etc/zealot.txt
, scriem informația All for the empire și apoi salvăm.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:
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
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:
root
, utilizatorul privilegiat#
(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 Utilizatori și procese.
Vom prezenta detalii despre comanda su
în secțiunea Schimbarea utilizatorului.
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.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).Promptul shellului este configurabil și poate să nu ofere informații despre utilizatorul curent. Pentru siguranță, folosim comenzi dedicate pentru identificarea utilizatorului curent.
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
).
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ă:
uid
), o valoare numerică, aici 1000
student
gid
) și numele grupului (group name), aici 1000
și student
(poate fi considerată o coincidență egalitatea cu identificatorul utilizatorului și numele utilizatorului)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.
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
.
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.
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
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:
su
duce la solicitarea parolei contului de utilizator către care dorim schimbarea.sudo
(urmată de altă comandă) poate duce (depinde de configurație) la solicitarea parolei contului utilizatorului curent.
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.
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.
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).
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 de 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 de 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, informal, 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 unui utilizator (login, authentication) în sistem presupune următoarea secvență de pași:
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 de autentificare, folosită în pasul de verificare a 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.
Anumite conturi de utilizator pot să nu aibă parolă, ceea ce înseamnă că acele conturi pot fi accesate prin simpla utilizare a comenzii su <username>
, fără a vă fi solicitată o parolă ulterior.
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 să fie /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.
Î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:
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
Un utilizator își poate modifica 3 informații:
chsh
chfn
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 password: New password: Retype new password: passwd: password updated successfully
Acum utilizatorul are o nouă parolă.
Evident, utilizatorul privilegiat poate schimba parolele tuturor utilizatorilor.
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ă.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ă.
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:~$
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.
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:
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:
Pentru fiecare dintre cele trei categorii există trei permisiuni, care oferă următoarele drepturi:
Ordinea în care se aplică aceste permisiuni este următoarea:
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:
-
) sau director (d
)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
).Permisiunile se pot specifica și folosind cifre (notație în baza 8 – octal):
r
= 4w
= 2x
= 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).
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:
+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
.
sudo adduser student maria
are efectul dorit doar dupa ce utilizatorul student se va loga din nou. Pentru a face acest lucru puteți executa comanda sudo login student
.