Sécurités MAC SElinux et AppArmor
Le Mandatory access control (MAC) ou contrôle d’accès obligatoire est une méthode de gestion des droits des utilisateurs pour l’usage de systèmes d’information. SElinux et AppArmor sont des logiciels qui implémentent la sécurité MAC sous Linux.
Il existe d’autres méthodes telles que :
- le contrôle d’accès discrétionnaire (ou Discretionary Access Control - DAC), comme par exemple les droits Unix ;
- le contrôle d’accès à base de rôles (ou Role-Based Access Control - RBAC), comme par exemple
sudo
.
Le contrôle d’accès obligatoire est utilisé lorsque la politique de sécurité des systèmes d’information impose que les décisions de protection ne doivent pas être prises par le propriétaire des objets concernés, et lorsque ces décisions de protection doivent lui être imposées par le dit système. Le contrôle d’accès obligatoire doit permettre d’associer et de gérer des attributs de sécurité relatifs à cette politique, sur les fichiers et processus du système.
Source : Contrôle d’accès obligatoire
1. SELINUX
La documentation Red Hat Selinux est une référence à suivre.
1.1. Introduction à SELinux
Security-Enhanced Linux, abrégé SELinux, est un Linux security module (LSM), qui permet de définir une politique de contrôle d’accès obligatoire aux éléments d’un système issu de Linux.
Son architecture dissocie l’application de la politique d’accès et sa définition. Il permet notamment de classer les applications d’un système en différents groupes, avec des niveaux d’accès plus fins. Il permet aussi d’attribuer un niveau de confidentialité pour l’accès à des objets systèmes, comme des descripteurs de fichiers, selon un modèle de sécurité multiniveau (MLS pour Multi level Security). SELinux utilise le modèle Bell LaPadula complété par le mécanisme Type enforcement de contrôle de l’intégrité, développé par SCC. Il s’agit d’un logiciel libre, certaines parties étant sous licences GNU GPL et BSD.
D’origine militaire, afin de réduire les coûts, et de donner accès à ce type de logiciel au secteur privé (banques, services de santé, etc.) pour se protéger des pirates informatiques, son auteur a décidé de placer ce logiciel sous licence open source. L’objectif est la formation d’une communauté de chercheurs, d’utilisateurs et d’entreprises pour améliorer le logiciel et fournir des solutions avancées. (https://fr.wikipedia.org/wiki/SELinux)
1.2. Terminologie SELinux
- Policy : un ensemble de règles qui déterminent les accès des sources aux cibles.
- Domaine Source : un objet (processus ou utilisateur) qui tente d’accéder à une cible.
- Domaine Cible : un objet (un fichier ou un port) auquel un domaine source tente d’accéder.
- Contexte / Etiquette : une étiquette de sécurité qui permet d’organiser les objets SELinux.
- Règle : partie d’un policy qui décide les permissions d’un domaine source à un domaine cible.
1.3. Modes SELinux
- Enforcing : SELinux est en mode enforced. SELinux refuse les accès basés sur des règles SELinux.
- Permissive : SELinux n’est pas en mode enforced. SELinux ne refuse aucun accès mais ceux qui enfraignent les règles SELinux sont journalisés.
- On connait aussi un mode targeted ciblé sur une application.
cat /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
Afficher le mode Selinux
getenforce
Enforcing
Activer le mode Enforcing ou Permissive
sudo setenforce
usage: setenforce [ Enforcing | Permissive | 1 | 0 ]
Activer le mode Permissive
sudo setenforce 0
getenforce
Permissive
Activer le mode Enforcing
sudo setenforce 1
getenforce
Enforcing
Vérification des contextes
Vérification des contextes (processus et fichier) :
sestatus -v
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28
Process contexts:
Current context: unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Init context: system_u:system_r:init_t:s0
/usr/sbin/sshd system_u:system_r:sshd_t:s0-s0:c0.c1023
File contexts:
Controlling terminal: unconfined_u:object_r:user_tty_device_t:s0
/etc/passwd system_u:object_r:passwd_file_t:s0
/etc/shadow system_u:object_r:shadow_t:s0
/bin/bash unconfined_u:object_r:shell_exec_t:s0
/bin/login unconfined_u:object_r:login_exec_t:s0
/bin/sh unconfined_u:object_r:bin_t:s0 -> unconfined_u:object_r:shell_exec_t:s0
/sbin/agetty unconfined_u:object_r:getty_exec_t:s0
/sbin/init unconfined_u:object_r:bin_t:s0 -> unconfined_u:object_r:init_exec_t:s0
/usr/sbin/sshd system_u:object_r:sshd_exec_t:s0
Le contexte est l’étiquette qui peut être appliquée à différents éléments tels que :
- Utilisateur (u)
- Rôle (r)
- Type (t)
- Niveau (s)
- Rôle (r)
Vérification des booléens
Vérification des booléens :
sestatus -b
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: permissive
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31
1.4. Vérifier la présence des outils de gestion
1.5. Utilisateur SELinux
sudo semanage login -l
Nom pour l'ouverture de session Identité SELinux Intervalle MLS/MCS Service
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
system_u system_u s0-s0:c0.c1023 *
1.6. Contextes
Domaines de transition :
sudo ls -Z /usr/bin/passwd
-rwsr-xr-x. root root system_u:object_r:passwd_exec_t:s0 /usr/bin/passwd
sudo ls -Z /etc/shadow
----------. root root system_u:object_r:shadow_t:s0 /etc/shadow
Contextes des processus :
ps -eZ
Contextes des utilisateurs :
id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
1.7. Exemples de modification de contexte
…
Service httpd
:
sudo yum -y install httpd
sudo ls -Z /var/www
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
sudo mkdir /opt/www
sudo semanage fcontext -a -t httpd_sys_content_t "/opt/www(/.*)?"
sudo restorecon -R -v /opt/www
restorecon reset /opt/www context unconfined_u:object_r:usr_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
Substitution de /home1
vers /home
:
sudo semanage fcontext -a -e /home /home1
sudo restorecon -R -v /home1
1.8. Manipuler les “booleans”
En changeant les valeurs de “booleans”, on peut modifier le comportement de SELinux.
Pour lister des booleans :
# getsebool -a
# getsebool -a | grep httpd
httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
httpd_can_connect_ldap --> off
httpd_can_connect_mythtv --> off
httpd_can_connect_zabbix --> off
httpd_can_network_connect --> off
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_relay --> off
httpd_can_sendmail --> off
...
C’est le logiciel setsebool qui permet de modifier ces valeurs :
man setsebool
setsebool(8) SELinux Command Line documentation setsebool(8)
NAME
setsebool - set SELinux boolean value
SYNOPSIS
setsebool [ -PNV ] boolean value | bool1=val1 bool2=val2 ...
DESCRIPTION
setsebool sets the current state of a particular SELinux boolean or a
list of booleans to a given value. The value may be 1 or true or on to
enable the boolean, or 0 or false or off to disable it.
Without the -P option, only the current boolean value is affected; the
boot-time default settings are not changed.
If the -P option is given, all pending values are written to the policy
file on disk. So they will be persistent across reboots.
1.9. Logs SELinux
sudo grep AVC /var/log/audit/audit.log
sudo sealert
1.10. Restaurer les contextes par défaut définis de tous les fichiers du système
Restaurer les contextes par défaut sera nécessaire après chaque modification de SELinux.
Avec un restorecon
sur la racine :
sudo restorecon -R -v /
Avec la création d’un fichier /.autorelabel
et redémarrage :
sudo touch /.autorelabel
sudo shutdown -r now
1.11. SELINUX pour Debian
ATTENTION Politique de référence absente de Jessie
Les responsables du paquet source
refpolicy
n’ont malheureusement pas pu traiter à temps les bogues critiques du paquet, et ce dernier a donc été supprimé de Jessie. En pratique, cela signifie que les paquetsselinux-policy-*
ne sont pas disponibles dans Jessie, et qu’ils doivent être récupérés depuis une autre distribution. Nous espérons qu’ils reviendront dans une version corrective, ou dans les rétroportages. En attendant, vous pouvez les récupérer dans Unstable.Ce triste constat montre au moins que SELinux n’est pas très populaire parmi les utilisateurs et développeurs qui se servent des versions de développement de Debian. C’est pourquoi, lorsqu’on choisit d’utiliser SELinux, il faut s’attendre à passer un temps non négligeable à l’adapter à ses besoins spécifiques.
Source : https://debian-handbook.info/browse/fr-FR/stable/sect.selinux.html
Installation de SELINUX en Debian 9 (Stretch)
apt update
apt install selinux-*
perl -pi -e 's,GRUB_CMDLINE_LINUX="(.*)"$,GRUB_CMDLINE_LINUX="$1 selinux=1 security=selinux",' /etc/default/grub
update-grub
fixfiles relabel
reboot
2. AppArmor (Debian 8)
AppArmor est un système de contrôle d’accès obligatoire (Mandatory Access Control) qui s’appuie sur l’interface Linux Security Modules fournie par le noyau Linux. Concrètement, le noyau interroge AppArmor avant chaque appel système pour savoir si le processus est autorisé à effectuer l’opération concernée. Ce mécanisme permet à AppArmor de confiner des programmes à un ensemble restreint de ressources. AppArmor applique un ensemble de règles (un “profil”) à chaque programme. Le profil appliqué par le noyau dépend du chemin d’installation du programme à exécuter.
Contrairement à SELinux, les règles appliquées ne dépendent pas de l’utilisateur : tous les utilisateurs sont concernés par le même jeu de règles lorsqu’ils exécutent le même programme (mais les permissions habituelles des utilisateurs jouent toujours, ce qui peut donner un comportement différent). Les profils AppArmor sont stockés dans
/etc/apparmor.d/
; ils consistent en une liste de règles de contrôle d’accès sur les ressources que peut utiliser chaque programme. Les profils sont compilés et chargés dans le noyau par le biais de la commandeapparmor_parser
. Chaque profil peut être chargé soit en mode strict (enforcing) soit en mode relâché (complaining). Le mode strict applique les règles et rapporte les tentatives de violation, alors que le mode relâché se contente d’enregistrer dans les journaux système les appels système qui auraient été bloqués, sans les bloquer réellement.
Source : https://debian-handbook.info/browse/fr-FR/stable/sect.apparmor.html
sudo apt update
sudo apt -y install apparmor apparmor-profiles apparmor-utils
sudo perl -pi -e 's,GRUB_CMDLINE_LINUX="(.*)"$,GRUB_CMDLINE_LINUX="$1 apparmor=1 security=apparmor",' /etc/default/grub
sudo update-grub
sudo reboot
aa-status
aa-unconfined
sysctl -w kernel.printk_ratelimit=0
aa-genprof sshd
cat /etc/apparmor.d/usr.sbin.sshd
Référence : https://wiki.apparmor.net/index.php/Main_Page