Ik Van Linux

Gebruikers En Rechten


Ik heb het al een paar keer gezegd, Linux is een multi-user systeem. Er kunnen dus meerdere gebruikers tegelijkertijd gebruik maken van de machine. Je vraagt je wellicht af wat je daar aan hebt als je maar de enige gebruiker bent. Veel, zoals ik hierna ga uitleggen.

Je mag dit hoofdstuk overslaan en er later een keer op terugkomen. De informatie in dit hoofdstuk is wellicht een beetje ingewikkeld voor de nieuwe Linux gebruiker. Maar ik vind het wel heel belangrijk om te weten hoe het rechtensysteem onder Linux werkt, dus raad ik je toch aan om het te lezen. Wellicht kun je het later nog een keer lezen als je al een redelijk gevorderde Linux gebruiker bent om je geheugen wat op te frissen.

Drie soorten gebruikers


Er zijn drie soorten gebruikers in Linux. De gebruiker root is het opperhoofd, de systeem administrator, de super user. De root user mag alles. Hij mag zelfs het hele systeem kapot maken. Daarom loggen we liefst zo min mogelijk in als root gebruiker. Gewoon om onszelf tegen domme fouten te beschermen. We worden alleen maar root wanneer dat echt nodig is, en dan proberen we natuurlijk extra voorzichtig te zijn met wat we doen.

Dan zijn er nog de normale gebruikers. Op je eigen machine is er dat wellicht maar een. Maar het kunnen er vele meer zijn. Die ene gebruiker kan overigens meerdere keren tegelijkertijd zijn ingelogd, wat ook een vorm van multi-user gebruik is.

En tenslotte zijn er nog de systeemgebruikers. Dat zijn eigenlijk geen gebruikers van vlees en bloed, maar het zijn systeemprocessen die onder een eigen naam, met de daarbij behorende beperkte rechten, hun werk doen. Omdat die gebruikers slechts beperkte rechten hebben kan het systeem niet kapot gemaakt worden mocht een van die processen rare dingen doen, door een bug of door een hacker die op het systeem weet in te breken. Systeem gebruikers krijgen doorgaans geen shell toegewezen, en kunnen derhalve zelf dus geen commando’s uitvoeren.

Laten we eens kijken wie er allemaal zijn ingelogd op de machine:

w
 23:56:32 up 18 days,  1:40, 3 users,  load average: 0.15, 0.10, 0.04
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
pi       tty1     -                23:59   11.00s  2.15s  0.57s nano test
pi       pts/0    192.168.59.10    23:54    5:39   0.92s  0.92s -bash
pi       pts/1    192.168.59.81    23:56    1.00s  1.01s  0.06s w

Je ziet hier een voorbeeld, waarbij ik drie keer ben ingelogd op mijn Raspberry Pi. Een keer op de normale console (tty1), en twee keer via ssh (pts/0 en pts/1). En alle drie de keren is het de gebruiker pi die is ingelogd. Je ziet ook hoe laat er is ingelogd en hoeveel die gebruiker het systeem belast en welk commando hij/zij op dat moment aan het uitvoeren is.
De eerste gebruiker is met de tekstverwerker nano bezig. De tweede zit in bash, en doet waarschijnlijk niet heel veel.
En de derde gebruiker is op dit moment het w commando aan het uitvoeren. Ik vraag me af wie dat dan is?

Rechten


En dan komen we nu bij een belangrijke eigenschap van Linux. Het rechtensysteem. Gebruikers hebben zo hun eigen rechten. Zo hebben ze bijvoorbeeld het recht om bestanden aan te maken, te wijzigen en weer weg te gooien in hun eigen home directory. Ze hebben echter niet het recht bestanden van een andere gebruiker te wijzigen. Dat zou een mooie boel zijn als dat wel mocht.
Elk bestand of directory heeft dus een eigenaar.

Basisrechten

Er zijn drie basisrechten in Linux:

  • Het recht om een bestand te lezen (Read).
  • Het recht om een bestand te schrijven (Write). Bestanden aanmaken, wijzigen, weggooien en hernoemen vallen allemaal onder het schrijfrecht.
  • Het recht om een bestand uit te voeren (eXecute).

