Kapitel 3. Adgangsstyring

I Unix har man mulighed for at styre hvilke brugere der har adgang til at gøre bestemte ting og se bestemte data. Brugerne er opdelt i et hierarki med to niveauer. Øverst er der systemadministratoren (bruger nummer nul) der typisk, men ikke nødvendigvis, har brugernavnet "root". Nederst er der alle de andre brugere (brugernumre større end nul). Systemadministratoren har adgang til at gøre alt på systemet og kan dermed lave større ulykker end de almindelige brugere. Derfor er det vigtigt at man kun udfører programmer med systemadministratorrettigheder i det omfang det er strengt nødvendigt.

Udover brugere arbejder Unix' adgangsstyring også med grupper. Hver bruger er medlem af en eller flere grupper. Ligesom man for en enkelt bruger kan styre hvad han skal have adgang til, så kan man også gøre det for en hel gruppe ad gangen.

Unix styrer adgangen til ressourcer på filniveau. Det betyder at den mest detaljerede opdeling af rettigheder som Unix kan håndtere er enkelte dokumenter, kataloger eller eksterne enheder. Hvis man har brug for en mere detaljeret opdeling af adgangen til data, klarer man det typisk ved at køre et databasesystem ovenpå Unix.

Hver ressource tilhører i Unix én bestemt bruger og én bestemt gruppe. Man styrer adgangen til ressourcen ved at sætte eller stryge ni flag. De ni flag er delt ind i tre kategorier efter hvem de gælder for:

og tre kategorier efter hvilken form for adgang de tillader: Tabel 3-1 giver en oversigt over de ni almindelige flag, samt nogle specialflag man også kan sætte eller stryge. Det skal nævnes at flagene kan kombineres til at lave en meget fleksibel adgang til data.

Tabel 3-1. Flag til adgangsstyring

Talværdi Symbol Betydning
0400 u+r Brugeren som ressourcen tilhører har adgang til at læse fra ressourcen.
0200 u+w Brugeren som ressourcen tilhører har adgang til at skrive i ressourcen.
0100 u+x Brugeren som ressourcen tilhører har adgang til at bruge ressourcen.
0040 g+r Gruppen som ressourcen tilhører har adgang til at læse fra ressourcen.
0020 g+w Gruppen som ressourcen tilhører har adgang til at skrive i ressourcen.
0010 g+x Gruppen som ressourcen tilhører har adgang til at bruge ressourcen.
0004 o+r Andre har adgang til at læse fra ressourcen.
0002 o+w Andre har adgang til at skrive i ressourcen.
0001 o+x Andre har adgang til at bruge ressourcen.
4000 u+s Hvis ressourcen er et program, så vil det blive kørt med de rettigheder som brugeren det tilhører har.
2000 g+s Hvis ressourcen er et program, så vil det blive kørt med de rettigheder som gruppen det tilhører har. Og hvis ressourcen er et katalog, så vil filer oprettet i det katalog automatisk tilhøre samme gruppe som kataloget tilhører.
1000 o+t Hvis ressourcen er et program, så vil det blive kopieret til "swap", så det kan starte hurtigere.

Eksempel 3-1. Se adgangstilladelser for filer og kataloger

Kommandoen ls (vis katalogindhold) kan bruges til at vise hvilke adgangstilladelser der er sat for en fil. Vi kan for eksempel kigge i kataloget ~/websted/:

[tyge@hven ~]$ ls -l ~/websted/
totalt 8
-rw-r--r--    1 tyge     brahe        2414 maj 18 19:51 index.html
drwxr-xr-x    3 tyge     brahe        4096 mar 30 16:09 Artikler
Der er en fil (index.html) markeret med et - som første tegn på linjen og et underkatalog (Artikler) markeret med et d som første tegn på linjen. Begge tilhører brugeren tyge og gruppen brahe. Brugeren tyge har tilladelse til både at læse og skrive i filen index.html mens brugere i gruppen brahe samt andre brugere på systemet kun har tilladelse til at læse i filen. Brugeren tyge har tilladelse til både at læse og skrive i kataloget Artikler mens brugere i gruppen brahe samt andre brugere på systemet kun har tilladelse til at læse i og bruge kataloget.

Eksempel 3-2. Hindre alle andre i at læse hjemmekataloget

Som en første praktisk øvelse i adgangsstyring kan man fratage alle andre alle adgangstilladelser under sit hjemmekatalog med kommandoen:

