Rechte über File-Capabilities einschränken

© sxc.hu

Im Zaun halten

Zu viel Root tut nicht gut. Aus diesem Grund führten die Kernel-Entwickler mit Version 2.6.24 die Posix-File-Capabilities ein. Dieser Artikel erklärt, wie sie dem sicherheitsbewussten Admin helfen.

Ich bin Root, ich darf das! So lautet einer der Lieblingssprüche von Linux-Nutzern auf T-Shirts, Kaffeetassen und anderen Fanartikeln. In der Tat verfügt Linux über ein relativ einfaches Rechtemanagement: Es gibt Root, den Benutzer und "die Anderen" sowie Rechte zum Lesen, Schreiben und Ausführen. Zugriffe kontrolliert das System über eine relativ einfache Matrix dieser Berechtigungen, und Root darf immer alles.

Das Setuid-Bit

Es gibt allerdings Programme, die weitergehende Rechte benötigen, als sie einem durchschnittlichen Benutzer zustehen. Dazu zählen etwa der »passwd« -Befehl, der die Passwörter in der Datei »/etc/shadow« (oder »/etc/passwd« ) ändert, oder der »ping« -Befehl, mit dem man die Netzwerkkarte eines anderen Rechners anspricht. Traditionellerweise verleiht der Systemadministrator solchen Tools über »chmod u+s« das Setuid-Bit. Das führt dazu, dass das Programm mit den Rechten des Benutzers arbeitet, dem die Datei gehört – normalerweise arbeiten Programme mit den Rechten des Ausführenden. Manche Programme kommen von Haus aus mit gesetztem S-Bit, je nach Distribution.

Die Wirkungsweise des S-Bits lässt sich an einem kleinen Beispiel leicht nachvollziehen. Geben Sie dazu in einem Terminal den Befehl »su - Benutzername« ein:

marcel@kim:~ $ su - marcel
Passwort:

Rufen Sie nun in einem zweiten Terminalfenster den Befehl »ps -au | grep su« auf, so sehen Sie, dass der »su« -Befehl vom Benutzer root ausgeführt wurde. Während es beim »su« -Befehl noch relativ offensichtlich erscheint, warum er spezielle oder gar Root-Rechte benötigt, sieht es zum Beispiel bei »ping« ganz anders aus. Eigentlich würde es genügen, dem Ping-Befehl den Zugriff auf die entsprechenden Netzwerk-Socket zu gewähren – das ist aber mit traditionellen Unix-Rechten nicht möglich. Abhilfe schaffen die Posix-File-Capabilities.

Rechte minimieren

Die Posix-File-Capabilities bilden einen Teil der allgemeinen Posix-Capabilities [1]. Sie teilen die möglichen Berechtigungen in verschiedene Rechtebereiche (Capabilities) auf, die zusammen die Rechte des Administrators Root ergeben. Zurzeit gibt es 33 solcher Rechtebereiche, die Tabelle "Posix-Capabilities" gibt einen kurzen Überblick. Während die grundlegenden Capabilities bereits seit Kernel 2.2 Bestandteil von Linux sind, beherrscht Linux die File-Capabilities erst seit Version 2.6.24. Detaillierte Informationen zu den einzelnen Fähigkeiten finden sich in der Datei »/usr/include/linux/capability.h«

Auch bei den Posix-Access-Control-Listen (ACLs), die eine feingliedrige Rechteverteilung auf Verzeichnisse und Dateien ermöglichen, handelt es sich im weiteren Sinn um Posix-Capabilities; sie werden als erweiterte Attribute im Dateisystem abgelegt. Für den Einsatz von Posix-ACLs und File-Capabilities muss das Dateisystem deshalb mit der Option »user_xattr« eingehängt sein.

Tabelle 1

Posix-Capabilities

Nummer

Name

Erklärung

0

»CAP_CHOWN«

Eigentümer von Files beliebig setzen

1

»CAP_DAC_OVERRIDE«

Sich über Dateizugriffsrechte hinwegsetzen (DAC, Discretionary Access Control), nur das Immutable-Flag ist davon nicht betroffen

2

»CAP_DAC_READ_SEARCH«

In allen Files und Verzeichnissen lesen

3

»CAP_FOWNER«

