Wie setzt man die Capabilities ein?

Die Capabilities werden seit dem Linux-Kernel 2.2.11 unterstützt. Leider gab es in der Vergangenheit nur sehr wenig Möglichkeiten, diese einzusetzen und nur wenige Administratoren, die diese Möglichkeiten genutzt haben.

Natürlich erlauben Mandatory Access Control Systeme, wie die in diesem Buch beschriebenen AppArmor und SELinux, aber auch LIDS, grsecurity, RSBAC, etc. die Verwaltung dieser Capabilities. Diese Verwaltung ist meist auch sehr flexibel und komfortabel. Aber Linux-Systeme, die diese Funktionen nicht besitzen, können auch von den Capabilities profitieren. Die meisten Administratoren kennen nur nicht die Möglichkeiten.

Die Capabilities können über /proc/sys/kernel/cap-bound gelesen und geschrieben werden. Dies ist das Capability-Bounding-Set. Dieses gibt die maximal ausübbaren Capabilities für das gesamte System an. Hierbei wird jede Capability durch ein Bit repräsentiert. Diese Konfiguration ist aber mit Vorsicht zu nutzen. Selbst root kann eine Capability, die dem System entzogen wurde, nicht wieder zur Verfügung stellen. Lediglich der init-Prozess könnte dies tun. Da dieser aber diese Funktion nicht anbietet, können Sie über diese Datei die maximal verfügbaren Capabilities nach dem Start des Systems konfigurieren. Eine Modifikation ist dann nur durch einen Reboot möglich. Um zum Beispiel eine Modifikation des Kernels zu verhindern, können Sie die Capability CAP_SYS_MODULE entfernen. Damit ein potentieller Angreifer nicht direkt über /dev/mem ein Modul nachlädt oder das Capability Bounding Set verändert, sollten Sie auch immer die Capability CAP_SYS_RAWIO entfernen. Allerdings funktionieren dann einige Programme nicht mehr, die direkten Zugriff auf den Speicher und I/O-Ports benötigen. Hierzu gehört auch X.

Um das Capability-Bounding-Set zu editieren, gibt es mehrere Möglichkeiten. Zwei Programme sind auf der CD enthalten. Hierbei handelt es sich um den Befehl lcap der in der Debian-Distribution enthalten ist und das Perl-Skript syscapset. Mit beiden Befehlen können Sie die aktuellen Capabilities auslesen und sie setzen:

[root@supergrobi ~]# syscapset list
audit_control                      enabled
audit_write                        enabled
chown                              enabled
dac_override                       enabled
dac_read_search                    enabled
fowner                             enabled
fsetid                             enabled
....
[root@supergrobi ~]# lcap 
Current capabilities: 0xFDEFFEFF
   0) *CAP_CHOWN                   1) *CAP_DAC_OVERRIDE         
   2) *CAP_DAC_READ_SEARCH         3) *CAP_FOWNER               
   4) *CAP_FSETID                  5) *CAP_KILL                 
   6) *CAP_SETGID                  7) *CAP_SETUID               
   8)  CAP_SETPCAP                 9) *CAP_LINUX_IMMUTABLE      
  10) *CAP_NET_BIND_SERVICE       11) *CAP_NET_BROADCAST        
  12) *CAP_NET_ADMIN              13) *CAP_NET_RAW              
  14) *CAP_IPC_LOCK               15) *CAP_IPC_OWNER            
  16) *CAP_SYS_MODULE             17) *CAP_SYS_RAWIO            
  18) *CAP_SYS_CHROOT             19) *CAP_SYS_PTRACE           
  20)  CAP_SYS_PACCT              21) *CAP_SYS_ADMIN            
  22) *CAP_SYS_BOOT               23) *CAP_SYS_NICE             
  24) *CAP_SYS_RESOURCE           25)  CAP_SYS_TIME             
  26) *CAP_SYS_TTY_CONFIG         27) *CAP_MKNOD                
  28) *CAP_LEASE                  29) *CAP_AUDIT_WRITE          
  30) *CAP_AUDIT_CONTROL        
    * = Capabilities currently allowed
Um eine Capability zu entfernen, geben Sie diese einfach bei den Befehlen an:
[root@supergrobi ~]# lcap CAP_SYS_TIME
[root@supergrobi ~]# syscapset set sys_time

Sinnvoll ist der Einsatz dieser Befehle nachdem der Bootvorgang abgeschlossen ist, sämtliche Module geladen wurden und das System sich in einem funktionstüchtigen Zustand befindet. Capabilities, deren Deaktivierung zu empfehlen ist, sind:

Natürlich müssen Sie die korrekte Funktion Ihres Systems anschließend prüfen. Auf Firewallsystemen, deren Netzwerkkonfiguration sich nicht ändert, können Sie auch überlegen CAP_NET_ADMIN zu deaktivieren.

Ralf Spenneberg 2007-11-13