Introduction aux concepts et à la gestion de selinux

Introduction aux concepts et à la gestion de selinux

Objectif

Introduction aux concepts et à la gestion de selinux

Système d'exploitation et versions logicielles

  • Système opérateur: - Distribution Linux agnostique

Exigences

  • Accès root sur une installation Linux fonctionnelle avec une stratégie SELINUX valide
  • Ensemble de politiques: il fournit des utilitaires GetSebool, Setsebool, Restorecon
  • Package CoreUtils: fournit un utilitaire CHCON
  • Ensemble Policycoreutils-Python: fournit une commande de sémanage
  • Policycoreutils-Newrole: fournit le programme Newrole
  • Setools-Console: fournit la commande Seinfo

Difficulté

MOYEN

Conventions

  • # - Exige que les commandes Linux soient exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
  • $ - Exige que les commandes Linux soient exécutées en tant qu'utilisateur non privilégié régulier

Introduction

Selinux (Security Enhanced Linux) est une implémentation d'un système d'autorisation de contrôle d'accès obligatoire (MAC) dans le noyau Linux. Ce type de contrôle d'accès diffère des systèmes de contrôle d'accès discrétionnaires (DAC) comme les ACL et les autorisations standard UNIX UGO / RWX, dans la façon dont l'accès à une ressource est fourni. Dans le cas de Mac n'est pas le propriétaire d'une ressource, celui qui décide qui et comment peut y accéder: cet accès est basé sur les relations entre les domaines et les étiquettes, dictées par une politique et appliquée au niveau du noyau. Il est important de dire que les règles appliquées et les autorisations du système standard ne s'excluent pas mutuellement, et les premiers sont mis en œuvre après la dernière.

Statut de selinux possible

Il y a trois statuts possibles de selinux: handicapés, permissifs et appliqués. Dans le premier cas, Selinux est complètement désactivé: il n'a aucun effet sur le système en cours d'exécution. En mode permissif, Selinux est actif: il enregistre les violations de la politique, mais il ne fait rien pour les bloquer. Enfin, en mode application, Selinux applique en fait sa politique.

Il existe de nombreuses façons de consulter l'état de selinux sur votre système. Le premier consiste à utiliser la commande appelée gedenforce. Cette commande rapporte simplement les trois statuts mentionnés ci-dessus seinux. Pour avoir une sortie plus verbeuse, vous pouvez utiliser l'utilitaire Sestatus. Ceci est la sortie de la commande sur mon système (Centos 7):

SELINUX Statut: SELINUXFS MOURT: / SYS / FS / SELINUX SELINUX ROOT DIRECTORY: / etc / SELINUX Nom de la stratégie chargée: Mode actuel cible: Mode d'application à partir du fichier de configuration: Application de la stratégie MLS Statut: Politique activée Deny_Unknown Status: Autorisé la version de stratégie de kernel maximale autorisée : 28 

Des informations utiles sont fournies: tout d'abord le SELINUXFS Mountpoint, Dans ce cas / SYS / FS / SELINUX. Selinuxfs est un système de fichiers pseudo, tout comme / proc: il est rempli à l'exécution par le noyau Linux et contient des fichiers utiles pour documenter le statut selinux. Le SELINUX ROOT ROOT ROOT est, au lieu de cela, le chemin utilisé pour conserver les fichiers de configuration SELINUX, le principal étant / etc / selinux / config (un lien symbolique vers ce fichier est également présent sur / etc / sysconfig / selinux). La modification de ce fichier directement est le moyen le plus simple de modifier l'état et le mode SELINUX. Jetons un bref aperçu de son contenu:

$ cat / etc / selinux / config # Ce fichier contrôle l'état de selinux sur le système. # Selinux = peut prendre l'une de ces trois valeurs: # Enforced - La politique de sécurité SELINUX est appliquée. # Permissive - Selinux imprime les avertissements au lieu de l'application. # Désactivé - Aucune stratégie SELINUX n'est chargée. Selinux = application # selinuxType = peut prendre l'une des trois valeurs: # ciblé - les processus ciblés sont protégés, # minimum - modification de la politique ciblée. Seuls les processus sélectionnés sont protégés. # MLS - Protection de sécurité multi-niveaux. SelinuxType = ciblé 

