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.
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?
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.
Er zijn drie basisrechten in Linux:
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.
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.
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.
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.
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.
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.
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.
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.