BEZEICHNUNG¶
capget, capset - Setzt/ermittelt die Capabilities von Thread(s)
ÜBERSICHT¶
#include <sys/capability.h>
 
int capget(cap_user_header_t hdrp, cap_user_data_t
  datap );
 
int capset(cap_user_header_t hdrp, const cap_user_data_t
  datap);
BESCHREIBUNG¶
Seit Linux 2.2 ist die Macht des Superusers (Root) in eine Gruppe von diskreten
  Capabilities aufgeteilt. Jeder Thread hat eine Gruppe an effektiven
  Capabilities, die angeben, welche Capabilities (falls zutreffend) er derzeit
  ausführen darf. Jeder Thread hat auch eine Gruppe an vererbbaren
  Capabilities, die über einen 
execve(2)-Aufruf weitergegeben werden
  können und eine Gruppe an erlaubten Capabilities, die er zu effektiven
  oder vererbbaren hinzufügen kann.
Diese zwei Funktionen sind die rohe Kernelschnittstelle zum Ermitteln und Setzen
  der Thread-Capabilities. Die Systemaufrufe sind nicht nur Linux-spezifisch,
  auch die Kernel-API wird sich wahrscheinlich ändern und die Verwendung
  dieser Funktionen (insbesondere das Format der 
cap_user_*_t-Typen)
  unterliegt in jeder Kernel-Revision Erweiterungen, aber alte Programme werden
  weiterhin funktionieren.
 
Die portablen Schnittstellen sind 
cap_set_proc(3) und
  
cap_get_proc(3); falls möglich, sollten Sie diese Schnittstellen
  in Anwendungen verwenden. Falls Sie die Linux-Erweiterungen in Anwendungen
  verwenden möchten, sollten Sie die leichter zu verwendenden
  Schnittstellen 
capsetp(3) und 
capgetp(3) verwenden.
Aktuelle Details¶
Nachdem Sie gewarnt wurden, einige aktuelle Kernel-Datails. Die Strukturen sind
  wie folgt definiert:
 
#define _LINUX_CAPABILITY_VERSION_1  0x19980330
#define _LINUX_CAPABILITY_U32S_1     1
#define _LINUX_CAPABILITY_VERSION_2  0x20071026
#define _LINUX_CAPABILITY_U32S_2     2
typedef struct __user_cap_header_struct {
   __u32 version;
   int pid;
} *cap_user_header_t;
typedef struct __user_cap_data_struct {
   __u32 effective;
   __u32 permitted;
   __u32 inheritable;
} *cap_user_data_t;
 
effektiv, erlaubt, vererbbar sind Bitmasken der in 
capability(7)
  definierten Capabilities. Beachten Sie, dass 
CAP_*-Werte Bitindizes
  sind und bitweise verschoben werden müssen, bevor per ODER auf die
  Bitfelder zugegriffen wird. Um die Strukturen zu definieren, die an den
  Systemaufruf übergeben werden sollen, müssen Sie die Namen
  
struct __user_cap_header_struct und 
struct
  __user_cap_data_struct verwenden, da die Typedefs nur Zeiger sind.
 
Kernel vor 2.6.25 bevorzugen 32-Bit-Capabilities mit Version
  
_LINUX_CAPABILITY_VERSION_1 und Kernel 2.6.25+ bevorzugen
  64-Bit-Capabilities mit Version 
_LINUX_CAPABILITY_VERSION_2. Beachten
  Sie, dass 64-Bit-Capabilities 
datap[0] und 
datap[1] verwenden,
  während 32-Bit-Capabilities nur 
datap[0] verwenden.
 
Eine weitere Änderung betrifft das Verhalten dieser Systemaufrufe im
  Hinblick auf Datei-Capabilities (VFS-Capability-Unterstützung). Diese
  Unterstützung ist derzeit eine Compilierzeit-Option (hinzugefügt in
  Kernel 2.6.24).
 
Für 
capget()-Aufrufe können die Capabilities eines Prozesses
  über die Angabe der Prozess-ID mit dem Feldwert 
hdrp->pid
  ermittelt werden.
Mit VFS-Capability-Unterstützung¶
VFS-Capability-Unterstützung erstellt eine auf Dateiattributen basierende
  Methode zum Hinzufügen von Funktionen für privilegierte
  ausführbare Dateien. Dieses Privilegienmodell ersetzt die
  Kernel-Unterstützung dafür, dass ein Prozess asynchron die
  Capabilities eines anderen setzt. Das heißt, mit VFS-Unterstützung
  sind für Aufrufe von 