Le fichier est très bien commenté: en modifiant les valeurs des variables SELINUX et SELINUXTYPE, nous pouvons définir respectivement l'état de Selinux et le mode selinux. Les modes possibles sont: ciblés (par défaut), minimum et MLS. Le mode ciblé est la valeur par défaut: lorsque ce mode est actif, tous les processus ciblés sont protégés. Le mode minimum est un sous-ensemble du premier, dans lequel seuls les processus spécifiques sont protégés. Enfin, la politique MLS est la plus sophistiquée, basée sur le concept de classification de sécurité: de non classifié au top secret: il utilise le modèle Bell-La Padula, développé pour le département américain de la défense.

Modification du statut de selinux

Pour modifier le statut selinux au moment de l'exécution, vous pouvez utiliser le setenforce commande. Sa syntaxe est vraiment simple: vous spécifiez le statut dans lequel vous souhaitez mettre SELINUX, en choisissant entre l'application ou la permissive ou fournir une valeur booléenne renvoyée au statut d'application. Ce que vous ne pouvez pas faire avec cette commande, c'est de désactiver complètement Sellinux. Pour accomplir cela (non recommandé) et apporter d'autres modifications persistantes, vous devez modifier le fichier de configuration principal, comme on le voit ci-dessus. Les modifications apportées à ce fichier sont appliquées après un redémarrage.

Comment fonctionne Selinux?

Fondamentalement, Selinux travaille sur le concept d'entités: sujets, objets et actions. Un sujet est une application ou un processus (un serveur HTTP par exemple), un objet est une ressource sur le système, comme un fichier, une prise ou un port. Enfin, une action est ce que ce sujet spécifique peut effectuer sur l'objet. Un sujet se déroule sous un certain domaine qui, par exemple, dans le cas du démon httpd est httpd_t. Ceci est facile vérifiable en vérifiant un processus en cours d'exécution avec la commande PS: tout ce que nous devons faire est d'ajouter le commutateur -z (le commutateur -z est souvent associé à selinux sur les commandes qui le prennent en charge, comme LS par exemple):

$ PS -AUXZ | grep httpd 

La commande ci-dessus donne le résultat suivant (sortie tronquée):

System_U: System_R: httpd_t: S0 Apache 2340 0.0 0.2 221940 2956 ? S 14:20 0:00 / usr / sbin / httpd -dforeground 

En fonctionnement dans le domaine HTTPD_T, le service HTTPD (sujet) ne peut accéder qu'à des ressources (Action) (objets) dans les types SELINUX associés. Un moyen très simple de vérifier cela est en vérifiant le répertoire / var / www. Le démon HTTPD doit être en mesure d'y accéder, alors vérifions le type de ce type. Nous pouvons le faire en utilisant la commande LS avec le commutateur -z:

$ ls -dz / var / www 

Les commandes nous donne ce résultat:

System_U: object_r: httpd_sys_content_t: s0 / var / www 

La sortie nous montre le contexte SELINUX complet, et le répertoire / var / www étant étiqueté avec le type TTPD_SYS_CONTENT_T. Cela est parfaitement logique: la stratégie SELINUX ciblée permet un processus exécuté sous le domaine HTTPD_T pour accéder (en mode lecture uniquement) tous les fichiers étiquetés avec le type HTTPD_SYS_CONTENT_T. Si le processus tentera une action qui n'est pas attendue par la politique, SELINUX enregistrera l'erreur et, en mode application, bloquez l'action elle-même.

Utilisateurs de Selinux

Nous avons vu ci-dessus comment une représentation d'un contexte de selinux complet semble être structurée:

System_U: object_r: httpd_sys_content_t: s0 

Permet d'analyser cette structure en prenant en considération les trois premières parties (le quatrième est renvoyé au mode MLS). La première section concerne les utilisateurs de Selinux: chaque utilisateur de Selinux a un ensemble différent de restrictions et est autorisé
Pour jouer uniquement un ensemble spécifique de rôles Selinux qui donnent accès à des domaines SELINUX spécifiques, qui, à leur tour, peuvent accéder uniquement.

Les utilisateurs de Selinux peuvent jouer des rôles Selinux peuvent aller dans les domaines selinux ont accès aux types selinux 

Pour avoir une idée claire des utilisateurs de Selinux disponibles, nous pouvons exécuter:

# user de sémanage -l

Cette commande nous donne une vue globale claire des utilisateurs - Rôles Relations:

