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 paquets selinux-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 commande apparmor_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