[SELinux] Créer un environnement

Page content

Avant de commencer, j'aimerais remercier IoT.bzh de m'avoir donné l'opportunité d'écrire cet article.


----------

Prérequis

Dans cet article, toutes les commandes sont lancées sur un serveur fedora 31.

Vous avez besoin d’installer les paquets suivants pour la suite :

dnf install git selinux-policy-devel

Créer son environnement SELinux

On crée les dossiers suivants avec un utilisateur unconfined ou sysadm, on peut le faire avec root par défaut :

$ cd
$ mkdir ~/selinux/
$ mkdir ~/selinux/bin
$ mkdir ~/selinux/fedora
$ mkdir ~/selinux/local

Il faut ensuite télécharger le fichier function.sh dans le dossier bin/.

$ cd ~/selinux/bin
$ wget https://resources.oreilly.com/examples/9781783989669/raw/master/functions.sh

Ce code a été développé par Sven Vermeulen et facilite l’interaction avec la politique de sécurité.

Il faut aussi rajouter les lignes suivantes à votre fichier .bashrc.

# vi ~/.bashrc
DEVROOT=~/selinux
POLICY_LOCATION=${DEVROOT}/fedora/selinux-policy
source ${DEVROOT}/bin/functions.sh

Maintenant, on clone la politique fedora qui correspond dans le dossier fedora/.

$ cd ~/selinux/fedora/
$ git clone https://github.com/fedora-selinux/selinux-policy
$ cd selinux-policy
$ git submodule update --init --recursive
$ git checkout f31

Pour finir, on crée un lien symbolique avec le Makefile de SELinux. Il va nous permettre de compiler nos modules dans le dossier local/ :

$ ln -s /usr/share/selinux/devel/Makefile ~/selinux/local/

Pour que les changements soient pris en compte directement, il faut recharger le fichier .bashrc :

$ source ~/.bashrc

Utilisation

Maintenant, différentes commandes bash sont accessibles et vont nous permettre d’interagir plus facilement avec notre politique de sécurité :

  • sefindif : Permet de trouver une interface
  • seshowif : Permet d’afficher une interface
  • sefinddef : Permet de trouver une définition
  • seshowdef : Permet d’afficher une définition

Chaque “application” crée des interfaces pour communiquer avec ces domaines.

Une définition ressemble à une énumération de valeurs.

sefindif va chercher dans la politique de sécurité si une partie correspond à l’expression régulière fournie et l’afficher.

Si on veut trouver une interface avec apache :

$ sefindif "exec.*apache"
contrib/apache.if: interface(`apache_domtrans',`
contrib/apache.if: ##	Allow the specified domain to execute apache
contrib/apache.if: interface(`apache_exec',`
contrib/apache.if: ##	Allow the specified domain to execute apache suexec
contrib/pki.if: template(`pki_apache_template',`
contrib/pki.if: 		attribute pki_apache_executable, pki_apache_script, pki_apache_var_log;
contrib/pki.if: 	type $1_exec_t, pki_apache_executable;
contrib/pki.if: 	type $1_script_exec_t, pki_apache_script;

Si on veut plus d’informations à propos de l’interface apache_domtrans, on va utiliser seshowif :

$ seshowif "apache_domtrans"
interface(`apache_domtrans',`
	gen_require(`
		type httpd_t, httpd_exec_t;
	')

	corecmd_search_bin($1)
	domtrans_pattern($1, httpd_exec_t, httpd_t)
')

$1 représente les arguments donnés à l’interface. Si on veut l’utiliser avec le label guest_t, on crée un fichier .te avec le contenu suivant :

apache_domtrans(guest_t)

Avec la même méthodologie, on peut utiliser sefinddef et seshowdef.

Sources

Vermeulen, S. (2014). SELinux Cookbook : over 70 hands-on recipes to develop fully functional policies to confine yours applications and users using SElinux. Packt Publishing.