Est-il possible de configurer les capacités Linux par utilisateur? [fermé]

Il semble y avoir un support pour capacités à grain fin dans le noyau Linux, qui permet d'accorder des privilèges à un processus pour faire des choses comme, par exemple, ouvrir des sockets raw ou augmenter la priorité de thread sans accorder les privilèges root du processus.

Cependant ce que j'aimerais savoir s'il existe un moyen d'accorder des capacités par utilisateur. C'est-à-dire permettre aux processus non-root et non-suid d'acquérir ces capacités.

24
demandé sur tomix86 2009-12-24 07:49:31

5 réponses

Il y a des limites.conf, il est possible de restreindre certaines ressources pour un utilisateur ou un groupe à travers elle.

Découvrez man limits.conf

-4
répondu vava 2009-12-24 04:58:45

Cela peut en quelque sorte être fait avec libcap - il fournit un module PAM pam_cap.so. Cependant, ce n'est pas tout à fait {[16] } si simple:)

Chaque processus a trois ensembles de capacités:

  • efficace (les plafonds que ce processus a réellement)
  • autorisé (les plafonds que ce processus peut éventuellement avoir-un sur-Ensemble De efficace)
  • héritable (les majuscules que ce processus peut transmettre à un processus enfant)

Chaque fichier a la même capacité définir. Quand un nouveau binaire est exec()'d, les capacités du processus changent selon les règles suivantes, Où:

  • pI / pP sont les capacités héritables/autorisées initiales du processus
  • pI'/pP'/pE' sont le processus de nouveaux Héritables/Permis/capacités Effectives
  • fI/fP/fE sont les capacités héritables/autorisées / efficaces du fichier
  • & représente l'intersection
  • | représente union

    pI' = pI
    pP' = fP | (pI & fI)
    pE' = fE & pP'

(simplifié à partir de http://www.friedhoff.org/posixfilecaps.html)

Dans la plupart des scénarios, pE' est le seul résultat qui nous intéresse. Les programmes qui sont liés à libcap peuvent appeler setcap() pour changer leurs caps effectifs (tant que les caps qu'ils essaient de demander sont dans l'ensemble autorisé), mais la grande majorité des programmes ne touchent pas explicitement leurs caps, nous devons donc faire en sorte que le cap soit efficace post-exec ().

Ayant un exemple concret aidera à comprendre ici... J'en avais marre d'avoir à 'su' pour exécuter openvpn, donc je voulais m'accorder la capacité CAP_NET_ADMIN pour permettre la définition de routes et autres.

En regardant la dernière règle (pE' = fE & pP'), Il est clair que pour avoir CAP_NET_ADMIN dans L'ensemble effectif du processus, CAP_NET_ADMIN doit être dans l'ensemble effectif du fichier . Ainsi, le système de capacités ne nous permet pas de dire simplement "grant CAP_NET_ADMIN to user sqweek" - le programme les capacités sont toujours importantes.

Être dans L'ensemble effectif du fichier n'est pas suffisant, le cap doit également être dans le nouvel ensemble autorisé du processus. Regardons cette règle: pP' = fP | (pI & fI). Il y a donc deux façons d'obtenir le cap dans pP', soit nous ajoutons CAP_NET_ADMIN à L'ensemble autorisé du fichier, soit nous l'ajoutons à L'ensemble héritable du fichier et nous nous assurons qu'il est dans L'ensemble héritable du processus.

Si nous l'ajoutons à L'ensemble autorisé du fichier, les capacités initiales du processus devenir hors de propos-openvpn obtiendra CAP_NET_ADMIN chaque fois qu'il s'exécute, peu importe qui l'exécute. Ceci est similaire à setuid, mais fournit une approche plus fine. Pourtant, ce n'est pas une granularité par utilisateur, alors regardons l'autre option.

Notez la première règle, pI' = pI. Les capacités héritables du processus ne sont pas affectées par exec (). Ce que cela signifie, Tout ce dont nous avons besoin est un seul programme conscient de libcap pour définir CAP_NET_ADMIN comme un cap héritable, et chaque processus engendré à partir de là aussi aura CAP_NET_ADMIN héritable. C'est le rôle joué par le module pam - il modifie l'ensemble héritable lors de la connexion, qui est ensuite hérité pour tous les processus de cet utilisateur.

Pour résumer:

  1. Installer libcap
  2. configurez le module pam_cap (ajoutez la ligne cap_net_admin sqweek à /etc/security/capability.conf. Si le fichier n'existait pas auparavant, ajoutez une autre ligne none * pour une valeur par défaut raisonnable.
  3. activez le module PAM lors de la connexion (ajoutez auth required pam_cap.so à /etc/pam.d/login). Marque assurez-vous de tester votre connexion dans un terminal séparé avant de vous déconnecter lorsque vous effectuez des modifications PAM afin de ne pas vous bloquer!
  4. ajoute CAP_NET_ADMIN aux ensembles effectifs et héritables pour openvpn (setcap cap_net_admin+ie /usr/sbin/openvpn)
  5. openvpn appelle ip pour changer la table de routage et autres, de sorte que cela nécessite le même traitement (setcap cap_net_admin+ie /sbin/ip)
42
répondu sqweek 2016-12-13 05:04:25

Oui, vous pouvez utiliser setcap pour spécifier un ensemble de capacités pour un exécutable, qui peut accorder des capacités spécifiques lorsque cet exécutable est exécuté.

À partir de la page de manuelcapabilities(7) :

Capacités Du Fichier Depuis le noyau 2.6.24, le noyau prend en charge associant ensembles de capacités avec un exécutable fichier en utilisant setcap(8). Fichier les ensembles de capacités sont stockés dans un attribut étendu (voir setxattr(2)) nommée à la sécurité.capacité. Écrit à cet attribut étendu nécessite Cap_setfcap capacité. Fichier ensembles de capacités, en conjonction avec les ensembles de capacités du thread, déterminer les capacités d'un thread après un execve(2).


La façon d'accorder des capacités par utilisateur (ou même par groupe) serait avec un module PAM. la réponse de sqweek montre comment le faire en utilisant pam_cap.

9
répondu caf 2017-05-23 11:54:13

Je n'ai pas confirmé, mais je pense que cet aspect de SELinux peut être votre réponse:

Http://www.lurking-grue.org/writingselinuxpolicyHOWTO.html#userpol5.1

6
répondu gahooa 2009-12-24 04:56:52

Jetez un oeil à CapOver - il devrait faire ce que vous voulez.

Note: Je ne l'ai pas utilisé car ce n'est pas (encore?) été porté sur l'API du noyau 2.6.30 ish.

3
répondu Druiloor 2012-11-23 03:32:08