introduction
Les capacités Linux sont des attributs spéciaux du noyau Linux qui accordent aux processus et aux exécutables binaires des privilèges spécifiques qui sont normalement réservés aux processus dont l'ID utilisateur effectif est 0 (l'utilisateur root, et uniquement l'utilisateur root, a UID 0).
Cet article expliquera certaines des capacités disponibles, leurs utilisations et comment les définir et les supprimer. Veuillez noter que la définition de capacités sur les exécutables peut compromettre la sécurité de votre système. En tant que tel, vous devriez envisager de tester sur un système hors production avant d'implémenter des capacités en production.
Conditions préalables
- Un système Linux sur lequel vous avez un accès root (soit via l'utilisateur root ou un utilisateur avec accès sudo).
Explication
Essentiellement, l'objectif des capacités est de diviser la puissance de `` root '' en privilèges spécifiques, de sorte que si un processus ou un binaire qui possède une ou plusieurs capacités est exploité, les dommages potentiels sont limités par rapport au même processus exécuté en tant que root.
Les capacités peuvent être définies sur les processus et les fichiers exécutables. Un processus résultant de l'exécution d'un fichier peut gagner les capacités de ce fichier.
Les capacités implémentées sur Linux sont nombreuses, et beaucoup ont été ajoutées depuis leur version originale. Certains d'entre eux sont les suivants:
CAP_CHOWN
: Modifiez l'ID utilisateur et l'ID groupe des fichiers
CAP_DAC_OVERRIDE
: Remplacer le DAC (contrôle d'accès discrétionnaire). Par exemple, vto contourne les vérifications des autorisations de lecture / écriture / exécution.
CAP_KILL
: Contourner les contrôles de permission pour envoyer des signaux aux processus.
CAP_SYS_NICE
: Augmenter la gentillesse des processus ( Une explication de la gentillesse peut être trouvée ici )
CAP_SYS_TIME
: Régler le système et l'horloge matérielle en temps réel
Pour la liste complète, exécutez man 7 capabilities
.
Les capacités sont attribuées dans des ensembles, à savoir "autorisé", "héritable", "effectif" et "ambiant" pour les threads, et "autorisé", "héritable" et "effectif" pour les fichiers. Ces ensembles définissent différents comportements complexes, leur explication complète dépasse le cadre de cet article.
Lors de la définition des capacités dans un fichier, nous utiliserons presque toujours «autorisé» et «efficace», par exemple CAP_DAC_OVERRIDE+ep
. Remarquez le +ep
, qui désigne les ensembles susmentionnés.
Utilisation des capacités de fichier
Forfaits requis
Il existe deux principaux outils, getcap
et setcap
qui peuvent respectivement afficher et définir ces attributs.
- Sur Debian et Ubuntu, ces outils sont fournis par le
libcap2-bin
package, qui peut être installé avec:apt install libcap2-bin
- Sur CentOS et Fedora, le
libcap
package est nécessaire:yum install libcap
- Sur Arch Linux, ils sont également fournis par
libcap
:pacman -S libcap
Capacités de lecture
Pour voir si un fichier a un ensemble de capacités, vous pouvez simplement exécuter getcap /full/path/to/binary
, par exemple:
root@demo:~# getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep
root@demo:~# getcap /usr/bin/rcp
/usr/bin/rcp = cap_net_bind_service+ep
Si vous souhaitez savoir quelles fonctionnalités sont déjà définies sur votre système, vous pouvez rechercher récursivement l'ensemble de votre système de fichiers avec la commande suivante:
getcap -r /
En raison du fait que les systèmes de fichiers virtuels (tels que /proc
) ne prennent pas en charge ces opérations, la commande ci-dessus produira des milliers d'erreurs, donc pour une sortie plus propre, utilisez ce qui suit:
getcap -r / 2>/dev/null
Attribution et suppression de capacités
Pour définir une capacité particulière sur un fichier, utilisez setcap "capability_string" /path/to/file
.
Pour supprimer toutes les fonctionnalités d'un fichier, utilisez setcap -r /path/to/file
.
Pour démonstration, nous allons créer un fichier vierge dans le répertoire courant, lui donner une capacité et le supprimer. Commencez par ce qui suit:
root@demo:~# touch testfile
root@demo:~# getcap testfile
La deuxième commande ne produit aucune sortie, ce qui signifie que ce fichier n'a aucune capacité.
Ensuite, définissez une capacité pour le fichier:
root@demo:~# setcap "CAP_CHOWN+ep" testfile
root@demo:~# getcap testfile
testfile = cap_chown+ep
"CAP_CHOWN + ep" a été utilisé comme exemple, mais tout autre peut être attribué de cette manière.
Maintenant, supprimez toutes les fonctionnalités de testfile
:
root@demo:~# setcap -r testfile
root@demo:~# getcap testfile
Encore une fois, il n'y aura pas de sortie, car "CAP_CHOWN + ep" a été supprimé.
Conclusion
Les capacités ont de nombreuses utilisations potentielles et peuvent aider à renforcer la sécurité de vos systèmes. Si vous utilisez le bit SUID sur vos exécutables, envisagez de le remplacer par la capacité spécifique requise.