Standaard heeft een gebruiker alleen het lees en schrijfrecht op zijn eigen bestanden. Op speciaal verzoek kan aan een bestand ook het uitvoerrecht gegeven worden.

Merk op dat dat anders is dan bij Windows. Bij Windows bepaalt de bestandsextensie of een bestand uitvoerbaar is. Als het bijvoorbeeld op .exe eindigt is het per definitie uitvoerbaar. In Linux maakt het niet uit hoe een bestand heet, als het eXecute recht niet is toegekend aan een bestand kun je het niet uitvoeren.

Bij een directory ligt het ietsje anders. Als een directory geen eXecute rechten bezit dan kun je niet met cd in zo’n directory gaan staan om daar rond te snuffelen. Als je wel leesrechten hebt op een directory zonder eXecute rechten dan kun je er wel bestanden uit lezen, maar dan moet je wel weten wat het pad is naar dat bestand, want je bent niet in de gelegenheid om rond te snuffelen.

Dus de enige die rechten kan ontlenen aan een bestand of directory is de eigenaar. O ja, en de root gebruiker, want die mag alles. Andere gebruikers kunnen niet bij jouw bestanden.

Groepen

Tot zover de rechten van gebruikers. Als dit het hele verhaal zou zijn geweest dan zouden we een probleem hebben. Hoe voer je bijvoorbeeld een programma uit wat niet van jou is? Bijna alle Linux commando’s zijn uitvoerbare bestanden, waarbij root meestal de eigenaar is.

Elk bestand behoort ook tot een groep. Meestal is de groepsnaam hetzelfde als de gebruikersnaam. Standaard hoor je bij je eigen groep. Dus de gebruiker pi hoort ook bij de groep pi, als enige.
Je kunt de drie basisrechten ook aan de groep toekennen, onafhankelijk van de basisrechten van de eigenaar van het bestand. Je kunt dus de eigenaar lees en schrijfrechten geven, terwijl de groep alleen maar leesrechten heeft. Iedereen die lid is van die groep, maar niet de eigenaar zelf is, heeft dan de bijbehorende rechten.

Als gebruiker kun je tot meerdere groepen behoren. Op die manier kun je heel fijnmazig bepalen wie wat allemaal mag in Linux.
Een heel goed voorbeeld van dit soort groepsrechten is het recht om de Gpio poorten van de Raspberry Pi te mogen gebruiken. Standaard mag je die poorten niet besturen. Vaak wordt dan voor het gemak het programma, wat de poorten bestuurt, uitgevoerd als root, want die mag alles. Maar dat soort praktijken wordt sterk afgeraden in de Linux wereld. Het is beter om jezelf aan de gpio groep toe te voegen. Op die manier mag jij wel de Gpio poorten besturen, maar kun je niet als neveneffect het systeem kapot maken.

De Rest Van De Wereld

Tenslotte hebben we nog de rest van de wereld. Eigenlijk wordt daarmee elke gebruiker op het systeem bedoeld. Het maakt daarbij niet uit of dat nu een gebruiker van vlees en bloed is, of een systeemgebruiker.
De rest van de wereld kent ook de drie bovengenoemde basisrechten. Geef je de rest van de wereld dus het recht om een bestand te kunnen lezen dan is er geen houden meer aan, iedereen die toegang tot het systeem heeft kan dat bestand dan lezen. Tenzij dat bestand in een directory staat waar de hele wereld geen toegang toe heeft natuurlijk. Want dan zou het bestand op zich wel leesbaar zijn, maar men kan niet in de directory komen waar het bestand staat.

Rechten En Eigenaar Bekijken

Voor dit voorbeeld maken we even een bestand aan in onze home directory, mocht dat bestand nog niet bestaan, en gaan daar wat mee spelen:

touch konijn
ls -l konijn
-rw-r--r-- 1 pi pi 0 Dec  6 09:29 konijn

