FreeBSD, direct afgeleid van BSD UNIX®, is gebaseerd op verschillende belangrijke UNIX® concepten. Het meest bekende is dat FreeBSD een multi-user systeem is. Het systeem kan meerdere gebruikers behandelen die tegelijkertijd totaal verschillende dingen doen. Het systeem is verantwoordelijk voor het netjes delen en beheren voor aanvragen voor hardware, randapparatuur, geheugen en cpu tijd tussen elke gebruiker.
Omdat het systeem in staat is om meerdere gebruikers te ondersteunen, heeft alles wat door het systeem beheerd wordt een set van rechten die aangeeft wie mag lezen, schrijven en de bron mag uitvoeren. Deze rechten zijn opgeslagen in drie octetten, die weer in drie stukjes onderverdeeld zijn: één voor de eigenaar van het bestand, één voor de groep waar het bestand toe behoort en één voor de overigen. De numerieke weergave werkt als volgt:
Waarde | Recht | Maprecht |
---|---|---|
0 | Niet lezen, niet schrijven, niet uitvoeren | --- |
1 | Niet lezen, niet schrijven, uitvoeren | --x |
2 | Niet lezen, schrijven, niet uitvoeren | -w- |
3 | Niet lezen, schrijven, uitvoeren | -wx |
4 | Lezen, niet schrijven, niet uitvoeren | r-- |
5 | Lezen, niet schrijven, uitvoeren | r-x |
6 | Lezen, schrijven, niet uitvoeren | rw- |
7 | Lezen, schrijven, uitvoeren | rwx |
De -l
optie kan gebruikt worden met
ls(1) om een lange lijst met de inhoud van een map te zien
die een kolom heeft met informatie over bestandsrechten voor de
eigenaar, groep en de rest. ls -l
in een
willekeurige map kan het volgende laten zien:
%
ls -l
total 530 -rw-r--r-- 1 root wheel 512 Sep 5 12:31 myfile -rw-r--r-- 1 root wheel 512 Sep 5 12:31 otherfile -rw-r--r-- 1 root wheel 7680 Sep 5 12:31 email.txt ...
Zo ziet de eerste kolom van ls -l
eruit:
-rw-r--r--
Het eerste (meest linkse) karakter geeft aan of dit een
reguliere bestand is, een map, een speciaal karakter
component(!), een socket of een andere pseudo-file component(!).
In dit geval betekent de -
dat het een
regulier bestand is. De volgende drie karakters,
rw-
in dit voorbeeld, geven de rechten voor de
eigenaar van het bestand. De drie karakters
r--
erna geven de rechten van voor de groep van
het bestand. De overige drie karakters r--
tonen de rechten voor alle overige gebruikers. Een streepje betekent dat
de rechten uitgeschakeld zijn. In het geval van dit bestand zijn de
rechten zo ingesteld dat de eigenaar kan lezen en schrijven naar
het bestand, de groep het bestand kan lezen, en alle overige
gebruikers kunnen ook het bestand lezen. Volgens de tabel hierboven
worden de rechten 644
, waar de cijfers de drie
stukjes van de rechten aangeven.
Dit is allemaal leuk en aardig, maar hoe controleert het
systeem dan rechten voor apparaten? FreeBSD behandelt de meeste
hardware apparaten als bestanden die door programma's kunnen
worden geopend en gelezen, en waar data naar toe kan worden
geschreven, net zoals elk ander bestand. Deze speciale apparaat
bestanden worden bewaard in de map
/dev
.
Mappen worden ook behandeld als bestanden. Ze hebben lees,
schrijf en uitvoerbare rechten. De uitvoerbare vlag voor een map
heeft een klein verschil qua betekenis dan die voor gewone
bestanden. Als een map als uitvoerbaar gemarkeerd is, betekent
het dat erin gekeken mag worden. Het is dus mogelijk om te
wisselen naar de map met cd
(wissel van map).
Dit betekent ook dat in de map bestanden benaderd kunnen worden
waarvan de naam bekend is. Dit is natuurlijk afhankelijk van de
rechten op het bestand zelf.
In het bijzonder, om een lijst van de map te kunnen maken, moet een gebruiker leesrechten op de map hebben. Om een bestand te verwijderen zijn de naam van het bestand en schrijf en uitvoerrechten op de map nodig waarin het bestand zich bevindt.
Er zijn meer rechtenvlaggen, maar die worden slechts gebruikt in speciale gevallen, zoals bij setuid binaries en sticky mappen. Meer informatie over bestandsrechten en hoe die aangepast kunnen worden staat in chmod(1).
Symbolische rechten, soms ook wel symbolische expressies, gebruiken karakters in plaats van octale getallen om rechten aan bestanden en mappen te geven. Symbolische expressies gebruiken de volgende opbouw: (wie) (actie) (permissies), waar de volgende waardes beschikbaar zijn:
Optie | Letter | Vertegenwoordigt |
---|---|---|
(wie) | u | Gebruiker |
(wie) | g | Groepseigenaar |
(wie) | o | Overigen |
(wie) | a | Iedereen (“wereld”) |
(actie) | + | Rechten toevoegen |
(actie) | - | Rechten verwijderen |
(actie) | = | Stel deze rechten in |
(recht) | r | Lezen |
(recht) | w | Schrijven |
(recht) | x | Uitvoeren |
(recht) | t | Sticky bit |
(recht) | s | Verander UID of GID |
Deze waardes worden gebruikt met chmod(1), net zoals
eerder, alleen nu met letters. Het volgende commando kan
gebruikt worden om de overige gebruikers toegang tot
BESTAND
te ontzeggen:
%
chmod go= BESTAND
Er kan een door komma's gescheiden lijst geleverd worden als meer dan één wijziging aan een bestand moet worden uitgevoerd. Het volgende commando past de rechten voor de groep en de “wereld” aan door de schrijfrechten te ontnemen om daarna iedereen uitvoerrechten te geven:
%
chmod go-w,a+x BESTAND
Naast de bestandsrechten die hiervoor zijn besproken, biedt FreeBSD ondersteuning voor “bestandsvlaggen.” Deze vlaggen bieden een aanvullend beveiligingsniveau en controle over bestanden, maar niet over mappen.
Bestandsvlaggen voegen een extra niveau van controle over
bestanden, waardoor verzekerd kan worden dat in sommige
gevallen zelfs root
een bestand niet kan
verwijderen of wijzigen.
Bestandsvlaggen worden gewijzigd met het hulpprogramma
chflags(1), dat een eenvoudige interface heeft. Om
bijvoorbeeld de systeemvlag niet verwijderdbaar in te stellen
op het bestand file1
:
#
chflags sunlink file1
Om de vlag niet verwijderbaar weer te verwijderen kan het
voorgaande commando met “no” voor
sunlink
worden uitgevoerd:
#
chflags nosunlink file1
Om de vlaggen op een bestand te bekijken, kan het ls(1)
commando met de vlaggen -lo
gebruikt worden:
#
ls -lo file1
De uitvoer hoort er ongeveer als volgt uit te zien:
-rw-r--r-- 1 trhodes trhodes sunlnk 0 Mar 1 05:54 file1
Een aantal vlaggen kan alleen ingesteld of verwijderd
worden door de gebruiker root
. In andere
gevallen kan de eigenaar van een bestand vlaggen instellen.
Meer informatie voor beheerders staat in chflags(1) en
chflags(2).
Buiten de toestemmingen die reeds besproken zijn, zijn er
nog drie specifieke instellingen waarvan alle beheerders kennis
dienen te hebben. Dit zijn de setuid
-,
setgid
-, en sticky
toestemmingen.
Deze instellingen zijn belangrijk voor sommige UNIX®-bewerkingen omdat ze functionaliteit bieden die normaliter niet aan normale gebruikers wordt gegeven. Om ze te begrijpen, dient ook het verschil tussen de echte gebruikers-ID en de effectieve gebruikers-ID opgemerkt te worden.
De echte gebruikers-ID is de UID die het
proces start of bezit. De effectieve UID is
de gebruikers-ID waaronder het proces draait. Bijvoorbeeld, het
gereedschap passwd(1) draait met de echte gebruikers-ID van
de gebruiker die het wachtwoord verandert; echter, om de
database met wachtwoorden te manipuleren, draait het met de
effectieve ID van de gebruiker root
. Dit
is wat normale gebruikers in staat stelt om hun wachtwoorden te
veranderen zonder een fout Permission
Denied te zien.
De mount(8)-optie nosuid
zorgt
ervoor dat deze binairen zwijgend falen. Dit houdt in dat ze
niet worden uitgevoerd zonder ooit de gebruiker op de hoogte
te stellen. Deze optie is ook niet geheel betrouwbaar
aangezien een nosuid
-wrapper dit volgens de
handleidingpagina mount(8) kan omzeilen.
De setuid-toestemming kan aangezet worden door het cijfer vier (4) voor een toestemmingenverzameling te plaatsen zoals te zien is in het volgende voorbeeld:
#
chmod 4755 suidvoorbeeld.sh
De toestemmingen op het bestand
suidvoorbeeld.sh
dienen er nu als volgt uit
te zien:
-rwsr-xr-x 1 trhodes trhodes 63 Aug 29 06:36 suidvoorbeeld.sh
Het zou in dit voorbeeld te zien moeten zijn dat een
s
nu deel is van de toestemmingenverzameling
bestemd voor de bestandseigenaar, en de uitvoerbare bit
vervangt. Dit staat gereedschappen toe die verhoogde
toestemmingen nodig hebben, zoals passwd
.
Open twee terminals om dit in real-time te zien. Start op
het ene het proces passwd
als een normale
gebruiker. Controleer de procestabel terwijl het op een nieuw
wachtwoord wacht en kijk naar de gebruikersinformatie van het
commando passwd
.
In terminal A:
Changing local password for trhodes Old Password:
In terminal B:
#
ps aux | grep passwd
trhodes 5232 0.0 0.2 3420 1608 0 R+ 2:10AM 0:00.00 grep passwd root 5211 0.0 0.2 3620 1724 2 I+ 2:09AM 0:00.01
Zoals boven vermeld, wordt passwd
door
een normale gebruiker gedraaid, maar gebruikt het de effectieve
UID van root
.
De setgid
-toestemming voert dezelfde
functie uit als de setuid
-toestemming;
behalve dat het de groepsinstellingen verandert. Wanneer een
applicatie of gereedschap met deze instelling wordt gedraaid,
krijgt het de toestemmingen gebaseerd op de groep die het
bestand bezit, niet op de gebruiker die het proces startte.
Om de setgid
-toestemming op een bestand
aan te zetten, dient een voorlopende twee (2) aan het commando
chmod
gegeven te worden zoals in het volgende
voorbeeld:
#
chmod 2755 sgidvoorbeeld.sh
De nieuwe instelling kan zoals hierboven bekeken worden,
merk op dat de s
nu in het veld bestemd voor
de instellingen van de groepstoestemmingen staat:
-rwxr-sr-x 1 trhodes trhodes 44 Aug 31 01:49 sgidvoorbeeld.sh
In deze voorbeelden zal het shellscript niet met een andere EUID of effectief gebruikers-ID draaien, zelfs al is het shellscript uitvoerbaar. Dit is omdat shellscripts geen toegang hebben tot de setuid(2)-systeemaanroepen.
De eerste twee speciale toestemmingsbits die we besproken
hebben (de toestemmingsbits setuid
en
setgid
) kunnen de systeemveiligheid verlagen,
door verhoogde toestemmingen toe te staan. Er is een derde bit
voor speciale toestemmingen die de veiligheid van een systeem
kan verhogen: de klevende bit
.
De klevende bit
, wanneer deze op een map
is ingesteld, staat alleen het verwijderen van bestanden toe
door de eigenaar van die bestanden. Deze
toestemmingenverzameling is nuttig om het verwijderen van
bestanden in publieke mappen, zoals /tmp
, door gebruikers die het
bestand niet bezitten te voorkomen. Zet een één
(1) voor de toestemming om deze toestemming te gebruiken.
Bijvoorbeeld:
#
chmod 1777 /tmp
Het effect kan nu met het commando ls
bekeken worden:
#
ls -al / | grep tmp
drwxrwxrwt 10 root wheel 512 Aug 31 01:49 tmp
De toestemming klevende bit
is te
onderscheiden met de t
aan het einde van de
verzameling.