Cap. 4. Autentificare și controale de acces

Cuprins

4.1. Autentificare normală Unix
4.2. Gestionarea informațiilor privind contul și parola
4.3. Parolă bună
4.4. Crearea unei parole criptate
4.5. PAM și NSS
4.5.1. Fișierele de configurare accesate de PAM și NSS
4.5.2. Sistemul modern de gestionare centralizată
4.5.3. „De ce comanda «su» a GNU nu acceptă grupul wheel”
4.5.4. Reguli mai stricte privind parolele
4.6. Securitatea autentificării
4.6.1. Parolă sigură în Internet
4.6.2. Shell securizat
4.6.3. Măsuri suplimentare de securitate pentru Internet
4.6.4. Securizarea parolei root
4.7. Alte controale de acces
4.7.1. Liste de control al accesului (ACL)
4.7.2. sudo
4.7.3. PolicyKit
4.7.4. Restricționarea accesului la anumite servicii ale serverului
4.7.5. Caracteristici de securitate Linux

Când o persoană (sau un program) solicită acces la sistem, autentificarea confirmă identitatea ca fiind una de încredere.

[Avertisment] Avertisment

Erorile de configurare ale PAM vă pot bloca accesul la propriul sistem. Trebuie să aveți la îndemână un CD de recuperare sau să configurați o partiție de pornire alternativă. Pentru a recupera sistemul, porniți-l cu ajutorul acestora și remediați problemele de acolo.

Autentificarea normală Unix este asigurată de modulul pam_unix(8) din cadrul PAM (Pluggable Authentication Modules). Cele trei fișiere de configurare importante, cu intrări separate prin „:”, sunt următoarele.


/etc/passwd” conține următoarele.

 ...
user1:x:1000:1000:User1 Name,,,:/home/user1:/bin/bash
user2:x:1001:1001:User2 Name,,,:/home/user2:/bin/bash
 ...

Așa cum se explică în passwd(5), fiecare intrare separată prin „:” din acest fișier înseamnă următoarele.

  • Nume de autentificare

  • Intrarea specificării parolei

  • ID-ul numeric al utilizatorului

  • ID-ul numeric al grupului

  • Nume utilizator sau câmp comentariu

  • Directorul personal al utilizatorului

  • Interpret opțional de comenzi pentru utilizator

A doua intrare din „/etc/passwd” a fost utilizată pentru introducerea parolei criptate. După introducerea „/etc/shadow”, această intrare este utilizată pentru introducerea specificațiilor parolei.


Fișierul „/etc/shadow” conține următoarele câmpuri.

 ...
user1:$1$Xop0FYH9$IfxyQwBe9b8tiyIkt2P4F/:13262:0:99999:7:::
user2:$1$vXGZLVbS$ElyErNf/agUDsm1DehJMS/:13261:0:99999:7:::
 ...

După cum se explică în shadow(5), fiecare intrare separată prin „:” din acest fișier înseamnă următoarele.

  • Nume de autentificare

  • Parolă criptată (inițialele „$1$” indică utilizarea criptării MD5. Simbolul „*” indică faptul că nu există date de conectare.)

  • Data ultimei modificări a parolei, exprimată ca număr de zile de la 1 ianuarie 1970

  • Numărul de zile pe care utilizatorul va trebui să le aștepte înainte de a i se permite să își schimbe din nou parola

  • Numărul de zile după care utilizatorul va trebui să își schimbe parola

  • Numărul de zile înainte de expirarea parolei în care utilizatorul trebuie avertizat

  • Numărul de zile după expirarea parolei în care parola ar trebui să fie încă acceptată

  • Data expirării contului, exprimată ca număr de zile de la 1 ianuarie 1970

Fișierul „/etc/group” conține următoarele câmpuri.

group1:x:20:user1,user2

După cum se explică în group(5), fiecare intrare separată prin „:” din acest fișier are următoarea semnificație.

  • Numele grupului

  • Parolă criptată (nu este utilizată efectiv)

  • ID-ul numeric al grupului

  • Listă separată prin virgule a numelor de utilizatori

[Notă] Notă

/etc/gshadow” oferă o funcție similară cu „/etc/shadow” pentru „/etc/group”, dar nu este utilizat în mod real.

[Notă] Notă

