Module 3 · 3.1
Gebruikers, groepen en bestandsrechten
Module 3: Gebruikers, rechten en sudo · Leestijd: 12 minuten
Leerdoel: Na deze les kun je gebruikers en groepen aanmaken en bekijken, de rechten van een bestand of map lezen in ls -l, en ze met chmod en chown goed zetten zonder alles open te gooien.
Kernbegrippen: root (UID 0), gewone gebruiker, systeemgebruiker, /etc/passwd, /etc/shadow, groep, adduser, id, rwx, eigenaar, groep, overig, octaal (644, 755, 600), chmod, chown, umask, setuid, 777
Iedereen is een nummer
Linux is vanaf het begin gebouwd voor meerdere gebruikers op één machine. Elk proces dat draait, draait namens een gebruiker, en elk bestand heeft een eigenaar. Voor het systeem is een gebruiker vooral een nummer, de UID:
- root heeft UID 0. Root mag alles: elk bestand lezen en wijzigen, elke dienst stoppen, elke gebruiker aanmaken. Er is geen "weet je het zeker".
- Gewone gebruikers, zoals
anna, krijgen op Debian en Ubuntu een UID vanaf 1000. Ze mogen in hun eigen thuismap schrijven en verder weinig. - Systeemgebruikers hebben een laag nummer en meestal geen wachtwoord en geen shell. Diensten draaien onder zo'n gebruiker: nginx onder
www-data, PostgreSQL onderpostgres. Wordt zo'n dienst gehackt, dan heeft de inbreker alleen de rechten van die gebruiker, niet die van root.
Wie je bent, zie je met id:
anna@web1:~$ id
uid=1000(anna) gid=1000(anna) groups=1000(anna),27(sudo),100(users)Anna heeft UID 1000, een eigen groep anna, en zit ook in de groepen sudo en users.
Waar gebruikers staan
De lijst van gebruikers staat in /etc/passwd, één regel per gebruiker:
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/bashDe velden, gescheiden door dubbele punten: naam, x (het wachtwoord staat elders), UID, hoofdgroep, omschrijving, thuismap, shell. Bij www-data staat als shell /usr/sbin/nologin: inloggen kan niet.
De wachtwoorden zelf staan, versleuteld (gehasht), in /etc/shadow. Dat bestand kan alleen root lezen. Een ! of * aan het begin van het wachtwoordveld betekent: met een wachtwoord inloggen kan niet. Zo staat root op Ubuntu standaard vergrendeld, en op Debian als je bij de installatie geen root-wachtwoord opgaf.
Gebruikers en groepen aanmaken
Op Debian en Ubuntu gebruik je het vriendelijke 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 maakt de gebruiker, een eigen groep met dezelfde naam, een thuismap en vraagt om een wachtwoord. Het lagere useradd bestaat ook (en is op AlmaLinux en Rocky Linux het gewone commando), maar doet zonder opties minder: geen wachtwoord, en op sommige systemen geen thuismap.
Een groep is een manier om rechten aan meerdere gebruikers tegelijk te geven. Een gebruiker aan een groep toevoegen:
root@web1:~# adduser anna www-data
root@web1:~# usermod -aG www-data anna # hetzelfde, werkt overalLet op de -a bij usermod: zonder -a vervang je alle extra groepen van de gebruiker door alleen deze ene. Een nieuwe groep geldt pas na opnieuw inloggen.
Een account dichtzetten zonder het te verwijderen (bijvoorbeeld van een oud-collega):
root@web1:~# usermod -L -e 1 jan-L vergrendelt het wachtwoord, -e 1 laat het account verlopen. Let op: een vergrendeld wachtwoord houdt een SSH-sleutel niet altijd tegen. Haal dus ook de sleutels in /home/jan/.ssh/authorized_keys weg (les 2.3); het verlopen account (-e 1) weigert sshd wel.
Rechten lezen
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 uploadsHet eerste blok van tien tekens is de sleutel tot alles:
- Teken 1: het soort.
-is een gewoon bestand,deen map (directory),leen snelkoppeling (symlink). - Teken 2 tot 4: wat de eigenaar mag.
- Teken 5 tot 7: wat de groep mag.
- Teken 8 tot 10: wat overig (iedereen anders) mag.
Daarna komen het aantal koppelingen, de eigenaar, de groep, de grootte en de datum.
De letters betekenen bij een bestand:
| Letter | Betekenis bij een bestand |
|---|---|
r | lezen |
w | wijzigen |
x | uitvoeren als programma of script |
En bij een map net iets anders:
| Letter | Betekenis bij een map |
|---|---|
r | de namen van de bestanden in de map opvragen |
w | bestanden in de map aanmaken, hernoemen en verwijderen |
x | de map binnengaan en bestanden erin openen |
Dat laatste verrast veel mensen. Zonder x op een map kom je niet bij de bestanden erin, ook als die zelf leesbaar zijn. En wie w heeft op een map, kan er bestanden in verwijderen, ook als die van een ander zijn.
In het voorbeeld: index.html mag iedereen lezen; config.php (met het databasewachtwoord) mag Anna lezen en wijzigen, de groep www-data (dus de webserver) alleen lezen, en de rest niets. In uploads mag de webserver schrijven, want daar komen uploads van bezoekers.
Rechten als getal
Rechten worden vaak als drie cijfers geschreven, het octale getal. Elke letter heeft een waarde: r = 4, w = 2, x = 1. Tel per groep op:
| Rechten | Getal | Gebruik |
|---|---|---|
rw-r--r-- | 644 | gewoon bestand dat iedereen mag lezen |
rw-r----- | 640 | bestand voor eigenaar en groep, zoals een configuratie met een wachtwoord |
rw------- | 600 | geheim bestand, zoals authorized_keys of een privésleutel |
rwxr-xr-x | 755 | map of programma dat iedereen mag gebruiken |
rwx------ | 700 | privémap, zoals ~/.ssh |
Rechten wijzigen: chmod en 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 wijzigt de rechten, met een getal of met letters (u, g, o voor eigenaar, groep, overig; + of - en de letter). chown eigenaar:groep wijzigt eigenaar en groep; dat mag alleen root. Met -R werken beide op een hele map, en daar gaat het vaak mis: chmod -R 644 op een map maakt alle submappen onbruikbaar, want mappen hebben x nodig. Gebruik voor een hele boom liever 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 {} +Nooit 777
"Het werkt niet, ik heb er maar 777 op gezet." 777 betekent: iedereen op de server mag dit lezen, wijzigen en uitvoeren. Gaat er ooit één dienst of één website op je server mis, dan kan de inbreker overal in schrijven waar 777 op staat, inclusief je PHP-bestanden. Het echte probleem is bijna altijd de eigenaar of de groep: geef de webserver via de groep precies het recht dat hij nodig heeft, en alleen op de map waar het nodig is.
Standaardrechten en speciale bits
Nieuwe bestanden krijgen hun rechten via de umask. Met de gangbare umask 022 worden nieuwe bestanden 644 en nieuwe mappen 755. Je ziet je umask met het commando umask.
Soms zie je een s in plaats van een x, zoals bij /usr/bin/passwd (-rwsr-xr-x). Dat is het setuid-bit: het programma draait met de rechten van de eigenaar (root), ook als een gewone gebruiker het start. Dat is nodig voor een paar systeemprogramma's, maar zet het nooit zelf op een script. Een onverwacht setuid-bestand is een bekend teken van een inbraak; met find / -perm -4000 -type f 2>/dev/null zie je ze allemaal.
Op AlmaLinux en Rocky Linux
adduser is daar een andere naam voor useradd; gebruik useradd -m anna en dan passwd anna. Groepen toevoegen gaat met usermod -aG. SELinux voegt een extra laag toe naast de rechten in deze les: een bestand met de juiste rechten kan toch geweigerd worden als het verkeerde SELinux-label erop staat (ls -Z toont het).
Samenvatting
- Elke gebruiker heeft een UID; root (0) mag alles, diensten draaien onder eigen systeemgebruikers zonder shell.
- Gebruikers staan in
/etc/passwd, de wachtwoordhashes in/etc/shadow. Maak gebruikers metadduseren voeg groepen toe metusermod -aG. ls -ltoont soort, rechten van eigenaar, groep en overig, en daarna eigenaar en groep. Bij een map betekentxbinnengaan enwbestanden aanmaken en verwijderen.- Gangbare getallen: 644 en 755 voor openbaar, 640 voor configuratie met geheimen, 600 en 700 voor privé. Nooit 777.
- Gebruik
findom rechten op een hele boom te zetten; let op setuid-bestanden.
Quiz
Opdracht
Opdracht Z3.1: Rechten lezen. Open het voorbeeldbestand rechten-1.txt: de uitvoer van id voor drie gebruikers en van ls -l in een webmap. Beantwoord per vraag wie wat mag (bijvoorbeeld: "kan de webserver config.php wijzigen?", "welk bestand heeft te ruime rechten?", "welk getal hoort bij .env?"). Het programma vergelijkt je antwoorden met de vaste sleutel en legt per vraag uit waarom.
Verder lezen
De stappen in deze artikelen gelden voor de hostingpakketten en VPS'en van WebOké; bij andere aanbieders werkt het vergelijkbaar.
- Forbidden (403): You don't have permission to access / on this server
- Inloggen op je VPS met SSH (en een SSH-sleutel maken)
- Gratis WordPress-cursus 7.4: De site verharden: rechten, headers en beveiligingsplugins
- Debian-handleiding adduser: https://manpages.debian.org/trixie/adduser/adduser.8.en.html
- Debian-handleiding chmod: https://manpages.debian.org/trixie/coreutils/chmod.1.en.html
- Bestandsrechten op je VPS lezen en goed zetten
