Direct naar de inhoud

Cookie-instellingen

Kies per soort welke cookies je toestaat. Je kunt je keuze altijd wijzigen via Cookie-instellingen onderaan elke pagina. Privacyverklaring

Noodzakelijk

Altijd aan

Nodig om in te loggen, je winkelwagen te bewaren en je keuzes te onthouden. Deze staan altijd aan.

Welke cookies?
  • weboke_sessie, weboke_klant, weboke_remember: je sessie en ingelogd blijven
  • weboke_basket: je winkelwagen
  • wkBtwIncl: prijzen met of zonder btw tonen
  • wok_cookies: je cookiekeuze, 12 maanden

Meet welke advertentie tot een bezoek of bestelling leidt, zodat we niet betalen voor advertenties die niets doen.

Welke cookies?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), tot 90 dagen
  • OpenAI Ads, advertenties in ChatGPT
  • wok_aff: via welke partner je bij ons kwam (affiliateprogramma), 60 dagen

4,6

Land en taal

Elk land heeft zijn eigen site, met prijzen en btw van dat land.

Bekijken

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 onder postgres. 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/bash

De 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 overal

Let 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 uploads

Het eerste blok van tien tekens is de sleutel tot alles:

  • Teken 1: het soort. - is een gewoon bestand, d een map (directory), l een 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:

LetterBetekenis bij een bestand
rlezen
wwijzigen
xuitvoeren als programma of script

En bij een map net iets anders:

LetterBetekenis bij een map
rde namen van de bestanden in de map opvragen
wbestanden in de map aanmaken, hernoemen en verwijderen
xde 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:

RechtenGetalGebruik
rw-r--r--644gewoon bestand dat iedereen mag lezen
rw-r-----640bestand voor eigenaar en groep, zoals een configuratie met een wachtwoord
rw-------600geheim bestand, zoals authorized_keys of een privésleutel
rwxr-xr-x755map of programma dat iedereen mag gebruiken
rwx------700privé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.php

chmod 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 met adduser en voeg groepen toe met usermod -aG.
  • ls -l toont soort, rechten van eigenaar, groep en overig, en daarna eigenaar en groep. Bij een map betekent x binnengaan en w bestanden aanmaken en verwijderen.
  • Gangbare getallen: 644 en 755 voor openbaar, 640 voor configuratie met geheimen, 600 en 700 voor privé. Nooit 777.
  • Gebruik find om rechten op een hele boom te zetten; let op setuid-bestanden.

Quiz

1. Wat betekent -rw-r----- bij een bestand met eigenaar anna en groep www-data?



2. Wat gebeurt er als een map de rechten drw-r--r-- heeft (dus nergens een x)?



3. Je voert usermod -G www-data anna uit (zonder -a). Wat is het gevolg?



4. Een plugin kan niet schrijven in /var/www/example.com/uploads. Wat is de beste oplossing?



5. Waarom draait nginx onder de gebruiker www-data en niet onder root?



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.

Opdracht Z3.1: Rechten lezen

Bestand bij deze opdracht: rechten-1.txt










Wat je invult en wat we vinden, slaan we niet op. Je browser onthoudt je antwoorden en of je de opdracht hebt gehaald. Ben je aangemeld, dan bewaren we alleen dat je de opdracht (bijna) goed had in Mijn cursussen; daar kun je het ook verwijderen.

Verder lezen

De stappen in deze artikelen gelden voor de hostingpakketten en VPS'en van WebOké; bij andere aanbieders werkt het vergelijkbaar.

Even geduld…

Stel je domeinen in

Regel per domein de nameservers, de koppeling aan je hosting en wie de eigenaar wordt.

Je domeinen laden…