Les capacités permettent l'évaluation de certains privilèges système importants dans un thread distinct différent du processus en cours. De cette façon, vous n'avez pas besoin d'exécuter un programme en tant que root pour qu'il accède à certaines parties du système.

En tant que solution découlant des besoins, la section 25 de POSIX.1e traite de ce problème. Le développement des privilèges définis dans cette section et plus a été achevé avec la sortie de la version 2.6.26 du noyau Linux. Voici tout ce que vous devez savoir sur les fonctionnalités du noyau Linux.

Comprendre la logique de l'API Capabilities

Le contrôle des autorisations dans les systèmes basés sur Unix comprend deux étapes :

  • Si le propriétaire actuel (ID utilisateur effectif, EUID) de l'application en cours d'exécution est zéro, le système ne vérifie pas l'autorisation
  • Si la valeur EUID est différente de zéro, le système exécute le processus de contrôle conformément aux autorisations de l'utilisateur et du groupe effectifs de l'application concernée.

Certaines applications doivent avoir des privilèges plus larges (bits SUID, SGIT) lors de leur exécution. Comme exemple le plus typique, vous pouvez penser à l'application passwd. Avec cela, les utilisateurs d'un système peuvent changer leurs mots de passe. Cependant, écrire au /etc/shadow fichier, où les mots de passe cryptés sont conservés, il est nécessaire de travailler avec les droits d'utilisateur root (c'est-à-dire ID utilisateur = 0).

Pour résoudre ce problème, l'application passwd possède un bit SUID. Quel que soit l'utilisateur qui exécute cette application, le propriétaire actif (EUID) sera toujours root :

ls -l /usr/bin/passwd

# Production
-rwsr-xr-x. 1 racine racine 32552 23 juillet 2021 /usr/bin/passwd

La possibilité d'exécuter des applications SUID dans le modèle d'authentification Unix traditionnel semble avoir résolu le problème. Cependant, des erreurs critiques dans les applications avec des bits SUID ouvrent la porte à l'exécution de codes indésirables pour les utilisateurs disposant d'une autorité totale sur le système. Une application idéale devrait pouvoir s'exécuter sans avoir besoin de droits d'utilisateur root si possible.

Le problème ne se termine pas uniquement avec le bit SUID. Vous devez également disposer des droits d'utilisateur root lorsque vous souhaitez écouter sur un port TCP ou UDP privilégié moins de 1024 sur les systèmes basés sur Unix. Par exemple, pour pouvoir écouter le port TCP 80 d'un serveur Web, vous devez exécuter l'application en tant qu'utilisateur root.

Au fil des ans, on a compris à quel point il est dévastateur d'exécuter un logiciel qui fournit un service à l'environnement réseau avec un compte utilisateur pleinement autorisé. Comme solution provisoire, il a été adopté que seule une partie certaine et plus petite du programme écoute sur le port privilégié en tant que root, puis remplace l'ID utilisateur actif par un autre utilisateur pour les processus suivants (par exemple, l'utilisateur personne avec des droits restreints).

Ce système, qui a été utilisé pendant des années, a bien fonctionné avec sa simplicité et est toujours utilisé efficacement. Cependant, de nos jours, il est possible d'obtenir des fonctionnalités supplémentaires, spécifiques à l'application, via l'API des fonctionnalités Linux, sans avoir besoin de droits root, à l'exception des éléments mentionnés ci-dessus système.

Le modèle de capacité Linux, expliqué !

Vous pouvez trouver l'implémentation la plus complète de l'API de fonctionnalités dans le noyau Linux. Les distributions Linux modernes essaient également d'utiliser autant que possible ce nouveau modèle à l'échelle du système.

Par exemple, pour que l'application ping fonctionne, elle doit être capable d'ouvrir les sockets RAW, qui sont généralement réservés aux utilisateurs root uniquement. Dans les anciennes distributions Linux, le problème est de donner le bit SUID à l'application afin que les utilisateurs normaux puissent l'utiliser. Dans ces versions, lorsque vous supprimez le bit SUID de l'application et essayez d'exécuter l'application en tant qu'utilisateur normal, vous obtenez l'erreur suivante :

ping 8.8.8.8

# Production
ping: socket ouvert icmp: opération non autorisée

Alors que sur les distributions Linux modernes, l'application ping n'a probablement pas le bit SUID :

ls -l /bin/ping 

# Production
-rwxr-xr-x. 1 racine racine 95232 25 juillet 2021 /bin/ping

Néanmoins, vous pouvez exécuter l'application avec succès en tant qu'utilisateur normal. Le mécanisme qui rend cela possible est que l'application ping a la capacité spéciale CAP_NET_RAW.

Vous pouvez apprendre les fonctionnalités supplémentaires de l'application avec le capter commande comme suit :

sudo capter /bin/ping

# Production
/bin/ping cap_net_raw=ep

Si la commande getcap renvoie une réponse vide, vous pouvez définir manuellement cette valeur avec :

sudo setcap cap_net_raw+ep /bin/ping

Le modèle de capacité de processus

Dans l'implémentation Linux, les capacités de chaque processus sont regroupées sous trois rubriques :

