LINUX:SELinux-Concept

De WIKI sur Linux (ADB)
Aller à la navigation Aller à la recherche

retour à SELinux


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


Fcontext

Chaque fichier a un "Context". Par défaut, ils vont en recevoir un: "system_u:object_r:default_t:s0". Mais il est impératif que chaque fichier aie son propre context adapté selon sa fonction.

Il existe deux moyens pour effectuer cette liaison:

  • via les modules: Un module est un ensemble cohérent de déclaratives, de règles, de liaisons de contexts aux fichiers,... Ces modules sont majoritairement installés via les logiciels.
  • via les commandes de lignes pour des adaptations personnelles

Cette seconde approche peut être visualisée dans les fichiers du répertoire "/etc/selinux//targeted/contexts/files".

Pour avoir une liste complète, exécutez la commande suivante:

semanage fcontext -l

Et pour ceux personnalisés:

semanage fcontext -lC

Pour effectuer cette liaison, on passe par deux étapes:

  • l'ajout d'une définition; on utilise la commande:
semanage fcontext -a -t <type> <fichiers>

Par exemple:

semanage fcontext -a -t httpd_sys_content_t '/web(/.*)?'

Qui ajoute ("-a") le type "httpd_sys_content_t" à tous les fichiers et répertoires de l'arborescence "/web".

  • l'élimination d'une définition; on utilise la commande:
semanage fcontext -d -t <type> <fichiers>

Par exemple:

semanage fcontext -d -t httpd_sys_content_t '/web(/.*)?'

Pour éliminer la définition précédente.

  • l'application de cette définition ou son retrait avec la commande suivante:
restorecon -RFv <fichiers>

Par exemple:

restorecon -RFv /web/

Si par après, on ajoute un fichier ou un répertoire et si leur "Context" ne suit pas, on réapplique cette définition avec cette même commande.




Rôles et Types

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


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








retour à SELinux