Autoriser certains comportements à risque d'un seul programme de manière sûre dans SELinux

8

J'ai un programme fonctionnant à l'intérieur d'un conteneur Docker qui charge un fichier .so qui modifie le comportement du programme par le raccordement et la manipulation de la mémoire. Ce comportement est bloqué par SELinux avec le message suivant dans le journal d'audit:

type = AVC msg = audit (1548166862.066: 2419): avc: refusé {execheap} pour pid = 11171 comm = "myProgram" scontext = system_u: system_r: container_t: s0: c426, c629 tcontext = system_u: system_r: container_t: s0: c426, c629 tclass = permissive process = 0

Je suis extrêmement réticent à simplement l'exécuter audit2allowcar je ne veux pas autoriser ce comportement spécifique ailleurs (car cela serait assez risqué).

  • Comment puis-je dire à SELinux d'autoriser ce comportement spécifique de la manière la plus sûre possible?
  • Puis-je le faire d'une manière qui me permette de générer plus de conteneurs Docker exécutant le même programme à l'avenir?
Thomas
la source

Réponses:

4

audit2allowgénère probablement une règle pour permettre execheapde container_tprocessus de type. Vous pouvez toujours d'abord générer le module et l'inspecter avant de le charger.

Un problème possible est que désormais tout processus de container_ttype est désormais autorisé à effectuer la même opération. Pour éviter cela, vous devrez peut-être créer votre propre type personnalisé (en utilisant container_tcomme modèle) et ne permettre execheapque ce type spécial.

Ce billet de blog de Dan Walsh explique comment rédiger une telle politique personnalisée. Vous pouvez également combiner cela avec audit2allowpour générer les règles réelles. Les étapes essentielles sont:

  1. Créez une stratégie de conteneur de base, par exemple container_execheap:

    policy_module(container_execheap, 1.0)
    
    virt_sandbox_domain_template(container_execheap_t)
    

    virt_sandbox_domain_templateLa macro crée le nouveau type container_execheap_tet crée les règles nécessaires au fonctionnement du docker pour que le nouveau type puisse être utilisé comme domaine de conteneur.

  2. Compilez et chargez le module de politique (les fichiers de développement nécessaires, y compris le makefile, devraient être fournis par selinux-policy-develpaquet):

    make -f /usr/selinux/devel/Makefile container_execheap.pp
    semodule -i container_execheap.pp
    

    Le nouveau type peut être configuré pour être un domaine permissif:

    semanage permissive -a container_execheap_t
    

    Pour les domaines permissifs, les dénis AVC sont enregistrés mais les règles ne sont pas appliquées. De cette façon, il est facile de générer les règles manquantes ultérieurement en utilisant audit2allow.

  3. Exécutez votre conteneur dans ce nouveau contexte, quelque chose comme docker run ... --security-opt label:type:container_execheap_t ...

  4. Générez les erreurs attendues. Exécutez ensuite audit2allowpour générer des règles autorisant ces opérations container_execheap_t. Vous pouvez mettre à jour le même .tefichier de module (pensez à augmenter le numéro de version) avec les nouvelles règles. Compilez et installez le module mis à jour.

  5. Lorsque plus aucune erreur n'est générée, remettez le type de conteneur personnalisé en mode d'application semanage -d container_execheap.

sebasth
la source
Votre réponse semble être la voie à suivre - malheureusement, même si je n'ai aucune expérience dans la création de politiques SELinux moi-même. C'est ce que j'ai trouvé en parcourant le billet de blog auquel vous avez lié et d'autres documents. J'ai le sentiment que je ne le fais pas bien ... pourriez-vous peut-être m'aider en me pointant dans la bonne direction? Ma politique a-t-elle un sens?
Thomas
Merci, j'ai maintenant quelque chose qui semble fonctionner! C'est ce avec quoi je me suis retrouvé. J'ai cependant reçu un tas d' erreurs concernant les doublons lors de la compilation, je suppose que c'est un problème dans les politiques incluses plutôt que le mien? Je ne sais pas non plus pourquoi la chaîne à l'intérieur de l'instruction gen_require doit se terminer par un 'au lieu d'un' (ce dernier a généré une erreur). Quoi qu'il en soit, merci encore pour l'aide!
Thomas
Je pense qu'il est sûr d'ignorer ces erreurs spécifiques, voir bugzilla . Citer en utilisant `` est comment cela fonctionne en langage M4 , qui est utilisé pour écrire des modules de politique de référence. Vous pouvez vérifier (à l'aide de ps axZetc.) que votre conteneur s'exécute dans le bon contexte si vous souhaitez revérifier après avoir installé et configuré votre stratégie personnalisée.
sebasth