====== Access Control Lists (ACL) unter Linux ====== 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). ===== Vorteile von ACL ===== * Rechte für mehrere Benutzer und Gruppen gleichzeitig * Feingranulare Steuerung von Lese-, Schreib- und Ausführungsrechten * Erweiterte Attribute für zusätzliche Metadaten * Capabilities für präzise Rechtevergabe ohne volle Root-Rechte ===== Voraussetzungen ===== # 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 - ACL anzeigen ===== ''getfacl'' zeigt die Access Control Lists einer Datei oder eines Verzeichnisses an. ==== Syntax ==== getfacl [OPTIONEN] datei ==== Beispiele ==== # 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 ==== Wichtige Optionen ==== ^ 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 - ACL setzen/ändern ===== ''setfacl'' setzt oder ändert Access Control Lists für Dateien und Verzeichnisse. ==== Syntax ==== setfacl [OPTIONEN] [REGEL] datei ==== Grundlegende Beispiele ==== # 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 ACLs gleichzeitig ==== # 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 ==== ACLs entfernen ==== # 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 ==== Standard-ACL für Verzeichnisse ==== 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 anwenden ==== # 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/ ==== ACLs kopieren/wiederherstellen ==== # 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=- ==== Wichtige Optionen ==== ^ 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) | ==== ACL-Notation ==== [d:]:: d: = Default ACL (nur bei Verzeichnissen) = u (user), g (group), o (other), m (mask) = Username oder Gruppenname (leer bei owner/other) = 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 - ACL setzen (IRIX/XFS Style) ===== ''chacl'' ist eine alternative Syntax für ACLs, ursprünglich von IRIX/XFS. Auf modernen Linux-Systemen wird meist ''setfacl'' bevorzugt. ==== Syntax ==== chacl acl datei ==== Beispiele ==== # 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 - Erweiterte Attribute verwalten ===== ''attr'' verwaltet erweiterte Dateiattribute (Extended Attributes), die zusätzliche Metadaten an Dateien anhängen. ==== Syntax ==== attr [OPTIONEN] datei ==== Beispiele ==== # 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 ==== Wichtige Optionen ==== ^ 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 | ==== Namespaces ==== Extended Attributes nutzen verschiedene Namespaces: * ''user.*'' - Normale Benutzer-Attribute * ''trusted.*'' - Nur für root (vertrauenswürdig) * ''system.*'' - Vom System verwendet (z.B. ACLs) * ''security.*'' - Sicherheitsmodule (SELinux, AppArmor) ===== getfattr - Erweiterte Attribute anzeigen ===== ''getfattr'' zeigt erweiterte Dateiattribute (Extended Attributes) an - moderner Nachfolger von ''attr -g''. ==== Syntax ==== getfattr [OPTIONEN] datei ==== Beispiele ==== # 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 ==== Wichtige Optionen ==== ^ 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 | ==== Ausgabeformat ==== getfattr -d datei.txt # Ausgabe: # file: datei.txt # user.kommentar="Wichtig" # user.mime_type="text/plain" ===== setfattr - Erweiterte Attribute setzen ===== ''setfattr'' setzt oder ändert erweiterte Dateiattribute (Extended Attributes) - moderner Nachfolger von ''attr -s''. ==== Syntax ==== setfattr [OPTIONEN] datei ==== Beispiele ==== # 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 ==== Wichtige Optionen ==== ^ 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 | ==== Praktische Anwendungen ==== # 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 - Capabilities anzeigen ===== ''getcap'' zeigt die Linux Capabilities einer Datei an. Capabilities erlauben es, spezifische privilegierte Operationen auszuführen, ohne volle Root-Rechte zu benötigen. ==== Syntax ==== getcap [OPTIONEN] datei ==== Beispiele ==== # 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 ==== Wichtige Optionen ==== ^ Option ^ Bedeutung ^ | ''-r'' | Rekursiv | | ''-v'' | Verbose (detaillierte Ausgabe) | | ''-h'' | Symlinks nicht folgen | ==== Capability Flags ==== ^ Flag ^ Bedeutung ^ | ''e'' | Effective - Capability ist aktiv | | ''p'' | Permitted - Capability ist erlaubt | | ''i'' | Inheritable - Capability wird vererbt | ==== Häufige Capabilities ==== ^ 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 - Capabilities setzen ===== ''setcap'' setzt Linux Capabilities für Dateien. Dies ermöglicht Programme, spezifische privilegierte Operationen ohne SUID-Bit oder Root-Rechte auszuführen. ==== Syntax ==== setcap [capability][flags] datei ==== Beispiele ==== # 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 ==== Praktische Anwendungen ==== === Webserver ohne Root starten === # 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 === Ping ohne SUID === # 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 === Netzwerk-Tools === # 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 === Custom-Programme === # 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 ==== Wichtige Flags ==== ^ Flag ^ Bedeutung ^ | ''+ep'' | Effective + Permitted (Standard) | | ''+eip'' | Effective + Inheritable + Permitted | | ''+i'' | Nur Inheritable | | ''='' | Capability komplett ersetzen | | ''-r'' | Remove - Alle Capabilities entfernen | ==== Sicherheitshinweise ==== # 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:** * Capabilities werden bei Datei-Updates oft entfernt * Nach Paket-Updates müssen Capabilities neu gesetzt werden * Capabilities sind eine sicherere Alternative zu SUID * Minimalprinzip: Nur notwendige Capabilities setzen ===== Hinweise und Best Practices ===== ==== ACL-Erkennung ==== # 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-Unterstützung ==== ^ 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 ==== ACL vs. Traditionelle Rechte ==== # 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 ==== Backup und Migration ==== # 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 ==== Troubleshooting ==== === ACLs funktionieren nicht === # 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 nach Update weg === # 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 === Extended Attributes verschwinden === # Manche Tools entfernen xattr beim Kopieren # Verwenden Sie: cp -a --preserve=xattr quelle ziel rsync -aX quelle ziel ==== Sicherheitsaspekte ==== * **ACL regelmäßig prüfen**: ''getcap -r / 2>/dev/null'' für Audit * **Minimalprinzip**: Nur notwendige Rechte vergeben * **Capabilities statt SUID**: Reduziert Angriffsfläche * **Backup von ACL/xattr**: Bei wichtigen Systemen immer mit sichern * **Dokumentation**: ACL-Änderungen dokumentieren (wer, wann, warum) * **Monitoring**: Änderungen an Capabilities überwachen ==== Performance-Überlegungen ==== * ACL-Lookups sind minimal langsamer als traditionelle Rechte * Extended Attributes verbrauchen zusätzlichen Speicher (meist < 1%) * Bei sehr vielen ACL-Einträgen: Performance-Tests empfohlen * NFS v4 benötigt für ACL-Unterstützung aktivierte ACL-Optionen ===== Praxis-Beispiele ===== ==== Projekt-Verzeichnis mit Team-Zugriff ==== # 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 ohne Root-Rechte ==== # 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 mit ACL ==== # 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 ===== Siehe auch ===== * [[sammlung:chmod|chmod - Dateiberechtigungen ändern]] * [[sammlung:chown|chown - Besitzer ändern]] * [[sammlung:suid_sgid|SUID, SGID und Sticky Bit]] * [[sammlung:dateirechte_uebersicht|Dateirechte Übersicht]] * [[kommandoreferenz:acl|ACL Kommandoreferenz]] ===== Weitere Informationen ===== # 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 ---- {{tag>cli permissions security advanced}} ----