SELINUX User Préfixe MCS Niveau MCS Range SELINUX ROLES CUTER_U USER S0 S0 GURD_R ROOT User S0 S0-S0: C0.C1023 Staff_R Sysadm_R System_R Unfined_R Staff_U User S0 S0-S0: C0.C1023 Staff_R Sysadm_R System_R Unfined_R Sysadm_U User S0 S0-S0: C0.C1023 SYSADM_R System_U User S0 S0-S0: C0.C1023 System_r Uncifined_r Unconfined_U User S0 S0-S0: C0.C1023 System_r Uncifined_R User_U User S0 S0 User_R XGUEST_U User S0 S0 XGUEST_R 

Voyons brièvement ce que certains des utilisateurs de Selinux décrits sont autorisés à faire:

  • invité_u: Ce type d'utilisateur n'a pas accès à la mise en réseau, pas de privilèges d'exécution de script dans / home, ni ne peut utiliser les commandes sudo ou su pour obtenir des privilèges plus élevés. Il ne peut utiliser que le rôle invité_r
  • staff_u: Les utilisateurs du système mappés à cet utilisateur de Selinux ont accès à l'interface graphique, à la mise en réseau et à l'utilisation de la commande sudo pour acquérir des privilèges. Il peut basculer entre les rôles Stuff_r, Sysadm_R, System_R et Unfined_R
  • sysadmin_u: Identique à ci-dessus, plus peut également utiliser la commande su. Il ne peut jouer que le rôle sysadm_r
  • system_u: Ceci est l'utilisateur affecté aux services système, aucun utilisateur du système ne doit être mappé
  • non raffiné_u: Ce type d'utilisateur n'a aucune restriction. Il a des rôles non définis_r et system_r qui lui sont associés
  • xguest_u: Cet utilisateur de Selinux a accès à l'interface graphique et au réseau, mais uniquement via le navigateur Firefox. Il n'a pas de droits d'exécution pour les fichiers sous / à domicile et n'a que le rôle xGuest_r qui lui est associé

Comme vous pouvez le voir, l'utilisateur de Selinux est identifiable, dans le contexte, ayant le suffixe _U. Il devrait être clair qu'ils sont une chose totalement différente des utilisateurs du système. Il existe une carte entre les deux, et il est possible de le voir en courant SEMANAGE LOGIN -L commande:

# SEMANAGE -L Connexion

Ce qui nous donne la sortie suivante:

Nom de connexion SELINUX User MLS / MCS Range Service __DEFAULT__ Uncifined_U S0-S0: C0.C1023 * Root Unfined_U S0-S0: C0.C1023 * 

La racine de l'utilisateur du système est mappée à l'utilisateur non perçu. Aucun autre utilisateur n'est explicitement cartographié, ils sont donc par défaut associés à l'utilisateur non confiné_U SELINUX.

Modification de l'utilisateur de Selinux

À ce stade, vous pouvez vous demander comment il est possible de définir une carte entre un utilisateur système et un selinux. Nous accomplissons cette tâche en utilisant la commande de connexion SEMANAGE. Dans l'exemple suivant, je modifie le mappage par défaut, en associant l'utilisateur factice sur mon système à l'utilisateur invité_u selinux:

# SEMANAGE LOGIN -a -s invité_u dumum 

Le commutateur -a est court pour -add et il est utilisé pour ajouter un enregistrement, tandis que le -s un (abréviation de -seser) spécifie l'utilisateur de SELINUX que l'utilisateur du système doit être mappé pour. Permet maintenant de réactiver la connexion SEMANAGE -L pour voir si quelque chose a changé:

Nom de connexion SELINUX User MLS / MCS Range Service __DEFAULT__ Uncifined_U S0-S0: C0.C1023 * Dummy invité_U S0 * ROOT NONFINED_U S0-S0: C0.C1023 * System_U System_U S0-S0: C0.C1023 * 

Comme prévu, l'utilisateur factice du système est désormais associé à l'utilisateur invité_u selinux qui, comme indiqué précédemment, n'a pas accès au réseau. Permet de le vérifier de la manière la plus simple: nous essayons de recouvrir Google et de voir quel est le résultat:

[dummy @ linuxconfig ~] $ ping google.com ping: prise: permission refusée 

Comme prévu, l'utilisateur factice n'est pas autorisé à utiliser le réseau, donc la commande ping échoue. Pour supprimer le mappage, nous utilisons le commutateur -D (abréviation de -delete):

