Rechtenbeheer on steroids
Oct 12 2023
Discretionary Access Control
Een moeilijke naam voor het standaard rechtensysteem in Linux. Dit systeem bepaalt wie wat mag doen wel welke bestanden of mappen. Standaard is dat opgedeeld in drie groeperingen van rechten;
- Gebruiker (of eigenaar)
- Groep
- Alle andere gebruikers
Per deze drie groepen kan je opnieuw drie rechten geven; Read, Write en Execute. Deze rechten zijn dan in te stellen met chown (change owner) om de eigenaar of groep te veranderen en chmod (change mode) om de rechten voor de drie entiteiten aan te passen. De basiskennis gaat verder. Je kan de rechten instellen met symbolische of numerieke waarden. Waar je bij symbolische waarden volledig moet uitschrijven welke rechten voor eigenaar, groe. en anderen zijn (u=rwx,g=rwx,o=rwx)en voor numerieke waarden kan je een snel sommetje maken. (777 => iedere 7 is 4,voor leesrechten, plus 2, voor schrijfrechten plus 1 voor uitvoerrechten). Meer over die rechten in een eerder post
Probleemstelling
In sommige gevallen heb je meerdere teams die niet noodzakelijke dezelfde rechten mogen hebben maar toch moeten samenwerken in dezelfde locatie. Het basisrechtenbeheer systeem schiet hier tekort. Als we leden van één groep bepaalde rechten geven, kunnen we niet een andere groep andere rechten geven zonder dat we alle andere gebruikers diezelfde rechten ook geven.
De oplossing: ACL
Access Control List is een uitbreiding op het basis rechtensysteem en stelt ons in staat om meerdere groepen en gebruikers rechten te geven op bestanden. Ieder bestand en map heeft nog steeds slechts één eigenaar en groep eigenaar maar daarnaast kunnen extra rechten verdeeld worden. De tools hiervoor zitten standaard in onze favoriete Distro's zoals RedHat, Rocky Linux en uiteraard Fedora genaamd getfacl
en setfacl
.
Wanneer we getfacl
uitvoeren op een map, krijgen we de standaard rechten te zien maar iets leuker gepresenteerd. Daarnaast kunnen we ook een flag -t
meegeven om dezelfde info ook in kollommen gepresenteerd te krijgen.
getfacl .
# file: .
# owner: ewinderickx
# group: ewinderickx
user::rwx
group::---
other::---
getfacl -t .
# file: .
USER ewinderickx rwx
GROUP ewinderickx ---
other
Extra rechten instellen
Na getfacl
, gaan we aan de slag met setfacl
. Hiermee kunnen we de extra rechten beheren. De syntax om extra rechten toe te voegen is heel simpel.
# Instellingen voor gebruikers of groepen
setfacl -m user:bob:rw /home/development/
setfacl -m group:devtest:rwx /home/development/
# Kortere versie om alles ineens uit te voeren
setfacl -m u:bob:rw,g:devtest:rwx /home/development/
De gebruiker bob
heeft nu additioneel aan de eigenaar en de groep eigenaar ook lees en schrijfrechten. De dev
groep heeft daarbovenop ook nog eens uitvoerrechten. Dat terwijl andere gebruikers helemaal geen rechten moeten hebben.
Als we nu getfacl
uitvoeren op de /home/development
map ziet het er normaal zo uit. We hebben hier 770 ingesteld als basis rechten met de SGID en sticky bit. De groepseigenaar zal nu developers blijven en iedereen kan enkel bestanden verwijderen die daar eigenaar van is.
# file: .
# owner: root
# group: developers
# flags: -st
user::rwx
user:bob:rw-
group::rwx
group:devtest:rwx
mask::rwx
other::---
Default rechten
Complexe rechten zoals die met ACL worden standaard niet toegepast. Als je de setfacl
uitvoert zoals hierboven, voer je eenmalig een operatie uit. Dat is niet handig als er nieuwe bestanden worden aangemaakt. Hiervoor is er wel nog de defaults
optie in ACL. Als je de rechten instelt op een map met de -d
flag, worden de rechten automatisch toegepast op de nieuwe bestanden onder die map.
setfacl -d -m u:bob:rw,g:devtest:rwx /home/developers
Dat geeft dan:
# file: .
# owner: root
# group: developers
# flags: -st
user::rwx
user:bob:rw-
group::rwx
group:devtest:rwx
mask::rwx
other::---
default:user::rwx
default:user:bob:rw-
default:group::rwx
default:group:devtest:rwx
default:mask::rwx
default:other::---
Een bestand dat iemand uit de developers groep aanmaakt, krijgt nu dus ook de rechten van voor devtest en bob zoals hierboven staat. Handig maar vooral ook extra veilig!