[tyge@hven ~]$ chmod -R go-rwx ~/
Kommandoen chmod bruges til at sætte og stryge adgangsstyringsflag. Tilvalget "-R" betyder at vi ønsker at det skal gøres rekursivt og inkludere alle filer og kataloger under det katalog vi udpeger. Tilvalget "go-rwx" betyder at vi vil fratage ("-") gruppen og andre ("go") adgangen til at læse, skrive og bruge ("rwx") kataloget (og p.g.a. tilvalget "-R" også de underliggende filer og kataloger). ~/, hjemmekataloget, er det katalog hvis adgangsstyringsflag vi vil have chmod til at ændre.

Husk dog på at adgangsstyringen aldrig hindrer systemadministratoren — eller programmer der kører med systemadministratorrettigheder — i at læse, skrive og ændre i dine filer. For netværksdrev er dette dog ikke nødvendigvis sandt. Man kan fra en netværksserver hindre at lokale "root"-brugere får fuld adgang til data (eng: root-squashing).

Eksempel 3-3. Standardadgangstilladelser for nye filer

Med umask kan man styre de rettigheder som nye filer får. Man angiver et tre-cifret tal som anvendes efterfølgende. Skal det gemmes fra gang til gang man logger ind, så kan man tilføje det til sin kommandofortolkers opsætningsfil(er). Argumentet til umask er et tal (skrevet med grundtal 8) der definerer hvilke af de grundlæggende ni adgangstilladelser der ikke skal gives til nyoprettede filer. Tallet dannes ved at lægge talværdierne fra tabellen Tabel 3-1 for de adgangstilladelser der ikke skal gives sammen.

Hvis vi udelukkende vil begrænse adgangstilladelserne for andre brugere, skal vi således bruge talværdierne 0001 (ingen brugstilladelser til andre), 0002 (ingen skrivetilladelser til andre) og 0004 (ingen læsetilladelser til andre). Det er kun de sidste tre cifre der betyder noget, så kommandoen bliver således:

[tyge@hven ~]$ umask 007
Vi kan bruge kommandoen uden tilvalg til at se hvad indstillingerne er:
[tyge@hven ~]$ umask
007
Og for en god ordens skyld opretter vi en ny fil og ser hvilke adgangstilladelser den oprettes med:
[tyge@hven ~]$ touch Bond
[tyge@hven ~]$ ls -l Bond
-rw-rw----    1 tyge     brahe           0 maj 18 20:19 Bond

Til daglig er det nok mest hensigtsmæssigt at andre (også gruppen) ikke har automatisk har adgang til en brugers filer, hvilket svarer til tilvalget 077 til umask:

[tyge@hven ~]$ umask 077
Vi kan bruge kommandoen uden tilvalg til at se hvad indstillingerne er:
[tyge@hven ~]$ umask
077
Og for en god ordens skyld opretter vi igen en ny fil og ser hvilke adgangstilladelser den oprettes med:
[tyge@hven ~]$ touch James
[tyge@hven ~]$ ls -l James
-rw-------    1 tyge     brahe           0 maj 18 20:19 James

Eksempel 3-4. Gøre hjemmesiden synlig for Apache

Hvis Apache skal kunne vise din hjemmeside, er det nødvendigt at den bruger, hvis rettigheder Apache kører med, har adgang til at læse både kataloget hjemmesiden ligger i og selve filen med hjemmesiden. Men efter at vi i Eksempel 3-2 har hindret al adgang til filerne under ~/ for alle andre end dig selv, har Apache ikke længere adgang til det. Først giver vi alle adgang til at læse kataloget ~/websted/ og alt hvad der ligger i det og dets underkataloger:

[tyge@hven ~]$ chmod -R o+r ~/websted/

Men det alene er ikke nok, for for at komme til kataloget ~/websted/, skal Apache også kunne komme til kataloget ~/ som vi stadig har frataget alle andre brugere alle adgangstilladelser til. For at kunne komme til en fil eller et underkatalog i et katalog skal man have adgang til at bruge kataloget, så vi sætter "x"-flaget for "andre brugere" ("o") på katalogerne ~/ og ~/websted/:

[tyge@hven ~]$ chmod o+x ~/ ~/websted/

Hvis ~/websted/ har nogle underkataloger som Apache skal kunne læse filer fra, så bliver du også nødt til at udføre kommandoen chmod o+x på dem. Det kan for eksempel gøres sådan her:

[tyge@hven ~]$ find ~/websted/ -type d -print0 | xargs -0 chmod o+x

