Ricerca nel sito web

Esercitazione Linux eBPF


eBPF sta per Extended Berkeley Packet Filter. Quando lavori con Linux e vuoi interagire con il kernel, hai bisogno di un framework come eBPF che ti aiuti. eBPF è un framework progettato per aiutare gli sviluppatori a eseguire i programmi del kernel di basso livello senza ostacoli.

Con eBPF, puoi caricare ed eseguire rapidamente il software con un sovraccarico di configurazione minimo. Se sei nuovo a eBPF e stai lavorando con programmi del kernel, questa guida ti aiuterà a comprendere eBPF e come usarlo. Presenteremo alcuni esempi di iniezione del codice nel kernel utilizzando eBPF. Cominciamo!

Cos'è l'eBPF

eBPF è l'acronimo di Extended Berkeley Packer Filter. Funziona come un'interfaccia nel kernel Linux che consente agli sviluppatori di iniettare il codice per interagire con il kernel, modificandone il comportamento o osservandolo.

eBPF è stato inizialmente rilasciato come tracciatore di pacchetti, ma è stato successivamente esteso nel 2014 e integrato nel kernel Linux. Sebbene aiuti principalmente con le attività di tracciamento, ha molte funzionalità tra cui consentire alle applicazioni dello spazio utente di eseguire i programmi nello spazio del kernel.

La memoria di un computer ha lo spazio utente e lo spazio del kernel. I programmi utente vengono eseguiti nello spazio utente mentre lo spazio del kernel è riservato per eseguire i driver e il kernel. I programmi utente non possono essere eseguiti nello spazio del kernel. Lo scopo è garantire che programmi non sicuri o altre vulnerabilità non possano essere inseriti nel kernel e bloccarlo.

Tuttavia, eBPF offre un percorso per eseguire i programmi utente nello spazio del kernel come bytecode. Poiché i codici byte sono difficili da scrivere, sono necessari framework di sviluppo come BCC o Bpftrace per scrivere i programmi eBPF. Questi framework sono open source e chiunque può utilizzarli. È possibile installare i framework BCC o Bpftrace e creare programmi eBPF.

Installazione di Ccn

BCC è una raccolta di strumenti di raccolta del compilatore BPF che aiutano a scrivere ed eseguire i programmi eBPF.

Inizia aggiornando il tuo repository apt:

sudo apt-get update;

Installa gli strumenti di raccolta del compilatore BPF con il seguente comando:

sudo apt-get install bpfcc-tools linux-headers-$(uname -r);

Gli strumenti BCC appropriati per l'architettura del kernel vengono recuperati e installati. Premere "y" per confermare l'installazione.

Puoi verificare che BCC sia installato e funzioni eseguendo uno dei suoi strumenti per ottenere il PID di qualsiasi comando eseguito sul terminale.

Apri due finestre di terminale. Esegui il seguente comando bpfcc sul primo terminale:

sudo /usr/sbin/bashreadline-bpfcc;

Esegui alcuni comandi come nella seguente immagine sul secondo terminale:

Se BCC ed eBPF funzionano sul primo terminale, vedrai i PID dei comandi che hai inserito nella seconda finestra e i timestamp.

Il tuo BCC è installato. Ora puoi eseguire i diversi programmi eBPF per inserire il codice nel kernel per scopi diversi.

Installazione di Bpftrace

Oltre a utilizzare il framework BCC, puoi utilizzare il framework Bpftrace. È ideale per diverse attività e offre un'utilità della riga di comando che consente agli utenti di eseguire direttamente i comandi eBPF.

Installalo con il seguente comando:

sudo apt install bpftrace;

Con Bpftrace installato, puoi distribuire i tuoi programmi eBPF. Facciamo alcuni esempi di distribuzione di vari programmi utilizzando l'utilità della riga di comando.

Dal repository GitHub di Bpftrace è possibile distribuire i diversi programmi "one-liner". Ad esempio, puoi elencare il consumo del disco da parte di diversi processi eseguendo il seguente programma:

bpftrace -e 'tracepoint:block:block_rq_issue { printf("%s %d\n", comm, args->bytes); }'

Dall'output, noterai che le colonne mostrano il nome del processo, la dimensione del disco e la dimensione del disco.

L'output mostra tutti i processi nel kernel.

Se vuoi controllare anche i conteggi delle chiamate di sistema per processo, puoi utilizzare il programma one-liner Bpftrace con il seguente comando:

sudo bpftrace -e ‘tracepoint:raw_syscalls:sys_enter {@[comm] = count(); }

Le chiamate di sistema vengono visualizzate dopo aver premuto Ctrl + C per terminare il comando. L'output visualizza il nome del processo e un report che contiene la mappa viene visualizzato come un array associativo.

Il count() popola il conteggio della frequenza delle volte in cui il sistema richiede che ogni processo avvenga. Se vuoi elencare tutte le sonde, puoi usare il comando bpftrace -l per elencarle come illustrato di seguito:

sudo bpftrace -l 'tracepoint:syscalls:sys_enter_*'

Ecco come lavori con il programma eBPF su Linux.

Conclusione

eBPF è un modo per inserire il codice nel kernel Linux. Puoi utilizzare framework come BCC e Bpftrace per creare ed eseguire i programmi eBPF. Questo post ha introdotto eBPF e il framework per scrivere ed eseguire i programmi eBPF. Inoltre, abbiamo presentato alcuni esempi dei programmi eBPF che puoi eseguire. Questo è tutto!

Articoli correlati: