Un article un peu pratique : comment configurer SELinux pour protéger un forum de type SMF (simple machine forum) ? (c’est largement utilisable pour d’autres forums).
SELinux fera l’objet d’un billet spécifique donc je ne le présente pas ici.
La configuration de base
Pour être efficace, SELinux doit être en mode enforcing. De plus, comme on le verra dans un prochain billet, nous avons fait le choix d’utiliser la politique MLS.
La configuration du serveur
Nous utilisons la configuration suivante :
- Centos 6 à jour
- SELinux : politique MLS
- LibSELinux-devel
- HTTPD (apache)
En détails, les dépendances pour SELinux :
[root@ossus]# rpm -qa | grep selinux
libselinux-utils-2.0.94-7.el6.x86_64
libselinux-2.0.94-7.el6.x86_64
libselinux-devel-2.0.94-7.el6.x86_64
libselinux-python-2.0.94-7.el6.x86_64
selinux-policy-3.7.19-292.el6.noarch
selinux-policy-mls-3.7.19-292.el6.noarch
selinux-policy-targeted-3.7.19-292.el6.noarch
Avec la politique de base, nous avons donc
ps auxwZ | grep apache
system_u:system_r:httpd_t:s0-s15:c0.c1023 apache 4410 0.5 1.2 478756 49552 ? S 16:25 1:01 /usr/sbin/httpd
Le contexte d’apache est donc system_u:system_r:httpd_t:s0-s15:c0.c1023.
SMF est installé dans le répertoire /var/www/html/forum/.
La politique SELinux
Avec la politique de base de SELinux, les éléments présents dans /var/www/html ont le contexte suivant : httpd_sys_content_t
Par défaut, httpd_t n’a pas les permissions de modification (création, suppression, exécution, etc.). Pour preuve, les AVC générés par apache :
type=AVC msg=audit(1466969654.803:74508): avc: denied { add_name } for pid=29483 comm=”httpd” name=”” scontext=system_u:system_r:httpd_t:s0-s15:c0.c1023 tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=dir
type=AVC msg=audit(1466969654.880:74511): avc: denied { setattr } for pid=29483 comm=”httpd” name=”” dev=sda1 ino=1182475 scontext=system_u:system_r:httpd_t:s0-s15:c0.c1023 tcontext=staff_u:object_r:httpd_sys_content_t:s0 tclass=file
type=AVC msg=audit(1466969656.954:74512): avc: denied { remove_name } for pid=29483 comm=”httpd” name=”” dev=sda1 ino=1702698 scontext=system_u:system_r:httpd_t:s0-s15:c0.c1023 tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=dir
type=AVC msg=audit(1467154855.120:80140): avc: denied { write } for pid=5473 comm=”httpd” name=”” dev=sda1 ino=1182554 scontext=system_u:system_r:httpd_t:s0-s15:c0.c1023 tcontext=staff_u:object_r:httpd_sys_content_t:s0 tclass=file
Donc par défaut, apache n’a pas la possibilité de modifier les répertoires présents dans le sous-répertoire du forum (ni les fichiers par extension).
Le problème c’est qu’il est nécessaire pour apache de pouvoir écrire dans certains répertoires comme celui du cache, des fichiers joints, avatar, etc.
Première méthode
On autorise tout : d’un point de vu sécurité, c’est pas top top. Il suffit de faire une règle
allow httpd_t httpd_sys_content_t:dir *;
allow httpd_t httpd_sys_content_t:dir *;
et on est tranquille.
Deuxième méthode
On fait ça proprement.
File context
Création du file_context spécifique :
var/www/html/forum/attachments system_u:object_r:http_wr_smf:s0
/var/www/html/forum/attachments/*.* system_u:object_r:http_wr_smf:s0/var/www/html/forum/avatars system_u:object_r:http_wr_smf:s0
/var/www/html/forum/avatars/*.* system_u:object_r:http_wr_smf:s0/var/www/html/forum/cache system_u:object_r:http_wr_smf:s0
/var/www/html/forum/cache/*.* system_u:object_r:http_wr_smf:s0/var/www/html/forum/Packages system_u:object_r:http_wr_smf:s0
/var/www/html/forum/Packages/*.* system_u:object_r:http_wr_smf:s0/var/www/html/forum/Settings.php system_u:object_r:http_wr_smf:s0
/var/www/html/forum/Settings_bak.php system_u:object_r:http_wr_smf:s0
/var/www/html/forum/Sources/Load.php system_u:object_r:http_wr_smf:s0
Quelques explications :
- attachments : contient les pièces jointes mises sur le forum
- avatars : explicite
- cache : cache du forum
- Packages : contient les archives pour installer des modules/mises à jour du forum
- Settings.php : pour pouvoir modifier les configurations depuis le serveur
- Load.php : coeur du forum
Tous ces fichiers ayant (presque) les mêmes demandent de permissions, on va leur créer un type spécifique http_wr_smf On pourrait affiner un peu en créant un contexte spécifique pour chaque catégories,, mais dans un soucis de clarté, on va rester simple.
Règle SELinux
Il reste maintenant à donner l’autorisation à apache de réaliser des actions spécifiques sur ce type.
On créé le nouveau type :
type http_wr_smf
Puis on fait les règles qui vont bien :
allow httpd_t http_wr_smf:file { read write create setattr getattr unlink open rename lock} ;
allow httpd_t http_wr_smf:dir *;allow httpd_t http_wr_smf:filesystem { associate };
allow http_wr_smf fs_t:filesystem { associate };
On compile (j’ai volontairement omis les types requis à la compilation). On charge la nouvelle politique et on applique les nouveaux contextes de sécurité, soit en utilisant restorecon soit autorelabel.
On a donc un forum fonctionnel avec SELinux en enforcing.