Octale getallen gebruiken met chmod en umask |
Het UNIX bestandssysteem onderscheid verschillende typen bestanden (files):
Gewone bestanden
Directories (directory files).
Apparatuurbestanden (special files, devices). Ze zijn onder te verdelen in blokbestanden en tekenbestanden.
Bestanden voor interproces communicatie: FIFO bestanden (named pipes) en sockets.
Gewone bestanden zijn programma's en databestanden. Een deel ervan bevat door "cat bestandsnaam" te lezen tekst (tekst, html, shell scripts); andere zogenaamde binaire bestanden zijn alleen maar door de hardware te ontcijferen (multimedia, gecompileerde programma's). Overigens worden alle bestanden binair (als reeksen van enen en nullen) opgeslagen.
Directories zijn bestanden die naar andere bestanden verwijzen. Een (leeg) directorybestand verwijst minimaal naar zichzelf (.) en naar de bovenliggende directory (..). Een gevulde directory bevat de locaties en attributen van de in de directory genoemde bestanden. Een directorybestand is dus een soort bestandslijst (index).
Als u een directorybestand wist, dan raakt u de verwijzingen naar de daarin genoemde bestanden en subdirectories kwijt. Het onvolledig (afgebroken) wissen of beschrijven van een directorybestand kan leiden tot lost clusters: naamloze bestanden, die in geen enkele directoryingang kunnen worden ondergebracht.
In de desktopmetafoor spreekt men van mappen. Uw bestanden worden in mappen bewaard. Maar die vergelijking gaat niet helemaal op: het wissen van een map betekent niet automatisch dat u bestanden kwijt bent. U raakt slechts de verwijzingen naar de bestanden kwijt. Met een unerase programma kunt u ze vaak nog redden.
Onder UNIX fungeert het bestandssysteem als een interface naar de hardware. Dit maakt Unix gemakkelijker porteerbaar naar andere hardware. Stuurbestanden projecteren de door hen benaderde hardware elementen op het bestandssysteem. Zo worden vaste schijven als blokbestanden afgebeeld (bijv. /dev/hda). Apparaten die sequentieel afgelezen worden (modem, geluidskaart) worden afgebeeld als tekenbestanden (character devices).
Nu is het niet zo het midigeluid van uw geluidskaart ook daadwerkelijk in de map /dev/midi terecht komt. En het blokbestand /dev/hda1 kan best op /dev/hdb1 zitten (als daar uw Linux bestandssysteem zit).
sjoerd@laptop:~> ls -ila /dev/midi 6526 lrwxrwxrwx 1 root root 6 jan 21 20:44 /dev/midi -> midi00 sjoerd@laptop:~> ls -ila /dev/midi00 6528 crw-rw-rw- 1 root audio 14, 2 mrt 23 2002 /dev/midi00
Zo'n apparatuurbestand (hier een symlink naar de 1e midi-interface midi00) is meer te zien als een adres waar programmeurs de stuurbestanden van de apparaten kunnen vinden. En dan is /dev/midi wel zo handig als Midistraat 1.
Een groot voordeel van de weergave van de hardware en stuurbestanden als apparatuurbestanden is dat u er gebruiksrechten aan kunt geven. Zo blijkt /dev/midi00 tot de groep audio te behoren. De c in crw-rw-rw- geeft aan dat het een character device is. Hij is door iedereen te lezen en te beschrijven. Maar niet door iedereen tegelijkertijd. De aan het bestandssysteem gekoppelde bestandsvergrendeling (file-locking) voorkomt dat meerdere gebruikers (programma's) tegelijkertijd dezelfde hardware benaderen.
Onder OS/2 en DOS zijn eigenlijk alleen het toetsenbord (CON) en de printerpoorten (LPT) via symbolische namen in batches te benaderen. Onder Linux zijn een paar duizend apparatuurbestanden in de /dev map. Hier kunt u met cat informatie opvragen en met chmod de permissies tot de hardware regelen.
Linux geeft ieder bestand een uniek bestandsnummer. Dit inode of index nummer is op te vragen met ls -i(node). De bestandseigenschappen zijn op te vragen met ls -l(ong). Ls staat voor list, de optie -a voor all, die ook verborgen bestanden laat zien. (zie man ls voor meer opties).
Hieronder zijn de opties in ila gecombineerd.
sjoerd@visser:~/map > ls -ila
total 7
915507 drwxr-xr-x 4 sjoerd users 1024 Oct 21 22:06 .
280577 drwxr-xr-x 37 sjoerd users 3072 Oct 21 22:05 ..
915510 -rw-r--r-- 1 sjoerd users 10 Oct 21 22:06 derde.txt
915508 drwxr-xr-x 2 root root 1024 Oct 21 21:57 rootmap
796824 drwxr-xr-x 2 sjoerd users 1024 Oct 21 22:03 submap
Wat valt hier te zien?
Ik bevind me in de directory map (~/map) in mijn homedirectory (~). Linux toont informatie over vijf bestanden: de huidige directory (.), de onderliggende directory (..), het bestand derde.txt en de subdirectories rootmap en submap. Directories zijn te herkennen aan het d attribuut bij de toegangsrechten. Optioneel geeft de shell ze vet of gekleurd weer.
Andere letters waardoor bestanden worden gekenmerkt zijn: l (link), b (block device) en c (character device).
De eerste twee directoryingangen (. en ..) zijn verborgen. Dit geldt voor alle bestanden met een punt ervoor. Met ls -a kunt verborgen bestanden zien.
Per bestand laat ls -ila het volgende zien:
Het unieke bestandsnummer van het bestand (915510 voor derde.txt)
De toegangsrechten van het bestand
Het aantal namen van het bestand (een bestand kan dus meerdere namen hebben)
De eigenaar van het bestand (hier: sjoerd of root)
De groep waartoe de eigenaar behoort (hier: users of root)
De grootte in bytes van het bestand
De datum van aanmaak/of laatste wijziging van het bestand
De naam van het bestand (de naam van de harde link)
Ad 3 en 8. Met de opdracht ln (link) kunt u een bestand een tweede naam geven. Men spreekt van een harde link. Het bestand verandert hierdoor niet, maar heeft nu twee namen. Hier krijgt derde.txt als extra naam vierde.txt. De harde links verwijzen naar hetzelfde bestand met bestandsnummer 915510. Ook het tijdstip van aanmaak verschilt niet.
sjoerd@visser:~/map > ls -il
total 3
915510 -rw-r--r-- 1 sjoerd users 10 Oct 21 22:06 derde.txt
915508 drwxr-xr-x 2 root root 1024 Oct 21 21:57 rootmap
796824 drwxr-xr-x 2 sjoerd users 1024 Oct 21 22:03 submap
sjoerd@visser:~/map > ln derde.txt vierde.txt
sjoerd@visser:~/map > ls -il
total 4
915510 -rw-r--r-- 2 sjoerd users 10 Oct 21 22:06 derde.txt
915508 drwxr-xr-x 2 root root 1024 Oct 21 21:57 rootmap
796824 drwxr-xr-x 2 sjoerd users 1024 Oct 21 22:03 submap
915510 -rw-r--r-- 2 sjoerd users 10 Oct 21 22:06 vierde.txt
Een bestand wordt pas gewist als de laatste bestandsnaam (harde link) die naar het inode nummer verwijst verwijderd is. Dus als u derde.txt met rm "wist", blijft bestand 915510 beschikbaar onder de naam vierde.txt. De reden is dat een bestand onder UNIX niet wordt vastgelegd door de bestandsnaam, maar door het inode nummer. Bestandsnamen zijn slechts verwijzingen naar het inode nummer. Een enkel bestand kan dus onder verschillende namen in verschillende mappen op het EXT2 systeem voorkomen. Onder DOS en Windows moeten het dan verschillende bestanden zijn, maar onder UNIX en Linux kan het om één bestand gaan.
Om het beeld te completeren maak ik nu met cp (copy) een echte kopie van het bestand vierde.txt aan onder de naam kopie.txt. Zoals u kunt zien gaat het om een nieuw bestand met een later tijdstip van aanmaak en eigen inode nummer (915511). De inhoud is natuurlijk hetzelfde als dat van het origineel, maar de bestandseigenschappen verschillen.
sjoerd@visser:~/map > cp vierde.txt kopie.txt
sjoerd@visser:~/map > ls -il
total 4
915511 -rw-r--r-- 1 sjoerd users 10 Oct 21 23:41 kopie.txt
915508 drwxr-xr-x 2 root root 1024 Oct 21 21:57 rootmap
796824 drwxr-xr-x 2 sjoerd users 1024 Oct 21 22:03 submap
915510 -rw-r--r-- 1 sjoerd users 10 Oct 21 22:06 vierde.txt
Als u onder Linux een bestand aanmaakt (of download) wordt u eigenaar van het bestand.
Met commando chmod (change modus) zijn de rwx lettertjes van de bestandspermissies te veranderen.
Het commando heeft als syntaxis: chmod [opties][ugoa...][+ - =][rwxXstugo...] [bestand]
Veranderingen in de bestandspermissies betreffen bepaalde gebruikers: [ugoa...] staat voor user (eigenlijk eigenaar), de groep, anderen (others) of iedereen (all=u+g+o).
Ze worden gegeven (+), afgenomen (-) of exact gedefinieerd (=).
Ze betreffen bepaalde permissies/rechten: [rwx...] lezen (read), schrijven (write), uitvoeren van programma's of het doorzoeken van directories (execute).
Daarnaast zijn er uitgebreide toegangsrechten (Xst) om dit systeem te flexibiliseren: KFM (hiernaast) toont ze onder Special : het Set User en Group ID en de sticky bit (t).
De ugo uit [rwxXstugo...] slaat op de mogelijkheid om met chmod bestandspermissies te kopiëren: met chmod g+u geeft bijv. de groepsleden de mogelijkheden van de eigenaar.
En natuurlijk betreffen ze bepaalde bestanden: [bestand].
Tenslotte zijn er de chmod opties:
sjoerd@zolder:~ > chmod --help Usage: chmod [OPTION]... MODE[,MODE]... FILE... or: chmod [OPTION]... OCTAL_MODE FILE... or: chmod [OPTION]... --reference=RFILE FILE... -c, --changes like verbose but report only when a change is made -f, --silent, --quiet suppress most error messages -v, --verbose output a diagnostic for every file processed --reference=RFILE use RFILE's mode instead of MODE values -R, --recursive change files and directories recursively --help display this help and exit --version output version information and exit Each MODE is one or more of the letters ugoa, one of the symbols +-= and one or more of the letters rwxXstugo.
Maak alle mp3 bestanden in /mnt/mp3 voor alle gebruikers leesbaar.
chmod -R +r /mnt/mp3/*mp3 find /mnt/mp3/ -type f -exec chmod a+r {} \;
De directories moeten wel doorzoekbaar blijven:
find /mnt/mp3/ -type d -exec chmod u+rX {} \;
Om praktische redenen is root degene die programma's en bibliotheken installeert. Root wordt dus ook de eigenaar van vrijwel alle programmabestanden. De systeembestanden zijn met toegangsrechten zo beschermd dat gebruikers en indringers ze niet kunnen vernielen.
In de regel zal een door u opgeroepen programma ook onder uw naam lopen, ook al is root de eigenaar van het bestand. Hierdoor zullen bepaalde mappen, bestanden en diensten nooit met het programma voor u te benaderen zijn. Dit is wel zo veilig, aangezien het niet de bedoeling is dat een gebruiker met zijn bestandsbeheerder en editor aan andermans spullen komt.
Niet minder belangrijk: Ook systeembestanden (vrijwel altijd bezit van root) blijven zo veilig voor overmoedige gebruikers, slechte programmeurs en virussen. Om die reden lopen de meeste daemonen ook onder hun eigen account.
Maar beveiliging heeft ook nadelen. Soms moeten gebruikers wel aan systeembestanden komen. Bijv. als ze met passwd hun wachtwoord willen wijzigen. Of als ze met kppp inbellen naar het internet. Of als ze met whereis ook verborgen directories doorzoeken. Om dat mogelijk te maken is het SUID bit uitgevonden.
Een programma met het SUID-bit krijgt gedurende zijn looptijd het gebruikersnummer van de eigenaar van het bestand (meestal root). Zonder dit SUID bit zou een door een gebruiker gelanceerde inbelprogramma kppp de pppd daemon niet kunnen aanspreken, niet in var/log/messages kunnen schrijven of het modem voor andere gebruikers kunnen afschermen. U brengt SUID bit aan met chmod +s /pad/bestand. Of via het menu van een van de bestandsbeheerders (nc, kfm).
U vindt de programma's met het SUID (en Groeps ID) bit met de opdracht find:
zolder:~ # find / -perm +6000 -ls
Het Set Group ID (SGID) bit doet iets soortgelijks: Hierbij krijgt het programma tijdens de uitvoer het groepsnummer van de eigenaar van het bestand.
Alleen heel specifieke programma's hebben recht op het SUID of SGID bit. Idealiter mag een programma dat het SUID bit draagt alleen gebruikt worden om heel specifieke taken te vervullen. Het mag de beveiliging niet fundamenteel kunnen doorbreken. Een programma als chown (change owner) hoort pertinent niet in dit rijtje thuis. Waarom niet? Omdat het systeem van gebruikersrechten dan in duigen valt...
Bij de standaard gebruikersrechten kunnen groepsleden (bijv. de gebruikers van de samba share mp3) de bestanden wel lezen en uitvoeren, maar niet veranderen.
U kunt programma's met de SUID opzoeken met Kfind. In /bin zijn het: ping, su, passwd, mount en umount. Er zitten helaas ook veel spelletjes bij.
Het sticky bit op een map (1000) zorgt ervoor dat alleen eigenaars (en de root) bestanden in de map met het sticky bit mogen wissen. In plaats van een x of - voor execute rechten van "de anderen" ziet u een t. U ziet het sticky bit typisch in door iedereen gebruikte mappen als /tmp (de map van de tijdelijke bestanden) en /var/spool/mail/:
drwxrwxrwt 9 root root 21504 May 1 10:36 tmp
Achtergrond: Zo'n tijdelijke map wordt door iedereen gebruikt. Iedereen moet er zijn zooi in kwijt. Maar het is niet de bedoeling om deze map (met een x voor de rest van de wereld) zo open te gooien dat Jan ook Piets bestanden kan wissen. Dat wordt met chmod u+t /tmp voorkomen.
Het sticky bit op een gewoon bestand werkt heel anders: Als een uitvoerbaar bestand het sticky bitkrijgt wordt het bij benadering meteen in de swap space gezet. Hierdoor zal het sneller (her)laden. Alleen de root kan dit zo instellen.
Permissies voor hardware kunnen onder Linux op het bestandssysteem worden geschreven.
Als u als gebruiker uw COM4 (intern modem) voor alle (a)lle gebruikers en programma's wilt openen:
chmod a+rw /dev/modem (symbolic link naar /dev/ttsy3) chmod a+rw /dev/cua3 (oude benaming van /dev/ttsy3) chmod a+rw /dev/ttsy3 (de gangbare benaming van COM4)
Als uw zoontje teveel internet zou u met chmod naam -rw /dev/modem het modem specifiek voor hem kunnen verbieden.
Overigens is slimmer om hardware componenten aan aparte groepen (dialout, uucp) toe te wijzen dan ze chmod a+rw open te stellen voor Jan en alleman (zie: Als gebruiker internetten)
U kent het decimale stelsel van de lagere school. Het decimale stelsel werkt met meervouden van tien. Waarschijnlijk weet u ook dat de computer werkt met enen en nullen, waardoor meervouden van twee ontstaan (een binair stelsel). Hier wordt het octaal stelsel besproken.
Onder UNIX wordt het octaal stelsel aangewend om de toegangsrechten van een bestand te regelen.
Hier geldt: je hebt als eigenaar, groep of ander lees-, schrijf- of uitvoerpermissie of niet. Het gaat dan maar liefst om eenentachtig mogelijke combinaties (9 tot de macht 2, (3.3)^2 = 81) om toegangsrechten voor een bestand aan de eigenaar, de groep en de anderen te verdelen. U weet dat het met het rwxrwxrwx schema van ls kan. Maar daar valt op de prompt moeilijk mee te werken. Hoe worden die met letterschema's met octale getallen aangegeven?
Door de getallen van dit schema op te tellen.
Bestandstoegang |
Lezen (R) |
Schrijven (W) |
Uitvoeren (X) |
Totaal (alles) |
---|---|---|---|---|
Eigenaar (user) |
400 |
200 |
100 |
700 |
Groep (group) |
40 |
20 |
10 |
70 |
Anderen (others) |
4 |
2 |
1 |
7 |
Iedereen (all) |
444 |
222 |
111 |
777 |
Elke bevoegdheid krijgt een waarde. Een ontbrekende bevoegdheid (de - van ls) krijgt de waarde 0. Het rekent in de praktijk vrij eenvoudig. Want lezen staat voor 4, schrijven voor 2 en uitvoeren voor 1. Voor combinaties geldt de optelsom. De 7 staat dus voor rwx, de 6 voor rw, de 5 voor rx. En de positie van het driemanschap bepaalt of het gaat om de eigenaar, zijn groep of anderen.
Bedenk dat - welke permissies u ook zet - iemand onder het root account altijd toegang heeft tot al uw bestanden. Als uw laptop gestolen wordt en iemand boot Knoppix via een CD, dan kan hij u de partities op uw vaste schijf mounten en als root alles inzien en bewerken. Alleen versleutelde bestanden kunt u geheim houden.
De onderstaande tabel geeft enige rekenvoorbeelden. Ik heb alleen de (zelden toegepaste) uitersten en veel voorkomende waarden weergegeven. De weergave van ls -l staat in de eerste tabel.
ls-l aanduiding |
chmod |
umask |
Voorbeeld |
---|---|---|---|
"d rwx rwx rwx" |
"777" |
"000" |
Maximale toegang tot een directory. Iedereen kan (net als onder DOS of Windows 9x) bestanden wissen. |
"d rwx rwx rwt" |
"1777" |
? |
Een map met het sticky bit: iedereen mag erin schrijven en de inhoud veranderen, maar alleen een eigenaar (en de root) kan een bestand wissen. Komt voor in door iedereen beschreven mappen als /temp en /var/spool. |
"- rwx rwx r-x" |
"775" |
"002" |
Gebruikers mogen bestanden wissen. |
"d rwx r-x r-x" |
"755" |
"022" |
Typische directory (umask 022). Alleen de eigenaar mag de inhoud veranderen. De rest mag kijken en kan desgewenst bestanden uitvoeren. |
"- rwx r-x r-x" |
"755" |
"022" |
Typisch uitvoerbaar bestand (umask 022) |
"- rwx r-- r--" |
"744" |
"033" |
De eigenaar mag het bestand veranderen of uitvoeren. De rest mag het bekijken. |
"- rw- rw- rw-" |
"666" |
"000" |
Maximale toegang voor een databestand (maar ook /dev/apparaat) |
"- rw- r-- r--" |
"644" |
"022" |
Typisch databestand (umask 022) |
"- rwx --- ---" |
"700" |
"055" |
Alleen toegang voor de eigenaar |
"- --- --- ---" |
"000" |
"666" |
Minimale toegang voor een databestand (alleen root kan er nu bij) |
"d -- --- ---" |
"000" |
"777" |
Zeer besloten directory. Alleen root heeft toegang. Komt in de praktijk niet voor. Een "d rwx--- ---" map van root zou logischer zijn. |
De laatste regel in het verborgen bestand /home/sjoerd/.bashrc luidt: umask 022.
Umask 22 bepaalt dat de groep (+20) en anderen (+ 2) geen schrijftoegang krijgen tot de nieuw door mij gecreëerde (of gedownloade) bestanden en directories.
Het gaat dus om default permissies, die iedere gebruiker voor zichzelf bepalen kan. Als er geen umask waarde in de .bashrc van uw home directory staat, wordt de waarde uit etc/profile overgenomen. Dit is tevens de umask waarde van de root (zie: bash).
Als u met KFM rechts klikt op een pictogram en Eigenschappen kiest kunt u in het tabblad Permissions komen. Hiernaast ziet u de instellingen van een onder umask 022 aangemaakt tekstbestand.
U ziet dat umask 22 anderen wel leesrechten geeft. Exec is niet aangevinkt omdat het niet om een directory of een uitvoerbaar bestand gaat.
sjoerd@visser:~ > umask
022
geeft uw umask waarde weer.
Als het om een directory gaat zal umask 022 het Exec label aanvinken voor eigenaars, groep en anderen (ugo).
Een tweede methode is het gebruik van speciale groepen om toegangsrechten te verlenen. Vaak wordt de groep dialout gebruikt om de internet toegang te regelen. Hier kunt u de gebruikers (hier 'sjoerd") aan toevoegen.
groupadd dialout
usermod -G dialout sjoerd
Met:
cd $KDEDIR/bin
chgrp dialout kppp
chmod g+x kppp
verandert u toegang tot kppp. Aangezien u dat ook voor de andere hierboven genoemde bestanden moet doen, is dat een hele klus. En zoals gezegd, is het voor de recentere versies niet nodig.
Een derde methode is het gebruik van sudo (switch user do). Zie: man sudo.
In uw ~/.bashrc kunt u bijv. opdrachten plaatsen als:
alias ifup="sudo /sbin/ifup"
alias ifdown="sudo /sbin/ifdown"
om als gebruiker de genoemde root werktuigen in /sbin te gebruiken (deze waren voor RedHat scripts).
In /etc/sudoers kunnen door "root" deze rechten aan individuele gebruikers worden verleend.
sjoerd localhost=NOPASSWD:/sbin/ifup ppp0
sjoerd localhost=NOPASSWD:/sbin/ifdown ppp0
Hier is "sjoerd" de gebruiker met de specifiek voor de genoemde programma's verleende root toegangsrechten op de machine "localhost". Hiervoor is geen wachtwoord nodig. Omdat het programma onder het root account loopt, kan het andere root (systeem)bestanden vrijelijk benaderen. Gebruik sudo dus alleen als het op een andere manier (bijzonder groepen) niet lukt. Onder het rootaccount geeft u het programma immers alle rechten op uw systeem.
PC In Ubuntu werkt su niet, maar sudo-i wel.
Naast de hierboven beschreven klassieke UNIX bestandspermissies, bestaan er ook toegangscontrolelijsten volgens het Portable Operating System Interface (POSIX) systeem. De POSIX Access Control Lists (ACL) worden ondersteund door ReiserFS, Ext2 en 3, JFS, XFS en samba.
De klassieke UNIX bestandspermissies hebben een vrij eenvoudige structuur. De hele opzet heeft vooral de bedoeling het systeem te beschermen, waarbij het root account de spil vormt. Er zijn steeds drie bestandspermissies (lezen, schrijven, uitvoeren) voor drie soorten gebruikers (eigenaar, de groep en anderen). In bijzondere gevallen worden het suid bit (set user id), het gid bit (set group id) en het sticky bit toegepast. Via de umask variable kunnen globale permissies worden opgezet.
Maar om met dit systeem de bestandspermissies van een Windows NT server of nog ingewikkelder een Windows 2003 server op een samba server na te bootsen is een onmogelijke opgave.
Om te beginnen hebben Windows NT clients de mogelijkheid om bestandspermissies op afstand in te stellen. Wie onder een Windows NT client op een Windows server werkt, kan de toegangsrechten van zijn eigen mappen beheren.