LINUX:SELinux-Concept
But
Rappelons que sous Unix tout est basé sur des fichiers. A chaque fichier est lié un Context SELinux.
Un utilisateur est lié à un utilisateur SELinux.
Cet utilisateur SELinux appartient à un ou plusieurs rôles.
Un rôle donne accès à divers domaines qui sont une des catégorie de type SELinux.
Et tout un immense ensemble de règles régissent les interactions entre ces divers contexts. Cet ensemble de règles définit la sécurité SELinux.
Context
Donc une des bases de la protection est de sécuriser les fichiers au sens large, processus compris.
On est habitué à une sécurité basée sur la propriété et les accès basics. La commande suivante:
ls -al /etc/passwd
donne:
-rw-r--r--. 1 root root 7453 7 jan 11:36 /etc/passwd
Ce fichier appartient à l'utilisateur "root" et au group "root". Le propriétaire a les droits de lecture et d'écriture alors que les autres n'ont que le droit de lecture.
SELinux ajoute une nouvelle couche. Cette couche permet de contrôler les accès d'une application aux fichiers.
Remarque très importante!!! Dès que cette troisième couche SELinux est activée, il faut la considérer impérativement comme des deux premières couches sinon on courre à des blocages.
SELinux ajoute des attributs à chaque fichier appelé "context".
Sa syntaxe est la suivante:
[SELinux User]:[Role]:[Type]:[Level]
où:
- [SELinux User] : l'utilisateur SELinux. Chaque utilisateur Linux est lié à un utilisateur SELinux.
- [Role] : le rôle SELinux. Il relie un utilisateur SELinux à un ensemble de type SELinux.
- [Type] : le type d'attribut SELinux. Il défini le domaine d'un processus ou le type d'un fichier. Il permet de regrouper un ensemble de "fichiers,..." entre eux.
- [Level] : le niveau de sécurité. Il est surtout utilisé par le niveau de protection "MLS" (Multi Level Security). Comme nous utilisons le niveau "Targeted", il est fixe "s0" et n'a pas d'impact spécial.
Dans la pratique, diverses commandes comportent une option additionnelle "-Z" qui permet de connaitre ces attributs.
- la commande "ls" pour les fichiers:
ls -alZ /etc/passwd
donne:
-rw-r--r--. 1 root root system_u:object_r:passwd_file_t:s0 7453 7 jan 11:36 /etc/passwd
- la commande "ps" pour les processus:
ps axZ | grep crond
donne:
system_u:system_r:crond_t:s0-s0:c0.c1023 1141 ? Ss 0:01 /usr/sbin/crond -n
- la commande "netstat" pour les ports:
netstat -natpZ | grep httpd
donne:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1368/httpd system_u:system_r:httpd_t:s0 tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 1368/httpd system_u:system_r:httpd_t:s0 tcp 0 0 192.168.1.60:443 192.168.1.2:65097 ESTABLISHED 1477/httpd system_u:system_r:httpd_t:s0
- la commande "id" pour la session:
id
donne pour la session de l'utilisateur "staff":
uid=5004(staff) gid=100(users) groupes=100(users) contexte=user_u:user_r:user_t:s0
et
id -Z
donne:
user_u:user_r:user_t:s0
Pour le premier exemple concernant le fichier "/etc/passwd", ce context "system_u:object_r:passwd_file_t:s0" se décompose comme suit:
- [SELinux User] : system_u
- [Role] : object_r
- [Type] : passwd_file_t
- [Level] : s0
Par convention et pour pouvoir s'y retrouver, on ajoute des suffises spécifiques à chaque catégorie:
- [SELinux User] : _u
- [Role] : _r
- [Type] : _t
Utilisateurs Linux et SELinux
On peut lister la liaison entre les utilisateurs Linux et les utilisateurs SELinux par la commande:
semanage login -l
qui donne:
Nom pour l’ouverture de session Identité SELinux Intervalle MLS/MCS Service __default__ unconfined_u s0-s0:c0.c1023 * admin user_u s0 * root unconfined_u s0-s0:c0.c1023 * staff user_u s0 *
Si un utilisateur Linux n'est pas repris, il est lié à l'utilisateur SELinux par défaut "__default__".
La commande suivante permet d'effectuer cette liaison:
semanage login -a -s user_u staff
Ici on lie l'utilisateur Linux "staff" à l'utilisateur SELinux "user_u".
Et pour l'éliminer, voici la commande:
semanage login -d -s user_u staff
Utilisateur et Rôles
On peut lister la liaison entre les utilisateurs SELinux et les rôles SELinux par la commande:
semanage user -l
qui donne:
Étiquetage MLS/ MLS/ Identité SELinux Préfixe Niveau MCS Intervalle MCS Rôles SELinux 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
Ou:
seinfo -u -x
qui donne:
Users: 8 user guest_u roles guest_r level s0 range s0; user root roles { staff_r sysadm_r system_r unconfined_r } level s0 range s0 - s0:c0.c1023; user staff_u roles { staff_r sysadm_r system_r unconfined_r } level s0 range s0 - s0:c0.c1023; user sysadm_u roles sysadm_r level s0 range s0 - s0:c0.c1023; user system_u roles { system_r unconfined_r } level s0 range s0 - s0:c0.c1023; user unconfined_u roles { system_r unconfined_r } level s0 range s0 - s0:c0.c1023; user user_u roles user_r level s0 range s0; user xguest_u roles xguest_r level s0 range s0;
La commande suivante permet de créer un utilisateur "administrateur_u" ayant le rôle "webadm_r":
semanage user -a -R webadm_r administrateur_u
Et pour l'éliminer, voici la commande:
semanage user -d administrateur_u