Toegangsrechten wijzigen met chmod

Op een groot deel van de webservers draait het Unix-achtige besturingssysteem Linux. Alle Unix-derivaten hebben gemeen dat aan bestanden en mappen bepaalde toegangsrechten worden toegekend. Je kunt die in Linux wijzigen met ‘chmod’, een command-line-programma dat in de terminal via het gelijknamige commando geactiveerd wordt.


Wat is chmod?

Het programma ‘chmod’, afkorting van ‘change mode’, werd begin jaren zeventig geïntroduceerd met de eerste versie van de AT&T-Unix. De toepassing chmod wordt in Unix-gebaseerde besturingssystemen gebruikt om toegangsrechten toe te kennen in bestandssystemen die de klassieke Unix-bestandsrechten ondersteunen. Dit geldt meestal voor alle standaard bestandssystemen op gangbare Linux-servers. Het systeem van Unix-bestandsrechten is gebaseerd op gebruikerscategorieën en individueel toegewezen basisrechten. In dit geval ondersteunt chmod twee verschillende functies: de symbolische notatie met letters, en de toewijzing van bestandsrechten door middel van op cijfers gebaseerde, octale codes. Het wijzigen van de toegangsrechten met chmod kun je alleen doen als je eigenaar van het bestand bent óf rootgebruiker. De opdracht, die je gewoon in de terminal intypt, heeft altijd de volgende syntaxis:

$ chmod options mode file

Op het commando chmod volgt het vrijblijvende element options. Daarmee definieer je extra eigenschappen van chmod. Het element mode vertegenwoordigt een rechtenmasker dat op het volgende bestand, d.w.z. een bestand of map, moet worden toegepast. Dit masker geeft aan of een gebruikersklasse nieuwe toegangsrechten moet krijgen of dat deze rechten uit reeds toegekende rechten moeten worden verwijderd.


Chmod: Gebruikersklassen

Gebruikersklassen en chmod

In Unix en Linux heeft elk bestand op een server individuele toegangsrechten. Hetzelfde geldt voor directories. De toegangsrechten worden geregeld volgens drie klassen van gebruikers:

  • Eigenaar (user): een gebruiker die een bestand aanmaakt in Unix wordt gewoonlijk automatisch gedefinieerd als de ‘user’ van het bestand. Het eigendom kan later worden gewijzigd door het commando ‘chown’. In de symbolische notatie krijgt de gebruikersklasse ‘user’ de letter ‘u’.
  • Groep (group): de gebruikersklasse ‘group’ omvat verschillende gebruikersaccounts op de server. In Unix-bestandssystemen wordt elk gebruikersaccount automatisch toegewezen aan een hoofdgroep. Lidmaatschap in andere groepen is ook mogelijk. Zowel de eigenaar als de rootgebruiker kan bestanden groeperen met behulp van het ‘chgrp’ commando. De gebruikersklasse ‘groep’ wordt in de symbolische notatie met de letter ‘g’ weergegeven.
  • Andere (others): deze gebruikersklasse omvat alle gebruikers die geen user zijn van het bestand en ook niet bij een groep horen. Deze gebruikersklasse heeft de symbolische notatie ‘o’.

Heeft een opdracht betrekking op alle gebruikersklassen (user, group en others)? Dan is in de symbolische notatie hiervoor de afkorting ‘a’ beschikbaar, voor ‘all’.


Chmod: Toegangsrechten

Toegangsrechten

Het Unix-bestandssysteem heeft drie basisrechten. Elk van de bovengenoemde gebruikersaccounts kan verschillende rechten hebben die door de eigenaar van het bestand zijn toegewezen:

  • Lezen (read): het toegangsrecht ‘read’ geeft een gebruiker leestoegang tot een bestand. In het geval van een directory kan hij de hele inhoud van die map lezen. Maar met het read-toegangsrecht kun je geen bestandsrechten bekijken. In de symbolische notatie wordt dit recht gecodeerd met de letter ‘r’, ook wel r-bit genoemd.
  • Schrijven (write): gebruikers met het toegangsrecht ‘write’ mogen de inhoud van het bestand wijzigen. Als ‘write’ is toegewezen aan een directory, mag de gebruiker in die map submappen en bestanden aanmaken. Het schrijfrecht wordt in de symbolische notatie weergegeven met een ‘w’. Het heet daarom ook wel w-bit.
  • Uitvoeren (execute): een gebruiker met dit toegangsrecht mag bestanden als programma uitvoeren en naar een andere directory gaan om daar te kijken welke submappen of bestanden er staan. De symbolische notatie kent aan dit recht de letter ‘x’ toe, ofwel het x-bit.