Apartenența efectivă a unui utilizator la un grup poate fi adăugată dinamic dacă se adaugă linia „auth optional pam_group.so” în „/etc/pam.d/common-auth” și se definește în „/etc/security/group.conf”. Consultați pam_group(8).

[Notă] Notă

Pachetul base-passwd conține o listă oficială a utilizatorilor și grupurilor: „/usr/share/doc/base-passwd/users-and-groups.html”.

Iată câteva comenzi importante pentru gestionarea informațiilor contului.


Este posibil să aveți nevoie de privilegii de root pentru ca unele funcții să funcționeze. Consultați crypt(3) pentru criptarea parolelor și a datelor.

[Notă] Notă

În sistemul configurat cu PAM și NSS ca mașină Debian salsa, conținutul local „/etc/passwd”, „/etc/group” și „/etc/shadow” poate să nu fie utilizat în mod activ de sistem. Comenzile de mai sus sunt valabile chiar și în astfel de medii.

Când creați un cont în timpul instalării sistemului sau cu comanda passwd(1), ar trebui să alegeți o parolă bună care să conțină cel puțin 6-8 caractere, inclusiv unul sau mai multe caractere din fiecare dintre următoarele seturi, conform passwd(1).

  • literele alfabetului în minusculă

  • cifrele de la 0 la 9

  • Semne de punctuație

[Avertisment] Avertisment

Nu alegeți cuvinte ușor de ghicit pentru parolă. Numele contului, numărul de asigurare socială, numărul de telefon, adresa, data nașterii, numele membrilor familiei sau al animalelor de companie, cuvinte din dicționar, secvențe simple de caractere precum „12345” sau „qwerty” etc. sunt toate alegeri nepotrivite pentru parolă.

Există instrumente independente pentru a genera parole criptate cu „salt” (sare).


Sistemele moderne similare cu Unix precum sistemul Debian oferă PAM (Pluggable Authentication Modules -- Module de autentificare conectabile) și NSS (Name Service Switch -- Comutare servicii de nume) administratorului de sistem local pentru configurarea sistemului său. Rolul acestora poate fi rezumat după cum urmează.

  • PAM oferă un mecanism flexibil de autentificare utilizat de software-ul aplicației, implicând astfel schimbul de date privind parolele.

  • NSS oferă un mecanism flexibil de servicii de nume, care este frecvent utilizat de biblioteca standard C pentru a obține numele utilizatorului și al grupului pentru programe precum ls(1) și id(1).

Aceste sisteme PAM și NSS trebuie configurate în mod coerent.

Pachetele principale ale sistemelor PAM și NSS sunt următoarele.


  • „The Linux-PAM System Administrators' Guide -- Ghidul administratorilor de sistem Linux-PAM” din libpam-doc este esențial pentru învățarea configurării PAM.

  • Secțiunea „System Databases and Name Service Switch -- Baze de date de sistem și comutator de servicii de nume” din glibc-doc-reference este esențială pentru învățarea configurației NSS.

[Notă] Notă

Puteți vedea o listă mai extinsă și actualizată folosind comanda „aptitude search «libpam-|libnss-»”. Acronimul NSS poate însemna și „Network Security Service” (Serviciu de securitate rețea), care este diferit de „Name Service Switch” (Comutator serviciu de nume).

[Notă] Notă

PAM este cea mai simplă metodă de inițializare a variabilelor de mediu pentru fiecare program cu valoarea implicită la nivel de sistem.

În cadrul systemd, pachetul libpam-systemd este instalat pentru a gestiona autentificările utilizatorilor prin înregistrarea sesiunilor utilizatorilor în ierarhia grupului de control systemd pentru logind. Consultați systemd-logind(8), logind.conf(5) și pam_systemd(8).

Iată câteva fișiere de configurare importante accesate de PAM și NSS.


Limitarea selecției parolei este implementată de modulele PAM, pam_unix(8) și pam_cracklib(8). Acestea pot fi configurate prin argumentele lor.

[Indicație] Indicație

Modulele PAM utilizează sufixul „.so” pentru numele fișierelor lor.

Sistemul modern de gestionare centralizată poate fi implementat utilizând serverul centralizat Lightweight Directory Access Protocol (LDAP) pentru a administra numeroase sisteme de tip Unix și non-Unix din rețea. Implementarea de cod-sursă deschis a protocolului Lightweight Directory Access Protocol este OpenLDAP Software.

