Permissions de fichiers sous Linux

Bonjour à tous. Nous nous intégrons activement dans le travail et nous préparons de nombreux lancements puissants dès janvier. Parmi d'autres, nous avons annoncé une re-formation pour le nouveau cours qui plaît à tout le monde. « Administrateur Linux ». À l'approche du lancement, nous partageons traditionnellement la traduction de documents utiles.

Permissions de fichiers sous Linux

Les permissions de fichiers offrent une alternative sécurisée aux fichiers exécutables SUID, mais elles peuvent sembler un peu déroutantes au premier abord.


Nous savons tous que les fichiers binaires SUID microsoft/azure-cli sont une mauvaise solution en termes de sécurité.Heureusement, si votre application nécessite quelques privilèges limités, il existe un moyen plus efficace appelé permissions de fichiers..

Je vais vous faire gagner du temps si vous souhaitez éviter une lecture détaillée de l'article ci-dessus : en essence, les permissions de fichiers permettent aux processus exécutés au nom de l'utilisateur root et qui ont donc le droit de faire quoi que ce soit, de conserver certaines capacités limitées, restreintes à cette liste, lorsque ceux-ci abandonnent des privilèges et s'exécutent en tant qu'utilisateur non privilégié. Cela signifie que si un attaquant parvient à compromettre un processus via un débordement de tampon ou une autre exploitation, il ne pourra tirer parti que de certains privilèges minimaux qui sont réellement nécessaires au processus.

Les permissions sont excellentes pour les services qui s'exécutent généralement toujours au nom de l'utilisateur root, mais qu'en est-il des utilitaires en ligne de commande ? Heureusement, cela est également pris en charge tant que vous avez les bons utilitaires installés. Par exemple, si vous utilisez Ubuntu, vous aurez besoin du paquet libcap2-bin. Vous devrez également faire fonctionner un noyau non archaïque (à partir de la version 2.6.24).

). Ces fonctionnalités permettent de lier des permissions à des fichiers exécutables de manière analogue à la configuration du bit SUID, mais uniquement pour un ensemble spécifique de permissions. L'utilitaire setcap est utilisé pour ajouter et supprimer des permissions d'un fichier.

La première étape consiste à choisir les permissions dont vous avez besoin. Pour cet article, je suppose qu'il existe un outil de diagnostic réseau appelé tracewalk, qui devrait pouvoir utiliser des sockets bruts.Normalement, cela nécessite que l'application soit exécutée au nom de l'utilisateur root, mais en examinant liste , il s'avère qu'il suffit de la permission CAP_NET_RAW..

En supposant que vous vous trouvez dans le répertoire où se trouve le fichier binaire tracewalk, vous pouvez ajouter cette autorisation de la manière suivante :

sudo setcap cap_net_raw=eip tracewalk

Pour l’instant, ignorez le suffixe =eip concernant l’autorisation, je vous en parlerai dans quelques secondes. Notez que le nom de l’autorisation est en minuscules. Maintenant, vous pouvez vérifier si vous avez correctement configuré les autorisations avec :

setcap -v cap_new_raw=eip tracewalk

Ou vous pouvez afficher la liste de toutes les autorisations définies pour ce fichier exécutable :

getcap tracewalk

Pour votre information, vous pouvez également supprimer toutes les autorisations d’un fichier exécutable avec :

setcap -r tracewalk

À ce stade, vous devriez être en mesure d’exécuter le fichier exécutable en tant qu’utilisateur non privilégié, et il devrait être capable de travailler avec des sockets bruts, mais ne pas avoir d’autres privilèges que possède l’utilisateur root.

Alors, que signifie ce suffixe étrange =eip? Здесь потребуется толика понимания природы разрешений. Каждый процесс имеет три набора разрешений — efficace, héritables et disponibles (effective, inheritable et permitted):

  • Efficaces (Effective) les autorisations sont celles qui déterminent ce que le processus peut réellement faire. Par exemple, il ne peut pas traiter des sockets bruts si CAP_NET_RAW. il n’est pas dans l’ensemble efficace.
  • Disponibles (Permitted) les autorisations sont celles que le processus est autorisé à avoir s'il les demande par le biais de l'appel approprié. Elles ne permettent pas réellement au processus de faire quoi que ce soit, à moins qu'il n'ait été spécifiquement écrit pour demander ladite autorisation. Cela permet de rédiger des processus ajoutant des autorisations particulièrement importantes à l'ensemble efficace uniquement pendant la période où elles sont réellement nécessaires.
  • Héritables (Inheritable) les autorisations sont celles qui peuvent être héritées dans l'ensemble disponible d'un processus fils. Lors de l'opération fork() ou clone() le processus fils reçoit toujours une copie des autorisations du processus parent, car à ce moment-là, il exécute toujours le même fichier exécutable. L'ensemble héritable est utilisé lorsque exec() (ou équivalent) est appelé pour remplacer le fichier exécutable par un autre. À ce stade, l'ensemble disponible du processus est masqué par l'ensemble héritable pour obtenir l'ensemble disponible qui sera utilisé pour le nouveau processus.

