SELINUX
Introduction à SELinux
- DAC (Unix)
- RBAC (sudo)
- MAC (AppArmor)
- MAC (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)
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
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
# getenforce
Enforcing
# setenforce
usage: setenforce [ Enforcing | Permissive | 1 | 0 ]
# setenforce 0
# getenforce
Permissive
# setenforce 1
# getenforce
Enforcing
# 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ées à différents éléments tels que :
- Utilisateur (u)
- Rôle (r)
- Type (t)
- Niveau (s)
- Rôle (r)
Vérifier la présence des outils de gestion
Utilisateur SELinux
# 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 *
Contextes
- Domaines de transition
# ls -Z /usr/bin/passwd
-rwsr-xr-x. root root unconfined_u:object_r:passwd_exec_t:s0 /usr/bin/passwd
# 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
Examples de modification de contexte
- Service
httpd
# yum -y install httpd
# 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
# mkdir /opt/www
# semanage fcontext -a -t httpd_sys_content_t "/opt/www(/.*)?"
# 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
# semanage fcontext -a -e /home /home1
# restorecon -R -v /home1
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.
Logs SELinux
# grep AVC /var/log/audit/audit.log
# sealert
Restaurer les contextes par défaut définis de tous les fichiers du système
Sera nécessaire après chaque modification de SELinux.
avec
restorecon
sur la racine :# restorecon -R -v /
Avec le fichier /.autorelabel et redémarrage
# touch /.autorelabel # shutdown -r now