Aptitude Déclaration
permis Dans ce cluster, il existe une liste de fonctionnalités supplémentaires autorisées pour le processus concerné. Accorder une autorisation ne signifie pas qu'il peut être utilisé activement à ce moment-là. Il est possible d'inclure les autorisations ici dans l'ensemble de capacités effectif avec une action supplémentaire.
efficace Il affiche la liste des capacités actuellement actives du processus associé. Avec les fonctions auxiliaires qui régulent le système de compétences, il est possible d'abandonner ou de reprendre une compétence. Dans tous les cas, cependant, cela ne peut être fait que parmi ceux déjà autorisés dans le groupe autorisé.
héréditaire Lorsqu'une application démarre un nouveau processus, le processus nouvellement démarré affiche la liste des fonctionnalités dont il héritera de la liste autorisée.

La liste des capacités autorisées, effectives et héritables pour l'exécution de processus à tout moment s'affiche sous forme de masque binaire sur les lignes CapPrm, CapEff, et CapInh dans le fichier /proc//status. De plus, le CapBnd La ligne contient le masque binaire utilisé dans l'opération de contrôle de limite de capacité.

Par exemple, essayez de lire les valeurs de votre application shell en cours d'exécution à partir du /proc/self/status dossier:

chat /proc/soi/statut | Casquette grep

# Production
CapInh: 0000000000000000
CapPrm: 0000000000000000
EffCap: 0000000000000000
CapBnd: 000001ffffffffff
CapAmb: 0000000000000000

Le modèle de capacité de fichier sous Linux

Le fonctionnement du système de capacité pour les fichiers dépend de la condition préalable que ces propriétés puissent être stockées dans la couche du système de fichiers virtuel (VFS). Comme pour le modèle de processus, les fonctionnalités des fichiers se répartissent en trois catégories :

1. Permis

Le système détermine les capacités autorisées du processus lorsque l'exécutable correspondant s'exécute dans ce cluster.

2. Efficace

Contrairement au modèle de capacité de processus, cet en-tête stocke un seul bit: actif ou inactif. Si le bit est actif, les capacités définies dans la liste autorisée du fichier sont automatiquement transféré à la liste des capacités effectives du processus concerné lorsque ce fichier est exécuté et qu'un processus est créé. Si le bit n'est pas actif, le transfert automatique des capacités autorisées sur le fichier vers le processus en cours d'exécution n'est pas effectué.

Cependant, si le code de l'application concernée est intégré au système de capacités, il peut activer les autorisations dans l'ensemble autorisé du fichier avec des appels système. L'objectif principal de ce comportement est de s'assurer que les anciennes applications qui n'incluent pas de fonctionnalités spécifiques au système code, le développement au niveau du code logiciel peut fonctionner avec le système de capacités sans avoir besoin de code source changements.

Vous pourriez penser que les applications mieux écrites n'utiliseront les fonctionnalités qu'en cas de besoin. Si le bit est actif, toutes les fonctionnalités de la liste autorisée deviennent actives au démarrage de l'application.

3. Héritable

Comme dans le modèle de processus, le fichier concerné s'exécute et un processus se produit. Si une autre application s'exécute à partir du processus après cela, elle est incluse dans la liste autorisée du nouveau processus. Pour résumer, il indique une liste de capacités à hériter.

Le rôle des capacités dans un système Linux

Lorsque vous exécutez un certain processus en tant qu'utilisateur normal, vous n'avez aucun privilège. Par conséquent, vous ne pouvez accéder qu'aux partitions que le système autorise pour les utilisateurs normaux. La principale raison derrière cela est de renforcer la sécurité du système et de mettre en œuvre de telles mesures.

Permettre à tous les utilisateurs d'accéder à toutes les ressources peut créer une grave faille de sécurité. Il sera très facile pour les personnes qui utilisent le système à des fins malveillantes d'exploiter les vulnérabilités du système. Les capacités de Linux sont utiles dans ces domaines. Vous pouvez facilement renforcer la sécurité de vos applications grâce aux fonctionnalités API alimentées par le noyau.

Les capacités de Linux ne sont qu'un des problèmes auxquels il faut réfléchir pour utiliser des méthodes très puissantes telles que la division de l'utilisateur root autorisations, en attribuant diverses autorisations à des utilisateurs non privilégiés et en prenant diverses précautions concernant les ports ouverts dans les services Internet avec Serveurs Linux.

Améliorez la sécurité de votre serveur Linux avec ces 7 étapes de renforcement

Lire la suite

PartagerTweeterPartagerE-mail

Rubriques connexes

  • Linux
  • Programmation
  • Noyau Linux
  • Système opérateur

A propos de l'auteur

Fatih Küçükkarakurt (8 articles publiés)

Un ingénieur et développeur de logiciels passionné de mathématiques et de technologie. Il a toujours aimé les ordinateurs, les mathématiques et la physique. Il a développé des projets de moteurs de jeux ainsi que des bibliothèques d'apprentissage automatique, de réseaux de neurones artificiels et d'algèbre linéaire. De plus continue à travailler sur l'apprentissage automatique et les matrices linéaires.

Plus de Fatih Küçükkarakurt

Abonnez-vous à notre newsletter

Rejoignez notre newsletter pour des conseils techniques, des critiques, des ebooks gratuits et des offres exclusives !

Cliquez ici pour vous abonner