Guide capsh sur Ubuntu : maîtriser les capabilities Linux

Vue d’ensemble des capabilities sous Linux

Afin d’éviter d’accorder systématiquement l’ensemble des privilèges du superutilisateur root, le noyau Linux découpe l’autorité administrative en jetons de pouvoir distincts appelés capabilities. Pour auditer, expérimenter et manipuler ces permissions au niveau de la session courante, l’outil capsh (Capability Shell Wrapper) s’avère incontournable. Ce tutoriel pratique détaille le déploiement de cette boîte à outils sous Ubuntu, l’extraction des indicateurs de sécurité actifs, l’interprétation des masques hexadécimaux et la révocation dynamique de droits superflus.

Installation du paquet libcap2-bin et audit de l’état actuel (–print)

L’exécutable capsh n’étant pas systématiquement intégré aux installations minimales, son obtention passe par l’installation du binaire fourni dans le dépôt standard via le paquet libcap2-bin.

Installation de libcap2-bin via le gestionnaire de paquets apt

L’invocation de capsh --print offre une photographie complète des accréditations associées au processus actuel : ensembles de capacités (Effective, Permitted, Bounding, Inheritable), identifiants d’utilisateur et de groupe (UID/GID), ainsi que les indicateurs de durcissement (Securebits). Cet état des lieux permet d’évaluer immédiatement la portée réelle des privilèges dont dispose le shell.

⚙️ [Paramètres essentiels de capsh]

--print : Restitue la cartographie complète des capabilities rattachées au processus, les UID/GID effectifs et l’état des flags de sécurité.
--drop : Ampute de façon irréversible une ou plusieurs capacités du jeu de restriction (Bounding set).
--caps : Spécifie expressément les ensembles de capacités applicables au sous-shell créé.
--user : Bascule l’exécution vers le compte utilisateur cible tout en appliquant la politique de privilèges souhaitée.
--inh : Définit la collection de privilèges transmissibles par héritage (Inheritable set).
--addamb : Intègre des droits à la catégorie ambiante (Ambient set) afin d’en faire hériter des exécutables non privilégiés.
--secbits : Ajuste les verrous Securebits pour interdire toute modification ultérieure des privilèges.
--chroot : Confinera l’exécution dans une arborescence racine cloisonnée via l’appel chroot.

Visualisation des privilèges actifs avec capsh –print

Vérification du support noyau et décodage des masques binaires (–supports, –decode)

Pour valider l’existence d’une fonctionnalité spécifique au sein du kernel actif avant de construire un script d’automatisation, capsh --supports=cap_net_raw constitue un test fiable. Si le noyau reconnaît et supporte cap_net_raw, la commande s’achève silencieusement en retournant le code de statut standard de succès (0).

Contrôle de compatibilité noyau pour cap_net_raw

De la même manière, l’instruction capsh --supports=cap_sys_admin vérifie la prise en charge du privilège global d’administration système. Cette absence d’affichage en cas de succès permet une intégration fluide dans des structures conditionnelles au sein de scripts Bash pour s’assurer des capacités de la machine hôte.

Contrôle du support de cap_sys_admin dans le noyau

Lorsque l’on inspecte un processus via l’arborescence /proc/[PID]/status, les permissions sont fréquemment encodées sous forme d’entiers hexadécimaux bruts. L’option capsh --decode=0x000001ffffffffff traduit ce masque compact en une liste explicite d’attributs lisibles, révélant la présence de prérogatives telles que cap_chown, cap_sys_admin ou cap_bpf.

Décodage textuel du masque hexadécimal de capabilities

Révocation de privilèges dans le Bounding Set et confinement (–drop)

Le principe de moindre privilège impose de réduire le spectre d’action d’un processus au strict nécessaire. Grâce à capsh --drop=cap_chown,cap_setuid --print, le système retranche définitivement ces deux capacités de la frontière maximale (Bounding set). L’affichage résultant atteste de leur disparition tant dans le Bounding set que dans le vecteur IAB.

Suppression irréversible de cap_chown et cap_setuid via –drop

Pour éprouver l’efficacité de cette restriction sur un sous-processus dérivé, la syntaxe capsh --drop=cap_chown -- -c "capsh --print | grep 'Bounding set'" lance un sous-shell cloisonné. Le filtre appliqué confirme que le processus fils a bien hérité du jeu tronqué, garantissant que cap_chown demeure inaccessible pour toute commande enfant.

Vérification de l’héritage du Bounding set restreint

Exécution sous profil non privilégié et ajustement granulaire (–user, –caps)

La commande capsh --user=nobody --print effectue une transition d’identité vers le compte applicatif générique nobody. Le diagnostic généré met en évidence le passage des identifiants UID et GID à la valeur 65534, illustrant la perte globale des attributs privilégiés par défaut lors d’une déconnexion du contexte superutilisateur.

Changement d’identité vers nobody sans droit superflu

Dans un scénario de durcissement de service réseau, un démon nécessite souvent l’accès aux ports d’écoute réservés (< 1024) sans requérir les pleins pouvoirs de l’administrateur. La combinaison capsh --user=nobody --caps="cap_net_bind_service+ep cap_setpcap-ep" --print résout cette problématique : elle bascule vers nobody tout en conférant de façon ciblée la seule capability cap_net_bind_service dans les ensembles Effective et Permitted (ep). Le résultat confirme une isolation optimale du service sans compromis sur sa viabilité opérationnelle.

Attribution exclusive de cap_net_bind_service au compte nobody

Ce parcours d’expérimentation avec capsh démontre à quel point la manipulation fine des capabilities Linux permet de s’affranchir du modèle binaire “tout ou rien” du compte root. En éliminant les permissions excédentaires et en octroyant uniquement les jetons indispensables, vous réduisez considérablement la surface d’attaque de vos serveurs et conteneurs Ubuntu.