Serverul LDAP furnizează informațiile despre cont prin utilizarea PAM și NSS cu pachetele libpam-ldapd și libnss-ldapd pentru sistemul Debian. Pentru a activa această funcție sunt necesare mai multe acțiuni (nu am utilizat această configurare, iar informațiile următoare sunt pur secundare. Vă rugăm să citiți acest text în acest context.).

  • Configurați un server LDAP centralizat rulând un program precum demonul LDAP autonom, slapd(8).

  • Modificați fișierele de configurare PAM din directorul „/etc/pam.d/” pentru a utiliza „pam_ldap.so” în locul fișierului implicit „pam_unix.so”.

  • Modificați configurația NSS din fișierul „/etc/nsswitch.conf” pentru a utiliza „ldap” în locul valorii implicite („compat” sau „file”).

  • Trebuie să configurați libpam-ldapd pentru a utiliza conexiunea SSL (sau TLS) pentru securitatea parolei.

  • Puteți configura libnss-ldapd să utilizeze conexiunea SSL (sau TLS) pentru a asigura integritatea datelor, cu prețul unei suprasarcini a rețelei LDAP.

  • Ar trebui să rulați nscd(8) local pentru a stoca în cache orice rezultate ale căutării LDAP, în scopul de a reduce traficul de rețea LDAP.

Consultați documentația din nsswitch.conf(5), pam.conf(5), ldap.conf(5) și „/usr/share/doc/libpam-doc/html/” oferită de pachetul libpam-doc și „info libc «Name Service Switch»” oferită de pachetul glibc-doc.

În mod similar, puteți configura sisteme centralizate alternative cu alte metode.

[Notă] Notă

Informațiile prezentate aici pot fi insuficiente pentru nevoile dvs. de securitate, dar ar trebui să constituie un bun început.

Multe servicii ale stratului de transport populare comunică mesaje, inclusiv autentificarea parolei, în text simplu. Este o idee foarte proastă să transmiteți parola în text simplu pe Internet, unde poate fi interceptată. Puteți rula aceste servicii prin „Transport Layer Security” (TLS) sau predecesorul său, „Secure Sockets Layer” (SSL), pentru a securiza întreaga comunicare, inclusiv parola, prin criptare.


Criptarea consumă timp de procesare. Ca alternativă care nu solicită procesorul, puteți păstra comunicarea în text simplu, securizând doar parola cu un protocol de autentificare securizat, cum ar fi „Authenticated Post Office Protocol” (APOP) pentru POP și „Challenge-Response Authentication Mechanism MD5” (CRAM-MD5) pentru SMTP și IMAP. (Pentru trimiterea mesajelor de poștă electronică prin Internet către serverul dvs. de poștă electronică de la clientul dvs. de poștă electronică, este popular în ultima vreme să se utilizeze noul port de trimitere a mesajelor 587 în locul portului SMTP tradițional 25, pentru a evita blocarea portului 25 de către furnizorul de rețea, în timp ce vă autentificați cu CRAM-MD5.)

Programul Secure Shell (SSH) asigură comunicații criptate sigure între două gazde ce nu sunt de „încredere” într-o rețea nesigură, cu autentificare securizată. Acesta constă din clientul OpenSSH, ssh(1) și demonul OpenSSH, sshd(8). Acest SSH poate fi utilizat pentru a tunela o comunicare prin protocol nesigur, cum ar fi POP și X, în mod securizat pe Internet, cu ajutorul funcției de redirecționare a porturilor.

Clientul încearcă să se autentifice utilizând autentificarea bazată pe gazdă, autentificarea cu cheie publică, autentificarea cu provocare-răspuns sau autentificarea cu parolă. Utilizarea autentificării cu cheie publică permite conectarea la distanță fără parolă. Consultați Secțiune 6.3, „Serverul și instrumentele de acces la distanță (SSH)”.

Pentru a împiedica accesul persoanelor la mașina dvs. cu privilegii de root, trebuie să efectuați următoarele acțiuni.

