[SELinux] Créer un environnement
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.