GNU/Linux >> Tutoriels Linux >  >> Linux

Comment savoir de quelles capacités Linux un processus a besoin pour fonctionner ?

Une autre méthode, que j'ai rencontrée il y a quelque temps dans ce billet de blog de Brendan Gregg, consiste à utiliser le traceur de capacités - capable .

Voici un exemple de sortie :

$ sudo /usr/share/bcc/tools/capable
TIME      UID    PID    COMM             CAP  NAME                 AUDIT
11:31:54  0      2467   capable          21   CAP_SYS_ADMIN        1
11:31:54  0      2467   capable          21   CAP_SYS_ADMIN        1
11:31:59  1000   2468   ls               1    CAP_DAC_OVERRIDE     1
11:31:59  1000   2468   ls               2    CAP_DAC_READ_SEARCH  1
11:32:02  0      1421   timesync         25   CAP_SYS_TIME         1
11:32:05  1000   2469   sudo             7    CAP_SETUID           1
11:32:05  0      2469   sudo             6    CAP_SETGID           1

Il présente l'avantage significatif d'enregistrer les vérifications de capacité effectuées par le noyau pour un processus donné. Cela permet de profiler l'application par rapport aux capacités dont elle a réellement besoin, par ex. pour restreindre les privilèges et l'exécuter en tant qu'utilisateur non privilégié.

Tandis que pscap permet de lister les efficaces capacités de tous les processus en cours d'exécution, il n'offre pas de méthode fiable pour vérifier quelles capacités sont en fait requises par le processus, car :

  • Un processus peut avoir la capacité X dans son ensemble autorisé et ne l'élever à l'ensemble effectif que pendant une courte période pour effectuer une opération privilégiée.
  • Un processus aurait pu démarrer avec un ensemble plus large de fonctionnalités, effectuer l'initialisation nécessitant des privilèges élevés et supprimer certaines (ou toutes) fonctionnalités (par exemple, ping ouvrant un socket brut).
  • Cela ne fonctionne que pour les processus qui s'exécutent déjà de manière basée sur les capacités. Et si vous deviez déterminer l'ensemble de fonctionnalités minimal requis pour votre application nouvellement développée ?
  • Il ne permet pas de corréler les vérifications de privilèges effectuées pour l'application avec les opérations qu'elle effectue, avec capable vous obtenez des horodatages pour chaque vérification unique.

Les sources pour capable sont disponibles sur github. Instructions d'installation pour BCC (y compris capable ) sont disponible ici.

Remarque :je ne suis pas l'auteur et je ne suis en aucun cas affilié aux développeurs de l'outil. Je voulais juste l'apporter à un public plus large, car je l'ai personnellement utilisé pour développer un profil de capacités pour une application de surveillance complexe qui nécessitait auparavant des privilèges root complets pour s'exécuter, et j'ai trouvé ce traceur d'une aide précieuse.


Il s'avère que c'est plus facile que prévu. Installez libcap-ng (https://people.redhat.com/sgrubb/libcap-ng/) et utilisez pscap .

Dans Ubuntu 16.04, il peut être installé avec :

sudo apt-get install libcap-ng-utils

Exemple d'extrait de sortie :

ppid  pid   name        command           capabilities
1     468   root        systemd-journal   chown, dac_override, dac_read_search, fowner, setgid, setuid, sys_ptrace, sys_admin, audit_control, mac_override, syslog, audit_read
1     480   root        lvmetad           full
1     492   root        systemd-udevd     full
1     1040  root        rpc.idmapd        full
1     1062  root        rpc.gssd          full
1     1184  messagebus  dbus-daemon       audit_write +
1     1209  root        NetworkManager    dac_override, kill, setgid, setuid, net_bind_service, net_admin, net_raw, sys_module, sys_chroot, audit_write

Basé sur la récente mise à jour de libcap2

1 :(Option courte) :getpcaps

Description :

À partir d'ici :

getpcaps affiche les capacités des processus indiqués par la ou les valeurs pid données sur la ligne de commande.

Exemple :

$ getpcaps <PID>
PID: = cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+i

2 :(Option un peu plus longue) :/proc status et capsh

Description :

proc est un pseudo-système de fichiers d'informations sur les processus ou, en d'autres termes, un répertoire dans lequel vous pouvez afficher des informations sur tous les processus.

À propos de capsh :

La prise en charge et l'utilisation des fonctionnalités Linux peuvent être explorées et limitées avec cet outil. Cet outil fournit un wrapper pratique pour certains types de test de capacité et de création d'environnement.
Il fournit également des fonctionnalités de débogage utiles pour résumer l'état des capacités.

Exemple :

$ cat /proc/<PID>/status | grep Cap

Et vous obtiendrez (sur la plupart des systèmes) :

CapInh: 00000000a80425fb (Inherited capabilities)
CapPrm: 0000000000000000 (Permitted capabilities)
CapEff: 0000000000000000 (Effective capabilities)
CapBnd: 00000000a80425fb (Bounding set)
CapAmb: 000000000000000  (Ambient capabilities set)

Utilisez le capsh utilitaire pour décoder les nombres hexadécimaux dans le nom des capacités :

capsh --decode=00000000a80425fb
0x00000000a80425fb=cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap

(*) Vous pouvez télécharger capsh avec :sudo apt-get install git libpcap-dev .


Linux
  1. Comment trouver et tuer le processus Zombie sous Linux

  2. Linux - Comment savoir quels disques durs sont dans le système ?

  3. Linux - Comment trouver l'espace de noms d'un processus particulier ?

  4. Comment savoir quel processus utilise un fichier sous Linux ?

  5. Qu'est-ce qu'une commande pour trouver la priorité d'un processus sous Linux ?

Comment trouver un nom de processus à l'aide d'un numéro PID sous Linux

Comment trouver les périphériques connectés au réseau sous Linux

Comment trouver la version du noyau Linux en cours d'exécution sur votre PC

Comment savoir depuis combien de temps un processus s'exécute sous Linux

Comment puis-je savoir quelle version de Linux est en cours d'exécution ?

Comment puis-je savoir quels disques durs sont connectés à une machine Linux ?