Mit ACLs (Access Control Lists) und erweiterten Attributen können Zugriffsrechte auf Dateien und Verzeichnisse detaillierter vergeben werden als mit den klassischen Unix-Rechten (User/Group/Other).
# Prüfen ob Dateisystem ACL unterstützt mount | grep acl tune2fs -l /dev/sda1 | grep acl # ACL-Pakete installieren (falls nicht vorhanden) sudo apt install acl attr # Debian/Ubuntu sudo dnf install acl attr # RHEL/Fedora # Dateisystem mit ACL mounten (falls nötig) sudo mount -o remount,acl /partition # Oder in /etc/fstab: defaults,acl
getfacl zeigt die Access Control Lists einer Datei oder eines Verzeichnisses an.
getfacl [OPTIONEN] datei
# ACL einer Datei anzeigen getfacl datei.txt # Ausgabe: # file: datei.txt # owner: user # group: group user::rw- user:alice:rwx group::r-- mask::rwx other::r-- # ACL für mehrere Dateien getfacl datei1.txt datei2.txt # Rekursiv für Verzeichnis getfacl -R verzeichnis/ # Ohne Header/Kommentare (nur Rechte) getfacl -c datei.txt # Numerische IDs statt Namen getfacl -n datei.txt # Absolute Pfade anzeigen getfacl -p verzeichnis/* # Als Backup speichern getfacl -R /home/user > acl-backup.txt
| Option | Bedeutung |
|---|---|
-R | Rekursiv |
-c | Ohne Kommentare |
-e | Alle effektiven Rechte anzeigen |
-n | Numerische User/Group IDs |
-p | Absolute Pfade nicht kürzen |
-t | Tabellarische Ausgabe |
setfacl setzt oder ändert Access Control Lists für Dateien und Verzeichnisse.
setfacl [OPTIONEN] [REGEL] datei
# Benutzer-Rechte hinzufügen setfacl -m u:alice:rwx datei.txt # alice erhält rwx setfacl -m u:bob:r-- datei.txt # bob erhält r-- # Gruppen-Rechte hinzufügen setfacl -m g:projekt:rw- datei.txt # Gruppe projekt erhält rw- setfacl -m g:admin:rwx datei.txt # Gruppe admin erhält rwx # Other-Rechte ändern setfacl -m o::r-- datei.txt # Other erhält r-- # Mask setzen (maximale effektive Rechte) setfacl -m m::rw- datei.txt # Mask auf rw- setzen
# Mehrere Regeln mit Komma setfacl -m u:alice:rwx,u:bob:r--,g:team:rw- datei.txt # Mit mehreren -m Optionen setfacl -m u:alice:rwx -m u:bob:r-- datei.txt
# Spezifischen Eintrag entfernen setfacl -x u:alice datei.txt # ACL für alice entfernen setfacl -x g:projekt datei.txt # ACL für Gruppe entfernen # Alle ACLs entfernen setfacl -b datei.txt # Alle Extended ACLs löschen # Alle default ACLs entfernen setfacl -k verzeichnis/ # Nur Default-ACLs löschen
Default ACLs werden auf neu erstellte Dateien/Verzeichnisse vererbt:
# Default ACL setzen (mit d: Präfix) setfacl -m d:u:alice:rwx verzeichnis/ setfacl -m d:g:team:rw- verzeichnis/ # Default und normale ACL gleichzeitig setfacl -m u:alice:rwx,d:u:alice:rwx verzeichnis/ # Beispiel: Projekt-Verzeichnis setfacl -m u:alice:rwx verzeichnis/ # Alice Zugriff auf bestehendes setfacl -m d:u:alice:rwx verzeichnis/ # Alice Zugriff auf neue Dateien setfacl -m d:g:projektteam:rw- verzeichnis/ # Team Zugriff auf neue Dateien # Groß-X: Ausführungsrecht nur für Verzeichnisse setfacl -m d:u:alice:rwX verzeichnis/
# Rekursiv auf Verzeichnis und Inhalt setfacl -R -m u:alice:rwx verzeichnis/ # Rekursiv + Default ACL für neue Dateien setfacl -R -m u:alice:rwx verzeichnis/ setfacl -R -m d:u:alice:rwx verzeichnis/ # Kombiniert setfacl -R -m u:alice:rwx,d:u:alice:rwx verzeichnis/
# ACL von einer Datei auf andere kopieren getfacl datei1.txt | setfacl --set-file=- datei2.txt # ACL Backup erstellen und wiederherstellen getfacl -R /home/user > acl-backup.txt setfacl --restore=acl-backup.txt # ACL von Verzeichnis auf anderes kopieren getfacl -R /source/ | setfacl --restore=-
| Option | Bedeutung |
|---|---|
-m | Modify - ACL hinzufügen/ändern |
-x | Remove - ACL-Eintrag entfernen |
-b | Remove all - Alle ACLs entfernen |
-k | Remove default - Default ACLs entfernen |
-R | Rekursiv |
–set | ACL komplett ersetzen |
–set-file | ACL aus Datei setzen |
–restore | ACL-Backup wiederherstellen |
-d | Default ACL ändern (deprecated, nutze d: Präfix) |
–test | Testmodus (keine Änderungen) |
[d:]<typ>:<name>:<rechte> d: = Default ACL (nur bei Verzeichnissen) <typ> = u (user), g (group), o (other), m (mask) <name> = Username oder Gruppenname (leer bei owner/other) <rechte> = rwx, rw-, r--, etc.
Beispiele:
u:alice:rwx # User alice mit rwx g:team:rw- # Gruppe team mit rw- u::rw- # Dateibesitzer mit rw- o::r-- # Other mit r-- m::rwx # Mask mit rwx d:u:alice:rwx # Default für alice d:g:team:rw- # Default für Gruppe team
chacl ist eine alternative Syntax für ACLs, ursprünglich von IRIX/XFS. Auf modernen Linux-Systemen wird meist setfacl bevorzugt.
chacl acl datei
# ACL setzen (IRIX-Stil) chacl u::rwx,g::r--,o::--- datei.txt # Mit Named User chacl u::rwx,u:alice:rwx,g::r--,o::--- datei.txt # Rekursiv chacl -r u::rwx,g::r--,o::--- verzeichnis/
Hinweis: Auf den meisten Linux-Systemen ist setfacl die bevorzugte Methode.
attr verwaltet erweiterte Dateiattribute (Extended Attributes), die zusätzliche Metadaten an Dateien anhängen.
attr [OPTIONEN] datei
# Attribut setzen attr -s attributname -V "wert" datei.txt attr -s kommentar -V "Wichtiges Dokument" datei.txt # Attribut anzeigen attr -g attributname datei.txt attr -g kommentar datei.txt # Alle Attribute auflisten attr -l datei.txt # Attribut entfernen attr -r attributname datei.txt attr -r kommentar datei.txt # Root-Namespace verwenden (nur root) attr -Rs attribut -V "wert" datei.txt
| Option | Bedeutung |
|---|---|
-s | Set - Attribut setzen |
-g | Get - Attribut anzeigen |
-r | Remove - Attribut entfernen |
-l | List - Alle Attribute auflisten |
-V | Value - Wert des Attributs |
-R | Root-Namespace |
-L | Symlinks nicht folgen |
Extended Attributes nutzen verschiedene Namespaces:
user.* - Normale Benutzer-Attributetrusted.* - Nur für root (vertrauenswürdig)system.* - Vom System verwendet (z.B. ACLs)security.* - Sicherheitsmodule (SELinux, AppArmor)
getfattr zeigt erweiterte Dateiattribute (Extended Attributes) an - moderner Nachfolger von attr -g.
getfattr [OPTIONEN] datei
# Alle Extended Attributes anzeigen getfattr -d datei.txt # Bestimmtes Attribut anzeigen getfattr -n user.kommentar datei.txt # Alle user.* Attribute getfattr -d -m "^user\." datei.txt # Mit Attributwerten (hex encoding für binäre Daten) getfattr -d -e hex datei.txt # Rekursiv für Verzeichnis getfattr -R -d verzeichnis/ # Nur Attributnamen (ohne Werte) getfattr -d -m - --only-values datei.txt # Für Symlink selbst (nicht Ziel) getfattr -h symlink # Backup aller Attribute getfattr -R -d -m - /pfad > xattr-backup.txt
| Option | Bedeutung |
|---|---|
-d | Dump - Alle Attribute anzeigen |
-n name | Spezifisches Attribut anzeigen |
-m pattern | Pattern-Match für Attribute |
-R | Rekursiv |
-h | Symlinks nicht folgen |
-e encoding | Encoding: text, hex, base64 |
–only-values | Nur Werte, keine Namen |
–absolute-names | Absolute Pfadnamen |
getfattr -d datei.txt # Ausgabe: # file: datei.txt # user.kommentar="Wichtig" # user.mime_type="text/plain"
setfattr setzt oder ändert erweiterte Dateiattribute (Extended Attributes) - moderner Nachfolger von attr -s.
setfattr [OPTIONEN] datei
# Attribut setzen setfattr -n user.kommentar -v "Wichtiges Dokument" datei.txt setfattr -n user.author -v "Max Mustermann" datei.txt # Mehrere Attribute setzen setfattr -n user.kommentar -v "Text" datei.txt setfattr -n user.version -v "1.0" datei.txt # Attribut entfernen setfattr -x user.kommentar datei.txt # Alle user.* Attribute entfernen getfattr -d -m "user.*" datei.txt | \ grep "^user\." | cut -d= -f1 | \ xargs -I {} setfattr -x {} datei.txt # Binäre Werte (hex) setfattr -n user.checksum -v 0x48656c6c6f datei.txt # Rekursiv anwenden setfattr -R -n user.projekt -v "MyProject" verzeichnis/ # Für Symlink selbst (nicht Ziel) setfattr -h -n user.type -v "symlink" link # Attribute kopieren getfattr -d datei1.txt | setfattr --restore=- datei2.txt
| Option | Bedeutung |
|---|---|
-n name | Name des Attributs |
-v value | Wert des Attributs |
-x name | Attribut entfernen |
-R | Rekursiv |
-h | Symlinks nicht folgen |
–restore=file | Attribute aus Datei wiederherstellen |
# Dateiklassifizierung setfattr -n user.category -v "vertraulich" dokument.pdf setfattr -n user.project -v "Projekt-X" datei.txt # Metadaten für Bilder setfattr -n user.copyright -v "© 2025 Firma" bild.jpg setfattr -n user.description -v "Produktfoto" bild.jpg # Checksums/Hashes speichern md5sum datei.txt | cut -d' ' -f1 | xargs setfattr -n user.md5 -v # Backup-Informationen setfattr -n user.backup_date -v "$(date +%Y-%m-%d)" datei.txt setfattr -n user.backup_host -v "$(hostname)" datei.txt # Custom Flags setfattr -n user.reviewed -v "yes" dokument.txt setfattr -n user.approved_by -v "chef" bericht.pdf
getcap zeigt die Linux Capabilities einer Datei an. Capabilities erlauben es, spezifische privilegierte Operationen auszuführen, ohne volle Root-Rechte zu benötigen.
getcap [OPTIONEN] datei
# Capabilities einer Datei anzeigen getcap /usr/bin/ping # Ausgabe: /usr/bin/ping = cap_net_raw+ep # Mehrere Dateien prüfen getcap /usr/bin/* 2>/dev/null # Rekursiv alle Dateien mit Capabilities finden getcap -r / 2>/dev/null # Rekursiv in Verzeichnis getcap -r /usr/bin # Mit Details getcap -v /usr/bin/ping # Alle ausführbaren Dateien mit Capabilities find /usr/bin -type f -executable -exec getcap {} \; 2>/dev/null
| Option | Bedeutung |
|---|---|
-r | Rekursiv |
-v | Verbose (detaillierte Ausgabe) |
-h | Symlinks nicht folgen |
| Flag | Bedeutung |
|---|---|
e | Effective - Capability ist aktiv |
p | Permitted - Capability ist erlaubt |
i | Inheritable - Capability wird vererbt |
| Capability | Bedeutung |
|---|---|
cap_net_raw | Raw Sockets (ping, traceroute) |
cap_net_admin | Netzwerk-Administration |
cap_net_bind_service | An privilegierte Ports binden (<1024) |
cap_dac_override | Datei-Zugriffskontrollen umgehen |
cap_sys_admin | System-Administration |
cap_chown | Dateibesitzer ändern |
cap_setuid | UID ändern |
cap_setgid | GID ändern |
cap_sys_time | Systemzeit ändern |
setcap setzt Linux Capabilities für Dateien. Dies ermöglicht Programme, spezifische privilegierte Operationen ohne SUID-Bit oder Root-Rechte auszuführen.
setcap [capability][flags] datei
# Capability setzen sudo setcap cap_net_raw+ep /usr/bin/ping # Mehrere Capabilities sudo setcap cap_net_raw,cap_net_admin+ep /pfad/zu/programm # Port-Binding unter 1024 erlauben (z.B. für Webserver) sudo setcap cap_net_bind_service+ep /usr/local/bin/webserver # Alle Capabilities entfernen sudo setcap -r /usr/bin/ping # Capability prüfen und setzen getcap /usr/bin/programm sudo setcap cap_sys_admin+ep /usr/bin/programm # Für Python-Binary (z.B. für Raw Sockets) sudo setcap cap_net_raw+ep /usr/bin/python3.10
# Apache/Nginx an Port 80/443 binden ohne Root sudo setcap cap_net_bind_service+ep /usr/sbin/nginx sudo setcap cap_net_bind_service+ep /usr/sbin/apache2 # Testen nginx -t sudo systemctl restart nginx
# Statt SUID-Bit Capability nutzen sudo chmod u-s /usr/bin/ping # SUID entfernen sudo setcap cap_net_raw+ep /usr/bin/ping # Capability setzen # Testen ping -c 1 8.8.8.8
# tcpdump ohne Root sudo setcap cap_net_raw,cap_net_admin+ep /usr/sbin/tcpdump # wireshark ohne Root sudo setcap cap_net_raw,cap_net_admin+eip /usr/bin/dumpcap # traceroute sudo setcap cap_net_raw+ep /usr/bin/traceroute
# Eigenes Programm compilieren und Capability setzen gcc -o myserver myserver.c sudo setcap cap_net_bind_service+ep ./myserver ./myserver --port 80 # Kann jetzt Port 80 nutzen ohne Root
| Flag | Bedeutung |
|---|---|
+ep | Effective + Permitted (Standard) |
+eip | Effective + Inheritable + Permitted |
+i | Nur Inheritable |
= | Capability komplett ersetzen |
-r | Remove - Alle Capabilities entfernen |
# Alle Dateien mit Capabilities finden (Sicherheits-Audit) sudo getcap -r / 2>/dev/null # Oder mit find sudo find / -type f -exec getcap {} \; 2>/dev/null | grep -v "=" # Capabilities nach System-Update prüfen (werden oft entfernt) sudo setcap -v cap_net_bind_service+ep /usr/local/bin/myapp
Wichtig:
# Dateien mit ACL finden (haben "+" in ls -l) ls -l datei.txt -rw-r--r--+ 1 user group 1234 Dez 24 10:00 datei.txt ^ Plus zeigt ACL an # Alle Dateien mit ACL in Verzeichnis find /pfad -exec ls -ld {} \; 2>/dev/null | grep "^.*+.*" # Mit getfacl getfacl -R verzeichnis/ | grep "^# file:"
| Dateisystem | ACL | Extended Attributes | Capabilities |
|---|---|---|---|
| ext4 | ✓ | ✓ | ✓ |
| xfs | ✓ | ✓ | ✓ |
| btrfs | ✓ | ✓ | ✓ |
| ntfs-3g | ✓ (eingeschränkt) | ✗ | ✗ |
| vfat/FAT32 | ✗ | ✗ | ✗ |
| nfs | ✓ (v4+) | ✓ (v4+) | ✗ |
# Prüfen ob aktiviert mount | grep acl tune2fs -l /dev/sda1 | grep -i "default mount options" # Aktivieren in /etc/fstab UUID=xxx / ext4 defaults,acl,user_xattr 0 1
# Problem: Mehrere Benutzer, aber nur eine Gruppe # Traditionell: Komplizierte Gruppenverwaltung nötig # Mit ACL: Einfache Lösung setfacl -m u:alice:rwx datei.txt setfacl -m u:bob:rw- datei.txt setfacl -m u:charlie:r-- datei.txt
# Komplettes ACL/Extended Attribute Backup getfacl -R /source > acl-backup.txt getfattr -R -d -m - /source > xattr-backup.txt # Wiederherstellen cd /target setfacl --restore=acl-backup.txt setfattr --restore=xattr-backup.txt # Mit rsync (ACL + xattr erhalten) rsync -aAX /source/ /destination/ # -a = archive mode # -A = ACLs erhalten # -X = Extended Attributes erhalten # Mit tar (ACL + xattr) tar --acls --xattrs -czf backup.tar.gz /source tar --acls --xattrs -xzf backup.tar.gz -C /destination # Mit cp (ACL + xattr) cp -a --preserve=all quelle ziel
# 1. Dateisystem-Unterstützung prüfen mount | grep acl # 2. ACL-Pakete installieren sudo apt install acl attr # Debian/Ubuntu sudo dnf install acl attr # RHEL/Fedora # 3. Partition mit ACL neu mounten sudo mount -o remount,acl / # 4. /etc/fstab anpassen # Zeile finden und "acl" hinzufügen: UUID=xxx / ext4 defaults,acl 0 1
# Capabilities werden oft bei Package-Updates entfernt # Lösung: Capabilities in Startup-Skript setzen # /etc/rc.local oder systemd service: #!/bin/bash setcap cap_net_bind_service+ep /usr/local/bin/myserver setcap cap_net_raw+ep /usr/local/bin/mytool
# Manche Tools entfernen xattr beim Kopieren # Verwenden Sie: cp -a --preserve=xattr quelle ziel rsync -aX quelle ziel
getcap -r / 2>/dev/null für Audit# Projekt-Verzeichnis erstellen sudo mkdir /srv/projekt-x sudo chown projektleiter:projektteam /srv/projekt-x # ACL für Team-Mitglieder sudo setfacl -m u:alice:rwx /srv/projekt-x sudo setfacl -m u:bob:rwx /srv/projekt-x sudo setfacl -m u:charlie:r-x /srv/projekt-x # Nur lesen # Default ACL für neue Dateien sudo setfacl -m d:u:alice:rwx /srv/projekt-x sudo setfacl -m d:u:bob:rwx /srv/projekt-x sudo setfacl -m d:u:charlie:r-x /srv/projekt-x sudo setfacl -m d:g:projektteam:rw- /srv/projekt-x # Metadaten hinzufügen sudo setfattr -n user.project -v "Projekt-X" /srv/projekt-x sudo setfattr -n user.created -v "$(date +%Y-%m-%d)" /srv/projekt-x # Prüfen getfacl /srv/projekt-x getfattr -d /srv/projekt-x
# Webserver-Binary mit Capability ausstatten sudo setcap cap_net_bind_service+ep /usr/local/bin/webserver # Test /usr/local/bin/webserver --port 80 --user www-data # Läuft als www-data, kann aber Port 80 nutzen # Prüfen getcap /usr/local/bin/webserver ps aux | grep webserver
# Shared Folder für Abteilung sudo mkdir /srv/shared-marketing sudo chmod 770 /srv/shared-marketing sudo chgrp marketing /srv/shared-marketing sudo chmod g+s /srv/shared-marketing # SGID für Gruppenvererbung # ACL für externe Berater (nur lesen) sudo setfacl -m u:berater1:r-x /srv/shared-marketing sudo setfacl -m d:u:berater1:r-- /srv/shared-marketing # ACL für Management (nur lesen) sudo setfacl -m g:management:r-x /srv/shared-marketing sudo setfacl -m d:g:management:r-- /srv/shared-marketing # Prüfen getfacl /srv/shared-marketing
# Manpages man getfacl man setfacl man getfattr man setfattr man getcap man setcap man capabilities man acl man attr # Kernel-Dokumentation man 7 capabilities man 5 acl