Systèmes de sécurité Linux

L'une des raisons de l'énorme succès du système d'exploitation Linux sur les appareils et serveurs embarqués et mobiles est le degré de sécurité assez élevé du noyau, des services et des applications associés. Mais si Regarde de plus près à l'architecture du noyau Linux, alors il est impossible d'y trouver un carré responsable de la sécurité en tant que telle. Où se cache le sous-système de sécurité Linux et en quoi consiste-t-il ?

Informations générales sur les modules de sécurité Linux et SELinux

Security Enhanced Linux est un ensemble de règles et de mécanismes d'accès basés sur des modèles d'accès obligatoires et basés sur des rôles pour protéger les systèmes Linux contre les menaces potentielles et corriger les lacunes du contrôle d'accès discrétionnaire (DAC), le système de sécurité Unix traditionnel. Le projet est né dans les entrailles de la National Security Agency des États-Unis et a été directement développé principalement par les entrepreneurs Secure Computing Corporation et MITRE, ainsi que par un certain nombre de laboratoires de recherche.

Systèmes de sécurité Linux
Modules de sécurité Linux

Linus Torvalds a fait un certain nombre de commentaires sur les nouveaux développements de la NSA afin qu'ils puissent être inclus dans le noyau Linux principal. Il a décrit un environnement général, avec un ensemble d'intercepteurs pour contrôler les opérations avec les objets et un ensemble de certains champs de protection dans les structures de données du noyau pour stocker les attributs correspondants. Cet environnement peut ensuite être utilisé par des modules de noyau chargeables pour implémenter n'importe quel modèle de sécurité souhaité. LSM est entièrement entré dans le noyau Linux v2.6 en 2003.

Le framework LSM inclut des champs de garde dans les structures de données et des appels à des fonctions d'interception aux points critiques du code du noyau pour les manipuler et effectuer un contrôle d'accès. Il ajoute également des fonctionnalités pour enregistrer les modules de sécurité. L'interface /sys/kernel/security/lsm contient une liste des modules actifs sur le système. Les hooks LSM sont stockés dans des listes appelées dans l'ordre spécifié dans CONFIG_LSM. Une documentation détaillée sur les hooks est incluse dans le fichier d'en-tête include/linux/lsm_hooks.h.

Le sous-système LSM a permis de compléter l'intégration complète de SELinux avec la même version du noyau Linux stable v2.6. Presque immédiatement, SELinux est devenu le standard de facto pour un environnement Linux sécurisé et a été inclus dans les distributions les plus populaires : RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

Glossaire SELinux

  • Identité — L'utilisateur SELinux n'est pas le même que l'identifiant utilisateur Unix/Linux habituel ; ils peuvent coexister sur le même système, mais sont complètement différents par essence. Chaque compte Linux standard peut correspondre à un ou plusieurs dans SELinux. L'identité SELinux fait partie du contexte de sécurité global, qui détermine les domaines que vous pouvez et ne pouvez pas rejoindre.
  • domaines - Dans SELinux, un domaine est le contexte d'exécution d'un sujet, c'est à dire un processus. Le domaine détermine directement l'accès dont dispose un processus. Un domaine est essentiellement une liste de ce que les processus peuvent faire ou de ce qu'un processus peut faire avec différents types. Quelques exemples de domaines sont sysadm_t pour l'administration système et user_t qui est un domaine utilisateur normal non privilégié. Le système init s'exécute dans le domaine init_t et le processus nommé s'exécute dans le domaine approved_t.
  • Les rôles — Ce qui sert d'intermédiaire entre les domaines et les utilisateurs SELinux. Les rôles déterminent les domaines auxquels un utilisateur peut appartenir et les types d'objets auxquels il peut accéder. Ce mécanisme de contrôle d'accès empêche la menace d'attaques par élévation de privilèges. Les rôles sont écrits dans le modèle de sécurité Role Based Access Control (RBAC) utilisé dans SELinux.
  • Types — Un attribut de liste Type Enforcement qui est affecté à un objet et détermine qui peut y accéder. Semblable à la définition de domaine, sauf que le domaine s'applique à un processus et le type s'applique aux objets tels que les répertoires, les fichiers, les sockets, etc.
  • Sujets et objets - Les processus sont des sujets et s'exécutent dans un contexte spécifique ou un domaine de sécurité. Les ressources du système d'exploitation : fichiers, répertoires, sockets, etc., sont des objets auxquels est attribué un certain type, c'est-à-dire un niveau de confidentialité.
  • Politiques SELinux — SELinux utilise diverses politiques pour protéger le système. La politique SELinux définit l'accès des utilisateurs aux rôles, des rôles aux domaines et des domaines aux types. Tout d'abord, l'utilisateur est autorisé à obtenir un rôle, puis le rôle est autorisé à accéder aux domaines. Enfin, un domaine ne peut avoir accès qu'à certains types d'objets.

