Un altro metodo, che mi sono imbattuto qualche tempo fa in questo post sul blog di Brendan Gregg, è usare il tracciatore delle capacità - capable .
Di seguito è riportato un esempio di output:
$ 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
Ha un vantaggio significativo nel registrare i controlli di capacità effettuati dal kernel per un dato processo. Ciò consente di profilare l'applicazione rispetto alle capacità che effettivamente richiede, ad es. per restringere i privilegi ed eseguirlo come utente senza privilegi.
Mentre pscap permette di elencare gli efficaci capacità di tutti i processi in esecuzione, non offre un metodo affidabile per verificare quali capacità sono effettivamente richieste dal processo, perché:
- Un processo può avere la capacità X nel suo set consentito e portarla al set effettivo solo per un breve periodo di tempo per eseguire un'operazione privilegiata.
- Un processo potrebbe essere iniziato con un insieme più ampio di capacità, eseguire l'inizializzazione che richiede privilegi elevati e abbandonare alcune (o tutte) le capacità (ad es. ping all'apertura di un raw socket).
- Funziona solo per i processi che sono già in esecuzione in modalità basata sulle capacità. E se dovessi determinare il set di funzionalità minimo richiesto per la tua applicazione appena sviluppata?
- Non consente di correlare i controlli dei privilegi effettuati per l'applicazione con le operazioni che esegue, con capacità ottieni timestamp per ogni singolo controllo.
Le fonti per capable sono disponibili su github. Istruzioni di installazione per BCC (incluso capable ) sono disponibili qui. Per ulteriori descrizioni fare riferimento al post del blog menzionato all'inizio, si noti inoltre che la capacità richiede il kernel 4.4+, un'alternativa per i kernel precedenti è disponibile anche nel post del blog.
Nota:non sono l'autore, né sono in alcun modo affiliato con gli sviluppatori dello strumento. Volevo solo portarlo a un pubblico più ampio, dal momento che l'ho usato personalmente per sviluppare un profilo di funzionalità per un'applicazione di monitoraggio complessa che in precedenza richiedeva privilegi di root completi per essere eseguita, e ho trovato questo tracciante di grande aiuto.
Si scopre che è più facile del previsto. Installa libcap-ng (https://people.redhat.com/sgrubb/libcap-ng/) e usa pscap
.
In Ubuntu 16.04, può essere installato con:
sudo apt-get install libcap-ng-utils
Esempio di estratto dell'output:
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
Basato sul recente aggiornamento di libcap2
1:(opzione breve):getpcaps
Descrizione:
Da qui:
getpcaps visualizza le capacità sui processi indicati dai valori pid forniti nella riga di comando.
Esempio:
$ 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:(Opzione un po' più lunga):/proc status e capsh
Descrizione:
proc è uno pseudo-filesystem di informazioni sui processi o, in altre parole, una directory in cui è possibile visualizzare le informazioni su tutti i processi.
Informazioni su capsh:
Il supporto e l'uso delle capacità di Linux possono essere esplorati e limitati con questo strumento. Questo strumento fornisce un pratico wrapper per alcuni tipi di test di capacità e creazione dell'ambiente.
Fornisce inoltre alcune funzioni di debug utili per riassumere lo stato delle capacità.
Esempio:
$ cat /proc/<PID>/status | grep Cap
E otterrai (sulla maggior parte dei sistemi):
CapInh: 00000000a80425fb (Inherited capabilities)
CapPrm: 0000000000000000 (Permitted capabilities)
CapEff: 0000000000000000 (Effective capabilities)
CapBnd: 00000000a80425fb (Bounding set)
CapAmb: 000000000000000 (Ambient capabilities set)
Usa il capsh
utility per decodificare i numeri esadecimali nel nome delle capacità:
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
(*) Puoi scaricare capsh
con:sudo apt-get install git libpcap-dev
.