door Guido Socher Over de auteur: Is helemaal weg van Linux omdat het een vrij beschikbaar besturingssysteem is en het ook heel leuk is om met mensen van over de hele wereld aan Linux te werken. Zijn vrije tijd besteed hij met zijn vriendin. Hij luistert naar de BBC World Service, houdt van fietsen in de natuur en speelt graag met Linux. Inhoud: |
Kort:
Dit artikel bestaat uit twee delen:
Linux is een multi-user besturingssysteem waarbij gebruikers kunnen opgeven wie er toegang (permissie) heeft tot een bestand. Elke gebruiker heeft een uniek gebruikersnummer dat hem identificeert. Gebruikers horen bovendien tot één of meer gebruikersgroepen. Hiermee is het mogelijk om bestanden voor een groep gebruikers toegankelijk te maken. Deze eigenschap van Unix-varianten zoals Linux, maakt het delen van bestanden binnen een groep eenvoudig. Om te zien welk gebruikersnummer u heeft en tot welke groep(en) u behoort, typt u het commando 'id':
>id uid=550(alice) gid=100(users) groups=100(users),6(disk) |
Permissies voor lezen (r van read), schrijven (w van write) en uitvoeren (x van execute) kunnen per bestand gezet worden voor de eigenaar, groep en anderen. U kunt het commando 'ls -l' gebruiken om de permissie-indicatoren te zien.
>ls -l /usr/bin/id -rwxr-xr-x 1 root root 8632 May 9 1998 /usr/bin/id |
De eigenaar van het bestand /usr/bin/id is de gebruiker root en het bestand is onder beheer van de groep root. De permissie-indicatoren
-rwxr-xr-x
laten de bestandspermissies zien. Dit bestand is leesbaar (r), schrijfbaar (w) en uitvoerbaar (x) voor de eigenaar. Voor de gebruikersgroep en alle andere gebruikers is het bestand leesbaar (r) en uitvoerbaar (x).
De permissies zijn opgeslagen in een bitvector met drie bits voor de eigenaar, groep en anderen. De permissie-indicatoren r-x komen overeen met 101 als bitpatroon of 4+1=5 in het tientallig stelsel. De r-bit komt overeen met het decimale cijfer 4; het w-bit met 2 en het x-bit met 1.
sst 421 (verderop beschreven) |
rwx 421 user (eigenaar) |
rwx 421 groep |
rwx 421 anderen |
Met het commando 'chmod' kunnen de bestandspermissies veranderd worden. Uit veiligheidsoverwegingen kunnen alleen de root-gebruiker en de eigenaar van het bestand de permissies wijzigen. Het commando kan zowel met een decimale als met een symbolische weergave werken om de gewenste permissie te krijgen. De symbolische weergave is [ugoa][+-][rwx]. Een argument bestaat dus uit een van de letters u (van user, eigenaar), g (groep), o (van others, anderen) of a (alle, zowel u als g en o) gevolgd door een + (toevoegen) of - (verwijderen) en daarna de symbolische weergave voor de permissie r (lezen), w (schrijven) of x (uitvoeren). Om het bestand "bestand.txt" schrijfbaar te maken voor alle gebruikers typt u:
>chmod a+w bestand.txt of >chmod 666 bestand.txt >ls -l bestand.txt -rw-rw-rw- 1 alice users 79 Jan 1 16:14 bestand.txt |
Het commando 'chmod 644 bestand.txt' zou de permissie weer herstellen tot de "normale" situatie: lees- en schrijfbaar voor de eigenaar en alleen leesbaar voor alle andere gebruikers.
Het gaan naar een andere directory (met het commando 'cd') is hetzelfde als het uitvoeren van de directory. De "normale" permissie voor een directory is dan ook 755 en niet 644:
>chmod 755 mijndir >ls -ld mijndir drwxr-xr-x 2 alice users 1024 Dec 31 22:32 mijndir |
Met het commando umask stelt u de standaard bestandpermissies in. Als u een nieuw bestand of directory maakt, krijgen deze automatisch deze standaard permissies. Als argumenten heeft dit commando de decimale weergave van de permissies die u NIET gezet wilt hebben
Een goede keuze is 'umask 022'. Hiermee geeft u aan dat iedereen de bestanden kan lezen en directories kan binnengaan, maar dat alleen u bestanden kunt veranderen. Om de huidige standaard bestandspermissies te bekijken type u 'umask' zonder argumenten.
Hieronder staat een voorbeeld u umask en chmod gebruikt kunnen worden:
De umask is gezet op een goede standaard >umask 22 Maak een bestand 'mijnscript' aan met een teksteditor (bv. nedit): >nedit mijnscript (of vi mijnscript ...) Zet de volgende broncode erin: #!/bin/sh #myscript echo -n "hallo " whoami echo "Dit bestand ( $0 ) heeft de volgende bestandspermissies:" ls -l $0 | cut -f1 -d" " Sla het script op. Het heeft nu een 644 permissie: >ls -l mijnscript -rw-r--r-- 1 alice users 108 Jan 1 mijnscript Om het te kunnen uitvoeren moet het de uitvoeren-permissie krijgen: >chmod 755 mijnscript of >chmod a+x mijnscript Voer het script nu uit: >./mijnscript |
Merk op, dat u het script alleen kunt uitvoeren als het zowel leesbaar als uitvoerbaar is. Een normaal, gecompileerd programma hoeft alleen maar uitvoerbaar te zijn. Dit komt doordat het script uitgevoerd wordt door een ander programma; in dit geval is dat de shell 'sh'. Het script laat het volgende op het scherm zien:
hallo alice Dit bestand ( ./mijnscript ) heeft de volgende bestandspermissies: -rwxr-xr-x
Als u langere tijd met Linux werkt, ontdekt u waarschijnlijk dat er meer over bestandspermissies te leren valt dan alleen de "rwx"bits. Kijkt u eens rond in uw bestandssysteem en u zult zien dat er ook "s" en "t" permissies zijn:
>ls -ld /usr/bin/crontab /usr/bin/passwd /usr/sbin/sendmail /tmp
drwxrwxrwt 5 root root 1024 Jan 1 17:21 /tmp -rwsr-xr-x 1 root root 0328 May 6 1998 /usr/bin/crontab -r-sr-xr-x 1 root bin 5613 Apr 27 1998 /usr/bin/passwd -rwsr-sr-x 1 root mail 89524 Dec 3 22:18 /usr/sbin/sendmail |
Wat zijn deze "s" en "t" bits? De bitvector waarin de permissies zijn opgeslagen is eigenlijk 4 * 3 bits lang. Het commando 'chmod 755' is eigenlijk een afkorting van 'chmod 0755'.
Het t-bit (ook wel het 'sticky bit' genoemd) is alleen bruikbaar voor directories. Het is hierboven gebruikt bij de /tmp directory.
Normaal gesproken, als het t-bit niet gezet is, kunnen bestanden gewist worden als de directory waar ze in staan schrijfbaar is voor de persoon die ze wil wissen. Dus als er een directory is waar iedereen files kan neerzetten, dan kan ook iedereen deze files wissen.
Het t-bit verandert dit. Als het t-bit gezet is, kan alleen de eigenaar van het bestand of de directory het bestand wissen. Het t-bit kan gezet worden met het commando 'chmod a+tw' of 'chmod 1777'. Bekijk het voorbeeld:
Alice maakt een directory met het t-bit aan: >mkdir mijntmp chmod 1777 mijntmp Vervolgens plaatst Bob er een bestand in: >ls -al drwxrwxrwt 3 alice users 1024 Jan 1 20:30 ./ -rw-r--r-- 1 bob users 0 Jan 1 20:31 f.txt Dit bestand kan nu gewist worden door Alice (eigenaar van directory) en Bob (eigenaar van bestand) zelf. Maar Tux kan het niet wissen: >whoami |
Linuxprogramma's (processen) worden met een gebruikersnummer uitgevoerd. Dit geeft het proces alle permissies die de gebruiker met dat nummer ook heeft. Er zijn twee soorten gebruikersnummers: het echte gebruikersnummer en een effectief gebruikersnummer. De laatste is degene die de toegang tot bestanden bepaald. Sla het volgende script op onder de naam idinfo en maak het script uitvoerbaar met 'chmod 755 idinfo'.
#!/bin/sh #idinfo: Print gebruikersinformatie echo " effectief gebruikersnummer:" id -un echo " echt gebruikersnummer:" id -unr echo " groepsnummer:" id -gn |
Als u het script uitvoert, ziet u dat het proces uw gebruikersnummer en groepnummer krijgt:
effectief gebruikersnummer: alice echt gebruikersnummer: alice groepsnummer: users
Als de gebruiker Tux dit idinfo script uitvoert krijgt hij ongeveer hetzelfde te zien, maar nu met zijn gebruikers- en groepnummer. De uitvoer van het programma hangt alleen af van de gebruiker die het programma start en niet van de eigenaar ervan.
Om veiligheidsredenen werkt het s-bit alleen op gecompileerde programma's en niet op scripts (wel op Perl-scripts). Daarom maken we nu een C-programma dat het idinfo script aanroept:
/*suidtest.c*/ #include <stdio.h> #include <unistd.h> int main(){ /*veilige SUID programma's MOETEN *nooit vertrouwen op omgevingsvariabelen of gebruikersinvoer!! */ char *env[]={"PATH=/bin:/usr/bin",NULL}; char prog[]="/home/alice/idinfo"; if (access(prog,X_OK)){ fprintf(stderr,"FOUT: %s is niet uitvoerbaar\n",prog); exit(1); } printf("bezig met uitvoeren van %s ...\n",prog); execle(prog,(const char*)NULL,env); perror("suidtest"); return(1); } |
Compileer de broncode met het commando "gcc -o suidtest -Wall suidtest.c" en zet de s-bit voor de eigenaar:
>chmod 4755 suidtest of >chmod u+s suidtest |
Start het programma! Wat gebeurt er? Niets? Voer het dan als een andere gebruiker uit!
Alice is de eigenaar van het bestand suidtest en heeft het s-bit gezet waar normaal het x-bit gezet is. Hierdoor wordt het proces uitgevoerd met het gebruikersnummer van de eigenaar van het programma en niet het nummer van de gebruiker die het uitvoert. Als Tux het programma uitvoert dan ziet het resultaat er zo uit:
>ls -l suidtest -rwsr-xr-x 1 alice users 4741 Jan 1 21:53 suidtest >whoami tux bezig met uitvoeren van /home/alice/idinfo ... effectief gebruikersnummer: alice echt gebruikersnummer: tux groepsnummer: users |
Zoals u zult begrijpen is dit een zeer krachtige eigenschap van het besturingssysteem als de root eigenaar is van een bestand met een s-bit. Elke gebruiker kan dan dingen doen die normaal alleen voor de root-gebruiker zijn weggelegd. Dit geeft ook veiligheidsrisico's en daarover nu enkele woorden. Tijdens het schrijven van een SUID-programma moet men goed nagaan of het programma alleen bruikbaar is voor het doel dat het dient. Gebruik bijvoorbeeld altijd volledige, harde padnamen. Vertrouw nooit op omgevingsvariabelen of functies die omgevingsvariabelen gebruiken. Vertrouw ook nooit de invoer die de gebruiker meegeeft aan het programma, zoals configuratiebestanden of argumenten. Controleer de invoer bit voor bit en vergelijk deze met waarden waarvan je weet dat ze goed zijn.
Als de root eigenaar is van een SUID-programma dan kan ook het echte gebruikersnummer gezet worden met de setreuid() functie.
SUID programma's worden vaak door de "root" gebruikt om gebruikers toegang te geven tot dingen die normaal alleen de "root" kan doen. Zo kan de root het suidtest.c aanpassen zodat elke gebruiker de ppp-on en ppp-off scripts kan uitvoeren.
Uitvoerbare bestanden die het s-bit gezet hebben voor een groep draaien het programma met het groepsnummer van de eigenaar van het bestand. Het lijkt veel op het s-bit voor gebruikers in de paragraaf hierboven.
Als het s-bit gezet is voor een groep voor een directory, dan is die groep ook gezet voor alle bestanden die in die directory worden gemaakt. Alice zit in de volgende twee groepen:
>id uid=550(alice) gid=100(users) groups=100(users),6(disk) |
Nieuwe bestanden die Alice maakt worden normaal gezet met de groep users. Maar als de directory geset is met het s-bit voor groepen en de directory heeft als groepsnummer disk, dan krijgen alle bestanden in die directory ook het groepsnummer disk:
>chmod 2775 .
>ls -ld . drwxrwsr-x 3 tux disk 1024 Jan 1 23:02 . Als Alice een nieuw bestand in deze directory maakt, dan krijgt het ook de groep gezet op disk >touch newfile>ls -l newfile -rw-r--r-- 1 alice disk 0 Jan 1 23:02 newfile |
Dit is een makkelijke eigenschap als u met een groep mensen werkt en er zeker van wilt zijn dat alle bestanden het goede groepsnummer krijgen. Vooral als gebruikers een 027 umask hebben, voorkomt dit veel problemen en ergernis.
Oorspronkelijk in het Engels.
Vertaald door Egon Willighagen
Site onderhouden door het LinuxFocus editors team
© Guido Socher LinuxFocus 1999 |
1999-10-11, generated by lfparser version 0.6