# SEMANAGE LOGIN -D -S invité_U Dummy 

N'ayant pas de mappage spécifique, l'utilisateur factice se repliera à l'utilisateur non conçu. Puisque ce dernier n'a aucune restriction, si nous réessayons la commande ci-dessus, cela devrait maintenant réussir:

[dummy @ linuxconfig ~] $ ping google.com ping google.com (216.58.205.206) 56 (84) octets de données. 64 octets de MIL04S29-en-F14.1E100.net (216.58.205.206): ICMP_SEQ = 1 TTL = 52 Time = 29.2 ms [] 

Gardez à l'esprit que les changements dans la cartographie entre les utilisateurs et les utilisateurs de Selinux ne seront efficaces qu'après une nouvelle connexion.

Rôles de seinux

La deuxième partie d'un contexte selinux concerne les rôles. Comme vous pouvez le voir sur la sortie de utilisateur de sémanage -l Ci-dessus, chaque utilisateur de Selinux peut lire un ensemble spécifié de rôles Selinux: lorsqu'il existe plusieurs rôles pour un utilisateur de Selinux, l'utilisateur peut également basculer entre eux en utilisant le nouveau rôle Commande, en utilisant la syntaxe suivante:

$ newrole -r newrole 

Pour vérifier quels domaines un rôle spécifique peut accéder, vous devez exécuter le seinfo commande. Ceci est fourni par le Setools-console emballer. Par exemple, pour vérifier quels domaines sont accessibles à partir du rôle Stuff_R, nous exécutons:

# seinfo -RStuff_r -x 
$ seinfo -rStaff_r -x (sortie tronquée) Rôles dominés par le personnel_r: Types de personnel: ABRT_HELPER_T ALSA_HOME_T Antivirus_home_t httpd_user_content_t httpd_user_htaccess_t […] 

Domaines et types

La troisième partie d'un contexte selinux concerne les domaines et les types, et est identifiable en ayant le suffixe _t dans la représentation de contexte. Nous l'appelons le type si nous parlons d'un objet, ou de domaine si nous parlons d'un processus. Nous allons jeter un coup d'oeil.

J'ai créé un simple .Fichier HTML dans l'Apache VirtualHost par défaut sur ma machine CentOS 7: comme vous pouvez le voir, le fichier a hérité du contexte Selinux du répertoire dans lequel il a été créé:

-rw-r - r--. root root non raffined_u: objet_r: httpd_sys_content_t: test s0.html 

Avec le httpd_sys_content_t, Le fichier peut être lu par le processus HTTPD, comme l'a confirmé en y accédant dans le navigateur.

Essayons maintenant de modifier le type de fichier et de voir l'effet de ce changement. Pour manipuler le contexte SELINUX, nous utilisons le chcon commande:

# chcon -t user_home_t / var / www / html / test.html 

Nous avons changé le type selinux du fichier en user_home_t: Ceci est le type utilisé par les fichiers situés dans les utilisateurs
Répertoires domestiques par défaut. L'exécution ls -z sur le fichier nous donne la confirmation:

Uncomed_u: object_r: user_home_t: s0 / var / www / html / test.html 

Si nous essayons maintenant d'atteindre le fichier du navigateur, comme prévu.

Le chcon La commande peut être utilisée non seulement pour modifier le type de fichier, mais aussi l'utilisateur et la partie du rôle du contexte selinux. Lorsque vous l'utilisez pour modifier un contexte de répertoire, il peut également s'exécuter récursivement avec le commutateur -r, et peut également attribuer un contexte par référence: dans ce cas, nous ne spécifions pas les parties du contexte à modifier directement, mais nous fournissons la référence à le fichier ou le répertoire auquel le contexte doit être conforme à. Par exemple, faisons le test.Fichier HTML ci-dessus, acquérir le contexte du répertoire / var / www / html:

# chcon --reference / var / www / html / var / www / html / test.html && ls -z / var / www / html / test.html 

Nous pouvons voir à partir de la sortie des commandes ci-dessus, que le contexte du fichier a maintenant changé, et c'est maintenant le même que celui du répertoire / var / www / html:

System_u: object_r: httpd_sys_content_t: s0 / var / www / html / test.html 

