Contribuez à SecuObs en envoyant des bitcoins ou des dogecoins.
Nouveaux articles (fr): 1pwnthhW21zdnQ5WucjmnF3pk9puT5fDF
Amélioration du site: 1hckU85orcGCm8A9hk67391LCy4ECGJca

Contribute to SecuObs by sending bitcoins or dogecoins.



[Renforcement des fonctions de sécurité du noyau Linux – Partie 4] SELinux (1)

Par Rédaction, secuobs.com
Le 14/11/2007


Résumé : SELinux apporte aux noyaux des systèmes d'exploitation GNU/Linux ses nombreuses et riches fonctionnalités afin notamment de reistreindre l'environnement dans lequel un attaquant pourrait profiter d'une exploitation réussi. Cette première partie concerne la présentation de ces fonctionnalités et l'installation de SELinux.



Suite à de longs et virulents débats entre les mainteneurs du noyau Linux, mais également entre les utilisateurs finaux, SELinux a finalement été adoptée comme solution de sécurité par défaut lors du passage aux versions du noyau 2.6.X. La précédente branche stable du noyau (2.4.X) ne proposait, de base, aucune solution de ce type; ce besoin était pourtant vivement exprimé depuis plusieurs années déjà.

Le choix de SELinux a notamment été motivé par les garanties que ce projet pouvait apporter en termes de maintenance, d'évolutivité, mais également de moyens. Les services américains de la NSA ont su (l'histoire ne dira sans doute jamais si une totale transparence était de mise ou non), semble t-il, se démarquer, auprès de Linus Torvald pour faire adopter leur solution.

Quoi qu'il en soit, la qualité du code de SELinux, la richesse de ses fonctionnalités en font une solution très « recommandable » pour les renforcements sur les serveurs de production nécessitant toujours plus de robustesse, sécurité, et accessibilité.

L'approche des renforcements de SELinux se base donc, comme nous l'avons présenté en introduction, sur les moyens de restreindre au maximum l'environnement d'un attaquant ayant compromis partiellement (droits « user ») ou totalement (droits « root ») le système d'information. L'utilisateur root (souvent appelé « superuser » du fait de ses droits illimités sur un système Linux standard) est alors lui-même restreint.

De fait, la compromission d'un serveur implémentant SELinux peut alors être réduite aux seuls dégâts locaux de l'application vulnérable incriminée (ce n'est d'ailleurs pas toujours vrai!).

Le type « classique » de gestion des contrôles d'accès est du type DAC (Discretionary Access Control). Celui retenu par SELinux se rapproche très fortement du MAC (Mandatory Access Control) avec cependant quelques adaptations.

Il porte le nom de Flask et se différencie des MAC du type MLS (Multi-Level Security) qui n'intègrent pas :

- de contrôle sur l'intégrité des données ;
- le principe du « moindre privilège » (least privilege) ;
- la séparation des processus et des objets au sens ACL (Access Control List) du terme.

Les MLS se contentent d'assurer la confidentialité des fichiers et de certaines données en fonction des utilisateurs ou des appels qui l'initient.

Flask permet donc de palier ces différents problèmes en proposant les contre-mesures adaptées et en ajoutant des protections sur :

- Les fichiers
- Les processus
- Les signaux, et appels de type ptrace
- Les sockets et flux réseaux
- La gestion de l'interfaçage kernel land via un contrôle sur les modules, les appels systèmes et autres biais permettant d'atteindre le noyau du système.
- Mais également sur les fonctionnements internes des programmes grâce à une API permettant d'utiliser les fonctionnalités de SELinux directement.


Au niveau des options à configurer dans le noyau, SELinux comporte de multiples dépendances qu'il faudra impérativement « résoudre » avant de pouvoir ajouter le support. Selon le système de fichiers utilisé, retenez les entrées nécessaires dans la section « File systems » de votre configuration.

Un simple make menuconfig vous permettra de définir les options que vous voulez utiliser.

Voici les options nécessaires à son bon fonctionnement :

"Code maturity level options"
[*] Prompt for development and/or incomplete code/drivers

"General setup"
[*] Auditing support

"File systems"
<*> Second extended fs support
[*] Ext2 extended attributes
[ ] Ext2 POSIX Access Control Lists
[*] Ext2 Security Labels
<*> Ext3 journalling file system support
[*] Ext3 extended attributes
[ ] Ext3 POSIX Access Control Lists
[*] Ext3 security labels
<*> JFS filesystem support
[ ] JFS POSIX Access Control Lists
[*] JFS Security Labels
[ ] JFS debugging
[ ] JFS statistics
<*> XFS filesystem support
[ ] Realtime support (EXPERIMENTAL)
[ ] Quota support
[ ] ACL support
[*] Security Labels

[*] /proc file system support
[ ] /dev file system support (EXPERIMENTAL)
[*] /dev/pts file system for Unix98 PTYs
[*] /dev/pts Extended Attributes
[*] /dev/pts Security Labels
[*] Virtual memory file system support
[*] tmpfs Extended Attributes
[*] tmpfs Security Labels

"Security options"
[*] Enable different security models
[*] Socket and Networking Security Hooks
<*> Capabilities Support
[*] NSA SELinux Support
[*] NSA SELinux boot parameter
[*] NSA SELinux runtime disable
[*] NSA SELinux Development Support
[*] NSA SELinux AVC Statistics
[*] NSA SELinux MLS policy (EXPERIMENTAL)



Attention : pensez à ne laisser que le strict minimum, notamment s'il s'agit d'un serveur de production. Inutile donc de compiler le support pour une carte Tuner, l'accélération matérielle 3D, etc.

Une fois le noyau entièrement configuré (cette phase est souvent bien plus longue que la phase de compilation qui suit), les étapes classiques suivent :

make

make modules

make modules_install

cp arch/i386/bzImage /boot/vmlinux-2.6.16

cp System.map /boot/System.map-2.6.16

cp .config /boot/config-2.6.16



Puis si vous utilisez grub (ici avec un disque ide), ajoutez dans le fichier /boot/grub/menu.lst des lignes suivantes avec les informations de disques et de partitions concernant votre machine :

title Linux-2.6.16
root (hd0,3) # A adapter selon votre configuration
kernel /boot/vmlinuz-2.6.16 root=/dev/hda4
# Adaptez root selon votre configuration



Ou lilo (/etc/lilo.conf) :

image=/boot/vmlinuz-2.6.16
label=linux
read-only
root=/dev/hda4



Le répertoire /selinux doit ensuite être crée afin d'y stocker les futurs fichiers de policies (règles MAC SELinux) :

mkdir /selinux

chmod 700 /selinux



Le fichier /etc/fstab, contenant les points de montages virtuels et physiques de la machine, doit être complété afin d'y faire figurer le dernier montage relatif à SELinux :

none /selinux selinuxfs defaults 0 0


Le noyau et le système sont configurés pour utiliser SELinux. Un simple redémarrage, en sélectionnant le nouveau noyau généré est nécessaire pour poursuivre le déploiement.


Autres ressources dans ce dossier :

[Renforcement des fonctions de sécurité du noyau Linux – Partie 1] Présentation – lien

[Renforcement des fonctions de sécurité du noyau Linux – Partie 2] Address Space Layout Randomization – lien

[Renforcement des fonctions de sécurité du noyau Linux – Partie 3] GrSecurity et PaX – lien

[Renforcement des fonctions de sécurité du noyau Linux – Partie 5] SELinux (2) – lien

[Renforcement des fonctions de sécurité du noyau Linux – Partie 6] Netfilter, conclusions & webographie – lien