Table of Contents

SELinux: Les Bases

Présentation

SELinux (Security Enhanced Linux) 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 SELinux avant chaque appel système pour savoir si le processus est autorisé à effectuer l'opération concernée.

Chargé dans le noyau, le module de sécurité Linux effectue trois tâches, en fonction des règles chargées à partir de l'espace utilisateur (c'est-à-dire la stratégie):

Les autorisations SELinux sont données en plus des autorisations UNIX classiques. Une action aura lieu uniquement si les deux autorisations sont accordées.

Comment SELinux décide quoi autoriser

Le module de noyau SELinux permettra une opération si et seulement si:

Remarques:

SElinux avantages et inconvénients

Les avantage de SELinux

Problèmes avec SELinux

Description du paquet SELinux

Contenu du paquet SELinux

Est-ce que j'ai SELinux?

Si un répertoire /selinux est présent et s'il contient quelque chose, SELinux est chargé dans le noyau.

Essayer également la commande sestatus . Voici ce que l'on obtient par défaut sur Fedora Core 9:

sestatus

SELinux status: enabled
SELinuxfs mount: /selinux
Current Mode: Enforcing
Mode from config file: enforcing
Policy Version: 22
Policy from config file: targeted

Concepts

La politique

La politique courante Est une politique ciblée.

la politique est consommée de la façon suivante:

Le contexte

Mode contraignant ou permissif

Par défaut, tout système sain démarrera en enforcing mode,

Pour changer de mode ,utiliser la commande setenforce en tant que roout

Pour démarrer le système en mode permissif: Utiliser le paramètre d’amorçage du noyau « stricting = 0».

Les rôles

La politique SELinux limite les utilisateurs pouvant obtenir quels rôles

Il est courant, mais pas nécessaire, que chaque utilisateur de SELinux puisse avoir un rôle unique.

Le rôle limite les domaines (types) dans lequel que son propriétaire peut entrer