capset() die einzig zulässigen,
  gleichwertigen Werte für 
hdrp->pid 0 oder 
getpid(2).
Ohne VFS-Capability-Unterstützung¶
Wenn der Kernel VFS-Capabilities nicht unterstützt, können Aufrufe von
  
capset() auf die Capabilities des durch das 
pid-Feld von
  
hdrp beschriebenen Threads zugreifen, wenn das Feld von Null
  verschieden ist; wenn 
pid gleich 0 ist, wird auf die Capabilities des
  aufrufenden Threads zugegriffen. Falls sich 
pid auf einen
  single-threaded Prozess bezieht, kann 
pid auch als herkömmliche
  Prozess-ID angegeben werden. Der Zugriff auf einen Thread eines
  Multithread-Prozesses erfordert eine Thread-ID vom Typ, den 
gettid(2)
  zurückgibt. Für 
capset() kann 
pid auch -1 sein, d.h.
  die Änderung wird für alle Threads außer dem Aufrufenden und
  
init(8) durchgeführt; ein Wert kleiner als -1 bewirkt die
  Änderung für alle Mitglieder der Prozessgruppe, deren ID -
  
pid ist.
 
Für Details der Daten siehe 
capabilities(7).
RÜCKGABEWERT¶
Bei Erfolg wird Null zurückgegeben. Bei einem Fehler wird -1
  zurückgegeben und 
errno entsprechend gesetzt.
 
Die Aufrufe werden mit dem Fehler 
EINVAL fehlschlagen und das Feld
  
version von 
hdrp auf den vom Kernel bevorzugten Wert von
  
_LINUX_CAPABILITY_VERSION_? setzen, wenn ein nicht unterstützter
  
version-Wert angegeben wird. Auf diese Weise kann herausgefunden
  werden, wie die derzeit bevorzugte Capability-Revision lautet.
FEHLER¶
  - EFAULT
 
  - Ungültige Speicheradresse. hdrp darf nicht NULL
      sein. datap darf NULL nur sein, wenn der Benutzer versucht, das vom
      Kernel unterstützte bevorzugte Capability-Versionsformat zu
      ermitteln.
 
  - EINVAL
 
  - Eines der Argumente war ungültig.
 
  - EPERM
 
  - Es wurde versucht, eine Capability zu der erlaubten Menge
      hinzuzufügen oder eine Capability in der effektiven oder vererbbaren
      Menge zu setzen, die nicht in der erlaubten Menge enthalten ist.
 
  - EPERM
 
  - Der Aufrufende versuchte, capset() zu verwenden, um
      die Capabilities eines von ihm selbst verschiedenen Threads zu
      verändern, hatte dazu aber nicht die benötigten Privilegien.
      Für Kernel, die VFS-Capabilities unterstützen, ist dies nie
      erlaubt. Für Kernel ohne VFS-Unterstützung wird die Capability
      CAP_SETPCAP benötigt. (Ein Fehler in Kerneln vor 2.6.11
      führte dazu, dass dieser Fehler auch auftreten konnte, falls ein
      Thread ohne diese Capability versuchte, seine eigenen Capabilities zu
      ändern, indem er das Feld pid auf einen von numerisch Null
      verschiedenen Wert (d.h. den von getpid(2) zurückgelieferten
      Wert) anstatt 0 wählte.)
 
  - ESRCH
 
  - Kein solcher Thread.
 
Diese Systemaufrufe sind Linux-spezifisch.
ANMERKUNGEN¶
Die portable Schnittstelle der Capability-Abfrage- und -Setzfunktionen wird
  durch die Bibliothek 
libcap bereitgestellt, die unter folgender Adresse
  erhältlich ist:
 
http://www.kernel.org/pub/linux/libs/security/linux-privs
SIEHE AUCH¶
clone(2), 
gettid(2), 
capabilities(7)
KOLOPHON¶
Diese Seite ist Teil der Veröffentlichung 3.42 des Projekts Linux-
  
man-pages. Eine Beschreibung des Projekts und Informationen, wie Fehler
  gemeldet werden können, finden sich unter
  
http://www.kernel.org/doc/man-pages/.
 
ÜBERSETZUNG¶
Die deutsche Übersetzung dieser Handbuchseite wurde von Tobias Quathamer
  <toddy@debian.org>, Helge Kreutzmann <debian@helgefjell.de> und
  Martin Eberhard Schauer <Martin.E.Schauer@gmx.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>.