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
    

results matching ""

    No results matching ""