9.2. Création et utilisation d'une politique SELinux pour un conteneur personnalisé
Pour générer une politique de sécurité SELinux pour un conteneur personnalisé, suivez les étapes de cette procédure.
Conditions préalables
-
L'outil
podman
de gestion des conteneurs est installé. Si ce n'est pas le cas, utilisez la commandednf install podman
. - Un conteneur Linux personnalisé - ubi8 dans cet exemple.
Procédure
Installez le paquetage
udica
:# dnf install -y udica
Vous pouvez également installer le module
container-tools
, qui fournit un ensemble de logiciels de conteneurs, dontudica
:# dnf module install -y container-tools
Démarrez le conteneur ubi8 qui monte le répertoire
/home
avec des autorisations de lecture seule et le répertoire/var/spool
avec des autorisations de lecture et d'écriture. Le conteneur expose le port 21.# podman run --env container=podman -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it ubi8 bash
Notez que le conteneur fonctionne maintenant avec le type SELinux
container_t
. Ce type est un domaine générique pour tous les conteneurs dans la politique SELinux et il peut être trop strict ou trop lâche pour votre scénario.Ouvrez un nouveau terminal et entrez la commande
podman ps
pour obtenir l'ID du conteneur :# podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 37a3635afb8f registry.access.redhat.com/ubi8:latest bash 15 minutes ago Up 15 minutes ago heuristic_lewin
Créez un fichier JSON de conteneur et utilisez
udica
pour créer un module de politique basé sur les informations contenues dans le fichier JSON :# podman inspect 37a3635afb8f > container.json # udica -j container.json my_container Policy my_container with container id 37a3635afb8f created! [...]
Alternativement :
# podman inspect 37a3635afb8f | udica my_container Policy my_container with container id 37a3635afb8f created! Please load these modules using: # semodule -i my_container.cil /usr/share/udica/templates/{base_container.cil,net_container.cil,home_container.cil} Restart the container with: "--security-opt label=type:my_container.process" parameter
Comme le suggère la sortie de
udica
à l'étape précédente, chargez le module de politique :# semodule -i my_container.cil /usr/share/udica/templates/{base_container.cil,net_container.cil,home_container.cil}
Arrêtez le conteneur et redémarrez-le avec l'option
--security-opt label=type:my_container.process
:# podman stop 37a3635afb8f # podman run --security-opt label=type:my_container.process -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it ubi8 bash
Vérification
Vérifiez que le conteneur fonctionne avec le type
my_container.process
:# ps -efZ | grep my_container.process unconfined_u:system_r:container_runtime_t:s0-s0:c0.c1023 root 2275 434 1 13:49 pts/1 00:00:00 podman run --security-opt label=type:my_container.process -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it ubi8 bash system_u:system_r:my_container.process:s0:c270,c963 root 2317 2305 0 13:49 pts/0 00:00:00 bash
Vérifiez que SELinux autorise désormais l'accès aux points de montage
/home
et/var/spool
:[root@37a3635afb8f /]# cd /home [root@37a3635afb8f home]# ls username [root@37a3635afb8f ~]# cd /var/spool/ [root@37a3635afb8f spool]# touch test [root@37a3635afb8f spool]#
Vérifiez que SELinux n'autorise que la connexion au port 21 :
[root@37a3635afb8f /]# dnf install nmap-ncat [root@37a3635afb8f /]# nc -lvp 21 ... Ncat: Listening on :::21 Ncat: Listening on 0.0.0.0:21 ^C [root@37a3635afb8f /]# nc -lvp 80 ... Ncat: bind to :::80: Permission denied. QUITTING.
Ressources supplémentaires
-
udica(8)
etpodman(1)
pages de manuel - Construire, exécuter et gérer des conteneurs