LSM et l'architecture SELinux

Malgré leur nom, les LSM ne sont généralement pas des modules Linux chargeables. Cependant, comme SELinux, il est directement intégré au noyau. Toute modification du code source LSM nécessite une nouvelle compilation du noyau. L'option correspondante doit être activée dans les paramètres du noyau, sinon le code LSM ne sera pas activé après le démarrage. Mais même dans ce cas, il peut être activé par l'option du chargeur de démarrage du système d'exploitation.

Systèmes de sécurité Linux
Pile de contrôle LSM

LSM est équipé de hooks dans les fonctions principales du noyau qui peuvent être utiles pour les vérifications. L’une des principales caractéristiques des LSM est qu’ils sont empilés. Ainsi, les contrôles standard sont toujours effectués et chaque couche de LSM n'ajoute que des contrôles et des contrôles supplémentaires. Cela signifie que l’interdiction ne peut pas être annulée. Ceci est illustré dans la figure : si le résultat des contrôles de routine du DAC est un échec, alors le problème n'atteindra même pas les hooks LSM.

SELinux adopte l'architecture de sécurité Flask du système d'exploitation de recherche Fluke, notamment le principe du moindre privilège. L'essence de ce concept, comme son nom l'indique, est d'accorder à l'utilisateur ou au processus uniquement les droits nécessaires à la réalisation des actions envisagées. Ce principe est implémenté à l'aide du typage à accès forcé, ainsi le contrôle d'accès dans SELinux est basé sur le modèle domain => type.

Grâce au typage à accès forcé, SELinux dispose de capacités de contrôle d'accès bien supérieures à celles du modèle DAC traditionnel utilisé dans les systèmes d'exploitation Unix/Linux. Par exemple, vous pouvez limiter le numéro de port réseau auquel le serveur FTP se connectera, autoriser l'écriture et la modification de fichiers dans un certain dossier, mais pas leur suppression.

Les principaux composants de SELinux sont :

  • Serveur d'application des politiques — Le principal mécanisme d'organisation du contrôle d'accès.
  • Base de données des politiques de sécurité du système.
  • Interaction avec l'intercepteur d'événements LSM.
  • Sélinuxfs - Pseudo-FS, identique à /proc et monté dans /sys/fs/selinux. Rempli dynamiquement par le noyau Linux au moment de l'exécution et contenant des fichiers contenant des informations sur l'état de SELinux.
  • Accéder au cache vectoriel — Un mécanisme auxiliaire pour augmenter la productivité.

Systèmes de sécurité Linux
Comment fonctionne SELinux

