Im Moment verwende ich cap_net_bind_service MY_USERNAME
in /etc/security/capability.conf.
Jetzt muss ich nur noch cap_net_bind_service+i
setzen auf dem Interpreter meiner bevorzugten Skriptsprache, um CAP_NET_BIND_SERVICE
hinzufügen zu können zum wirksamen gesetzt über libcap[-ng].
Das funktioniert gut, aber ich frage mich, ob es eine Möglichkeit gibt, dasselbe zu erreichen, ohne Obergrenzen für die Interpreter-Binärdatei festzulegen. Obwohl es kein großes Problem ist (andere Benutzerkonten haben keine Obergrenze, sodass sie es nicht verwenden können, selbst wenn das Bit auf der Interpreter-Binärdatei gesetzt ist), ist es etwas ärgerlich, da ich das Flag jedes Mal neu setzen muss, wenn der Interpreter aktiviert ist aktualisiert.
Akzeptierte Antwort:
Normalerweise werden die Fähigkeiten an die Kinder vererbt. Wie in der Manpage angegeben:
Ein über fork(2) erstelltes Kind erbt Kopien der Capability Sets seines Elternteils.
Das Problem mit den Skripten ist, dass sie nicht direkt ausführbar sind. Der Kernel durchläuft eine Liste von Prüfungen (Kernel-Code befindet sich unter fs/binfmt_*.c). Eines davon ist „binfmt_script.c“, das die erste Zeile auf einen Shebang prüft und dann den echten Interpreter (den im Shebang) mit Ihrem Skript als Argument aufruft. Als solches wird der Standard/allgemeine Interpreter aufgerufen und liest Ihr Skript einfach als Argument.
Das bedeutet, dass Sie die Fähigkeit auf dem Interpreter einstellen müssen, nicht auf dem Skript.
Dasselbe gilt für suid
Bits und andere spezielle Flags.
Entweder Sie erstellen also eine Kopie Ihres Interpreters, setzen die gewünschten Fähigkeiten darauf (überprüfen Sie auch, dass niemand über chmod/chown darauf zugreifen kann) und rufen diesen kopierten Interpreter in Ihrem Shebang auf.
Sie können auch das Setcap ausführen Logik in Ihrem Skript.