Denk er bij het toekennen van toegangsrechten aan dat machtigingen in Unix niet worden geërfd. Ofwel, als je een bestand in een directory aanmaakt, krijgt dat bestand niet automatisch de toegangsrechten die voor de hele directory gelden. Individuele bestandsrechten vloeien voort uit de machtiging van het programma dat het bestand heeft aangemaakt.


Weergave van toegangsrechten in de terminal

Om het systeem van Unix-toegangsrechten te onthouden, is het handig om te weten hoe de terminal toegangsrechten voor bestanden of mappen weergeeft. Met de opdracht ‘ls’ kan de inhoud van een map in de terminal weergegeven worden. Voor informatie over bestandsmachtigingen gebruik je (als user of rootgebruiker) het attribuut ‘-l’. Hieronder zie je de toegangsrechten voor de map ‘voorbeeldmap’:

gebruiker@computer:~$ ls –l
drwxrw-r-- 0 voorbeelduser voorbeeldgroup 0000 2016-01-01 voorbeeldmap

De tekens aan het begin zijn bijzonder belangrijk voor bestandsmachtigingen:

drwxrw-r--

Deze coderen het bestandstype en toegangsrechten voor de drie gebruikersklassen. Het beginteken geeft het type bestand aan. De string in het voorbeeld begint met een d. Het is dus het bestandstype ‘directory’. Daarna volgen drie blokken van elk drie tekens. Elk van deze drie blokken vertegenwoordigt een gebruikersklasse volgens de standaardvolgorde (user, group, others). De letters zijn afkortingen voor de symbolische notatie van de verschillende toegangsrechten:

Code: d rwx rw- r--
Betekenis: d = directory user group other
r = read r = read r = read
w = write w = write -
x = execute - -

De bestandsmachtigingen voor de map ‘voorbeeldmap’ zijn daarom als volgt: de eigenaar (user) mag de map wijzigen (r), hij heeft schrijfmachtigingen (w) en het uitvoerrecht (x) waarmee hij een lijst van de bestanden in de map mag bekijken. Leden van de groep ‘voorbeeldgroep’ hebben lees- en schrijfrechten (r, w), ze mogen bestanden opslaan in de directory. Alle andere gebruikers mogen alleen bestanden en submappen in de directory openen als zij de naam kennen (r). Maar let op: de gedefinieerde toegangsrechten gelden alleen voor de map – niet voor de submappen of bestanden in die map. Voor een tekstbestand in deze map kunnen de toegangsrechten er totaal anders uitzien:

-rw------- 0 voorbeelduser voorbeeldgroup 0000 2016-01-01 voorbeeld.txt

In dit voorbeeld geeft het initiële koppelteken (-) aan dat het een gewoon bestand is en geen directory of link. De notatie rw- geeft de eigenaar zowel lees- als schrijftoegang. Aangezien dit een tekstbestand is en geen programma, wordt het uitvoeringsrecht weggelaten en met een koppelteken (-) genoteerd. Het koppelteken staat ook in de blokken die zijn toegewezen aan de gebruikersklassen ‘group’ en ‘others’. Dit betekent dat alle toegangsrechten tot het voorbeeldbestand voor deze gebruikersklassen zijn uitgesloten.


Toegangsrechten wijzigen met chmod via de terminal

Als je de toegangsrechten tot een map of bestand wilt wijzigen voor één of alle gebruikersklassen, gebruik je in Linux ‘chmod’. Een bestandseigenaar of rootgebruiker voert deze opdracht in, inclusief het rechtenmasker (mode) en de bestandsnaam (file).

$ chmod options mode file

Het rechtenmasker kun je in een symbolische notatie of als octale code definiëren.


Chmod: Symbolische notatie

Symbolische notatie

Als je het rechtenmasker volgens de symbolische notatie opstelt, gebruik je de volgende operatoren, die de respectievelijke gebruikersklassen koppelen aan bestandsrechten.

+ - =
Met de operator ‘+’ koppel je nieuwe bestandsrechten aan een gebruikersklasse. Alleen de betroffen bestandsrechten worden hierbij overschreven. De operator ‘-‘ verwijdert een bestandsrecht van een gebruikersklasse. Wil je bestandsrechten voor een gebruikersklasse definiëren, ongeacht de vorige rechten? Dan gebruik je hiervoor de operator ‘=’

Als bijvoorbeeld het nieuw geïntroduceerde bestand ‘voorbeeld.txt’ zo moet worden gewijzigd dat niet alleen de eigenaar (user), maar ook alle andere gebruikers (group, others) schrijf- en leesrechten krijgen, dan zou het chmod-commando er als volgt uitzien:

$ chmod ugo+rw voorbeeld.txt
$ chmod a+rw voorbeeld.txt

Een verwijzing naar alle gebruikersklassen zou ook mogelijk zijn:

