Bestandspermissies

ArticleCategory: [Artikel Kategorie]

UNIX Basics

AuthorImage:[Foto van de Auteur]

[Foto van de Auteur]

AuthorName:[Naam van de Auteur]

Guido Socher

AboutTheAuthor:[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.

Stuur email naar de auteur

Abstract:[Kort]

Dit artikel bestaat uit twee delen:

  • Deel 1 (Inleiding tot bestandspermissies) is een korte inleiding tot de basis van Unix bestandspermissies.
  • Deel 2 (T-bit, SUID en SGID) gaat dieper in op de geavanceerdere mogelijkheden van Linux die verder gaan dan de standaard "lezen-schrijven-uitvoeren" permissies
  • ArticleIllustration:[Titel-illustratie van het Artikel]

    [chmod 600]

    ArticleBody:[Het eigenlijke artikel]

    Inleiding tot bestandspermissies

    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
    

    T-bit, SUID en SGID

    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

    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
    tux
    rm -f f.txt
    rm: f.txt: Operation not permitted

    S-bit gezet voor gebruikers

    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.

    S-bit gezet voor groepen

    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