Laten we van links naar rechts gaan bekijken wat hier allemaal staat.

  • Het eerste streepje geeft aan dat het een normaal bestand is. Een l (kleine letter L) zou aangeven dat het een symbolische link zou zijn, ook wel bekend als een snelkoppeling in Windows. Een d zou aangegeven hebben dat het een directory betreft. Maar hier is het dus een bestand, want het is een streepje.
  • Dan staat er rw- . Dat zijn de drie basisrechten van de eigenaar van het bestand. De r staat voor Read, ofwel leesrechten. De w staat voor Write, ofwel schrijf rechten. Het streepje geeft aan dat het eXecute recht niet is toegekend aan dit bestand. Dit is dus geen uitvoerbaar bestand. Als het dat wel geweest was zou hier een x staan.
  • Dan staat er r-- . Dit zijn de drie basisrechten van de groep van het bestand. Welke groep dat is zien we zo. Je ziet dat de hele groep dit bestand alleen maar mag lezen, want de schrijf en execute rechten zijn niet ingevuld. Overigens heeft de eigenaar wel schrijfrechten, dus die mag nog steeds naar het bestand schrijven, ondanks dat hij/zij dat volgens de groep niet zou mogen. Als je eenmaal een recht hebt kan een andere instelling dat recht niet meer ontnemen.
  • Dan staat er nog een keer r-- . Dit zijn de drie basisrechten van de rest van de wereld, ofwel alle andere gebruikers op het systeem. In dit geval mag dus iedereen het bestand lezen, ongeacht wat de instelling van de groep zou zijn geweest.
  • De 1 geeft aan dat het bestand maar 1 naam heeft. Wat dit betekent zien we later nog als we het over hard links en inodes hebben.
  • De eerste pi op de regel is de naam van de eigenaar van het bestand. Die eigenaar krijgt dus de rechten van het eerste groepje rw- .
  • De tweede pi op de regel is de naam van de groep waar het bestand toe behoort.
  • De 0 geeft de lengte van het bestand in bytes. Dat kan kloppen want we hebben dit bestand zojuist aangemaakt met niets erin.
  • Dec 6 09:29 is de datum en de tijd waarop het bestand is aangemaakt, of voor het laatst is gewijzigd.
  • Tenslotte zie je ook nog hoe het bestand eigenlijk heet, konijn dus.

Bestanden hebben nog een paar eigenschappen meer, maar dat laat het ls -l commando nu niet zien. Dit hier zijn wel de meest belangrijke eigenschappen van een bestand.

Nog een klein voorbeeldje van een directory.

mkdir kooi
ls -l kooi
total 0

Hmm. Dat is vreemd. Ik had een zelfde soort output verwacht als daarnet. Maar nu zegt hij alleen maar hoeveel kilobytes er in de directory staan.
Dat komt omdat je met ls -l kooi vraagt om de inhoud van de directory. Dat zijn dus niet de eigenschappen van de directory zelf. Je kunt dat corrigeren met de -d switch.

ls -ld kooi
drwxr-xr-x 2 san san 4096 Dec  6 09:43 kooi

Zie je wel, de eerste letter van de regel is een d, wat betekent dat we het over een directory hebben. De indeling van de rest van de regel is gelijk aan die van het bestand hierboven. Met dat verschil dat de eigenaar, de groep en de wereld eXecute rechten hebben op de directory. Dat betekent dus dat ze allemaal in de directory kunnen gaan staan en kunnen rondsnuffelen. Ontneem je iemand dat recht, met behoud van het leesrecht, dan mag die gebruiker, groep of wereld nog wel steeds bestanden uit je directory lezen, maar dan moet hij/zij wel het pad van dat bestand kennen. Want opzoeken is er niet bij.

Bestandsrechten Wijzigen

Alleen wanneer je eigenaar van een bestand bent kun je de rechten van een bestand wijzigen. Root mag dat natuurlijk ook, want die mag alles. Laten we dat eens doen met ons konijn:

chmod 777 konijn
ls -l konijn
-rwxrwxrwx 1 pi pi 0 Dec  6 11:47 konijn
chmod 124 konijn
ls -l konijn
---x-w-r-- 1 pi pi 0 Dec  6 11:47 konijn
chmod 644 konijn
ls -l konijn
-rw-r--r-- 1 pi pi 0 Dec  6 11:47 konijn