Hvis du har grund til at gøre nogle data på dit websted synlige for Apache, men ikke for alle brugere på maskinen, kan du bede din systemadministrator om at sørge for at kataloget med dit websted hører til den gruppe med hvis adgangstilladelser Apache kører med og så sætte "x"-flaget på det katalog (~/websted/ ovenfor) for gruppen i stedet for for "andre brugere". Dette vil i praksis kun være relevant, hvis du har adgangskodebeskyttede oplysninger på webstedet, for ellers vil de andre brugere på maskinen jo under alle omstændigheder kunne komme til dataene gennem Apache.

Eksempel 3-5. Give en gruppe skrivetilladelse til et katalog

Hvis vi skal sidde og bringe orden i familiebillederne, kan det være praktisk, hvis resten af familien også kan komme med nye billeder til samlingen. Vi opretter derfor kataloget ~/familiebilleder/ som hele familien (gruppen "brahe") skal kunne læse og kataloget ~/familiebilleder/nye/, hvor de også skal kunne tilføje billeder:

[tyge@hven ~]$ mkdir ~/familiebilleder/
[tyge@hven ~]$ mkdir ~/familiebilleder/nye/
[tyge@hven ~]$ chgrp -R brahe ~/familiebilleder/
[tyge@hven ~]$ chmod -R g+rx ~/familiebilleder/
[tyge@hven ~]$ chmod g+w ~/familiebilleder/nye/
Bemærk at der desværre ikke findes en mulighed for at give tilladelse til at tilføje data, der ikke også giver mulighed for at slette eller overskrive data. Det betyder for eksempel at medlemmerne af gruppen "brahe" nu både kan tilføje og slette billeder i kataloget ~/familiebilleder/nye/.

Eksempel 3-6. Direkte styring af enheder

Hvis du har koblet et instrument på enheden /dev/astrolabrium som alle brugerne i gruppen "astronomi" skal kunne styre, bliver du som root nødt til at give dem adgang til at skrive til enheden (så de kan sende kommandoer til instrumentet) og til at læse fra enheden (så de kan modtage data fra instrumentet).

[tyge@hven ~]$ su -
Password: 
[root@hven /root]# chgrp astronomi /dev/astrolabrium
[root@hven /root]# chmod g+rw /dev/astrolabrium
[root@hven /root]# exit
[tyge@hven ~]$ ls -l /dev/astrolabrium
brw-rw----    1 root     astronom   2,   0 apr 11  2002 /dev/astrolabrium
Da enheden er ejet af systemadministratoren, bliver vi først nødt til at skifte til systemadministratorkontoen med kommandoen su -. Bemærk også at kommandoen ls -l kun viser de første otte bogstaver i navnet på en bruger eller en gruppe.

Eksempel 3-7. suid

Normalt vil det være sådan, at når du starter et program op, f.eks. kommandoen ls, vil Linux køre dette program som den bruger, der startede programmet. Nogle gange kan det være nødvendigt at give en bruger flere rettigheder uden at skulle give brugeren systemadministratorrettigheder (på linje med root).

Suid (set user id) er et begreb (ikke et program), som giver mulighed for, at du kan udføre et program, som om du var en anden bruger. Det bruges normalt til at give almindelige brugere rettigheder til at udføre programmer, som om de var superbrugeren (root).

[tyge@hven MitKatalog]$ chmod +s FILNAVN
Når kommandoen FILNAVN udføres, vil Linux-kernen køre programmet med rettighederne for brugeren, der ejer filen, og ikke som brugeren, der starter programmet.

Dette kan f.eks. ses ved programmet ping, der skal være "suid root". Det skyldes, at det kun er root, der kan åbne den slags netværksforbindelse, som ping bruger.

[tyge@hven MitKatalog]$ ls /sbin/ping
-rwsr-xr-x   1 root     root        14804 Apr  7 23:21 /bin/ping

Suid er den største sikkerhedssynder på Unix-systemer. Det er f.eks. en dødssynd at sætte suid root for kommandofortolkerprogrammer, da det er muligt for en bruger at narre programmet til at efterlade en kommandofortolker med systemadministratorrettigheder. Jo færre suid filer du har på dit system jo bedre, men nogle ting er nødt til at være suid root for at fungere. Du kan se hvilke filer, der er suid root med følgende kommando:

[tyge@hven MitKatalog]$ find / -user root -perm +4000

Se mere i artiklen http://www.sslug.dk/artikler/Linux_sikkerhed/rootaccess.html om problemer med Suid.