Pas de signification intrinsèque : il est contraint aux règles de la
politique
Regroupe les sujets et objets ayant les même autorisations
On parle de :
type pour un objet
domaine pour un sujet
Exemples : system_t, user_t, unconfined_t
Convention de nommage
applicationd_t : domaine associé à un démon
application_t : domaine associé à un processus classique
application_exec_t : fichier binaire de l'application
application_conf_t : fichier de configuration
application_log_t : fichier de log
application_file_t : fichiers divers
application_lib_t : bibliothèque
application_tmp_t : fichier temporaire
applicationd_unit_file_t : fichier d'unit systemd
Un objet/processus ne possède qu'un seul type mais un type peut être associé à
plusieurs objets
Types
Chaque type doit être déclaré avant utilisation :
# Sujet
type init_t;
type sshd_t;
# Objet
type sshd_exec_t;
type admin_paswd_exec_t;
Attributs
Attributs : regroupe plusieurs types pour factoriser la politique :
# Déclaration d'un attribut
attribute file_type;
attribute application_domain_type;
attribute application_exec_type;
# Association d'un type (déjà déclaré) à un attribut (déjà déclaré)
typeattribute shadow_t security_file_type;
# Déclaration d'un type et association à un attribut (déjà déclaré)
type sshd_exec_t executable_file_type;
Opération
Opération = droit d'un contexte sujet sur un autre contexte
# Les sujets avec le type sysadm_t peuvent exécuter
# les fichiers avec le type ssh_exec_t
allow sysadm_t ssh_exec_t:file { getattr read execute };
# Les sujets avec le type sysadm_t peuvent exécuter
# les fichiers dont le type a pour attribut application_exec_type
allow sysadm_t application_exec_type:file { getattr read execute ... };
Factorisation des permissions
Macros pour simplifier l'utilisation des permissions :
policy/support/*perms_set.spt
Exemples :
r_file_perms : permissions pour lire un fichier
open getattr read lock ioctl
r_dir_perms : permissions pour traverser un répertoire
open getattr read lock search ioctl`
x_file_perms : permissions pour exécuter un fichier
open getattr execute
Type & file transitions
Par défaut, le contexte de sécurité d'un nouveau processus est celui de son
parent
Possibilité de changer de contexte avec une transition lors d'un appel à
execve
Permet de confiner chaque service dans son domaine respectif
Par défaut, le contexte de sécurité d'un fichier est celui de son répertoire
parent
Possibilité d'ajouter des règles pour associer des contextes différents en
fonction des répertoire ou noms de fichiers
Transition de type : sujet
# Lorsque le type user_t crée exécute le fichier ayant le type
# ssh_exec_t il transite automatiquement vers user_ssh_t
type_transition user_t ssh_exec_t:process user_ssh_t;
# Lorsque le type user_t crée exécute le fichier ayant le type
# passwd_exec_t il transite automatiquement vers passwd_t
type_transition user_t passwd_exec_t:process passwd_t;
# Règles supplémentaires correspondantes
allow user_t ssh_exec_t : file { read getattr execute };
allow user_ssh_t ssh_exec_t : file entrypoint;
allow user_r user_ssh_t : process transition;
Transition de type : objets
# Lorsque le processus labellé par user_t accède à un fichier de type tmp_t,
# le type de cet objet transite automatiquement vers user_tmp_t
type_transition user_t tmp_t:{ dir file lnk_file sock_file fifo_file } user_tmp_t;
# Lorsque le processus labellé par sshd_t accède à un fichier de type tmp_t,
# le type de cet objet transite automatiquement vers sshd_tmp_t
type_transition sshd_t tmp_t:{ dir file sock_file } sshd_tmp_t;
# Règles supplémentaires correspondantes
allow user_t tmp_t: dir { open getattr create write };
allow user_t user_tmp_t:file rw_file_perms;
# Lorsque qu'un processus user_t créé un dossier nommé .ssh dans un dossier
# user_home_dir_t, il est labellé ssh_home_t
type_transition user_t user_home_dir_t:dir ssh_home_t .ssh;
Politique Multi-Niveau (MLS & MCS)
Deux attributs supplémentaires ajoutés aux contextes de sécurité:
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
MLS : niveaux de sécurité
Ajout de contrainte entre différents niveau de sécurité
Souvent utilisé pour implémenter des modèles de confidentialité
N'est pas utilisé dans la politique targeted
MCS : catégories
Isole plusieurs instances d'un même type
Le . définie un ensemble (ex : c0.c16)
La , définie une liste (ex : c21,c36,c45)
Les deux séparateurs peuvent être combinés (ex: c0.c16,c21,c36,c45)
Politique Multi-Niveau (MLS & MCS)
Contrôle entre les niveaux et les catégories est réalisé via des contraintes
SELinux
Décrites dans la politique : policy/mls, policy/mcs
Tous les types ne sont pas nécessairement contraints
Utilisé principalement pour confiner les machines virtuelles et les
conteneurs (cf. chapitre sécurité & conteneurs, sécurité & KVM)
SELinux en pratique
Refpolicy
Strict policy
Tous les utilisateurs sont confinés
La politique doit décrire l'intégralité des interactions autorisées
Disponible principalement sous Gentoo Hardened (et partiellement sous Debian
et Arch Linux)
Restrictif et complexe
Fedora, Red Hat Enterprise Linux & CentOS Stream
Targeted policy
Les démons système sont confinés
Les utilisateurs interactifs ne sont pas confinés par défaut (unconfined)
Possibilité de confiner certains utilisateurs
Politique et état de SELinux
Configuration de SELinux et politique actuelle stockées dans /etc/selinux
sestatus -v : état général
Etat actuel de SELinux dans le noyau : /sys/fs/selinux/
Etat actuel de la politique stocké dans /var/lib/selinux/
seinfo -v : informations sur la politique
Audit
SELinux utilise le sous système d'audit du noyau
Démon auditd en espace utilisateur
Logs dans /var/log/audit/audit.log ou dans le Journal
Log par défaut tous les accès refusés
Outils audit2allow et audit2why pour générer des règles de politique à
partir de ces logs
# Audite l'accès en lecture au type shadow_t par sysadm_t
auditallow sysadm_t file:read shadow_t;
# Les types non privilégiés ne peuvent pas lire shadow_t
# Utilisation de ~ pour la négation
neverallow ~can_read_shadow_passwords shadow_t:file read;
# Ne pas auditer certains accès aux répertoires pour le type staff_t
# Utilisation de - pour retirer le type security_file_type de file_type
dontaudit staff_t { file_type -security_file_type }: dir { getattr search read lock};
semodule -DB : désactiver les règles dontaudit
Politique modulaire
Politique source stockée sous forme d'une collection de fichiers texte
Politique séparée entre une base et de nombreux modules
« Compilation » de la base et des modules pour former la politique finale,
sous forme binaire
Seule la forme finale est chargée par le noyau
On écrit rarement une politique de zéro
On ajoute ou modifie un module existant
Module SELinux
Composé de trois fichiers:
.te : ensemble des règles SELinux à appliquer
.fc : liste des associations entre chemin de fichiers et contexte (fc
: file contexts)
.if : interface, ou ensemble de « fonctions » proposé
pour utilisation dans d'autres modules
Création d'un module à l'aide de /usr/share/selinux/devel/Makefile
Installation avec semodule --install --priority=500
Exemple de module SELinux
toto.te :
policy_module(toto, 0.0.1)
require {
type httpd_t;
type httpd_sys_script_t;
type user_tmp_t;
}
type toto_data_t;
files_type(toto_data_t);
allow httpd_t toto_data_t:file read_file_perms;
allow httpd_t toto_data_t:dir search_dir_perms;
allow httpd_sys_script_t user_tmp_t:file read_file_perms;