Ainsi, l'outil setcap nous permet d'ajouter séparément les autorisations de ces trois ensembles pour ce fichier exécutable. Notez que la valeur des groupes est interprétée légèrement différemment pour les droits d'accès aux fichiers :

  • Disponibles les autorisations de fichiers sont celles qui sont toujours disponibles pour le fichier exécutable, même si le processus parent qui l'a appelé ne les avait pas. Auparavant, elles étaient appelées « autorisations forcées ».
  • Héritées les autorisations de fichiers définissent un masque supplémentaire qui peut également être utilisé pour retirer des autorisations de l'ensemble du processus appelant. Elles s'appliquent en plus de l'ensemble hérité du processus appelant, donc une autorisation est héritée uniquement si elle existe dans les deux ensembles.
  • Efficaces les autorisations de fichiers ne représentent en réalité qu'un seul bit, et si celui-ci est défini, cela signifie que l'ensemble des autorisations disponibles est également copié dans l'ensemble efficace du nouveau processus. Cela peut être utilisé pour ajouter des autorisations à des processus qui n'ont pas été spécifiquement écrits pour les demander. Étant donné qu'il s'agit d'un seul bit, si vous l'activez pour une autorisation, elle doit être activée pour toutes les autorisations. Vous pouvez le considérer comme un bit de compatibilité, car il est utilisé pour permettre l'utilisation des autorisations pour des applications qui ne les prennent pas en charge.

Lors de la spécification des autorisations via setcap trois lettres e, i et p font référence à efficace, hérité et disponible ensembles respectifs. Donc, la spécification antérieure :

sudo setcap cap_net_raw=eip tracewalk

… indique que l'autorisation CAP_NET_RAW. doit être ajoutée aux ensembles disponibles et hérités, et que le bit efficace doit également être défini. Cela remplacera toutes les autorisations précédemment définies dans le fichier. Pour définir plusieurs autorisations en même temps, utilisez une liste séparée par des virgules :

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Le guide sur les autorisations discute de tout cela plus en détail, mais j'espère que ce post a un peu démystifié ce qui se passe. Il ne reste plus qu'à mentionner quelques avertissements et astuces.

Premièrement, les capacités de fichiers ne fonctionnent pas avec les liens symboliques — vous devez les appliquer au fichier binaire lui-même (c'est-à-dire à la cible du lien symbolique).

Deuxièmement, ils ne fonctionnent pas avec des scripts interprétés. Par exemple, si vous avez un script Python auquel vous souhaitez attribuer des autorisations, vous devez les attribuer à l'interpréteur Python lui-même. Évidemment, c'est un problème de sécurité potentiel, car cela signifie que tous les scripts exécutés avec cet interpréteur auront les autorisations spécifiées, bien que cela soit tout de même considérablement mieux que de faire un SUID. La solution de contournement la plus courante semble consister à écrire un fichier exécutable distinct en C ou un équivalent qui peut effectuer les opérations nécessaires et l'appeler depuis le script. Cela ressemble à l'approche utilisée par Wireshark, qui utilise un fichier binaire. /usr/bin/dumpcap pour exécuter des opérations privilégiées :

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

Troisièmement, les autorisations de fichiers sont désactivées si vous utilisez une variable d'environnement LD_LIBRARY_PATH pour des raisons de sécurité évidentes(1). Il en va de même pour LD_PRELOAD, autant que je sache.

1. Étant donné qu'un attaquant peut clairement remplacer l'une des bibliothèques standard et utiliser LD_LIBRARY_PATH, pour forcer sa bibliothèque à être appelée en priorité par rapport à la système, et par conséquent, exécuter son propre code arbitraire avec les mêmes privilèges que l'application appelante.

C'est tout. Pour plus de détails sur le programme du cours, vous pourrez vous renseigner lors du webinaire qui se tiendra le 24 janvier.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster