Provided by: manpages-de_1.4-1_all bug

BEZEICHNUNG

       capabilities - Überblick über Linux-Capabilities

BESCHREIBUNG

       Für   den   Zweck   der   Durchführung  von  Rechteprüfungen  unterscheiden  traditionelle
       UNIX-Implementierungen zwei Arten von Prozessen: Privilegierte Prozesse  (deren  effektive
       Benutzer-ID  0  ist,  auch  als  Superuser oder Root benannt) und unprivilegierte Prozesse
       (deren effektive UID von Null verschieden  ist).  Privilegierte  Prozesse  übergehen  alle
       Kernel-Rechteprüfungen,   während   unprivilegierte  Prozesse  der  vollen  Rechteprüfung,
       basierend auf den Berechtigungsnachweisen des  Prozesses  (normalerweise:  effektive  UID,
       effektive GID und ergänzende Gruppenliste), unterliegen.

       Beginnend  mit  Kernel  2.2  unterteilt  Linux  die  Privilegien, die traditionell mit dem
       Superuser assoziiert sind, in getrennte Einheiten,  die  als  Capabilities  bekannt  sind.
       Diese  können  unabhängig voneinander aktiviert oder deaktiviert werden. Capabilities sind
       ein Attribut pro Thread.

   Liste der Capabilities
       Die folgende Liste zeigt die in Linux implementierten  Capabilities  und  die  Operationen
       oder Verhalten, die jede Capability erlaubt:

       CAP_AUDIT_CONTROL (seit Linux 2.6.11)
              Kernel-Auditierung aktivieren und deaktivieren; die Auditierung-Filterregel ändern;
              den Auditstatus und Filterregel abfragen.

       CAP_AUDIT_WRITE (seit Linux 2.6.11)
              Datensätze in das Audit-Protokoll des Kernels schreiben

       CAP_BLOCK_SUSPEND (seit Linux 3.5)
              Funktionalitäten  einsetzen,  die  die   System-Supsendierung   blockieren   können
              (epoll(7) EPOLLWAKEUP, /proc/sys/wake_lock).

       CAP_CHOWN
              beliebige Änderungen an Datei-UIDs und GIDs vornehmen (siehe chown(2))

       CAP_DAC_OVERRIDE
              Lese-,  Schreibe  und  Ausführrechteprüfungen  umgehen.  (DAC ist die Abkürzung für
              »discretionary access control«, benutzerbestimmbare Zugriffskontrolle)

       CAP_DAC_READ_SEARCH
              * Dateileserechteprüfungen   und   Verzeichnislese-   und   -ausführrechteprüfungen
                umgehen.
              * open_by_handle_at(2) aufrufen.

       CAP_FOWNER
              * Rechteprüfungen  umgehen,  die  normalerweise verlangen, dass die Dateisystem-UID
                des Prozesses mit der UID der Datei  übvereinstimmt  (z.B.  chmod(2),  utime(2)),
                hierbei  sind  Operationen,  die  durch  CAP_DAC_OVERRIDE und CAP_DAC_READ_SEARCH
                abgedeckt sind, ausgeschlossen;
              * erweiterte Dateiattribute für beliebige Dateien setzen (siehe chattr(1));
              * Zugriffskontrolllisten (»Access  Control  Lists«,  ACLs)  auf  beliebige  Dateien
                setzen;
              * »sticky«-Bit von Verzeichnissen beim Dateilöschen ignorieren;
              * O_NOATIME für beliebige Dateien in open(2) und fcntl(2) setzen

       CAP_FSETID
              Set-User-ID-  und  Set-Group-ID-Rechte-Bits  nicht  zurücksetzen,  wenn  eine Datei
              verändert wird; das Set-Group-ID-Bit für eine Datei setzen, deren GID nicht auf das
              Dateisystem- oder eine der ergänzenden GIDs des aufrufenden Prozesses passt.

       CAP_IPC_LOCK
              Speicher sperren (mlock(2), mlockall(2), mmap(2), shmctl(2)).

       CAP_IPC_OWNER
              Rechteprüfungen für Operationen mit System-V-IPC-Objekten umgehen

       CAP_KILL
              Rechteprüfungen beim Senden von Signalen umgehen (siehe kill(2)). Dies schließt die
              ioctl(2)-KDSIGACCEPT-Operation mit ein.

       CAP_LEASE (seit Linux 2.4)
              Etabliert ein Leasing für beliebige Dateien (siehe fcntl(2)).

       CAP_LINUX_IMMUTABLE
              Setzt die i-node-Schalter FS_APPEND_FL und FS_IMMUTABLE_FL (siehe chattr(1)).

       CAP_MAC_ADMIN (seit Linux 2.6.25)
              Mandatory    Access    Control    (MAC)    außer    Kraft    setzen.    Für     das
              Smack-Linux-Sicherheitsmodul (LSM) implementiert.

       CAP_MAC_OVERRIDE (seit Linux 2.6.25)
              MAC-Konfiguration oder Statusänderungen erlauben. Implementiert für das Smack-LSM

       CAP_MKNOD (seit Linux 2.4)
              Spezielle Dateien mittels mknod(2) erstellen.

       CAP_NET_ADMIN
              Verschiedene Netz-bezogene Operationen durchführen:
              * Schnittstellenkonfiguration;
              * Administration von IP-Firewall, Masquerading und Abrechnung
              * Routing-Tabellen verändern;
              * an beliebige Adresse für eine transparente Proxyfunktion binden;
              * type-of-service (TOS) setzen
              * Treiberstatistiken bereinigen;
              * den »promiscuous«-Modus einschalten;
              * Multicasting aktivieren;
              * setsockopt(2)  verwenden,  um  die folgenden Socket-Optionen zu setzen: SO_DEBUG,
                SO_MARK, SO_PRIORITY (für  eine  Priorität  außerhalb  des  Bereichs  0  bis  6),
                SO_RCVBUFFORCE und SO_SNDBUFFORCE.

       CAP_NET_BIND_SERVICE
              Einen  Socket  an  einen  privilegierten  Internet-Domain-Port  binden (Portnummern
              kleiner als 1024)

       CAP_NET_BROADCAST
              (Unbenutzt) Socket-Broadcasts durchführen und auf Multicasts warten

       CAP_NET_RAW
              * RAW- und PACKET-Sockets verwenden;
              * an beliebige Adresse für eine transparente Proxyfunktion binden

       CAP_SETGID
              beliebige Änderungen an Prozess-GIDs und der ergänzenden GID-Liste  vornehmen;  GID
              fälschen,  wenn Socket-Berechtigungsnachweise via UNIX-Domain-Sockets weitergegeben
              werden

       CAP_SETFCAP (seit Linux 2.6.24)
              Datei-Capabilities setzen

       CAP_SETPCAP
              Falls Datei-Capabilites nicht unterstützt werden: eine Capability in der  erlaubten
              Capability-Menge oder von anderen Prozessen entfernen oder dafür bewilligen. (Diese
              Eigenschaft  von  CAP_SETPCAP  ist  nicht  verfügbar,  falls  der  Kernel  für  die
              Unterstützung  von  Datei-Capabilities  konfiguriert  ist, da CAP_SETPCAP für diese
              Kernel eine komplett andere Semantik aufweist.)

              Falls  Datei-Capabilites  unterstützt  werden:  Füge  alle  Capabilities  aus   der
              Begrenzungsmenge  des Threads zu der vererbbaren Menge hinzu; entferne Capabilities
              aus der Begrenzungsmenge (via prctl(2) PR_CAPBSET_DROP); nehme  Änderungen  an  den
              securebits-Schaltern vor.

       CAP_SETUID
              beliebige   Manipulationen  der  Prozess-UIDs  vornehmen  (setuid(2),  setreuid(2),
              setresuid(2),     setfsuid(2));      gefälschte      UIDs      erstellen,      wenn
              Socket-Berechtigungsnachweise via UNIX-Domain-Sockets weitergegeben werden

       CAP_SYS_ADMIN
              * eine  Reihe  von Systemadministratoroperationen ausführen, darunter: quotactl(2),
                mount(2), umount(2), swapon(2), swapoff(2), sethostname(2) und setdomainname(2);
              * privilegierte  syslog(2)-Operationen  ausführen   (seit   Linux   2.6.37   sollte
                CAP_SYSLOG verwandt werden, um diese Operationen zu erlauben);
              * den VM86_REQUEST_IRQ-Befehl vm86(2) ausführen;
              * IPC_SET- und IPC_RMID-Operationen auf beliebigen System-V-IPC-Objekten ausführen;
              * Operationen  an  den  Erweiterten  Attributen (»Extended Attributes«) trusted und
                security durchführen (siehe attr(5));
              * lookup_dcookie(2) verwenden;
              * ioprio_set(2)   verwenden,   um   IOPRIO_CLASS_RT   und   (vor   Linux    2.6.25)
                IOPRIO_CLASS_IDLE-E/A-Scheduling-Klassen zuzuweisen;
              * UID fälschen, wenn Socket-Berechtigungsnachweise weitergebeben werden;
              * die  systemweite Grenze der Anzahl der offenen Dateien (/proc/sys/fs/file-max) in
                Systemaufrufen, die Dateien öffnen (z.B. accept(2), execve(2), open(2),  pipe(2))
                überschreiben;
              * Schalter  CLONE_*  einsetzen,  der  neue  Namensräume mit clone(2) und unshare(2)
                erstellt;
              * perf_event_open(2) aufrufen;
              * auf privilegierte perf-Ereignisinformationen zugreifen;
              * setns(2) aufrufen;
              * fanotify_init(2) aufrufen;
              * KEYCTL_CHOWN- und KEYCTL_SETPERM-keyctl(2)-Operationen ausführen;
              * madvise(2)-MADV_HWPOISON-Operationen ausführen;
              * den TIOCSTI ioctl(2) verwenden, um  Zeichen  in  die  Eingabewarteschlange  eines
                Terminals, dass nicht das vom aufrufenden gesteuerte Terminal ist, einzufügen
              * veralteten Systemaufruf nfsservctl(2) verwenden;
              * veralteten Systemaufruf bdflush(2) verwenden;
              * verschiedene privilegierte Blockgeräte-ioctl(2)-Operationen ausführen
              * verschiedene privilegierte Dateisystem-ioctl(2)-Operationen ausführen
              * administrative Operationen auf vielen Gerätetreibern ausführen

       CAP_SYS_BOOT
              reboot(2) und kexec_load(2) verwenden

       CAP_SYS_CHROOT
              chroot(2) verwenden

       CAP_SYS_MODULE
              Kernelmodule  laden  und  entladen  (siehe init_module(2) und delete_module(2)); in
              Kerneln vor 2.6.25: Capabilities aus der  systemweiten  Capability-Begrenzungsmenge
              entfernen

       CAP_SYS_NICE
              * den   »nice«-Wert   von  Prozessen  erhöhen  (nice(2),  setpriority(2))  und  den
                »nice«-Wert von beliebigen Prozessen ändern;
              * Echtzeit-Scheduling-Richtlinien zum Prozessaufruf und Scheduling-Richtlinien  und
                -Prioritäten    für    beliebige    Prozesse    setzen    (sched_setscheduler(2),
                sched_setparam(2));
              * CPU-Affinität für beliebige Prozesse setzen (sched_setaffinity(2));
              * E/A-Scheduling-Klassen   und   -Prioritäten   für   beliebige   Prozesse   setzen
                (ioprio_set(2));
              * migrate_pages(2)  auf  beliebige  Prozesse  anwenden  und Prozessen erlauben, auf
                beliebige Knoten zu migrieren;
              * move_pages(2) auf beliebige Prozesse anwenden;
              * den Schalter MPOL_MF_MOVE_ALL mit mbind(2) und move_pages(2) verwenden

       CAP_SYS_PACCT
              acct(2) verwenden

       CAP_SYS_PTRACE
              Beliebige Prozesse mittels ptrace(2) verfolgen;  get_robust_list(2)  auf  beliebige
              Prozesse anwenden; inspeziere Prozesse mittels kcmp(2)

       CAP_SYS_RAWIO
              * E/A-Port-Operationen ausführen (iopl(2) und ioperm(2));
              * auf /proc/kcore zugreifen;
              * die FIBMAP-Operation ioctl(2) einsetzen
              * Geräte  für  den  Zugriff auf x86-modellspezifische Register (MSRs, siehe msr(4))
                öffnen
              * /proc/sys/vm/mmap_min_addr aktualisieren;
              * create  memory   mappings   at   addresses   below   the   value   specified   by
                /proc/sys/vm/mmap_min_addr;
              * map files in /proc/bus/pci;
              * /dev/mem und /dev/kmem öffnen;
              * verschiedene SCSI-Geräte-Befehle ausführen;
              * bestimmte Operationen auf hpsa(4)- und cciss(4)-Geräten ausführen;
              * eine Reihe von Geräte-spezifischen Operationen auf anderen Geräten ausführen

       CAP_SYS_RESOURCE
              * reservierten Platz auf Ext2-Dateisystemen verwenden;
              * ioctl(2)-Aufrufe ausführen, die das Journaling von Ext3 steuern;
              * Platten-Quota-Begrenzungen außer Kraft setzen;
              * Ressourcenbegrenzungen erhöhen (siehe setrlimit(2));
              * RLIMIT_NPROC-Ressourcenbegrenzung außer Kraft setzen;
              * maximale Anzahl von Konsolen bei der Konsolenzuteilung außer Kraft setzen;
              * maximale Anzahl an Tastaturdefinitionen außer Kraft setzen;
              * mehr als 64 Hz-Unterbrechungen von der Echtzeituhr erlauben;
              * die  msg_qbytes-Begrenzung  für  eine  System-V-Nachrichtenwarteschlange über die
                Grenze in /proc/sys/kernel/msgmnb anheben (siehe msgop(2) und msgctl(2));
              * die /proc/sys/fs/pipe-size-max-Begrenzung beim Setzen der  Kapazität  einer  Pipe
                mittels des F_SETPIPE_SZ-Befehls fcntl(2) außer Kraft setzen
              * F_SETPIPE_SZ   verwenden,   um   die   Kapazität   einer   Pipe   über   die   in
                /proc/sys/fs/pipe-max-size angegebene Grenze erhöhen;
              * die     /proc/sys/fs/mqueue/queues_max-Begrenzung     beim     Erstellen      von
                POSIX-Nachrichtenwarteschlangen (siehe mq_overview(7)) außer Kraft setzen;
              * prctl(2)-Operation PR_SET_MM einsetzen;
              * /proc/PID/oom_score_adj  auf  einen  Wert  niedriger  als den zuletzt durch einen
                Prozess mit CAP_SYS_RESOURCE gesetzten Wert setzen

       CAP_SYS_TIME
              Systemuhr setzen (settimeofday(2), stime(2), adjtimex(2)); Echtzeit- (Hardware-)Uhr
              setzen

       CAP_SYS_TTY_CONFIG
              vhangup(2) einsetzen; verschiedene privilegierte ioctl(2)-Operationen auf virtuelle
              Terminals einsetzen

       CAP_SYSLOG (seit Linux 2.6.37)

       *  Privilegierte  syslog(2)-Operationen  ausführen.  Siehe  syslog(2)  für  Informationen,
          welche Operationen Privilegien benötigen.

       *  Über  /proc  bereitgestellte  Kernel-Adressen und andere Schnittstellen anschauen, wenn
          /proc/sys/kernel/kptr_restrict  den  Wert  1  hat.  (Lesen  Sie  die  Diskussion   über
          kptr_restrict in proc(5).)

       CAP_WAKE_ALARM (seit Linux 3.0)
          Etwas    auslösen,    dass   das   System   aufwecken   wird   (siehe   die   Zeitgeber
          CLOCK_REALTIME_ALARM und CLOCK_BOOTTIME_ALARM)

   Frühere und heutige Implementierungen
       Eine komplette Implementierung von Capabilities verlangt folgendes:

       1. Für alle privilegierte Operationen muss der Kernel prüfen, ob der Thread die benötigten
          Capabilities in seiner effektiven Menge hat.

       2. Der Kernel muss Systemaufrufe bereitstellen, die es erlauben, dass die Capability-Menge
          des Threads geändert und ermittelt wird.

       3. Das Dateisystem muss das Anhängen von Capabilities an ausführbare Dateien erlauben,  so
          dass ein Prozess solche Capabilities erhält, wenn die Datei ausgeführt wird.

       Vor  Kernel  2.6.24  waren  nur  die ersten zwei dieser Anforderungen erfüllt, seit Kernel
       2.6.24 sind alle drei Anforderungen erfüllt.

   Capability-Mengen von Threads
       Jeder Thread hat  drei  Capability-Mengen,  die  null  oder  mehr  der  oben  aufgeführten
       Capabilities enthalten:

       Permitted (erlaubt):
              Dies  ist die begrenzende Übermenge für die effektiven Capabilities, die ein Thread
              annehmen kann. Es ist auch die begrenzende Übermenge für die  Capabilites,  die  zu
              der  vererbbaren  Menge durch einen Thread hinzugefügt werden dürfen, der nicht die
              Capability CAP_SETPCAP in seiner effektiven Menge hat.

              Falls ein Thread eine Capability aus seiner erlaubten Menge entfernt, kann es diese
              Capability niemals wiedererlangen (außer es führt ein Set-User-ID-Root-Programm mit
              execve(2) aus  oder  ein  Programm,  dessen  zugeordnete  Datei-Capabilities  diese
              Capability wieder bewilligen).

       Inheritable (vererbbar):
              Dies  ist  eine Menge von Capabilities, die über execve(2) hinweg erhalten bleiben.
              Es stellt ein Mechanismus für Prozesse dar, Capabilities zur  erlaubten  Menge  von
              neuen Programmen während eines execve(2) zuzuweisen.

       Effective (effektiv):
              Dies   ist  die  Menge  an  Capabilities,  der  vom  Kernel  zur  Durchführung  von
              Rechteprüfungen für den Thread verwandt wird.

       Ein mittels fork(2) erstelltes Kind erbt Kopien  der  Eltern-Capability-Menge.  Lesen  Sie
       weiter unten eine Diskussion der Behandlung von Capabilities während execve(2).

       Mittels  capset(2)  kann  ein  Thread  seine  eigenen  Capability-Mengen bearbeiten (siehe
       unten).

       Seit Linux 3.2 legt die  Datei  /proc/sys/kernel/cap_last_cap  den  numerischen  Wert  der
       höchsten vom laufenden Kernel unterstützten Capability offen. Dies kann zur Bestimmung des
       höchsten Bits, das in einer Capability-Gruppe gesetzt werden kann, genutzt werden.

   Datei-Capabilities
       Seit Kernel 2.6.24 unterstützt der Kernel die Zuordnung  von  Capability-Mengen  zu  einer
       ausführbaren  Datei  mittels  setcap(8). Die Datei-Capability-Mengen werden in erweiterten
       Attributen namens security.capability gespeichert (siehe setxattr(2)).  Das  Schreiben  in
       diese     erweiterten    Attribute    benötigt    die    Capability    CAP_SETFCAP.    Die
       Datei-Capability-Mengen bestimmen zusammen  mit  den  Capability-Mengen  des  Threads  die
       Capabilities nach einem execve(2).

       Die drei Datei-Capabilities-Mengen sind:

       Permitted (erlaubt, früher als forced (erzwungen) bekannt):
              Diese  Capabilities  werden  dem  Thread  automatisch  erlaubt,  unabhängig von den
              geerbten Capabilities des Threads.

       Inheritable (vererbbar, früher als allowed (erlaubt) bekannt):
              Diese Menge wird mittels AND mit der vererbbaren Menge des Threads verknüpft, um zu
              bestimmen,  welche vererbbaren Capabilities in der erlaubten Menge des Threads nach
              einem execve(2) aktiviert werden.

       Effective (effektiv):
              Dies ist keine Menge, sondern eher ein einziges Bit. Falls dieses Bit gesetzt  ist,
              dann  werden  während  eines  execve(2)  die gesamten erlaubten Capabilties für den
              Thread in die effektive Menge hochgezogen. Falls dieses Bit nicht gesetzt ist, dann
              wird  nach einem execve(2) keine der erlaubten Capabilities in der neuen effektiven
              Menge sein.

              Aktivieren des effektiven Datei-Capability-Bits impliziert, dass jede erlaubte oder
              vererbte  Datei-Capability,  die  dazu  führt,  dass  ein  Thread die entsprechende
              erlaubte Capability während eines execve(2) erlangt (siehe die  oben  beschriebenen
              Transformationsregeln),   auch  dazu  führt,  dass  er  die  Capability  in  seiner
              effektiven Menge erlangt. Werden  daher  Capabilities  zu  einer  Datei  zugeweisen
              ((setcap(8),  cap_set_file(3),  cap_set_fd(3)),  falls  der  effektive Schalter für
              irgendeine Capability aktiviert ist, dann muss  der  effektive  Schalter  auch  als
              aktiviert  für alle anderen Capabilities, für die die entsprechenden erlaubten oder
              vererbbaren Schalter aktiviert sind, spezifiziert werden.

   Umwandlungen von Capabilities während execve()
       Während eines execve(2) berechnet der Kernel die neuen Capabilities  eines  Prozesses  mit
       dem folgenden Algorithmus:

           P'(permitted) = (P(inheritable) & F(inheritable)) |
                           (F(permitted) & cap_bset)

           P'(effective) = F(effective) ? P'(permitted) : 0

           P'(inheritable) = P(inheritable)    [d.h. unverändert]

       wobei:

           P         bezeichnet den Wert einer Capability-Menge des Threads vor dem execve(2)

           P'        bezeichnet den Wert einer Capability-Menge nach dem execve(2)

           F         bezeichnet eine Datei-Capability-Menge

           cap_bset  ist der Wert der Capability-Begrenzungsmenge (weiter unten beschrieben)

   Capabilities und Ausführung von Programmen durch root
       Um während eines execve(2) ein allmächtigen root mit Capability-Mengen bereitzustellen:

       1. Falls  ein  Set-User-ID-Root-Programm  ausgeführt  wird  oder die reale Benutzer-ID des
          Prozesses 0 (root) ist sind die vererbbaren und erlaubten Dateimengen komplett auf  nur
          Einsen definiert (d.h. alle Capabilities aktiviert).

       2. Falls  ein  Set-User-ID-Root-Programm ausgeführt wird, dann ist das effektive Datei-Bit
          als Eins (aktiviert) definiert.

       Das   Fazit   der   oben   aufgeführten   Regeln,   kombiniert   mit   den   beschriebenen
       Capabilities-Umwandlungen,  ist,  dass  wenn ein Prozess ein Set-User-ID-Root-Programm mit
       execve(2) ausführt oder wenn ein Prozess mit einer effektiven UID von 0 ein  Programm  mit
       execve  ausführt,  er  alle Capabilities in seinen erlaubten und effektiven Mengen erhält,
       außer denen, die durch die Capability-Begrenzungsmenge  maskiert  sind.  Damit  wird  eine
       Semantik bereitgestellt, die identisch zu der von traditionellen UNIX-Sytemen ist.

   Capability-Begrenzungsmenge
       Die  Capability-Begrenzungsmenge  ist  ein  Sicherheitsmechanismus, der zur Begrenzung der
       Capabilities, die  während  eines  execve(2)  erlangt  werden  können,  dienen  kann.  Die
       Begrenzungsmenge wird auf die folgende Art und Weise benutzt:

       * Während  eines  execve(2)  wird  die  Capability-Begrenzungsmenge  mittels  AND  mit der
         erlaubten Datei-Capability-Menge verknüpft und das Ergebnis dieser  Operation  wird  der
         erlaubten  Capability-Menge  des  Threads  zugewiesen.  Die  Capability-Begrenzungsmenge
         stellt daher eine Grenze für die erlaubten  Capabilities  dar,  die  einer  ausführbaren
         Datei erlaubt werden dürfen.

       * (Seit Linux 2.6.25) Die Capability-Begrenzungsmenge agiert als begrenzende Übermenge für
         die  Capabilities,  die  ein  Thread  zu  seiner  vererbbaren  Menge  mittels  capset(2)
         hinzufügen  kann.  Das  bedeutet,  dass  ein  Thread  eine  Capability  nicht  zu seiner
         vererbbaren Menge hinzufügen kann, falls es nicht in der Begrenzungsmenge enthalten ist,
         selbst  falls  es in seinen erlaubten Capabilities vorhanden ist, wenn er eine Datei mit
         execve(2) ausführt, die diese Capability in seiner vererbbaren Menge hat.

       Beachten Sie, dass die Begrenzungsmenge die erlaubten  Datei-Capabilities  maskiert,  aber
       nicht  die  vererbten  Capabilities.  Falls ein Thread eine Capability in seiner vererbten
       Menge betreut, die nicht in seiner  Begrenzungsmenge  ist,  dann  kann  er  weiterhin  die
       Capability  in  seiner  erlaubten  Menge erlangen, indem er eine Datei ausführt, die diese
       Capability in seiner vererbten Menge enthält.

       Abhängig  von  der  Kernelversion  ist  die   Capability-Begrenzungsmenge   entweder   ein
       systemweites Attribut oder ein prozessweises Attribut.

       Capability-Begrenzungsmenge vor Linux 2.6.25

       In  Kerneln  vor 2.6.25 ist die Capability-Begrenzungsmenge ein systemweites Attribut, das
       alle Threads auf dem System  betrifft.  Auf  die  Begrenzungsmenge  kann  über  die  Datei
       /proc/sys/kernel/cap-bound  zugegriffen  werden.  (Zur  Erhöhung der Konfusion wird dieser
       Bitmaskenparameter  als  vorzeichenbehaftete  Dezimalzahl  in   /proc/sys/kernel/cap-bound
       ausgedrückt.)

       Nur   der  init-Prozess  darf  Capabilities  in  der  Capability-Begrenzungsmenge  setzen;
       abgesehen  davon  kann  der  Superuser  (oder  genauer:  Programme  mit   der   Capability
       CAP_SYS_MODULE) nur Capabilities aus dieser Menge entfernen.

       Auf  einem  Standardsystem  maskiert  die Capability-Begrenzungsmenge immer die Capability
       CAP_SETPCAP.  Um  diese  Einschränkung  zu  entfernen  (gefährlich!),  verändern  Sie  die
       Definition von CAP_INIT_EFF_SET in include/linux/capability.h und bauen Ihren Kernel neu.

       Die   systemweite  Capability-Begrenzungsmengenfunktion  wurde  Linux  in  Version  2.2.11
       hinzugefügt.

       Capability-Begrenzungsmenge seit Linux 2.6.25

       Seit Linux 2.6.25 ist die Capability-Begrenzungsmenge ein  pro-Thread-Attribut.  (Es  gibt
       keine systemweite Capability-Begrenzungsmenge mehr.)

       Die Begrenzungsmenge wird bei fork(2) vom Vater des Threads vererbt und über ein execve(2)
       erhalten.

       Ein Thread kann mittels der Operation prctl(2)  PR_CAPBSET_DROP  Capabilities  aus  seiner
       Begrenzungsmenge  entfernen,  vorausgesetzt  er  verfügt  über die Capability CAP_SETPCAP.
       Sobald eine Capability aus der Begrenzungsmenge entfernt wurde, kann sie nicht mehr zu der
       Menge   wieder  hinzugefügt  werden.  Ein  Thread  kann  mittels  der  Operation  prctl(2)
       PR_CAPBSET_READ herausfinden, ob eine Capability in seiner Begrenzungsmenge liegt.

       Entfernen  von  Capabilities   aus   der   Begrenzungsmenge   ist   nur   möglich,   falls
       Datei-Capabilities  in  den  Kernel  kompiliert  wurden. In Kerneln vor Linux 2.6.33 waren
       Datei-Capabilities   eine   optionale   Funktionalität,    die    mittels    der    Option
       CONFIG_SECURITY_FILE_CAPABILITIES   konfigurierbar   war.   Seit   Linux  2.6.33  ist  die
       Konfigurationsoption entfernt und Datei-Capabilities sind immer  Teil  des  Kernels.  Wenn
       Datei-Capabilities  in  den  Kernel  kompiliert  sind, beginnt der init-Prozess (der Urahn
       aller Prozesse) mit einer kompletten Begrenzungsmenge. Falls Datei-Capabilities  nicht  in
       den  Kernel  kompiliert  sind,  dann beginnt init mit einer vollständigen Begrenzungsmenge
       ohne  CAP_SETPCAP,  da  diese  Capability  eine  andere  Bedeutung  hat,  wenn  es   keine
       Datei-Capabilities gibt.

       Die  Entfernung  einer  Capability  aus  der  Begrenzungsmenge  entfernt sie nicht aus der
       vererbten Menge des Threads. Allerdings verhindert es  das  Zurückfügen  in  die  vererbte
       Menge des Threads in der Zukunft.

   Effekt von Benutzer-ID-Änderungen auf Capabilities
       Um  die  traditionellen Semantiken für Übergänge zwischen 0 und von 0 verschiedenen IDs zu
       erhalten, führt der Kernel folgende Änderungen an den Capability-Mengen eines Threads  bei
       Änderung   der   echten,  effektiven,  gespeicherten  und  Dateisystem-Benutzer-ID  (unter
       Verwendung von setuid(2), setresuid(2) oder ähnlich) durch:

       1. Falls einer der realen, effektiven oder gespeicherten Set-User-IDs vorher 0 war und als
          Ergebnis  der  UID-Änderung  alle  dieser IDs eine von 0 verschiedenen Wert haben, dann
          werden alle Capabilities aus den erlaubten und effektiven Capability-Mengen gelöscht.

       2. Falls die effektive Benutzer-ID von 0 auf einen von 0 verschiedenen Wert geändert wird,
          werden alle Capabilities aus der effektiven Menge gelöscht.

       3. Falls die effektive Benutzer-ID von einem von 0 verschiedenen Wert auf 0 geändert wird,
          dann wird die erlaubte Menge in die effektive Menge kopiert.

       4. If the filesystem user ID is changed from 0  to  nonzero  (see  setfsuid(2))  then  the
          following capabilities are cleared from the effective set: CAP_CHOWN, CAP_DAC_OVERRIDE,
          CAP_DAC_READ_SEARCH, CAP_FOWNER, CAP_FSETID, CAP_LINUX_IMMUTABLE (since Linux  2.2.30),
          CAP_MAC_OVERRIDE,  and CAP_MKNOD (since Linux 2.2.30). If the filesystem UID is changed
          from nonzero to 0, then any of these capabilities that are enabled in the permitted set
          are enabled in the effective set.

       Falls ein Thread, der einen Wert 0 für mindestens eine seiner Benutzer-IDs hat, verhindern
       möchte,  dass  seine  erlaubte  Capability-Menge  bereinigt  wird,  wenn  er  alle   seine
       Benutzer-IDs  auf einen von 0 verschiedenen Wert setzt, kann er dies mittels der Operation
       prctl(2) PR_SET_KEEPCAPS erreichen.

   Programmatische Anpassung von Capability-Mengen
       Ein Thread kann seine Capability-Mengen mittels der Systemaufrufe capget(2) und  capset(2)
       ermitteln   und   ändern.   Allerdings   werden   für  diesen  Zweck  die  Verwendung  von
       cap_get_proc(3) und cap_set_proc(3), beide im Paket libcap bereitgestellt, empfohlen.  Die
       folgenden Regeln bestimmen die Änderungen an den Capability-Mengen des Threads:

       1. Falls  der Aufrufende nicht über die Capability CAP_SETPCAP verfügt, dann muss die neue
          vererbbare Menge  eine  Teilmenge  der  Kombination  der  bestehenden  vererbbaren  und
          erlaubten Menge sein.

       2. (Seit  Linux  2.6.25) Die neue vererbbare Menge muss eine Teilmenge der Kombination der
          bestehenden vererbbaren Menge und der Capability-Begrenzungsmenge sein.

       3. Die neue erlaubte Menge muss eine Teilmenge der bestehenden erlaubten Menge sein  (d.h.
          es  ist  nicht möglich, erlaubte Capabilities zu erlangen, die der Thread derzeit nicht
          hat).

       4. Die neue effektive Menge muss eine Teilmenge der neuen erlaubten Menge sein.

   Der Schalter securebits: eine reine Capability-Umgebung einrichten
       Beginnend mit Kernel 2.6.26 und mit einem  Kernel,  in  dem  Datei-Capabilities  aktiviert
       sind,   implementiert  Linux  eine  Menge  von  pro-Thread-securebits-Schaltern,  die  zur
       Deaktivierung von spezieller Handhabung von Capabilities für UID 0 (root) verwandt  werden
       können. Dies sind die folgenden Schalter:

       SECBIT_KEEP_CAPS
              Durch Setzen dieses Schalters darf ein Thread, der mindestens eine 0 UID hat, seine
              Capabilities behalten, wenn er  alle  UIDs  auf  einen  von  0  verschiedenen  Wert
              umschaltet.  Falls dieser Schalter nicht gesetzt ist, dann führt das Umschalten der
              UIDs dazu, dass er alle Capabilities verliert. Dieser Schalter wird  bei  execve(2)
              immer  bereinigt. (Dieser Schalter stellt die gleiche Funktionalität wie die ältere
              Operation prctl(2) PR_SET_KEEPCAPS bereit.)

       SECBIT_NO_SETUID_FIXUP
              Setzen dieses Schalters hindert den Kernel daran, die Capability-Mengen anzupassen,
              wenn die effektive und die Dateisystem-UID eines Threads zwischen null und von null
              verschiedenen Werten umgeschaltet werden.  (Lesen  Sie  den  Abschnitt  Effekt  von
              Benutzer-ID-Änderungen auf Capabilities)

       SECBIT_NOROOT
              Falls dieses Bit gesetzt ist, dann verleiht der Kernel keine Capabilities, wenn ein
              Set-User-ID-Root-Programm  ausgeführt  wird  oder  wenn  ein  Prozess   mit   einer
              effektiven  oder  realen  UID  von  0  execve(2)  aufruft. (Lesen Sie den Abschnitt
              Capabilities und Ausführung von Programmen durch root)

       Jeder der obigen »basis«-Schalter hat einen begleitenden »gesperrten« Schalter. Das Setzen
       eines  »gesperrten«  Schalters ist unumkehrbar und hat den Effekt, dass weitere Änderungen
       an dem entsprechenden Basisschalter nicht mehr möglich sind. Die gesperrten Schalter sind:
       SECBIT_KEEP_CAPS_LOCKED, SECBIT_NO_SETUID_FIXUP_LOCKED und SECBIT_NOROOT_LOCKED.

       Die  Schalter  securebits  können  mit  den  Operationen  prctl(2)  PR_SET_SECUREBITS  und
       PR_GET_SECUREBITS geändert und abgefragt werden. Die Capability CAP_SETPCAP wird  für  die
       Veränderung der Schalter benötigt.

       Die  Schalter  securebits werden von Kindprozessen vererbt. Während eines execve(2) werden
       alle Schalter beibehalten, außer SECBIT_KEEP_CAPS, das immer bereinigt wird.

       Eine Anwendung kann den  folgenden  Aufruf  verwenden,  um  sich  selbst  und  alle  seine
       Abkömmlinge  in  eine Umgebung zu sperren, in der die einzige Möglichkeit, Capabilities zu
       erlangen,  darin  besteht,  ein   Programm   auzuführen,   das   über   die   zugeordneten
       Datei-Capabilities verfügt:

           prctl(PR_SET_SECUREBITS,
                   SECBIT_KEEP_CAPS_LOCKED |
                   SECBIT_NO_SETUID_FIXUP |
                   SECBIT_NO_SETUID_FIXUP_LOCKED |
                   SECBIT_NOROOT |
                   SECBIT_NOROOT_LOCKED);

KONFORM ZU

       No  standards govern capabilities, but the Linux capability implementation is based on the
       withdrawn POSIX.1e draft standard; see ⟨http://wt.tuxomania.net/publications/posix.1e/⟩.

ANMERKUNGEN

       Seit Kernel 2.5.27  sind  Capabilities  eine  optionale  Kernelkomponente,  die  über  die
       Kernelkonfigurationsoption CONFIG_SECURITY_CAPABILITIES aktiviert/deaktiviert werden kann.

       Die  Datei  /proc/PID/task/TID/status  kann  zum  Betrachten  der  Capability-Mengen eines
       Threads verwandt werden.  Die  Datei  /proc/PID/status  zeigt  die  Capability-Mengen  des
       Haupt-Threads  eines  Prozesses.  Vor  Linux 3.8 wurden nicht existierende Capabilities in
       diesen Mengen als aktiviert (1) angezeigt. Seit Linux 3.8 werden alle nicht  existierenden
       Capabilities (über CAP_LAST_CAP) als deaktiviert (0) angezeigt.

       Das  Paket  libcap stellt eine Suite von Routinen zum Setzen und Abfragen von Capabilities
       bereit, die komfortablere und änderungsstabilere Schnittstellen als die von capset(2)  und
       capget(2)  bereitstellen.  Dieses  Paket stellt auch die Programme setcap(8) und getcap(8)
       zur Verfügung. Es kann unter folgender Adresse gefunden werden:
       ⟨http://www.kernel.org/pub/linux/libs/security/linux-privs⟩.

       Vor Kernel 2.6.24 und seit Kernel 2.6.24, falls Datei-Capabilities nicht  aktiviert  sind,
       kann  ein  Thread  mit  der  Capability  CAP_SETPCAP  die Capabilities von anderen Threads
       manipulieren. Allerdings ist dies nur theoretisch möglich,  da  kein  Thread  jemals  über
       CAP_SETPCAP in einem der folgenden Fälle verfügt:

       * In  der  pre-2.6.25-Implementierung maskiert die systemweite Capability-Begrenzungsmenge
         /proc/sys/kernel/cap-bound diese Capability immer und dies  kann  ohne  Veränderung  der
         Kernelquellen und dessen Neubau nicht geändert werden.

       * Falls Datei-Capabilities in der aktuellen Implementierung deaktiviert sind, dann startet
         init derart, dass diese Capability aus seiner  prozessweisen  Begrenzungsmenge  entfernt
         ist  und  dass  die  Begrenzungsmenge  von  allen anderen im System erstellten Prozessen
         vererbt wird.

SIEHE AUCH

       capget(2),  prctl(2),  setfsuid(2),   cap_clear(3),   cap_copy_ext(3),   cap_from_text(3),
       cap_get_file(3),   cap_get_proc(3),   cap_init(3),   capgetp(3),   capsetp(3),  libcap(3),
       credentials(7), pthreads(7), getcap(8), setcap(8)

       include/linux/capability.h in dem Linux-Kernelquellbaum

KOLOPHON

       This page is part of release 3.54 of the Linux man-pages project.  A  description  of  the
       project,     and    information    about    reporting    bugs,    can    be    found    at
       http://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

       Die   deutsche   Übersetzung   dieser   Handbuchseite   wurde   von    Helge    Kreutzmann
       <debian@helgefjell.de> erstellt.

       Diese  Übersetzung  ist  Freie  Dokumentation;  lesen  Sie  die GNU General Public License
       Version  3  oder  neuer  bezüglich  der  Copyright-Bedingungen.  Es  wird  KEINE   HAFTUNG
       übernommen.

       Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-
       Mail an <debian-l10n-german@lists.debian.org>.