Tout fonctionne comme ça.

  1. Un certain sujet, en termes SELinux, effectue une action autorisée sur un objet après une vérification DAC, comme le montre l'image du haut. Cette demande d'exécution d'une opération est envoyée à l'intercepteur d'événements LSM.
  2. À partir de là, la demande, ainsi que le contexte de sécurité du sujet et de l'objet, sont transmises au module SELinux Abstraction and Hook Logic, qui est responsable de l'interaction avec le LSM.
  3. L’autorité décisionnelle concernant l’accès d’un sujet à un objet est le Policy Enforcement Server et il reçoit les données de SELinux AnHL.
  4. Pour prendre des décisions concernant l'accès ou le refus, Policy Enforcement Server se tourne vers le sous-système de mise en cache Access Vector Cache (AVC) pour les règles les plus utilisées.
  5. Si aucune solution pour la règle correspondante n'est trouvée dans le cache, la demande est transmise à la base de données de politique de sécurité.
  6. Le résultat de la recherche à partir de la base de données et de l'AVC est renvoyé au Policy Enforcement Server.
  7. Si la stratégie trouvée correspond à l'action demandée, l'opération est autorisée. Dans le cas contraire, l'opération est interdite.

Gestion des paramètres SELinux

SELinux fonctionne dans l'un des trois modes suivants :

  • Application – Strict respect des politiques de sécurité.
  • Permissif - La violation des restrictions est autorisée, une note correspondante est faite dans le journal.
  • Désactivé : les politiques de sécurité ne sont pas en vigueur.

Vous pouvez voir dans quel mode SELinux se trouve avec la commande suivante.

[admin@server ~]$ getenforce
Permissive

Changer le mode avant de redémarrer, par exemple en le définissant sur Enforcing, ou 1. Le paramètre permissif correspond au code numérique 0.

