Użytkownicy, grupy i uprawnienia do plików
Moduł 3: Użytkownicy, uprawnienia i sudo · Czas czytania: 12 min
Cel lekcji: Po tej lekcji będą Państwo potrafili tworzyć i przeglądać użytkowników oraz grupy, odczytywać uprawnienia pliku lub katalogu w ls -l i poprawnie je ustawiać za pomocą chmod oraz chown, nie otwierając wszystkiego na oścież.
Kluczowe pojęcia: root (UID 0), zwykły użytkownik, użytkownik systemowy, /etc/passwd, /etc/shadow, grupa, adduser, id, rwx, właściciel, grupa, pozostali, zapis ósemkowy (644, 755, 600), chmod, chown, umask, setuid, 777
Każdy jest numerem
Linux od początku był tworzony z myślą o wielu użytkownikach na jednej maszynie. Każdy uruchomiony proces działa w imieniu jakiegoś użytkownika, a każdy plik ma właściciela. Dla systemu użytkownik to przede wszystkim numer, czyli UID:
- root ma UID 0. Root może wszystko: odczytać i zmienić każdy plik, zatrzymać każdą usługę, utworzyć każdego użytkownika. Nie ma tu pytania "czy na pewno?".
- Zwykli użytkownicy, tacy jak
anna, otrzymują w Debianie i Ubuntu UID od 1000 wzwyż. Mogą zapisywać w swoim katalogu domowym, a poza nim niewiele. - Użytkownicy systemowi mają niski numer i zwykle nie mają ani hasła, ani powłoki. Pod takimi użytkownikami działają usługi: nginx pod
www-data, PostgreSQL podpostgres. Jeśli taka usługa zostanie zhakowana, włamywacz ma tylko uprawnienia tego użytkownika, a nie uprawnienia roota.
Kim Państwo są, sprawdzą Państwo poleceniem id:
anna@web1:~$ id
uid=1000(anna) gid=1000(anna) groups=1000(anna),27(sudo),100(users)Anna ma UID 1000, własną grupę anna, a do tego należy również do grup sudo i users.
Gdzie zapisani są użytkownicy
Lista użytkowników znajduje się w /etc/passwd, po jednym wierszu na użytkownika:
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/bashPola, rozdzielone dwukropkami, to: nazwa, x (hasło jest przechowywane gdzie indziej), UID, grupa główna, opis, katalog domowy, powłoka. Przy www-data jako powłoka widnieje /usr/sbin/nologin: zalogowanie się nie jest możliwe.
Same hasła są przechowywane w postaci zaszyfrowanej (jako skróty, hash) w /etc/shadow. Ten plik może odczytać tylko root. Znak ! lub * na początku pola hasła oznacza, że logowanie hasłem nie jest możliwe. W ten sposób root jest domyślnie zablokowany w Ubuntu, a w Debianie wtedy, gdy podczas instalacji nie podali Państwo hasła roota.
Tworzenie użytkowników i grup
W Debianie i Ubuntu używa się przyjaznego polecenia 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 tworzy użytkownika, własną grupę o tej samej nazwie, katalog domowy i prosi o hasło. Istnieje też niskopoziomowe useradd (w AlmaLinux i Rocky Linux jest to standardowe polecenie), ale bez opcji robi mniej: nie ustawia hasła, a w niektórych systemach nie tworzy katalogu domowego.
Grupa to sposób na nadanie uprawnień kilku użytkownikom jednocześnie. Dodanie użytkownika do grupy:
root@web1:~# adduser anna www-data
root@web1:~# usermod -aG www-data anna # to samo, działa wszędzieProszę zwrócić uwagę na -a przy usermod: bez -a zastępują Państwo wszystkie dodatkowe grupy użytkownika tylko tą jedną. Nowa grupa zaczyna obowiązywać dopiero po ponownym zalogowaniu.
Zablokowanie konta bez jego usuwania (na przykład konta byłego współpracownika):
root@web1:~# usermod -L -e 1 jan-L blokuje hasło, -e 1 powoduje wygaśnięcie konta. Uwaga: zablokowane hasło nie zawsze powstrzyma klucz SSH. Dlatego proszę usunąć również klucze w /home/jan/.ssh/authorized_keys (lekcja 2.3); wygasłe konto (-e 1) sshd natomiast odrzuca.
Odczytywanie uprawnień
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 uploadsPierwszy blok dziesięciu znaków jest kluczem do wszystkiego:
- Znak 1: typ.
-to zwykły plik,dkatalog (directory),ldowiązanie symboliczne (symlink). - Znaki od 2 do 4: co może właściciel.
- Znaki od 5 do 7: co może grupa.
- Znaki od 8 do 10: co mogą pozostali (wszyscy inni).
Dalej następują liczba dowiązań, właściciel, grupa, rozmiar i data.
Litery oznaczają w przypadku pliku:
| Litera | Znaczenie dla pliku |
|---|---|
r | odczyt |
w | modyfikacja |
x | uruchamianie jako program lub skrypt |
A w przypadku katalogu coś nieco innego:
| Litera | Znaczenie dla katalogu |
|---|---|
r | wyświetlanie nazw plików w katalogu |
w | tworzenie, zmiana nazw i usuwanie plików w katalogu |
x | wejście do katalogu i otwieranie znajdujących się w nim plików |
To ostatnie zaskakuje wiele osób. Bez x na katalogu nie dostaną się Państwo do znajdujących się w nim plików, nawet jeśli same pliki są czytelne. A kto ma w na katalogu, może usuwać znajdujące się w nim pliki, nawet jeśli należą do kogoś innego.
W przykładzie: index.html może czytać każdy; config.php (z hasłem do bazy danych) Anna może czytać i modyfikować, grupa www-data (czyli serwer WWW) tylko czytać, a pozostali nic. W uploads serwer WWW może zapisywać, ponieważ tam trafiają pliki przesyłane przez odwiedzających.
Uprawnienia jako liczba
Uprawnienia często zapisuje się jako trzy cyfry, czyli liczbę w zapisie ósemkowym. Każda litera ma wartość: r = 4, w = 2, x = 1. Wartości sumuje się dla każdej grupy osobno:
| Uprawnienia | Liczba | Zastosowanie |
|---|---|---|
rw-r--r-- | 644 | zwykły plik, który każdy może czytać |
rw-r----- | 640 | plik dla właściciela i grupy, na przykład konfiguracja z hasłem |
rw------- | 600 | plik poufny, taki jak authorized_keys lub klucz prywatny |
rwxr-xr-x | 755 | katalog lub program, z którego każdy może korzystać |
rwx------ | 700 | katalog prywatny, taki jak ~/.ssh |
Zmiana uprawnień: 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 zmienia uprawnienia, za pomocą liczby lub liter (u, g, o dla właściciela, grupy i pozostałych; + lub - i litera). chown eigenaar:groep zmienia właściciela i grupę; może to robić tylko root. Z -R oba polecenia działają na całym katalogu i właśnie tu często dochodzi do błędów: chmod -R 644 na katalogu sprawia, że wszystkie podkatalogi stają się bezużyteczne, ponieważ katalogi potrzebują x. Dla całego drzewa lepiej użyć 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 {} +Nigdy 777
"Nie działało, więc ustawiłem 777." 777 oznacza: każdy na serwerze może to czytać, modyfikować i uruchamiać. Jeśli kiedykolwiek jedna usługa lub jedna strona na Państwa serwerze zostanie przejęta, włamywacz może zapisywać wszędzie tam, gdzie ustawiono 777, łącznie z Państwa plikami PHP. Prawdziwym problemem jest niemal zawsze właściciel lub grupa: proszę nadać serwerowi WWW przez grupę dokładnie to uprawnienie, którego potrzebuje, i tylko na tym katalogu, na którym jest ono potrzebne.
Uprawnienia domyślne i bity specjalne
Nowe pliki otrzymują uprawnienia na podstawie umask. Przy typowej wartości umask 022 nowe pliki dostają 644, a nowe katalogi 755. Swoją wartość umask zobaczą Państwo poleceniem umask.
Czasem zamiast x widać s, na przykład przy /usr/bin/passwd (-rwsr-xr-x). To bit setuid: program działa z uprawnieniami właściciela (roota), nawet gdy uruchamia go zwykły użytkownik. Jest to potrzebne kilku programom systemowym, ale proszę nigdy samodzielnie nie ustawiać go na skrypcie. Nieoczekiwany plik z setuid to znany sygnał włamania; za pomocą find / -perm -4000 -type f 2>/dev/null zobaczą Państwo wszystkie takie pliki.
W AlmaLinux i Rocky Linux
adduser jest tam inną nazwą dla useradd; proszę użyć useradd -m anna, a następnie passwd anna. Grupy dodaje się za pomocą usermod -aG. SELinux dokłada dodatkową warstwę obok uprawnień opisanych w tej lekcji: plik z prawidłowymi uprawnieniami może mimo to zostać odrzucony, jeśli ma niewłaściwą etykietę SELinux (pokazuje ją ls -Z).
Podsumowanie
- Każdy użytkownik ma UID; root (0) może wszystko, a usługi działają pod własnymi użytkownikami systemowymi bez powłoki.
- Użytkownicy są zapisani w
/etc/passwd, skróty haseł w/etc/shadow. Użytkowników tworzy się poleceniemadduser, a grupy dodaje poleceniemusermod -aG. ls -lpokazuje typ, uprawnienia właściciela, grupy i pozostałych, a następnie właściciela i grupę. W przypadku kataloguxoznacza wejście, awtworzenie i usuwanie plików.- Typowe wartości: 644 i 755 dla treści publicznych, 640 dla konfiguracji z danymi poufnymi, 600 i 700 dla treści prywatnych. Nigdy 777.
- Do ustawiania uprawnień na całym drzewie proszę używać
find; proszę zwracać uwagę na pliki z setuid.
Quiz
Zadanie
Zadanie Z3.1: Odczytywanie uprawnień. Proszę otworzyć przykładowy plik rechten-1.txt: zawiera on wynik id dla trzech użytkowników oraz wynik ls -l w katalogu WWW. Przy każdym pytaniu proszę odpowiedzieć, kto co może (na przykład: "czy serwer WWW może zmodyfikować config.php?", "który plik ma zbyt szerokie uprawnienia?", "jaka liczba odpowiada .env?"). Program porównuje Państwa odpowiedzi z ustalonym kluczem i przy każdym pytaniu wyjaśnia dlaczego.
Przeczytaj więcej
Kroki opisane w tych artykułach dotyczą pakietów hostingowych i serwerów VPS WebOké; u innych dostawców działa to podobnie.
- Zabronione (403): Nie mają Państwo uprawnień dostępu do / na tym serwerze
- Logowanie do VPS przez SSH (i tworzenie klucza SSH)
- W kursie WordPress: lekcja 7.4 "Wzmacnianie strony: uprawnienia, nagłówki i wtyczki bezpieczeństwa"
- Podręcznik Debiana dla adduser: https://manpages.debian.org/trixie/adduser/adduser.8.en.html
- Podręcznik Debiana dla chmod: https://manpages.debian.org/trixie/coreutils/chmod.1.en.html
