Capacités pour un script sous Linux

8

Si je veux définir une fonctionnalité ( capabilities(7)), telle que CAP_NET_BIND_SERVICEsur un fichier exécutable et que ce fichier est un script , dois-je définir la capacité ( setcap(8)) sur l'interpréteur démarrant ce script ou est-ce suffisant pour le définir sur le fichier de script lui-même?

Remarque: la question concerne Scientific Linux 6.1 en particulier, mais je pense qu'il est possible d'y répondre de manière générique.

0xC0000022L
la source

Réponses:

8

La définition de la capacité sur le script ne sera pas efficace. C'est la même situation que de ne pas travailler setuidsur le script. Similaire comme dans ce dernier cas, c'est l'implémentation de la façon dont execvegère shebang et le raisonnement de sécurité derrière (pour plus de détails, voir: Autoriser setuid sur les scripts shell ).

Je pense que vous avez ces options

  1. définir les capacités sur l'interpréteur lui-même (en fait plutôt une copie de celui-ci)

    • vous avez un problème ici que quiconque est capable de l'exécuter s'exécutera avec ces capacités élevées (être capable d'exécuter un script arbitraire ou de le démarrer de manière interactive)
  2. écrire un exécutable wrapper qui aura une logique codée en dur pour exécuter votre script et définir les capacités souhaitées sur cet exécutable

    • assurez-vous que personne ne peut modifier, ni supprimer / remplacer le script
    • toujours en faisant chrooton pourrait mal utiliser un tel emballage

Dans les deux cas, vous devrez vous assurer que les capacités définies survivront execveen définissant l' inheritableindicateur. Vous pouvez également utiliser pam_capdistribué avec libcaphabituellement, pour activer réellement les fonctionnalités souhaitées par configuration uniquement pour les utilisateurs sélectionnés.

Et en général, vous voulez vous assurer que personne ne peut modifier le comportement de votre interprète en changeant l'environnement, par exemple. PYTHON_PATHou quelque chose de similaire.

Miroslav Koškár
la source