Les 4
Gebruikers en rechten
Wie mag wat: gebruikers, groepen, chmod, chown en sudo.
π― Na deze les kun je
- rechten lezen in ls -l
- rechten wijzigen met chmod en chown
- sudo verantwoord gebruiken
Linux is vanaf het begin gebouwd voor meerdere gebruikers op één computer. Een webserver mag de websitebestanden lezen, maar niet je wachtwoorden. Een collega mag je projectmap bewerken, maar een willekeurige andere gebruiker niet. Dat regelt Linux met gebruikers, groepen en rechten op elk bestand. Wie een server beheert, komt rechtenproblemen dagelijks tegen: "Permission denied" is een van de meest voorkomende foutmeldingen. In deze les leer je die lezen en oplossen, en leer je verantwoord omgaan met beheerrechten.
Gebruikers en groepen
Elke gebruiker heeft een naam en een nummer (UID), en hoort bij een of meer groepen (GID). Met id zie je wie je bent:
$ id
uid=1000(student) gid=1000(student) groups=1000(student),27(sudo),1001(webteam)
studentis lid van zijn eigen groepstudent, vansudo(mag beheerderscommando's uitvoeren) en vanwebteam.- Gebruikers staan in
/etc/passwd, groepen in/etc/group. Bekijk ze gerust metless; wachtwoorden staan er niet in (die staan versleuteld in/etc/shadow, alleen leesbaar voor root). - Veel gebruikers zijn geen mensen maar diensten, zoals
www-datavoor de webserver. Zo draait elke dienst met zo min mogelijk rechten.
Er is één bijzondere gebruiker: root (UID 0). Root mag alles, ook alles kapotmaken.
Rechten lezen in ls -l
$ ls -l
-rw-r--r-- 1 student student 320 Oct 12 10:15 notities.txt
-rwxr-xr-x 1 student student 812 Oct 12 10:16 backup.sh
drwxrws--- 2 student webteam 4096 Oct 12 10:17 project
Het eerste blok van tien tekens lees je zo:
d rwx rws ---
β β β βββ rechten voor anderen (others)
β β βββββββββ rechten voor de groep (group)
β βββββββββββββββ rechten voor de eigenaar (user)
ββββββββββββββββββββ soort: - = bestand, d = map, l = link
Daarna volgen het aantal links, de eigenaar, de groep, de grootte, de datum en de naam.
| Recht | Bij een bestand | Bij een map |
|---|---|---|
r (read) |
inhoud lezen | de lijst met namen zien (ls) |
w (write) |
inhoud wijzigen | bestanden erin maken, hernoemen, verwijderen |
x (execute) |
uitvoeren als programma | de map binnengaan (cd) en bestanden erin openen |
Let op het verschil bij mappen. Of je een bestand mag verwijderen, hangt af van de w op de map, niet op het bestand. En zonder x op een map kom je er niet in, zelfs als je r hebt.
Linux controleert in volgorde: ben je de eigenaar, dan gelden de eigenaarsrechten. Anders: zit je in de groep, dan gelden de groepsrechten. Anders gelden de rechten voor anderen.
Octale notatie
Rechten worden vaak als getal geschreven. Elk recht heeft een waarde, en per groep tel je ze op:
| r | w | x |
|---|---|---|
| 4 | 2 | 1 |
| Rechten | Optelling | Getal |
|---|---|---|
rwx |
4+2+1 | 7 |
rw- |
4+2 | 6 |
r-x |
4+1 | 5 |
r-- |
4 | 4 |
--- |
0 | 0 |
Drie cijfers achter elkaar zijn eigenaar, groep en anderen. Veelgebruikte combinaties:
| Getal | Rechten | Gebruikt voor |
|---|---|---|
644 |
rw-r--r-- |
gewone bestanden: jij schrijft, iedereen leest |
600 |
rw------- |
privΓ©bestanden, zoals SSH-sleutels (les 10) |
755 |
rwxr-xr-x |
scripts en gewone mappen |
700 |
rwx------ |
privΓ©mappen |
770 |
rwxrwx--- |
gedeelde map voor een groep |
chmod: rechten wijzigen
chmod 644 notities.txt # octaal
chmod 755 backup.sh
chmod u+x backup.sh # symbolisch: eigenaar krijgt x erbij
chmod g-w,o= notities.txt # groep verliest w, anderen krijgen niets
chmod -R g+w project # recursief voor een hele map
In de symbolische vorm is u de eigenaar (user), g de groep, o de anderen en a iedereen. + geeft erbij, - haalt weg, = zet precies. stat -c '%a %A' bestand toont de rechten als getal en als tekst naast elkaar.
chown: eigenaar en groep wijzigen
sudo chown sam rapport.txt # nieuwe eigenaar
sudo chown sam:webteam rapport.txt # eigenaar en groep
sudo chgrp webteam rapport.txt # alleen de groep
sudo chown -R www-data:www-data /var/www/site
Een bestand aan iemand anders geven mag alleen root, vandaar de sudo.
Sudo en root
Inloggen als root is riskant: elke tikfout heeft volledige rechten. Daarom werk je als gewone gebruiker en zet je sudo (superuser do) alleen voor een commando dat beheerrechten nodig heeft:
$ cat /etc/shadow
cat: /etc/shadow: Permission denied
$ sudo cat /etc/shadow
[sudo] password for student:
sudo vraagt jouw wachtwoord, en werkt alleen als je in de groep sudo (op Debian/Ubuntu) of wheel (op Fedora/RHEL) zit. Elk sudo-commando wordt gelogd.
Regels voor verantwoord gebruik:
- Gebruik
sudoalleen als het commando zonder faalt en je begrijpt waarom het rechten nodig heeft. - Los "Permission denied" niet op met
chmod 777. Dat geeft iedereen alle rechten, ook kwaadwillenden. Zoek uit wie toegang nodig heeft en geef precies dat. - Werk niet langdurig in een root-shell (
sudo -i). Doe je klus enexit.
sudo rm -rf met een tikfout kan een heel systeem wissen. Hoe meer rechten, hoe zorgvuldiger je typt. Lees een sudo-commando altijd nog één keer voor je op Enter drukt.
Een gedeelde map voor een groep
Een veelvoorkomende taak: een map waarin een team samen werkt.
sudo groupadd webteam # groep maken
sudo usermod -aG webteam sam # sam toevoegen (let op -a!)
sudo usermod -aG webteam noor
sudo mkdir /srv/website
sudo chown root:webteam /srv/website
sudo chmod 2770 /srv/website
usermod -aGvoegt een groep toe. Zonder-avervang je alle andere groepen van de gebruiker; een klassieke fout.- Groepslidmaatschap geldt pas na opnieuw inloggen.
- De
2vooraan in2770is het setgid-bit: nieuwe bestanden in deze map krijgen automatisch de groepwebteam, in plaats van de persoonlijke groep van wie ze maakt. Inls -lzie je dat als eensop de plek van de groeps-x:drwxrws---.
Oefenen
Oefening 1. Lees: -rw-r----- 1 sam webteam 2048 Oct 12 begroting.xlsx. Wie mag wat? Wat is het octale getal?
Modelantwoord oefening 1
Sam (eigenaar) mag lezen en schrijven; leden van webteam mogen lezen; anderen niets. Octaal: 640.
Oefening 2. Je script backup.sh geeft Permission denied bij ./backup.sh. ls -l toont -rw-r--r--. Wat doe je?
Modelantwoord oefening 2
Het bestand mist het x-recht. chmod u+x backup.sh (of chmod 755 backup.sh als anderen het ook mogen uitvoeren). Geen sudo nodig: je bent zelf de eigenaar.
Oefening 3. Een collega stelt voor om een probleem met de webserver op te lossen met sudo chmod -R 777 /var/www. Waarom is dat een slecht idee, en wat is beter?
Modelantwoord oefening 3
777 geeft elke gebruiker en elk proces op het systeem schrijfrechten op de hele website. Wordt één dienst gehackt, dan kan de aanvaller je site aanpassen. Beter: zoek uit welke gebruiker toegang nodig heeft (bijvoorbeeld www-data alleen lezen), en geef precies dat, zoals chown -R root:www-data /var/www/site met mappen op 750 en bestanden op 640.
Lab: een gedeelde projectmap
- Start het lab:
docker run -it --rm registry.wizg.it/webhosting/beetje-labs:les4. Je bentstudenten magsudogebruiken; de gebruikerssamennoorbestaan al. - Maak de groep
webteamen voegsamennoortoe (niet jezelf). - Maak
/srv/projectmet groepwebteam, rechten2770. - Maak in
/srv/projecteen bestandREADME.txtdat iedereen in de groep kan lezen en bewerken (660). - Zet in je thuismap het bestand
geheim.txtop600. - Test:
sudo -u sam touch /srv/project/test.txtmoet lukken, en het nieuwe bestand moet groepwebteamhebben.sudo -u noor cat ~/geheim.txtmoet mislukken. - Controleer met
beetje check les4.
Samenvatting
- Elke gebruiker heeft een UID en groepen;
idlaat ze zien. Root (UID 0) mag alles. ls -ltoont rechten voor eigenaar, groep en anderen:rlezen,wschrijven,xuitvoeren of binnengaan.- Octaal: r=4, w=2, x=1. Veelgebruikt:
644,600,755,700,770. chmodwijzigt rechten,chowneigenaar en groep.- Gebruik
sudoper commando en met beleid; los rechtenproblemen nooit op met777.
In les 5 leer je bestanden bewerken in de terminal met nano en vim, en veilig configuratiebestanden aanpassen.
Lab
Een gedeelde projectmap voor een groep inrichten
π» Dit lab doe je op je eigen computer met Docker. Start de lab-container met (geeft de opdracht een eigen startcommando, gebruik dan dat):
$ docker run -it --rm registry.wizg.it/webhosting/beetje-labs:les4
Klaar? Controleer je werk met:
$ beetje check les4