# 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 httpd_t peuvent lire
# les fichiers avec le type http_sys_content_t
allow httpd_t http_sys_content_t:file { getattr read };
Type transitions pour les processus
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
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;
SELinux en pratique
SELinux & Android
Utilisé par Android depuis la version 4.4 (KitKat)
Protection complète depuis la version 5.0 (Lollipop)
Impact significatif sur le durcissement du système
# Audite l'accès en lecture au type shadow_t par sysadm_t
auditallow sysadm_t file:read shadow_t;
# 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;
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)
Role Based Access Control (RBAC)
Sous concept pour mettre en place le MAC
Objectif : factoriser les opérations réalisables sur des objets en un rôle
Association des utilisateurs à un ou plusieurs rôles
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
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;
Attributs et règles de contrôle d'accès
# 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 ... };
Transition de type pour les fichiers
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 : 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;
Contraintes
# 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;
Points de montage
Options à passer à mount
Force les contexte pour tous les fichiers :
-o context=user:role:type
Contexte par défaut pour les fichiers sans contexte :