[SELinux] Les utilisateurs et les rôles
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