Notez que les modifications apportées à la commande CHCON survivront à un redémarrage mais pas à un décomplerie des fichiers: dans ce cas, les fichiers seront définis conformément à la politique originale de Selinux, et les modifications seront perdues. Alors, comment pouvons-nous rendre le changement persistant? Nous devons ajouter une nouvelle règle à la stratégie SELINUX à l'aide de la commande SEMANAGE.

Disons que nous voulons ajouter une règle dictant que tous les fichiers créés dans le répertoire / home / egdoc / test devraient avoir, par défaut, le Type httpd_sys_content_t. Voici la commande que nous devrions exécuter:

SEMANAGE FContext -a -t httpd_sys_content_t / home / egdoc / test (/.*)? 

Nous invoquons d'abord la commande SEMANAGE spécifiant fcontext Pour modifier les contextes de fichiers, alors nous ajoutons le -un Communiquez pour ajouter un enregistrement et le -t un, pour spécifier que nous voulons modifier la partie type du contexte en ce qui a suivi immédiatement.

Enfin, nous fournissons le chemin du répertoire avec une expression régulière qui signifie: / home / egdoc / chemin de test suivi du / le caractère, suivi de n'importe quel nombre de n'importe quel caractère, l'expression entière correspondant à 0 ou 1 fois. Cette expression régulière correspondra à tous les noms de fichiers.

Nous exécutons maintenant le Restorecon commande avec le -R (récursif) option sur le répertoire, pour appliquer la politique. Depuis maintenant la règle que nous avons ajoutée ci-dessus fait partie de la politique elle-même, tous les fichiers contenus dans le répertoire, ainsi que les nouveaux créés, auront le contexte que nous avons spécifié dans la règle.

SELINUX BOOLEAN COMMENTS

Les paramètres de SELINUX BOOLEANS peuvent modifier le comportement de SELINUX et sont gérés par l'utilisation de valeurs booléennes. Nous pouvons interagir avec eux par l'utilisation de deux commandes: getsebool et Setsebool, le premier étant utilisé pour interroger l'état d'une option et le second pour le changer.

Si nous passons l'option que nous voulons vérifier sur getsebool, cela nous donnera uniquement l'état de cette option, si nous lui fournissons le -un Le changement nous montrera plutôt tous les paramètres disponibles et leur état booléen respectif. Par exemple, si nous voulons vérifier l'état des options liées à HTTPD, nous pourrions exécuter:

$ getsebool -a | grep httpd 

Voici un extrait très court de la sortie:

[egdoc @ linuxconfig.org ~] $ getsebool -a | grep httpd httpd_anon_write -> off httpd_builtin_scripting -> on […] 

Permet maintenant d'essayer de modifier l'état de l'option httpd_anon_write et de l'activer. Comme mentionné ci-dessus, nous utilisons SetSebool pour la tâche:

# setSebool httpd_anon_write 1 

Si nous vérifions maintenant la valeur de l'option, elle aurait dû être activée:

[egdoc @ linuxconfig.org ~] $ getsebool -a | grep httpd_anon_write httpd_anon_write -> sur 

Tout est allé comme prévu. Cependant, les modifications apportées à cette façon ne survivront pas à un redémarrage. Pour accomplir cette tâche, nous devons utiliser la même commande, mais ajoutant le -P Switch: Lorsque vous l'utilisez, les modifications seront écrites à la politique et ils persisteront.

Il y a beaucoup de choses que l'on devrait considérer lors de l'utilisation de selinux, et de le régler pour obtenir un comportement spécifique, tandis que le maintien des autorisations moins possibles peut être une tâche qui prend du temps. Néanmoins, ce n'est pas une bonne idée, dans la myopinion, pour le désactiver complètement. Continuez à expérimenter jusqu'à ce que vous soyez satisfait des résultats et que vous atteignez la configuration recherchée:
Vous gagnerez à la fois en sécurité et en connaissances.

Tutoriels Linux connexes:

  • Choses à installer sur Ubuntu 20.04
  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux
  • Commandes Linux: les 20 meilleures commandes les plus importantes que vous devez…
  • Fichiers de configuration Linux: 30 premiers
  • Commandes Linux de base
  • Téléchargement Linux
  • Installez Arch Linux dans VMware Workstation
  • Linux peut-il obtenir des virus? Exploration de la vulnérabilité de Linux…
  • Journalisation et audit avancés sur Linux