Capabilitățile permit evaluarea unor privilegii importante de sistem într-un fir separat diferit de procesul curent. În acest fel, nu este nevoie să rulați un program ca root pentru ca acesta să acceseze anumite părți ale sistemului.
Ca o soluție care decurge din nevoi, secțiunea 25 din POSIX.1e se referă la această problemă. Dezvoltarea privilegiilor definite în acea secțiune și altele a fost finalizată cu lansarea versiunii 2.6.26 a nucleului Linux. Iată tot ce trebuie să știți despre capabilitățile din nucleul Linux.
Înțelegerea logicii API a capabilităților
Controlul autorizării în sistemele bazate pe Unix constă în doi pași:
- Dacă proprietarul actual (ID de utilizator efectiv, EUID) al aplicației care rulează este zero, atunci sistemul nu verifică autorizarea
- Dacă valoarea EUID este diferită de zero, sistemul efectuează procesul de control în conformitate cu autorizațiile utilizatorului efectiv și grupului aplicației relevante.
Unele aplicații trebuie să aibă privilegii mai largi (SUID, biți SGIT) în timpul rulării. Ca exemplu cel mai tipic, vă puteți gândi
aplicația passwd. Cu aceasta, utilizatorii dintr-un sistem își pot schimba parolele. Cu toate acestea, pentru a scrie la /etc/shadow fișier, unde parolele criptate sunt păstrate, este necesar să se lucreze cu drepturi de utilizator root (adică, ID utilizator = 0).Pentru a rezolva această problemă, aplicația passwd are un bit SUID. Indiferent de utilizator care rulează această aplicație, proprietarul activ (EUID) va fi întotdeauna root:
ls -l /usr/bin/passwd
# Ieșire
-rwsr-xr-x. 1 rădăcină rădăcină 32552 23 iulie 2021 /usr/bin/passwd
Abilitatea de a rula aplicații SUID în modelul tradițional de autentificare Unix pare să fi rezolvat problema. Cu toate acestea, erorile critice din aplicațiile cu biți SUID deschid ușa pentru a rula coduri nedorite pentru utilizatorii cu autoritate deplină în sistem. O aplicație ideală ar trebui să poată rula fără a avea nevoie de drepturi de utilizator root, dacă este posibil.
Problema nu se termină doar cu bitul SUID. De asemenea, trebuie să aveți drepturi de utilizator root atunci când doriți să ascultați pe a port TCP sau UDP privilegiat mai puțin de 1024 pe sisteme bazate pe Unix. De exemplu, pentru a putea asculta portul TCP 80 al unui server web, trebuie să rulați aplicația ca utilizator root.
De-a lungul anilor, s-a înțeles cât de devastator este să rulezi software care oferă servicii mediului de rețea cu un cont de utilizator complet autorizat. Ca soluție provizorie, s-a adoptat ca doar o anumită parte și mai mică a programului să asculte pe portul privilegiat ca root, și apoi schimbă ID-ul utilizatorului activ cu un alt utilizator pentru procesele ulterioare (de exemplu, utilizatorul nimeni cu drepturi restricționate).
Acest sistem, care a fost folosit de ani de zile, a funcționat bine cu simplitatea sa și este încă folosit eficient. Cu toate acestea, în zilele noastre, este posibil să obțineți câteva capabilități suplimentare, specifice aplicației, prin API-ul de capabilități Linux, fără a fi nevoie de drepturi de root, în afară de cele menționate mai sus sistem.
Modelul de capacitate Linux, explicat!
Puteți găsi cea mai cuprinzătoare implementare a API-ului de capabilități în kernel-ul Linux. Distribuțiile moderne Linux încearcă, de asemenea, să folosească acest nou model la nivel de sistem cât mai mult posibil.
De exemplu, pentru ca aplicația ping să funcționeze, trebuie să poată deschide socket-uri RAW, care sunt în general rezervate doar utilizatorilor root. În vechile distribuții Linux, problema este să dai bitul SUID aplicației, astfel încât utilizatorii normali să o poată folosi. În aceste versiuni, când eliminați bitul SUID din aplicație și încercați să rulați aplicația ca utilizator normal, primiți următoarea eroare:
ping 8.8.8.8
# Ieșire
ping: icmp open socket: Operațiunea nu este permisă
În timp ce în distribuțiile moderne Linux, aplicația ping probabil nu are bitul SUID:
ls -l /bin/ping
# Ieșire
-rwxr-xr-x. 1 root root 95232 Jul 25 2021 /bin/ping
Cu toate acestea, puteți rula aplicația cu succes ca utilizator normal. Mecanismul care face acest lucru posibil este că aplicația ping are capacitatea specială CAP_NET_RAW.
Puteți afla capabilitățile suplimentare ale aplicației cu ajutorul getcap comandă după cum urmează:
sudo getcap /bin/ping
# Ieșire
/bin/ping cap_net_raw=ep
Dacă comanda getcap returnează un răspuns gol, puteți seta manual această valoare cu:
sudo setcap cap_net_raw+ep /bin/ping
Modelul capacităţii de proces
În implementarea Linux, capacitățile fiecărui proces sunt grupate sub trei titluri:
Capacitate | Afirmație |
permis | În acest cluster, există o listă de capabilități suplimentare permise pentru procesul relevant. Acordarea permisiunii nu înseamnă că aceasta poate fi utilizată activ în acel moment. Este posibil să includeți aici autorizațiile în setul de capabilități efective cu o acțiune suplimentară. |
efectiv | Afișează lista de capabilități activă în prezent a procesului asociat. Cu funcțiile auxiliare care reglează sistemul de abilități, este posibil să renunți sau să recâștigi o abilitate. În orice caz, însă, acest lucru se poate face numai în rândul celor deja autorizați în grupul permis. |
moştenire | Când o aplicație începe un nou proces, procesul nou început afișează lista de capabilități pe care le va moșteni din lista permisă. |
Lista de capabilități permise, eficiente și moștenite pentru rularea proceselor în orice moment este afișată ca mască de biți pe linii CapPrm, CapEff, și CapInh în dosar /proc/
De exemplu, încercați să citiți valorile aplicației shell care rulează din fișierul /proc/self/status fişier:
pisica /proc/de sine/status | grep Cap
# Ieșire
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 000001ffffffffff
CapAmb: 0000000000000000
Modelul de capacitate de fișiere în Linux
Funcționarea sistemului de capabilități pentru fișiere depinde de condiția ca aceste proprietăți să poată fi stocate în stratul de sistem de fișiere virtual (VFS). Similar cu modelul de proces, capabilitățile pentru fișiere se încadrează în trei titluri:
1. Permis
Sistemul determină capabilitățile permise ale procesului atunci când executabilul corespunzător rulează în acest cluster.
2. Efectiv
Spre deosebire de modelul de capacitate de proces, acest antet stochează doar un bit: activ sau inactiv. Dacă bitul este activ, capabilitățile definite în lista permisă a fișierului sunt automat transferat la lista de capabilități efective a procesului relevant atunci când acest fișier este rulat și un proces este creată. Dacă bitul nu este activ, transferul automat al capabilităților permise pe fișier în procesul de rulare nu este efectuat.
Cu toate acestea, dacă codul aplicației relevante este integrat cu sistemul de capabilități, acesta poate activa permisiunile în setul permis al fișierului cu apeluri de sistem. Scopul principal al acestui comportament este de a se asigura că aplicațiile vechi care nu includ capabilități specifice sistemului cod, dezvoltarea la nivel de cod software poate funcționa cu sistemul de capabilități fără a fi nevoie de niciun cod sursă schimbări.
S-ar putea să credeți că aplicațiile mai bine scrise vor folosi capacități numai atunci când este necesar. Dacă bitul este activ, toate capabilitățile din lista permise devin active atunci când pornește aplicația.
3. Moștenire
Ca și în modelul de proces, fișierul relevant rulează și are loc un proces. Dacă o altă aplicație rulează din cadrul procesului după aceea, aceasta este inclusă în lista permisă a noului proces. Pentru a rezuma, indică o listă de capabilități de moștenit.
Rolul capabilităților într-un sistem Linux
Când rulați un anumit proces ca utilizator normal, nu aveți niciun privilegiu. Drept urmare, puteți accesa doar partițiile pe care sistemul le permite utilizatorilor normali. Motivul principal din spatele acestui lucru este întărirea securității sistemului și implementarea unor astfel de măsuri.
Permiterea tuturor utilizatorilor să acceseze toate resursele poate crea o vulnerabilitate gravă de securitate. Va fi foarte ușor pentru persoanele care folosesc sistemul în scopuri rău intenționate să exploateze vulnerabilitățile sistemului. Capacitățile Linux sunt utile în astfel de chestiuni. Puteți consolida cu ușurință securitatea aplicațiilor dvs. cu capabilități API alimentate de kernel.
Capacitățile Linux sunt doar una dintre problemele care trebuie gândite pentru a face metode foarte puternice, cum ar fi împărțirea utilizatorului root. permisiuni, alocarea diferitelor permisiuni utilizatorilor neprivilegiati și luarea diferitelor măsuri de precauție cu privire la porturile deschise în serviciile de internet cu servere Linux.
Îmbunătățiți-vă securitatea serverului Linux cu acești 7 pași de consolidare
Citiți în continuare
Subiecte asemănătoare
- Linux
- Programare
- Kernel Linux
- Sistem de operare
Despre autor
Un inginer și dezvoltator de software care este un fan al matematicii și al tehnologiei. Întotdeauna i-au plăcut computerele, matematica și fizica. El a dezvoltat proiecte de motoare de jocuri, precum și învățare automată, rețele neuronale artificiale și biblioteci de algebră liniară. În plus, continuă să lucreze la învățarea automată și la matrice liniare.
Aboneaza-te la newsletter-ul nostru
Alăturați-vă buletinului nostru informativ pentru sfaturi tehnice, recenzii, cărți electronice gratuite și oferte exclusive!
Click aici pentru a te abona