Cu acces fizic la dispozitivul de stocare al sistemului, redefinirea parolei este relativ ușoară, urmând pașii de mai jos.

  1. Mutați dispozitivul de stocare al sistemului pe un PC cu USB ce poate fi pornit UEFI/BIOS.

  2. Porniți sistemul cu un suport de recuperare (consultați Secțiune 3.2.2, „Sistem de recuperare Linux live pe USB”).

  3. Montați partiția rădăcină cu acces de citire/scriere.

  4. Editați fișierul „/etc/passwd” din partiția rădăcină și lăsați necompletată a doua intrare pentru contul root.

Dacă aveți acces de editare la intrarea din meniul GRUB (consultați Secțiune 3.1.2, „Etapa 2: încărcătorul de pornire”) pentru grub-rescue-pc la pornire, este și mai ușor să urmați pașii de mai jos.

  1. Porniți sistemul cu parametrul de nucleu modificat în ceva precum „root=/dev/sda6 rw init=/bin/sh”.

  2. Editați fișierul „/etc/passwd” și lăsați goală a doua intrare pentru contul root.

  3. Reporniți sistemul.

Shell-ul root al sistemului este acum accesibil fără parolă.

[Notă] Notă

Odată ce cineva are acces la shell-ul root, poate accesa totul din sistem și poate reinițializa oricare dintre parolele din sistem. Mai mult, poate compromite parola pentru toate conturile de utilizator folosind instrumente de spargere a parolelor prin forță brută, cum ar fi pachetele john și crack (a se vedea Secțiune 9.5.11, „Verificarea securității și integrității sistemului”). Această parolă spartă poate duce la compromiterea altor sisteme.

Singura soluție software rezonabilă pentru a evita toate aceste probleme este utilizarea unei partiții rădăcină criptate software (sau partiția „/etc”) folosind dm-crypt și initramfs (vezi Secțiune 9.9, „Sfaturi pentru criptarea datelor”). Totuși, aveți întotdeauna nevoie de parolă pentru a porni sistemul.

Există controale de acces la sistem, altele decât autentificarea bazată pe parolă și permisiunile de fișiere.

[Notă] Notă

Consultați Secțiune 9.4.16, „Tasta Alt-SysRq” pentru restricționarea caracteristicii nucleului tastă de atenție securizată „secure attention key”: (SAK).

ACL-urile sunt un superset al permisiunilor obișnuite, așa cum se explică în Secțiune 1.2.3, „Permisiuni ale sistemului de fișiere”.

Întâlniți ACL-uri în acțiune în mediul grafic de birou modern. Când un dispozitiv de stocare USB formatat este montat automat ca, de exemplu, „/media/penguin/USBSTICK”, un utilizator normal penguin poate executa:

 $ cd /media/penguin
 $ ls -la
total 16
drwxr-x---+ 1 root    root    16 Jan 17 22:55 .
drwxr-xr-x  1 root    root    28 Sep 17 19:03 ..
drwxr-xr-x  1 penguin penguin 18 Jan  6 07:05 USBSTICK

+” în coloana a 11-a indică faptul că ACL-urile sunt active. Fără ACL-uri, un utilizator normal penguin nu ar trebui să poată afișa această listă, deoarece penguin nu face parte din grupul root. Puteți vedea ACL-urile astfel:

 $ getfacl .
# file: .
# owner: root
# group: root
user::rwx
user:penguin:r-x
group::---
mask::r-x
other::---

Aici:

  • user::rwx”, „group::---” și „other::---” corespund permisiunilor obișnuite ale proprietarului, grupului și altor utilizatori.

  • ACL „user:penguin:r-x” permite unui utilizator normal penguin să aibă permisiuni „r-x”. Acest lucru a permis „ls -la” să listeze conținutul directorului.

  • ACL „mask::r-x” stabilește limita superioară a permisiunilor.

Pentru mai multe informații, consultați „POSIX Access Control Lists on Linux -- Liste de control al accesului POSIX în Linux”, acl(5), getfacl(1) și setfacl(1).

sudo(8) este un program conceput pentru a permite unui administrator de sistem să acorde privilegii root limitate utilizatorilor și să înregistreze activitatea root. sudo necesită doar parola unui utilizator obișnuit. Instalați pachetul sudo și activați-l configurând opțiunile din „/etc/sudoers”. Consultați exemplul de configurare din „/usr/share/doc/sudo/examples/sudoers” și Secțiune 1.1.12, „Configurarea «sudo»”.

