Eigenaarschap van een bestand, permissies en beveiligingOm te voorkomen dat programma's per ongeluk of
met opzet gegevens in de weg zitten, heeft Unix permissies.
Deze werden oorspronkelijk ontworpen om timesharing te ondersteunen door
meerdere gebruikers op dezelfde computer tegen elkaar te beschermen, in de
tijd dat Unix hoofdzakelijk op dure gedeelde minicomputers werd gedraaid.Je moet onze beschrijving van gebruikers en groepen in de sectie
even terughalen, om
bestandspermissies te kunnen begrijpen. Ieder bestand heeft een gebruiker en
een groep als eigenaar. Dit zijn in eerste instantie degenen die het bestand
aanmaakten; ze kunnen met de programma's chown(1) en
chgrp(1) worden gewijzigd.De basis-permissies die met een bestand kunnen worden geassocieerd zijn
`read' (permissie de gegevens erin te lezen), `write' (permissie het te
wijzigen) en `execute' (permissie het als een programma uit te voeren).
Ieder bestand heeft drie sets met permissies; één voor de
eigenaar ervan, één voor iedere gebruiker uit de groep ervan,
en één voor alle anderen. De `privileges' die je krijgt, als
je inlogt, bestaan uit de mogelijkheden om die bestanden waarvan de
permissie-bits overeenkomen met je gebruikers-ID of één van
de groepen waartoe je behoort, te lezen, schrijven en uit te voeren.Laten we eens een aantal listings van bestanden op een hypothetisch
Unix-systeem bekijken om te bezien hoe deze op elkaar inwerken en hoe
Unix ze toont. Hier is er één:snark:~$ ls -l notes
-rw-r--r-- 1 esr users 2993 Jun 17 11:00 notesDit is een gewoon gegevensbestand. De listing vertelt ons dat `esr' de
eigenaar ervan is en dat het werd aangemaakt met de groep `users'.
Waarschijnlijk plaatst de computer waar we ons nu op bevinden, alle
gewone gebruikers standaard in deze groep; andere groepen die je vaak
zal zien op timesharing computers zijn `staff', `admin', of `wheel'
(om vanzelfsprekende redenen zijn groepen op een single-user systeem
of op PC's niet zo belangrijk). Op je UNIX-systeem kan het een
andere standaardgroep zijn, misschien één die is benoemd naar
je gebruikers-ID.De string `-rw-r--r--' stelt de permissie-bits voor van het bestand.
Het allereerste streepje is de positie van de directory-bit; het zou
een `d' tonen als het bestand een directory was. De eerste posities daarna zijn
de drie plaatsen met gebruikerspermissies, het tweede drietal de permissies
van de groep en het derde drietal zijn de permissies voor alle anderen
(worden vaak `world' permissies genoemd). Bij dit bestand mag de eigenaar
van het bestand `esr' het bestand lezen en beschrijven, andere mensen in
de groep `users' mogen het lezen, en alle anderen in de wereld mogen het lezen.
Dit is een typische set permissies voor een gewoon gegevensbestand.Laten we nu eens kijken naar een bestand met totaal andere permissies.
Dit bestand is de GCC, de GNU C-compiler.snark:~$ ls -l /usr/bin/gcc
-rwxr-xr-x 3 root bin 64796 Mar 21 16:41 /usr/bin/gccDit bestand behoort toe aan een gebruiker genaamd `root' en een groep genaamd
`bin'; het kan alleen door root worden beschreven (gewijzigd), maar door
iedereen worden gelezen of uitgevoerd. Dit is een typische eigenaarschap en
set permissies voor een voorgeïnstalleerd systeemcommando. Op een
aantal Unixes bestaat de `bin' groep om systeemcommando's te groeperen
(de naam is een historisch overblijfsel, een afkorting van `binary').
Het kan zijn dat er onder jouw Unix in plaats daarvan een `root' groep
wordt gebruikt (niet geheel hetzelfde als de `root' gebruiker!).De `root' gebruiker is de conventionele naam voor numeriek gebruiker ID 0,
een speciaal, account met privileges waarmee alle andere privileges kunnen
worden overheerst. Root-toegang is handig maar gevaarlijk; een typische
fout, als je als root bent ingelogd, kan kritieke systeembestanden
in de war schoppen wat met hetzelfde commando, uitgevoerd met een gewoon
gebruikersaccount, niet kan.Omdat het root-account zo krachtig is, is waakzaamheid bij de toegang ertoe
geboden. Je root-wachtwoord is het enige meest kritieke stukje
beveiligingsinformatie op je systeem, en dat is wat alle crackers en indringers,
die ooit zullen komen, zullen proberen te verkrijgen.(over wachtwoorden: Schrijf ze niet op -- en kies geen wachtwoorden uit die
makkelijk te raden zijn, zoals de voornaam van je vriendin/vriend/echtgenote.
Dit is een verbazingwekkende algemene slechte gewoonte waarmee crackers worden
geholpen...). In het algemeen, kies geen woord uit het woordenboek; er
zijn programma's genaamd `woordenboekkrakers' die naar waarschijnlijke
wachtwoorden zoeken door woordenlijsten met algemene keuzes door te nemen.
Een goede techniek bestaat uit een combinatie van een bestaand woord, een
cijfer, een ander woord, zoals `shark6cider' of `jump3joy'; dat zal er
voor zorgen dat de zoekruimte voor een woordenboekkraker te groot is.
Maak echter geen gebruik van deze voorbeelden -- crackers zouden daar vanuit
kunnen gaan en ze in hun woordenboeken kunnen plaatsen.Laten we nu eens een derde situatie bekijken:snark:~$ ls -ld ~
drwxr-xr-x 89 esr users 9216 Jun 27 11:29 /home2/esr
snark:~$Dit bestand is een directory (merk de `d' op in het eerste permissie slot).
We zien dat het alleen door esr kan worden beschreven, maar door alle anderen
kan worden gelezen en uitgevoerd.Leespermissie geeft je de mogelijkheid de directory weer te geven -- dat wil
zeggen, de namen van bestanden en directory's die erin staan te zien.
Schrijfpermissie geeft je de mogelijkheid bestanden in de directory aan te
maken en te verwijderen. Als je je een lijst namen van
bestanden en subdirectory's in de directory herinnert, zijn deze regels
begrijpelijk.Execute-permissie op een directory betekent dat je via de directory
bestanden en daaronderliggende directory's kunt openen. Als resultaat
geeft het je permissie de inodes in de directory te benaderen. Een
directory met de execute-bit volledig uitgeschakeld zou nutteloos zijn.Zo nu en dan zal je een directory tegenkomen die voor iedereen
leesbaar, maar niet voor iedereen uitvoerbaar is; dit betekent dat een
willekeurige gebruiker alleen bij de daaronder liggende bestanden en
directory's kan komen als het de exacte namen kent (de directory kan
niet worden weergegeven).Het is belangrijk eraan te denken dat lees, schrijf- of permissie om
uit te voeren op een directory onafhankelijk staat van de bestandspermissies
en daaronderliggende directory's. In het bijzonder betekent schrijftoegang
op een directory dat je nieuwe bestanden erin aan kunt maken en bestaande
bestanden kunt verwijderen, maar het geeft je niet automatisch schrijftoegang
tot bestaande bestanden.Laten we als laatste eens kijken naar de permissies van het login-programma.snark:~$ ls -l /bin/login
-rwsr-xr-x 1 root bin 20164 Apr 17 12:57 /bin/loginDit heeft de permissies zoals we ze zouden verwachten van een systeemcommando
-- behalve dan die `s', waar de execute-bit van de eigenaar zou moeten staan.
Dit is de zichtbare manifestatie van een speciale permissie genaamd de
`set-user-id' of setuid bit.De setuid bit is normaliter verbonden met programma's die gewone gebruikers
root-privileges toe moeten kennen, maar dan op een gecontroleerde wijze.
Als het op een uitvoerbaar programma is ingesteld, krijg je de privileges van
de eigenaar van dat programmabestand terwijl het programma namens jou draait,
of 't nu wel of niet met jou overeenkomt.Net als het root-account, zijn setuid programma's handig maar gevaarlijk.
Iedereen die een setuid programma met als eigenaar root, kan verwerpen
of kan wijzigen, kan het gebruiken om een shell met root-privileges voort
te brengen. Om deze reden, wordt op de meeste Unixes het setuid-bit uitgezet,
als het bestand voor schrijven wordt geopend. Veel aanvallen op de
Unix-beveiliging proberen bugs te exploiteren in setuid programma's om ze
te kunnen verwerpen. Beveiligings bewuste systeembeheerders zijn daarom
extra voorzichtig met deze programma's en installeren met tegenzin
nieuwe programma's.Er zijn een paar belangrijke details die we verdoezelde toen we hiervoor
de permissies bespraken; namelijk hoe de eigenaar en de permissies van de
groep worden toegekend, wanneer een bestand of directory voor 't eerst wordt
aangemaakt. De groep is een probleem omdat gebruikers deel uit kunnen maken van
meerdere groepen, maar één daarvan (aangegeven in het record
van de gebruiker in /etc/passwd) is de
standaardgroep van de gebruiker en hierin zullen normaal
gesproken de bestanden staan die door de gebruiker zijn aangemaakt.Het verhaal met initiïle permissie-bits is iets gecompliceerder.
Een programma dat een bestand aanmaakt, zal er om te beginnen de permissies
aan toekennen. Maar deze zullen door een variabele in de gebruikersomgeving
met de naam umask worden gewijzigd. De umask geeft
aan welke permissie-bits worden uitgezet als een bestand wordt
aangemaakt; de meest algemene waarde, en op de meeste systemen de standaard,
is -------w- of 002, waarmee de world-write bit wordt uitgezet. Zie de
documentatie van het umask commando in de manual-page van je shell voor
details.De initiële directorygroep is ook wat gecompliceerd. Op een aantal
Unix-systemen krijgt een nieuwe directory de standaardgroep van de
gebruiker die het aanmaakt (dit is de System V conventie); op andere
systemen krijgt de directory als eigenaar de groep van de parent-directory
waarin het is aangemaakt (dit is de BSD-conventie). Op een aantal moderne
Unixen, waaronder Linux, kan die laatste worden geselecteerd door het
instellen van de set-group-ID op de directory (chmod g+s).Er is een nuttige discussie over bestandspermissies in het artikel
van eric Goebelbecker .