[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #то же самое

Vous pouvez également changer de mode en éditant le fichier :

[admin@server ~]$ cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.

SELINUXTYPE=cible

La différence avec setenfoce est qu'au démarrage du système d'exploitation, le mode SELinux sera défini en fonction de la valeur du paramètre SELINUX dans le fichier de configuration. De plus, les modifications apportées à l'application de <=> désactivé ne prennent effet qu'en modifiant le fichier /etc/selinux/config et après un redémarrage.

Afficher un bref rapport d'état :

[admin@server ~]$ sestatus

SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31

Pour afficher les attributs SELinux, certains utilitaires standard utilisent le paramètre -Z.

[admin@server ~]$ ls -lZ /var/log/httpd/
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200920
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200927
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201004
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201011
[admin@server ~]$ ps -u apache -Z
LABEL                             PID TTY          TIME CMD
system_u:system_r:httpd_t:s0     2914 ?        00:00:04 httpd
system_u:system_r:httpd_t:s0     2915 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     2916 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     2917 ?        00:00:00 httpd
...
system_u:system_r:httpd_t:s0     2918 ?        00:00:00 httpd

Par rapport à la sortie normale de ls -l, il existe plusieurs champs supplémentaires au format suivant :

<user>:<role>:<type>:<level>

Le dernier champ désigne quelque chose comme une classification de sécurité et consiste en une combinaison de deux éléments :

  • s0 - signification, également écrite sous la forme d'un intervalle de bas niveau à haut niveau
  • c0, c1… c1023 - catégorie.

Modification de la configuration des accès

Utilisez semodule pour charger, ajouter et supprimer des modules SELinux.

[admin@server ~]$ semodule -l |wc -l #список всех модулей
408
[admin@server ~]$ semodule -e abrt #enable - активировать модуль
[admin@server ~]$ semodule -d accountsd #disable - отключить модуль
[admin@server ~]$ semodule -r avahi #remove - удалить модуль

Première équipe connexion sémanage connecte l'utilisateur SELinux à l'utilisateur du système d'exploitation, le second affiche une liste. Enfin, la dernière commande avec le commutateur -r supprime le mappage des utilisateurs SELinux aux comptes du système d'exploitation. Une explication de la syntaxe des valeurs de plage MLS/MCS se trouve dans la section précédente.

[admin@server ~]$ semanage login -a -s user_u karol
[admin@server ~]$ semanage login -l

Login Name SELinux User MLS/MCS Range Service
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
system_u system_u s0-s0:c0.c1023 *
[admin@server ~]$ semanage login -d karol

Équipe utilisateur de sémanage utilisé pour gérer les mappages entre les utilisateurs et les rôles SELinux.

[admin@server ~]$ semanage user -l
                Labeling   MLS/       MLS/                          
SELinux User    Prefix     MCS Level  MCS Range             SELinux Roles
guest_u         user       s0         s0                    guest_r
staff_u         staff      s0         s0-s0:c0.c1023        staff_r sysadm_r
...
user_u          user       s0         s0                    user_r
xguest_u        user       s0         s0                    xguest_r
[admin@server ~]$ semanage user -a -R 'staff_r user_r'
[admin@server ~]$ semanage user -d test_u

Paramètres de commande :

  • -une entrée de mappage de rôle personnalisée ajoutée ;
  • -l liste des utilisateurs et des rôles correspondants ;
  • -d supprime l'entrée de mappage de rôle d'utilisateur ;
  • -R liste des rôles attachés à l'utilisateur ;

Fichiers, ports et valeurs booléennes

Chaque module SELinux fournit un ensemble de règles de balisage de fichiers, mais vous pouvez également ajouter vos propres règles si nécessaire. Par exemple, nous souhaitons que le serveur Web ait des droits d'accès au dossier /srv/www.

[admin@server ~]$ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?
[admin@server ~]$ restorecon -R /srv/www/

La première commande enregistre de nouvelles règles de marquage et la seconde réinitialise, ou plutôt définit, les types de fichiers conformément aux règles actuelles.

De même, les ports TCP/UDP sont marqués de telle manière que seuls les services appropriés peuvent les écouter. Par exemple, pour que le serveur Web écoute sur le port 8080, vous devez exécuter la commande.

[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080

Un nombre important de modules SELinux ont des paramètres pouvant prendre des valeurs booléennes. La liste complète de ces paramètres peut être consultée en utilisant getsebool -a. Vous pouvez modifier les valeurs booléennes à l'aide de setsebool.

[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_cgi --> on
[admin@server ~]$ setsebool -P httpd_enable_cgi off
[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_homedirs --> off

Atelier, accédez à l'interface Pgadmin-web

Regardons un exemple pratique : nous avons installé pgadmin7.6-web sur RHEL 4 pour administrer la base de données PostgreSQL. Nous avons marché un peu quête avec les paramètres de pg_hba.conf, postgresql.conf et config_local.py, définissez les autorisations des dossiers, installez les modules Python manquants à partir de pip. Tout est prêt, on lance et on reçoit 500 Erreur interne du serveur.

Systèmes de sécurité Linux

Nous commençons par les suspects typiques, en vérifiant /var/log/httpd/error_log. Il y a là quelques entrées intéressantes.

[timestamp] [core:notice] [pid 23689] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Permission denied: '/var/lib/pgadmin'
[timestamp] [wsgi:error] [pid 23690] [timestamp] [wsgi:error] [pid 23690] HINT : You may need to manually set the permissions on
[timestamp] [wsgi:error] [pid 23690] /var/lib/pgadmin to allow apache to write to it.

À ce stade, la plupart des administrateurs Linux seront fortement tentés d'exécuter setencorce 0, et ce sera la fin. Franchement, c'est exactement ce que j'ai fait la première fois. C'est bien sûr aussi une issue, mais loin d'être la meilleure.

Malgré sa conception lourde, SELinux peut être convivial. Installez simplement le package setroubleshoot et affichez le journal système.

[admin@server ~]$ yum install setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ service restart auditd

Veuillez noter que le service auditd doit être redémarré de cette manière, et non en utilisant systemctl, malgré la présence de systemd dans le système d'exploitation. Dans le journal système sera indiqué non seulement le fait du blocage, mais aussi la raison et moyen de surmonter l'interdiction.

Systèmes de sécurité Linux

Nous exécutons ces commandes :

[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1

On vérifie l'accès à la page web pgadmin4-web, tout fonctionne.

Systèmes de sécurité Linux

Systèmes de sécurité Linux

Source: habr.com

Ajouter un commentaire