RBAC (Contrôle d'accès basé sur les rôles): limite les autorisations des utilisateurs en attribuant des rôles, ce qui limite leur variété de types et, partant, leurs actions.

seinfo -r # affichera tous les rôles connus du système

La stratégie Linux courante est Type Enforced (TE), les rôles et les utilisateurs ont donc peu d'importance:

Objets et classes SELinux

Le terme «objet» dans SELinux désigne les fichiers, les répertoires, les descripteurs de fichier, les tubes, les sockets, les interfaces réseau, etc.

Un objet est la chose qu'un processus demande la permission de faire quelque chose

Il y a plus de 70 classes d'objets SELinux

Chaque classe définit les autorisations applicables

Il existe une classe “process”, mais dans le jargon, un processus n'est généralement pas considéré comme un objet.

Les mécanismes de Sécurité

On distingue les mécanismes de niveau (level=MLS) des mécanismes de catégorie (MCS)

Ces mécanismes sont destinés à empêcher les utilisateurs de divulguer des informations par erreur.

Par exemple, l'application de messagerie peut être empêchée de lire des fichiers sensibles

Pour connaire quel mécanisme activé

cat /selinux/mls
1

Ces mécansimes sont implémentés avec les règles mlsconstraint dans les fichiers mls et mcs du répertoire source de la politique

MLS et MCS est le quatrième élément du contexte (s0 dans l'exemple ci-dessous)

ls -Z
drwxrwxr-x eli eli unconfined_u: object_r: user_home_t: s0 mydir
-rw-rw-r-- eli eli unconfined_u: object_r: user_home_t: s0 myfile

Étiquetage de fichier

Le contexte est stocké pour chaque fichier en tant qu'attributs sur un système de fichiers étendu, XFS (man attr).

La politique inclut des règles qui déterminent les types de fichiers à la création.

Les systèmes de fichiers qui ne peuvent pas porter d'attributs étendus obtiennent un contexte uniforme, en fonction des options de l'opération de montage et des fichiers de configuration système (par exemple, VFAT, NFS, Samba, ISO)

tar ne stocke et n'extrait pas de contextes sauf si des indicateurs explicites sont donnés

Le ré-étiquetage des fichiers peut être effectué avec plusieurs utiliatires Les contradictions entre les règles de stratégie et le ré-étiquetage des fichiers de configuration sont possibles et dangereuses:

L'utilitaire setfiles

définit le contexte dans tous les fichiers, en fonction d'un fichier de configuration (généralement /etc/selinux/targeted/contexts/files/file_contexts).

restorecon fait la même chose que setfiles , mais est destiné à quelques fichiers seulement (principalement pour corriger de petites incohérences)

L'utilitaire semanage fcontext

Permet de modifier de manière permanente le contexte des fichiers et des répertoires (expression régulière).

L'installation d'un module de stratégie peut également modifier les contextes de fichier de manière permanente

On peut utiliser chcon pour modifier le contexte de certains fichiers sans modifier les fichiers de configuration, mais cette modification est temporaire jusqu'au prochain changement d'étiquette.

Règles et syntaxe

La règle "allow"

allow Source Target:Class Permission; accorder une autorisation à un processus de domaine (type) Source sur des objets de type Cible et classe Classe

 allow unconfined_t mytype_t:file read ;

signifie “autoriser les processus dans le domaine (type) unconfinedt permission de lecture sur les fichiers de type mytypet” '

L'utilitaire audit2allow permet d'écrire les règles d'autorisation

Autres règles

À l'exception du mot-clé d'ouverture, ces règles précédents ont la même syntaxe que allow

En cas de contradiction entre les règles, la dernière règle prend effet.

Les transitions de type

Les transitions de type permettent d'affecter un autre type à un un domaine source

Les transitions de type ne sont pas des règles de permission. Au contraire, elles indiquent à SELinux d'effectuer une action.

Les Transitions de type pour les objets

Chaque objet créé a un contexte par défaut

Par exemple, les fichiers et les répertoires sont créés par défaut avec le contexte de leur répertoire parent.

Cependant il est souhaitable que le type du nouvel objet dépende de celui qui l'a créé.

Par exemple: Si le serveur X crée un fichier dans le répertoire /tmp , il doit être de type xdm_tmp_t , mais si un processus «utilisateur normal» le fait, il doit s'agir de user_tmp_t.

Pour permettre cela on utilise la directive type_transition Source Source: Class new_type : tout objet de la classe Class, créé par un processus du domaine (type) Source et obtenant par défaut le type Target, obtiendra le type new_type à la place)

Par exemple :

 type_transition sshd_t tmp_t: fichier sshd_tmp_t;

Signifie que si un processus s'exécute dans le domaine sshd_t (très probablement le ssh deamon) crée un fichier normal ordinaire qui aurait dû recevoir le type tmp_t (probablement dans le répertoire /tmp ), il devrait recevoir l'attribut sshd_tmp_t à la place .

La transition de type pour les objets ne nécessite pas de règle d'autorisation supplémentaire.

Mais plusieurs autres actions nécessitent une autorisation:

Pour simplifier les choses, une macro regroupe l'instruction de transition de type avec les autorisations: file_type_auto_trans

En reprenant le dernier exemple, la macro-instruction suivante couvre une variété de types de fichiers (fichiers simples, répertoires, liens symboliques, etc.) et gère également les autorisations. Tout en un:

 file_type_auto_trans (sshd_t, tmp_t, sshd_tmp_t);

Les Transitions de domaine pour les processus

Avec la directive typetransition Source Target:process newtype; lorsqu'un processus du domaine Source exécute, appel exec(), un fichier de type Cible, le domaine du processus sera changé en new_type.

Exemple:

type_transition sshd_t shell_exec_t: process user_t;

Signifie que si un processus du domaine sshd_t exécute un exécutable de type shell_exec_t (un shell, très probablement), le processus se poursuivra dans le domaine user_t .

Pour les processus, l'instruction type_transition n'inclut pas l'autorisation.

De nombreuses autorisations doivent être explicitement déclarées: la transition elle-même, la lecture et l’exécution de l’exécutable, et bien plus encore.

La macro domain_auto_trans inclut l'instruction de transition de type et un grand nombre d'autorisations pertinentes (par exemple, autoriser une conduite de canal entre les deux domaines pertinents).

Donc, au lieu de l'exemple précédent, on utilisera donc l'instruction:

domain_auto_trans (sshd_t, shell_exec_t, user_t);

En l'absence d'une règle de transition correspondante, l'exécutable s'exécutera sans changer de domaine. Cela nécessite l'autorisation execute_no_trans

Utilisation des caractères géneriques

Les caractères génériques peuvent être utilisés dans la défition de la politique

Exemples:

allow unconfined_t mytype_t: fichier {read getattr};
allow unconfined_t mytype_t: file *;

Déclarations

Déclaration des rôles

Les ensembles peuvent être utilisés pour le type, mais pas pour le rôle

Une tentative d'entrer dans un domaine avec un rôle non autorisé provoquera une erreur «contexte invalide».

Pour lister les types actuellement connus par le noyau utiliser la commande :

seinfo -r

Exemple:

role unconfined_r types mytype_t;

Déclaration des contraintes (constraints)

Chaque demande d'autorisation :

Comme ce n'est pas si pertinent, prenons un exemple:

constrain process transition ( u1 == u2 or t1 == privuser );
constrain process transition ( r1 == r2 or t1 == privrole );
constrain dir_file_class_set { create relabelto relabelfrom } ( u1 == u2 or t1 == privowner );

Il existe également mlsconstraint , qui limite les autorisations liées à MLS

Déclaration des types

Exemples :

type mytype_t;
type crond_t, domain, privuser, privrole, privfd, privowner;

Compte tenu de la déclaration de type ci-dessus, si lun des attribut domain, privuser, privrole, privfd ou privowner est utilisé là où la syntaxe attend un type, cela inclura plusieurs types, y compris crond_t.

Déclaration des attributs et attribuer du texte