Auf alle Files die Funktionen ausüben, die üblicherweise nur deren Eigentümern gestattet sind (etwa »chmod()« und »utime()« )

4

»CAP_FSETID«

Set-UID-Flag auch für fremde Files setzen

5

»CAP_KILL«

Beliebigen Prozessen Signale senden

6

»CAP_SETGID«

Beliebige Gruppen-ID annehmen

7

»CAP_SETUID«

Beliebige User-ID annehmen

8

»CAP_SETPCAP«

Eigene Capabilities an fremde Prozesse übertragen oder dort entfernen

9

»CAP_LINUX_IMMUTABLE«

Immutable- und Append-Only-Attribute ändern

10

»CAP_NET_BIND_SERVICE«

Privilegierte Ports verwenden

11

»CAP_NET_BROADCAST«

Broadcast-Nachrichten senden und empfangen

12

»CAP_NET_ADMIN«

Sammlung vieler Netzwerk-Konfigurationen (Interface, Firewall, Routing, Sockets, Promiscuous Mode setzen u.a.m..)

13

»CAP_NET_RAW«

Sockets vom Typ Raw (IPv4-Pakete) und Packet (Ethernet-Frames) verwenden

14

»CAP_IPC_LOCK«

Shared-Memory-Segmente sperren

15

»CAP_IPC_OWNER«

Nachrichten per IPC (Interprozesskommunikation) an beliebige Prozesse senden

16

»CAP_SYS_MODULE«

Kernel-Module laden und entladen, den Kernel beliebig ändern sowie Capabilities-Bounding-Sets ändern

17

»CAP_SYS_RAWIO«

Verwenden von »ioperm()« und »iopl()« sowie beliebige USB-Kommunikation

18

»CAP_SYS_CHROOT«

»chroot()« -Kommando absetzen

19

»CAP_SYS_PTRACE«

Beliebige Prozesse mit »ptrace()« überwachen und kontrollieren

20

»CAP_SYS_PACCT«

Prozess-Accounting konfigurieren

21

»CAP_SYS_ADMIN«

Viele administrative Aufgaben, etwa Domain- und Hostnamen ändern, Dateisysteme ein- und aushängen, Swapping ein/<0x200B>ausschalten, Semaphore löschen uvm.

22

»CAP_SYS_BOOT«

Das System per »reboot()« neu starten

23

»CAP_SYS_NICE«

Die Priorität per »nice()« hochsetzen, Realtime-Scheduling verwenden und die CPU-Affinität fremder Prozesse ändern

24

»CAP_SYS_RESOURCE«

Ressourcenlimits überschreiten, etwa Quota, reservierter Filesystemraum, Größenbeschränkungen bei IPC-Nachrichten etc..

25

»CAP_SYS_TIME«

Die Systemzeit stellen

26

»CAP_SYS_TTY_CONFIG«

TTY-Geräte konfigurieren

27

»CAP_MKNOD«

Alle Funktionen von »mknod()« beim Anlegen von Gerätedateien nutzen

28

»CAP_LEASE«

Dateien leasen (siehe »fcntl()« -Leases)

29

»CAP_AUDIT_WRITE«

Meldungen an das Audit-Subsystem senden

30

»CAP_AUDIT_CONTROL«

Audit-Subsystem per »auditctl()« konfigurieren

31

»CAP_SETFCAP«

Posix-Capabilities im Extended Attribute »capability« speichern, also File Posix-Capabilities setzen

32

»CAP_MAC_OVERRIDE«

Erlaubt es, zwingende Zugriffskontrollen (Mandatory Access Control, MAC) des Linux-Sicherheitsmoduls (LSM) zu überschreiben

33

»CAP_MAC_ADMIN«

Erlaubt administrativen Zugriff auf die zwingenden Zugriffskontrollen

Wie erwähnt verfügt »ping« bei den meisten Distributionen von Haus aus über das Setuid-Bit. Um einem normalen Nutzer den Ping-Befehl zu ermöglichen, könnte der Administrator entweder den Zugriff auf die Netzwerk-Geräte über die typischen Unix-Dateirechte freigeben oder über die File-Capabilities genau das Feature freischalten, das der Ping-Befehl benötigt – in diesem Fall »CAP_NET_RAW« . Dann kann er auf das Setuid-Bit beim Ping-Befehl verzichten.

comments powered by Disqus