Hierboven staan 3 voorbeelden waarbij de rechten van een bestand worden gewijzigd middels een drie cijferig octaal getal. Het octale talstelsel kent 8 mogelijkheden per cijfer, en laat daar nu precies in 3 bits passen.
Het meest linkse cijfer bepaalt de rechten van de eigenaar van het bestand. Het middelste cijfer bepaalt de rechten van de groep waar het bestand aan toebehoort. En het meest rechtse cijfer bepaalt de rechten van de wereld.
Een octaal cijfer kun je dus ook lezen als 3 bits. Als het meest linkse, het bit met de hoogste waarde (4), een 1 is dan wordt het leesrecht gegeven. Als het middelste bit, met de waarde 2, een 1 is dan wordt het schrijfrecht gegeven. En als tenslotte het meest rechtse bit, met de waarde 1, een 1 is dan wordt het eXecute recht gegeven.

Dus bij een 7 zijn alle 3 de bits een 1, waardoor alle 3 de rechten gezet worden. In ons eerste voorbeeld geldt dat dus voor zowel de eigenaar, de groep en de wereld voor het bestand konijn.
In ons tweede voorbeeld worden er 3 verschillende cijfers gebruikt. Probeer eens te beredeneren waarom 124 resulteert in de rechten --x-w-r-- .
En tenslotte zetten we de rechten weer terug op rw voor de eigenaar en alleen r voor de andere twee.

Het chmod commando kent nog meer mogelijkheden om rechten toe te kennen en te ontnemen. Hier zijn een paar voorbeelden:

chmod u+x konijn
chmod g+w konijn
chmod o+r konijn
chmod a-x konijn

Voer bovenstaande commando’s allemaal eens uit en kijk dan eens met ls -l konijn wat het effecten op de rechten van het bestand zijn.
De eerste letter van de eerste parameter geeft aan voor wie je het recht wilt instellen. Daarbij staat u voor user (gebruiker), g voor group, o voor others en a voor allemaal. Dus o is voor de wereld rechten, en allemaal wil zeggen dat alle drie de rechten tegelijk aangepast worden.
De middelste + of - geeft aan of je het recht wilt geven of wilt ontnemen. De laatste letter van deze parameter geeft aan welk recht je wilt bewerken, x voor eXecute, w voor Write en r Read.

Welke manier van werken jouw voorkeur heeft is aan jou.

Eigenaar En Groep Wijzigen

Om de eigenaar en/of groep van een bestand te wijzigen gebruik je het commando chown en/of chgrp . Ik beperk me hier tot het chown commando (CHange OWNer), want daarmee kun je zowel de eigenaar als ook de groep wijzigen.

chown pi:users konijn

Met dit commando kun je zowel de eigenaar als groep van een bestand wijzigen. Je kunt natuurlijk ook meerdere bestanden tegelijk wijzigen. De eerste parameter bevat de nieuwe eigenaar en de nieuwe groep, gescheiden door een dubbele punt. Als je alleen de eigenaar wilt wijzigen hoef je de dubbele punt en de groep niet op te geven. Wil je alleen de groep wijzigen dan hoef je de eigenaar niet in te vullen, de dubbele punt is dan echter wel verplicht.

Het bovenstaande voorbeeld maakt dat het bestand deel uit gaat maken van de groep users. Iedere gebruiker van vlees en bloed is doorgaans lid van die groep, daarmee maak je het mogelijk dat alle normale gebruikers toegang kunnen krijgen tot dat bestand, vooropgesteld dat de groepsrechten goed staan natuurlijk.

Maar probeer nu eens dit:

chown games konijn
chown: changing ownership of 'konijn': Operation not permitted

Dat gaat dus niet, want de gebruiker pi heeft daar geen toestemming voor. Of dit:

chown :root konijn
chown: changing group of 'konijn': Operation not permitted

