En ce moment, j'utilise cap_net_bind_service MY_USERNAME
dans /etc/security/capability.conf.
Il ne me reste plus qu'à définir cap_net_bind_service+i
sur l'interpréteur de mon langage de script préféré pour pouvoir ajouter CAP_NET_BIND_SERVICE
à l'effectif défini via libcap[-ng].
Cela fonctionne bien, mais je me demande s'il existe un moyen d'obtenir la même chose sans fixer de limite au binaire de l'interpréteur. Bien que ce ne soit pas un gros problème (les autres comptes d'utilisateurs n'ont pas le plafond, ils ne peuvent donc pas l'utiliser même avec le bit défini sur le binaire de l'interpréteur), c'est un peu ennuyeux car je dois réinitialiser le drapeau chaque fois que l'interpréteur est mis à jour.
Réponse acceptée :
Habituellement, les capacités sont héritées des enfants. Comme indiqué dans la page de manuel :
Un enfant créé via fork(2) hérite des copies des ensembles de capacités de son parent.
Le problème avec les scripts est qu'ils ne sont pas directement exécutables. Le noyau passe par une liste de vérifications (le code du noyau se trouve dans fs/binfmt_*.c). L'un d'eux est "binfmt_script.c", qui vérifie la première ligne pour un shebang, puis appelle le véritable interprète (celui du shebang) avec votre script comme argument. En tant que tel, l'interpréteur standard/commun est appelé et lit simplement votre script en tant qu'argument.
Cela signifie que vous devrez définir la capacité sur l'interpréteur, pas sur le script.
La même chose s'applique à suid
bits et autres drapeaux spéciaux.
Donc, soit vous faites une copie de votre interpréteur, y définissez les capacités que vous souhaitez (vérifiez également que personne ne peut y accéder via chmod/chown), et appelez cet interpréteur copié dans votre shebang.
Vous pouvez également faire le setcap logique dans votre script.