jeudi 13 août 2020

Compiler un fichier de règles SELinux ( fichier .te )

 Après avoir créé votre fichier te, il faut le compiler pour pouvoir l'installer sur votre système:

# checkmodule -M -m -o local.mod local.te 
checkmodule: loading policy configuration from local.te
checkmodule: policy configuration loaded
checkmodule: writing binary representation (version 19) to local.mod

Si vous avez l'erreur suivante:

' on line 1:e:1:WARNING 'unrecognized character' at token '

C'est que votre fichier comporte un caractère de fin de ligne non reconnu.

Pour convertir au format unix avec vi:

:set ff=unix

 Après quoi, votre fichier policy module est créé.

Reste à le compiler:

# semodule_package -o local.pp -m local.mod

 Charger le module créé avec une priorité à 300.

# semodule -X 300 -i local.pp

 

mardi 11 août 2020

SELinux - Transition de domaine

Dans cet article, nous allons aborder le concept de transition de domaine.

Une transition de domaine ne peut avoir lieu qu'avec les trois pré-requis suivants:

  1. Le domaine d’origine doit avoir l'autorisation d'exécution sur le fichier.
  2. Le contexte du fichier lui-même est identifié comme un point d'entrée pour le domaine cible
  3. Le domaine d'origine est autorisé à transiter au domaine cible.

Exemple avec la commande passwd

Un utilisateur souhaite changer son mot de passe. Il utilise la commande passwd

Regardons le contexte du fichier exécutable passwd:

[root@alien1 serge]# ls -Z /usr/bin/passwd 
-rwsr-xr-x. root root system_u:object_r:passwd_exec_t:s0 /usr/bin/passwd

Voyons les différents pré-requis cités plus haut pour donner à l'utilisateur la possibilité de faire une transition de domaine vers le fichier des mots de passe (/etc/shadow).

L'utilisateur doit pouvoir exécuter la commande passwd.

La règle suivante autorise user_t a exécuter un appel systeme execve() dans le domaine passwd_exec_t.

[root@alien1 serge]# sesearch -s user_t -t passwd_exec_t -Ad
Found 1 semantic av rules:
allow user_t passwd_exec_t : file { ioctl read getattr map execute execute_no_trans open } ;


La règle suivante autorise un point d'entrée au domaine passwd_t.

Ce point d'entrée (entrypoint) permet de définir quel fichier exécutable peut entrer dans le domaine.

[root@alien1 serge]# sesearch -s passwd_t -t passwd_exec_t -c file  -Ad
Found 1 semantic av rules:
allow passwd_t passwd_exec_t : file { ioctl read getattr lock map execute execute_no_trans entrypoint open } ;

 

Lorsque l'utilisateur lance la commande passwd, le process va transiter vers le domaine passwd_t.

La règle suivante autorise le type user_t à transiter vers le nouveau type passwd_t

[root@alien1 serge]# sesearch -s user_t -t passwd_t -Ad
Found 1 semantic av rules:
allow user_t passwd_t : process transition ;

On pourrait se demander si cela est bien utile car l'utilisateur devrait spécifiquement dire qu'il veut une transition de domaine. C'est là que les règles de transition de type sont utilisées.

 Pour créer une transition de domaine par défaut, la règle suivante est créée:

[root@alien1 serge]# sesearch -T -s user_t -t passwd_exec_t
Found 1 semantic te rules:
type_transition user_t passwd_exec_t : process passwd_t;


La règle type_transition indique que par défaut lors d'un appel système execve (), si le type de domaine du processus appelant est user_t et le type du fichier exécutable est passwd_exec_t, alors une transition de domaine vers un nouveau type de domaine (passwd_t) sera tentée.

Une règle type_transition provoque une tentative de transition de domaine par défaut, mais elle ne le permet pas, c'est pourquoi les 3 autres règles ont dû être créées.

Cet exemple a permis de montrer qu'un utilisateur peut changer son mot de passe dans le fichier /etc/shadow. Sans ces règles, cela n'aurait pas été possible, à part l'utilisateur root.

L'utilisateur ne peut accéder à ce fichier directement, il le fait à travers passwd.

Rappel du contexte SELinux du fichier shadow:

[root@alien1 serge]# ls -Z /etc/shadow
----------. root root system_u:object_r:shadow_t:s0 /etc/shadow


Une règle permet à un process avec le type passwd_t de lire et d'écrire dans les fichiers labelisés avec le type shadow_t:

[root@alien1 serge]# sesearch -s passwd_t -t shadow_t -c file -p read -Ad
Found 1 semantic av rules:
allow passwd_t shadow_t : file { ioctl read write create getattr setattr lock relabelfrom relabelto append map unlink link rename open } ;