Je mag dus ook een bestand geen lid maken van de root groep. Jammer. Maar wat mag dan wel? Eigenlijk niet zo heel veel. Je mag alleen de groep van een bestand wijzigen in een groep waar jij lid van bent, behalve de root groep.
En de eigenaar van het bestand mag je zelf nooit wijzigen, zelfs niet van je eigen bestand. De gebruiker root mag dat wel, want die mag alles. Maar hoe doe je dat? Door tijdelijk super user te worden, te vergelijken met de systeem administrator. Dat doe je door het commando sudo (Super User DO) voor het commando te zetten wat je als root wilt uitvoeren.

sudo chown games:root konijn
ls -l konijn
-rw-r--r-- 1 games root    0 Dec  6 11:47 konijn

Het kan zijn dat je om een wachtwoord gevraagd wordt wanneer je het sudo commando gebruikt. Bij de normale Raspberry Pi image wordt die vraag vaak niet gesteld. Maar dat vind ik persoonlijk niet zo’n fijne gedachte. Ik schakel de wachtwoord vraag liever in. Hoe je dat doet staat elders op mijn website.
Let wel, het intypen van het wachtwoord blijft weer onzichtbaar. En het systeem blijft je wachtwoord een kwartiertje onthouden, zodat je niet bij elk sudo commando het wachtwoord weer opnieuw hoeft in te typen. Alleen als je meer dan een kwartier of zo geen sudo commando meer gebruikt hebt moet je het wachtwoord opnieuw intypen.

Het feit dat je sudo mag gebruiken is ook weer een recht. Op je Raspberry Pi mag je gerust sudo worden. Maar op servers die door anderen beheerd worden heb je dat recht vaak niet.
Het kan zelfs voor komen dat je wel sudo mag gebruiken, maar dan op een beperkt aantal commando's. Dat is dus allemaal heel fijnmazig in te stellen in Linux.

Probeer het bestand konijn nu eens te wijzigen. Het volstaat om het bestand een keer aan te raken zodat de tijdstempel geupdate wordt.

touch konijn
touch: cannot touch 'konijn': Permission denied

Hmm. Dat mogen we niet. We zijn niet langer de eigenaar van het bestand en we hebben er geen schrijfrechten op.

sudo touch konijn

Mag wel. Laten we het bestand nu maar weggooien:

rm konijn
rm: remove write-protected regular empty file 'konijn'?

Dit is een speciaal geval. Je mag het bestand niet zomaar weggooien. Maar omdat je schrijfrechten in de huidige directory hebt mag je het bestand toch wissen. Maar daarvoor vraagt het systeem wel eerst even je toestemming. Die toestemming geef je door de y voor Yes in te drukken, gevolgd door de Enter toets. Elke andere toets voorkomt dat het bestand wordt weggegooid.
Wanneer je heel veel van dit soort bestanden moet weggooien dan moet je heel vaak op y Enter drukken. Dat is lastig. Geef in dat geval de -f switch achter het rm commando om het weggooien te forceren.

Een Groep Toevoegen Aan Een Gebruiker

Je kunt zien tot welke groepen je behoort door het id commando uit te voeren.

id
uid=1000(pi) gid=1000(pi) groups=1000(pi),4(adm),20(dialout),24(cdrom),27(sudo),
29(audio),44(video),46(plugdev),60(games),100(users),101(input),108(netdev),
997(gpio),998(i2c),999(spi)

De uid is het User ID, een uniek getal wat de gebruiker aangeeft. Daarachter staat de naam van die gebruiker tussen haakjes.
De gid is de Group ID waar je toe behoort. Dat is dus je standaard groep. Alle bestanden die jij aanmaakt horen automatisch tot die groep.
Daarna komen alle groepen waar je aan toegevoegd bent om de desbetreffende rechten te verwerven.

Om een nieuwe groep aan jezelf, of iemand anders, toe te voegen doe je dit:

sudo usermod -aG groepsnaam gebruiker

De groepsnaam is natuurlijk de naam van de groep die je aan de gebruiker wenst toe te voegen. Gebruiker is de naam van de gebruiker die die nieuwe groep toegevoegd krijgt.