Utilizarea mea a sudo pentru sistemul cu un singur utilizator (a se vedea Secțiune 1.1.12, „Configurarea «sudo»”) are scopul de a mă proteja de propria mea prostie. Personal, consider că utilizarea sudo este o alternativă mai bună decât utilizarea sistemului din contul root tot timpul. De exemplu, următoarea comandă schimbă proprietarul „some_file” în „my_name”.

$ sudo chown my_name some_file

Desigur, dacă cunoașteți parola root (așa cum o cunosc utilizatorii Debian care au instalat singuri sistemul), orice comandă poate fi executată sub root din contul oricărui utilizator folosind „su -c”.

PolicyKit este o componentă a sistemului de operare pentru controlul privilegiilor la nivel de sistem în sistemele de operare de tip Unix.

Aplicațiile GUI mai noi nu sunt concepute pentru a rula ca procese privilegiate. Acestea comunică cu procesele privilegiate prin intermediul PolicyKit pentru a efectua operații administrative.

PolicyKit limitează astfel de opereții la conturile de utilizator care aparțin grupului sudo din sistemul Debian.

A se vedea polkit(8).

Pentru securitatea sistemului, este recomandat să dezactivați cât mai multe programe de server posibil. Acest lucru devine esențial pentru serverele de rețea. Serverele neutilizate, activate fie direct ca daemon, fie prin programul super-server, sunt considerate riscuri de securitate.

Multe programe, cum ar fi sshd(8), utilizează controlul accesului bazat pe PAM. Există multe modalități de a restricționa accesul la anumite servicii ale serverului.

Consultați Secțiune 3.6, „Gestionarea sistemului”, Secțiune 4.5.1, „Fișierele de configurare accesate de PAM și NSS” și Secțiune 5.7, „Infrastructura netfilter”.

[Indicație] Indicație

Serviciile Sun RPC trebuie să fie active pentru NFS și alte programe bazate pe RPC.

[Indicație] Indicație

Dacă aveți probleme cu accesul la distanță într-un sistem Debian recent, comentați configurația problematică, cum ar fi „ALL: PARANOID” din „/etc/hosts.deny”, dacă există; (dar trebuie să fiți atenți la riscurile de securitate implicate de acest tip de acțiune).

Nucleul Linux a evoluat și oferă caracteristici de securitate care nu se regăsesc în implementările tradiționale UNIX.

Linux acceptă atribute extinse care extind atributele UNIX tradiționale (a se vedea xattr(7)).

Linux împarte privilegiile asociate în mod tradițional cu superutilizatorul în unități distincte, cunoscute sub numele de capacități(7), care pot fi activate și dezactivate independent. Capacitățile sunt un atribut per fir de execuție începând cu versiunea 2.2 a nucleului.

Infrastructura modulelor de securitate Linux („Linux Security Module”: LSM) oferă un mecanism pentru diverse verificări de securitate care pot fi conectate la noile extensii ale nucleului. De exemplu:

Deoarece aceste extensii pot restricționa modelul de privilegii mai strict decât politicile obișnuite ale modelului de securitate de tip Unix, chiar și privilegiile root pot fi restricționate. Vă recomandăm să citiți documentul infrastructurii „Linux Security Module (LSM)” la kernel.org.

Spatiile de nume Linux învăluiesc o resursă globală a sistemului într-o abstractizare care face ca procesele din cadrul spatiului de nume să pară că au propria instanță izolată a resursei globale. Modificările aduse resursei globale sunt vizibile pentru alte procese care sunt membre ale spațiului de nume, dar sunt invizibile pentru alte procese. Începând cu versiunea 5.6 a nucleului, există 8 tipuri de spații de nume (a se vedea namespaces(7), unshare(1), nsenter(1)).

Începând cu Debian 11 Bullseye (2021), Debian utilizează ierarhia cgroup unificată (cunoscută și sub numele de cgroups-v2).

Exemple de utilizare a spațiilor de nume cu cgroups pentru a izola procesele acestora și a permite controlul resurselor sunt:

Aceste funcționalități nu pot fi realizate prin Secțiune 4.1, „Autentificare normală Unix”. Aceste subiecte avansate sunt în mare parte în afara domeniului de aplicare al acestui document introductiv.