Stranger Than Usual

Damit ich es nicht vergesse: Linux Capabilities

Capabilities sind ein praktischer Weg, um in Linux vereinzelt Rechte für einzelne Programme zu vergeben (z.B. um an Port 80 zu binden). Darüber findet man im Internet sehr viele Informationen. Weil ich aber immer wieder alles mögliche davon vergesse und manche Details in dem ganzen AI-Slop heutzutage schwierig zu finden sind, hier eine kleine Zusammenstellung für mich selber:

Capabilities eines Prozesses herausfinden

cat /proc/<PID>/status | grep Cap

Dann kriegt man etwas wie

CapInh:	0000000000000000
CapPrm:	000001f3f5fcffff
CapEff:	000001f3f5fcffff
CapBnd:	000001f3f5fcffff
CapAmb:	0000000000000000

Das kann man dann z.B. mit capsh entschlüsseln:

capsh --decode=000001f3f5fcffff

Was diese ganzen Capabilities bedeuten findet man auf der capabilities-Manpage (man 7 capabilities).

Was bedeuten die verschiedenen Zeilen?

Wichtig: Ich schreibe das hier für mich selbst auf, nach meinem aktuellen Verständnis. Das hier kann also falsch oder irreführend sein. Wenn ihr mich korrigieren wollt, schreibt mich gerne an.

  • CapInh sind „Inheritable Capabilities“. Child-Prozesse können die erben.
  • CapPrm sind „Permitted Capabilities“. Die sind einem Executable zugeordnet und werden dem Prozess zugeordnet, wenn er gestartet wird (?)
  • CapEff sind „Effective Capabilities“. Das ist eine Untermenge von CapPrm und sind die Capabilities, die ein Prozess zu einem Zeitpunkt tatsächlich hat.
  • CapBnd („Bounding Set“) ist, was der Prozess maximal an Capabilities haben kann. Wir z.B. gerne als Sicherheitsmechanismus verwendet, um einzuschränken, was ein Prozess darf (z.B. von SystemD).
  • CapAmb sind „Ambient Capabilities“ sind capabilities, die an Kindprozesse weitergegeben werden können, selbst wenn die executables für die Kindprozesse die Capability nicht haben.