[SELinux] Les utilisateurs et les rôles

Page content

Avant de commencer, j'aimerais remercier IoT.bzh de m'avoir donné l'opportunité d'écrire cet article.


----------

Prérequis

Vous pouvez lire l’article sur les bases de SELinux avant cet article.

Dans cet article, toutes les commandes sont lancées sur un serveur fedora 31.

Vous avez besoin d’installer le paquet suivant pour la suite :

$ dnf install setools-console


Utilisateurs et rôles

La première et la seconde partie du label sont les parties utilisateur et rôle.

Les utilisateurs Linux et SELinux sont différents. L’utilisateur SELinux est défini au moment du login.

Regardons de plus près le processus d’identification.

PAM

La plupart des systèmes Linux utilise PAM. Voici le fichier qui s’occupe de l’authentification :

$ cat /etc/pam.d/login 
#%PAM-1.0
auth       substack     system-auth
auth       include      postlogin
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
session    optional     pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    include      postlogin
-session   optional     pam_ck_connector.so

On peut voir à l’intérieur que la librairie pam_selinux.so est appelée.

Une première fois pour fermer toute session qui existe, une deuxième fois pour en ouvrir une.

Si vous voulez plus d’informations à propos de selinux_pam, prenez le temps de regarder le manuel :

$ man pam_selinux

Voici comment le contexte d’un shell est assigné.

Listes

On peut lister l’association entre les utilisateurs Linux et SELinux avec la commande :

$ semanage login -l
Login Name           SELinux User         MLS/MCS Range        Service

__default__          unconfined_u         s0-s0:c0.c1023       *
bob                  guest_u              s0                   *
root                 unconfined_u         s0-s0:c0.c1023       *
sysadmin             staff_u              s0                   *

Ici bob (linux) est associé à guest_u (selinux) ou encore sysadm (linux) avec staff_u (selinux).

On peut lister les différents utilisateurs SELinux qui existent associés à leurs rôles :

$ semanage user -l
                Labeling   MLS/       MLS/
SELinux User    Prefix     MCS Level  MCS Range       SELinux Roles

guest_u         user       s0         s0              guest_r

root            user       s0         s0-s0:c0.c1023  staff_r sysadm_r system_r unconfined_r

staff_u         user       s0         s0-s0:c0.c1023  staff_r sysadm_r system_r unconfined_r

sysadm_u        user       s0         s0-s0:c0.c1023  sysadm_r

system_u        user       s0         s0-s0:c0.c1023  system_r unconfined_r

unconfined_u    user       s0         s0-s0:c0.c1023  system_r unconfined_r

user_u          user       s0         s0              user_r

xguest_u        user       s0         s0              xguest_r

Ici, staff_u peut prendre les rôles : staff_r, sysadm_r, system_r et unconfined_r.

L’utilisateur Linux donne donc accès à un utilisateur SELinux qui donne accès à des rôles.

Si on crée un sous-processus ou un nouveau fichier, il prendra le même utilisateur et rôle SELinux.

Associer un utilisateur Linux à un utilisateur SELinux

Pour associer l’utilisateur bob avec guest_u, on utilise la commande semanage :

$ semanage login -a -s guest_u bob

Pour modifier cette association :

$ semanage login -m -s sysadm_u bob

Et pour la supprimer :

$ semanage login -d bob

Associer un utilisateur et des rôles SELinux

Pour associer l’utilisateur new_u aux rôles guest_r et user_r :

$ semanage user -a -R "guest_r user_r" new_u

Pour modifier l’association :

$ semanage user -m -R "guest_r" new_u

Et pour la supprimer :

semanage user -d new_u


Lien entre type et rôle

Le rôle détermine quels types un processus peut prendre.

On peut lister les contextes disponibles pour un rôle avec la commande seinfo :

$ seinfo -r staff_r -x
Roles: 1
role guest_r types { wine_home_t ... svirt_tcg_t };

L’association par défaut d’un rôle et d’un type est défini en fonction de l’utilisateur. On peut trouver cette association dans le fichier /etc/selinux/targeted/contexts/users/.

Pour connaître le type par défaut de l’utilisateur staff_u lors d’une connexion locale, on vient regarder son fichier :

$ grep local_login_t /etc/selinux/targeted/contexts/users/staff_u
system_r:local_login_t:s0	staff_r:staff_t:s0 sysadm_r:sysadm_t:s0

On a une liste avec cette ordre : staff_r:staff_t:s0 et sysadm_r:sysadm_t:s0.

SELinux va regarder les rôles disponibles pour l’utilisateur :

$ semanage user -l | grep staff_u
staff_u   user  s0    s0-s0:c0.c1023   staff_r sysadm_r system_r unconfined_r

Le premier qui correspondra définira le rôle. Dans ce cas, on a dans le fichier staff_u, le premier rôle qui est staff_r et ce rôle est disponible pour l’utilisateur staff_u. On aura le label :

staff_u:staff_r:staff_t:s0

Imaginons que staff_u ne pouvait pas avoir le rôle staff_r, on aurait eu le label :

staff_u:sysadm_r:sysadm_t:s0

Sources

SELinux/Users and logins - Gentoo Wiki. (n.d.). Retrieved April 17, 2020, from https://wiki.gentoo.org/wiki/SELinux/Users_and_logins

Vermeulen, S. (2013, April 27). How logins get their SELinux user context. Retrieved April 17, 2020, from http://blog.siphos.be/2013/04/how-logins-get-their-selinux-user-context/

D. (2016, December 2). Understanding SELinux Roles. Retrieved April 17, 2020, from https://danwalsh.livejournal.com/75683.html