Modulul 3 · 3.1
Utilizatori, grupuri și permisiuni de fișiere
Modulul 3: Utilizatori, permisiuni și sudo · Timp de citire: 12 minute
Obiectivul lecției: După această lecție veți putea crea și vizualiza utilizatori și grupuri, veți putea citi permisiunile unui fișier sau ale unui director în ls -l și le veți putea seta corect cu chmod și chown, fără a deschide totul pentru toată lumea.
Noțiuni cheie: root (UID 0), utilizator obișnuit, utilizator de sistem, /etc/passwd, /etc/shadow, grup, adduser, id, rwx, proprietar, grup, ceilalți, octal (644, 755, 600), chmod, chown, umask, setuid, 777
Fiecare este un număr
Linux a fost construit de la început pentru mai mulți utilizatori pe aceeași mașină. Fiecare proces care rulează, rulează în numele unui utilizator, iar fiecare fișier are un proprietar. Pentru sistem, un utilizator este în primul rând un număr, UID-ul:
- root are UID 0. Root poate face orice: poate citi și modifica orice fișier, poate opri orice serviciu, poate crea orice utilizator. Nu există nicio întrebare de tipul "sunteți sigur?".
- Utilizatorii obișnuiți, precum
anna, primesc pe Debian și Ubuntu un UID începând de la 1000. Ei pot scrie în propriul director personal și în rest pot face puține lucruri. - Utilizatorii de sistem au un număr mic și, de regulă, nu au nici parolă, nici shell. Serviciile rulează sub un astfel de utilizator: nginx sub
www-data, PostgreSQL subpostgres. Dacă un astfel de serviciu este compromis, atacatorul are doar permisiunile acelui utilizator, nu pe cele ale lui root.
Cine sunteți vedeți cu id:
anna@web1:~$ id
uid=1000(anna) gid=1000(anna) groups=1000(anna),27(sudo),100(users)Anna are UID 1000, un grup propriu anna și face parte și din grupurile sudo și users.
Unde se află utilizatorii
Lista utilizatorilor se află în /etc/passwd, câte o linie pentru fiecare utilizator:
anna@web1:~$ grep -E '^(root|www-data|anna):' /etc/passwd
root:x:0:0:root:/root:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
anna:x:1000:1000:Anna,,,:/home/anna:/bin/bashCâmpurile, separate prin două puncte, sunt: numele, x (parola se află în altă parte), UID-ul, grupul principal, descrierea, directorul personal și shell-ul. La www-data, shell-ul este /usr/sbin/nologin: autentificarea nu este posibilă.
Parolele propriu-zise se află, criptate (sub formă de hash), în /etc/shadow. Acest fișier poate fi citit doar de root. Un ! sau * la începutul câmpului parolei înseamnă: autentificarea cu parolă nu este posibilă. Astfel, root este blocat implicit pe Ubuntu, iar pe Debian este blocat dacă nu ați introdus o parolă pentru root la instalare.
Crearea utilizatorilor și a grupurilor
Pe Debian și Ubuntu folosiți comanda prietenoasă adduser:
root@web1:~# adduser anna
info: Adding user `anna' ...
info: Adding new group `anna' (1000) ...
info: Adding new user `anna' (1000) with group `anna (1000)' ...
info: Creating home directory `/home/anna' ...
info: Copying files from `/etc/skel' ...
New password:
Retype new password:
...adduser creează utilizatorul, un grup propriu cu același nume și un director personal și vă cere o parolă. Există și comanda de nivel mai scăzut useradd (care pe AlmaLinux și Rocky Linux este comanda obișnuită), dar fără opțiuni face mai puțin: nu setează o parolă, iar pe unele sisteme nu creează un director personal.
Un grup este o modalitate de a acorda permisiuni mai multor utilizatori deodată. Adăugarea unui utilizator într-un grup:
root@web1:~# adduser anna www-data
root@web1:~# usermod -aG www-data anna # la fel, funcționează peste totAtenție la -a din usermod: fără -a înlocuiți toate grupurile suplimentare ale utilizatorului cu doar acesta. Un grup nou se aplică abia după o nouă autentificare.
Blocarea unui cont fără a-l șterge (de exemplu, al unui fost coleg):
root@web1:~# usermod -L -e 1 jan-L blochează parola, -e 1 face ca acel cont să expire. Atenție: o parolă blocată nu oprește întotdeauna o cheie SSH. Prin urmare, eliminați și cheile din /home/jan/.ssh/authorized_keys (lecția 2.3); un cont expirat (-e 1) este însă refuzat de sshd.
Citirea permisiunilor
anna@web1:~$ ls -l /var/www/example.com
total 12
-rw-r--r-- 1 anna www-data 1520 Nov 9 10:12 index.html
-rw-r----- 1 anna www-data 412 Nov 9 10:14 config.php
drwxr-xr-x 2 anna www-data 4096 Nov 9 10:15 images
drwxrwxr-x 2 www-data www-data 4096 Nov 9 10:20 uploadsPrimul bloc de zece caractere este cheia pentru tot:
- Caracterul 1: tipul.
-este un fișier obișnuit,dun director (directory),lo scurtătură (symlink). - Caracterele 2-4: ce poate face proprietarul.
- Caracterele 5-7: ce poate face grupul.
- Caracterele 8-10: ce pot face ceilalți (toți ceilalți).
Urmează apoi numărul de legături, proprietarul, grupul, dimensiunea și data.
La un fișier, literele înseamnă:
| Literă | Semnificație la un fișier |
|---|---|
r | citire |
w | modificare |
x | executare ca program sau script |
Iar la un director, ceva puțin diferit:
| Literă | Semnificație la un director |
|---|---|
r | listarea numelor fișierelor din director |
w | crearea, redenumirea și ștergerea fișierelor din director |
x | intrarea în director și deschiderea fișierelor din el |
Ultimul punct îi surprinde pe mulți. Fără x pe un director nu puteți ajunge la fișierele din el, chiar dacă acestea pot fi citite. Iar cine are w pe un director poate șterge fișiere din el, chiar dacă aparțin altcuiva.
În exemplu: index.html poate fi citit de oricine; config.php (care conține parola bazei de date) poate fi citit și modificat de Anna, grupul www-data (adică serverul web) îl poate doar citi, iar ceilalți nu au niciun drept. În uploads serverul web poate scrie, deoarece acolo ajung fișierele încărcate de vizitatori.
Permisiunile ca număr
Permisiunile sunt adesea scrise ca trei cifre, numărul octal. Fiecare literă are o valoare: r = 4, w = 2, x = 1. Adunați valorile pentru fiecare grup:
| Permisiuni | Număr | Utilizare |
|---|---|---|
rw-r--r-- | 644 | fișier obișnuit pe care oricine îl poate citi |
rw-r----- | 640 | fișier pentru proprietar și grup, de exemplu o configurație cu o parolă |
rw------- | 600 | fișier secret, precum authorized_keys sau o cheie privată |
rwxr-xr-x | 755 | director sau program pe care îl poate folosi oricine |
rwx------ | 700 | director privat, precum ~/.ssh |
Modificarea permisiunilor: chmod și chown
anna@web1:~$ chmod 640 /var/www/example.com/config.php
anna@web1:~$ chmod g+w /var/www/example.com/uploads
root@web1:~# chown anna:www-data /var/www/example.com/config.phpchmod modifică permisiunile, cu un număr sau cu litere (u, g, o pentru proprietar, grup și ceilalți; + sau - urmat de literă). chown eigenaar:groep modifică proprietarul și grupul; acest lucru îl poate face doar root. Cu -R, ambele comenzi acționează asupra unui întreg director, și tocmai aici apar des greșeli: chmod -R 644 pe un director face toate subdirectoarele inutilizabile, deoarece directoarele au nevoie de x. Pentru un arbore întreg folosiți mai degrabă find:
root@web1:~# find /var/www/example.com -type d -exec chmod 755 {} +
root@web1:~# find /var/www/example.com -type f -exec chmod 644 {} +Niciodată 777
"Nu funcționa, așa că am pus 777." 777 înseamnă: oricine de pe server poate citi, modifica și executa acest fișier. Dacă vreodată un singur serviciu sau un singur site de pe serverul dumneavoastră este compromis, atacatorul poate scrie oriunde este setat 777, inclusiv în fișierele dumneavoastră PHP. Adevărata problemă este aproape întotdeauna proprietarul sau grupul: acordați serverului web, prin grup, exact dreptul de care are nevoie și doar pe directorul unde este necesar.
Permisiuni implicite și biți speciali
Fișierele noi își primesc permisiunile prin umask. Cu valoarea uzuală umask 022, fișierele noi devin 644, iar directoarele noi 755. Vă vedeți valoarea umask cu comanda umask.
Uneori vedeți un s în locul unui x, ca la /usr/bin/passwd (-rwsr-xr-x). Acesta este bitul setuid: programul rulează cu permisiunile proprietarului (root), chiar dacă îl pornește un utilizator obișnuit. Acest lucru este necesar pentru câteva programe de sistem, dar nu îl setați niciodată dumneavoastră pe un script. Un fișier setuid neașteptat este un semn cunoscut al unei intruziuni; cu find / -perm -4000 -type f 2>/dev/null le vedeți pe toate.
Pe AlmaLinux și Rocky Linux
Acolo, adduser este un alt nume pentru useradd; folosiți useradd -m anna și apoi passwd anna. Grupurile se adaugă cu usermod -aG. SELinux adaugă un nivel suplimentar pe lângă permisiunile din această lecție: un fișier cu permisiunile corecte poate fi totuși refuzat dacă are o etichetă SELinux greșită (ls -Z o afișează).
Rezumat
- Fiecare utilizator are un UID; root (0) poate face orice, iar serviciile rulează sub utilizatori de sistem proprii, fără shell.
- Utilizatorii se află în
/etc/passwd, hash-urile parolelor în/etc/shadow. Creați utilizatori cuadduserși adăugați grupuri cuusermod -aG. ls -lafișează tipul, permisiunile proprietarului, ale grupului și ale celorlalți, apoi proprietarul și grupul. La un director,xînseamnă intrarea în director, iarwcrearea și ștergerea fișierelor.- Numere uzuale: 644 și 755 pentru conținut public, 640 pentru configurații cu secrete, 600 și 700 pentru conținut privat. Niciodată 777.
- Folosiți
findpentru a seta permisiunile pe un arbore întreg; fiți atent la fișierele setuid.
Test (quiz)
Exercițiu
Exercițiul Z3.1: Citirea permisiunilor. Deschideți fișierul de exemplu rechten-1.txt: rezultatul comenzii id pentru trei utilizatori și al comenzii ls -l într-un director web. Răspundeți la fiecare întrebare despre cine ce poate face (de exemplu: "poate serverul web să modifice config.php?", "ce fișier are permisiuni prea largi?", "ce număr corespunde lui .env?"). Programul vă compară răspunsurile cu cheia fixă și explică, pentru fiecare întrebare, de ce.
Lecturi suplimentare
Pașii din aceste articole se aplică pachetelor de găzduire și VPS-urilor WebOké; la alți furnizori procedura este similară.
- Interzis (403): Nu aveți permisiunea de a accesa / pe acest server
- Autentificarea pe VPS prin SSH (și crearea unei chei SSH)
- În cursul WordPress: lecția 7.4 "Securizarea site-ului: permisiuni, antete și pluginuri de securitate"
- Manualul Debian pentru adduser: https://manpages.debian.org/trixie/adduser/adduser.8.en.html
- Manualul Debian pentru chmod: https://manpages.debian.org/trixie/coreutils/chmod.1.en.html