In de terminal zou het bestand ‘voorbeeld.txt’ nu de volgende rechten tonen in plaats van de oorspronkelijke toegangsrechten:

-rw------- a+rw -rw-rw-rw-
Toegangsrechten voor de wijziging: chmod-opdracht: Toegangsrechten na de wijziging:
user: read, write a = all user: read, write
group: geen rechten + = Toegangsrecht toevoegen group: read, write
other: geen rechten r = read other: read, write
w = write

Chmod: Octale notatie

Octale notatie

De symbolische notatie is gemakkelijk te begrijpen, maar wordt wat onhandig bij frequent gebruik. Veel beheerders gebruiken daarom de octale notatie bij het toewijzen van toegangsrechten. Dit is een reeks van drie cijfers waarbij elk cijfer een gebruikersklasse van de server vertegenwoordigt. De octale notatie is ook gebaseerd op de standaardvolgorde:

Cijfer 1 Cijfer 2 Cijfer 3
Hoort bij de gebruikersklasse ‘eigenaar’ (user) Hoort bij de gebruikersklasse ‘groep’ (group) Hoort bij de gebruikersklasse ‘overige’ (others)

De waarde van elk cijfer bepaalt de toegangsrechten die aan de individuele gebruikerscategorieën worden toegekend. Vervolgens geldt de som van de individuele waarden die je aan de respectievelijke rechten toekent:

Toegangsrecht Waarde
Lezen 4
Schrijven 2
Uitvoeren 1
Geen rechten 0

Deze toekenning leidt tot de volgende waardecombinaties:

Toegangsrecht(en) Waarde
Geen 0
Alleen uitvoeren 1
Alleen schrijven 2
Schrijven/uitvoeren 3
Alleen lezen 4
Lezen/uitvoeren 5
Lezen/schrijven 6
Alle toegangsrechten 7

Voor een voorbeeld van de octale notatie gebruiken we weer het bestand ‘voorbeeld.txt’. Vóór we de toegangsrechten met chmod wijzigden, gold deze code:

-rw------- 0 voorbeelduser voorbeeldgroup 0000 2016-01-01 voorbeeld.txt

Alleen de eigenaar (user) heeft de toegangsrechten ‘read’ (r) en ‘write’ (w). Alle andere gebruikers hebben geen toegangsrechten tot het bestand. Ervan uitgaande dat de eigenaar van plan is om de ‘voorbeeldgroep’ leesrechten toe te kennen, wordt dit de octale code:

$ chmod 640 voorbeeld.txt

De eigenaar heeft dezelfde toegangsrechten als voorheen, maar nu met de waarde 6 op de eerste plaats in het rechtenmasker: 4 (lezen) + 2 (schrijven). De tweede waarde in het rechtenmasker specificeert de toegangsrechten van de groep: 4 (lezen). Andere gebruikers hebben geen rechten en zijn met een 0 gecodeerd.

Als de gebruikerscategorie ‘others’ leesrechten moet krijgen, wordt dit de octale code:

$ chmod 644 voorbeeld.txt

De 4 op de derde plaats van de octale code definieert dit leesrecht voor andere gebruikers op de server.


Opties van het commando chmod

Bij het toekennen van toegangsrechten heb je verschillende opties, ongeacht of je een symbolische of numerieke notatie kiest. Deze opties plaats je tussen de opdracht en het rechtenmasker.

Code Optie Omschrijving
-R recursive De wijziging van toegangsrechten geldt voor alle bestanden en submappen in een map.
-v verbose Na de command-line-opdracht wordt een diagnose gesteld voor alle verwerkte bestanden.
-c changes Na de command-line-opdracht wordt een diagnose gesteld voor alle gewijzigde bestanden.
-f silent Foutmeldingen worden niet getoond.

Het volgende voorbeeld toont een commando waarbij de wijziging van toegangsrechten recursief verwijst naar de submappen en bestanden in de map:

$ chmod -R 744 voorbeeldmap

Voor alle bestanden en submappen in de directory ‘voorbeeldmap’ geldt het volgende: de eigenaar krijgt volledige toegangsrechten (7), groepsleden en andere gebruikers hebben alleen leestoegang (4).

Het voordeel van het Unix-bestandssysteem is zijn eenvoudige structuur. Je kunt complexe dagelijkse problemen bij het werken met een multi-user-besturingssysteem eenvoudig oplossen. Bovendien blijft het systeem intuïtief voor gebruikers en gebruiksvriendelijk voor computersystemen. Maar als je bij het instellen van toegangsrechten de terminal niet wilt gebruiken, kun je ook een bestandsbeheerder nemen. Traditionele FTP-programma's bieden hiervoor meestal een grafische interface.