Extended Berkeley Packet Filter (eBPF) è una potente tecnologia che consente agli sviluppatori di eseguire programmi in modalità sandbox nel kernel Linux senza modificare il codice sorgente del kernel. Questa guida esplora le applicazioni di eBPF nel networking, nella sicurezza e nel monitoraggio delle prestazioni.
Scopri i vantaggi di eBPF e come migliora l'osservabilità e il controllo nei sistemi moderni. Comprendere eBPF è essenziale per sfruttarne le capacità nella sicurezza di rete.
Breve storia dei BPF
I Berkeley Packet Filter (BPF) sono stati creati nel 1992 con lo scopo di analizzare e filtrare il traffico di rete. All'epoca, Internet era ancora agli albori e gli ingegneri erano interessati a trovare modi per comprendere meglio il traffico che fluiva attraverso le loro reti. Il BPF è stato progettato per fornire un modo per farlo senza dover modificare il codice di tutti i server di un'organizzazione o biforcare il codice del kernel e aggiornarlo con istruzioni di strumentazione.
Applicati all'analisi di rete, i BPF venivano utilizzati per registrare tutte le comunicazioni TCP in entrata e in uscita su un server. Sebbene questo approccio richiedesse meno lavoro rispetto alla modifica del codice di tutti i server, era comunque necessario un notevole sforzo per creare il codice e distribuirlo su tutti i server dell'organizzazione. Il BPF veniva utilizzato anche per filtrare il traffico di rete. Tuttavia, poteva accettare solo pacchetti con un hash firmato nell'intestazione. Quando arrivava un pacchetto in entrata, il programma BPF veniva avviato e controllava l'intestazione per verificare se il valore previsto fosse presente. A seconda dei risultati, il pacchetto veniva accettato o scartato.Oggi, il BPF viene utilizzato per vari scopi oltre alla semplice analisi e al filtraggio del traffico di rete. È stato esteso per fornire più funzionalità e supporto per 64 byte, consentendo una maggiore raccolta e archiviazione di informazioni.
Successivamente, con il rilascio del kernel 3.18, sono stati creati gli Extended Berkeley Packet Filters (eBPF) per registrare quasi tutti gli eventi del kernel. Essendo un'estensione dei BPF originali, gli eBPF possono archiviare e scambiare più dati ed essere utilizzati per vari scopi, tra cui il monitoraggio, il tracciamento e l'ottimizzazione delle funzioni del kernel.
L'introduzione degli eBPF
Da un punto di vista storico, gli sviluppatori hanno sempre lavorato all'interno dei sistemi operativi per implementare e osservare le funzionalità di rete, utilizzando la capacità privilegiata del kernel di monitorare e controllare l'intero sistema. Il limite dei kernel dei sistemi operativi risiede nella loro mancanza di evoluzione: l'innovazione a livello di sistema operativo è inferiore rispetto alle capacità osservate al di fuori di essi. Inoltre, gli sviluppatori che aggiungevano moduli o modificavano il codice sorgente del kernel dovevano districarsi tra livelli astratti e infrastrutture complesse difficili da debuggare. Quando l'eBFP è stato introdotto per la prima volta nel 2014, ha risolto tutte queste problematiche.
Poiché gli eBPF funzionano consentendo l'esecuzione di programmi in sandbox all'interno del sistema operativo, gli sviluppatori hanno improvvisamente potuto aggiungere nuove funzionalità al sistema operativo durante il runtime. Si tratta di un tipo di macchina virtuale che funziona all'interno del kernel e fornisce un ambiente sandbox per l'esecuzione di programmi bytecode. La macchina virtuale eBPF è progettata per essere semplice, efficiente e sicura, con un set limitato di istruzioni che possono accedere solo a un set limitato di risorse.
Fin dalla sua nascita, eBPF si è evoluto e può essere utilizzato in un'ampia gamma di casi d'uso. eBPF ha consentito innovazioni nella rete ad alte prestazioni e nel bilanciamento del carico in ambienti cloud nativi, ha fornito ai responsabili della sicurezza dati granulari sulla sicurezza a un costo contenuto e ha supportato le organizzazioni nei loro sforzi di sicurezza preventiva.
Comprendere come funziona eBFP
A livello generale, eBPF consente agli sviluppatori di scrivere piccoli programmi, noti come programmi eBPF, che possono essere collegati a vari punti del kernel per intercettare ed elaborare i dati. Solitamente scritti in un sottoinsieme del linguaggio di programmazione C, i programmi vengono poi compilati in bytecode eBPF, che viene quindi caricato nel kernel ed eseguito. A differenza dei moduli kernel tradizionali, i programmi eBPF sono facili da implementare e gestire poiché non richiedono modifiche al codice sorgente del kernel né ricompilazioni.
Un programma eBPF segue una serie specifica di passaggi quando viene eseguito all'interno del kernel Linux:
- Una volta scritto, il programma eBPF viene compilato in bytecode eBPF. Il bytecode risultante è una rappresentazione di basso livello e indipendente dalla piattaforma del programma eBPF che può essere eseguito all'interno del kernel.
- Quindi, il bytecode eBPF viene caricato nel kernel. Il processo di caricamento comporta la verifica della sicurezza e della compatibilità del bytecode con il kernel in esecuzione e l'allocazione delle risorse necessarie per eseguire il programma eBPF.
- Una volta caricato il programma eBPF, questo può essere associato a un evento specifico del kernel, come un pacchetto di rete o una chiamata di sistema (syscall).
- Quando si verifica l'evento del kernel collegato, il programma eBPF viene eseguito automaticamente dal kernel. Il programma eBPF può accedere e modificare i dati associati all'evento, utilizzando costrutti di programmazione C standard come loop e istruzioni condizionali.
- Dopo che il programma eBPF ha elaborato i dati, può facoltativamente restituire un risultato al kernel. Ad esempio, un programma eBPF collegato a un'interfaccia di rete potrebbe eliminare un pacchetto se soddisfa determinati criteri, oppure un programma eBPF collegato a una chiamata di sistema potrebbe modificare gli argomenti passati alla chiamata prima di consentirne l'esecuzione.
- Quando il programma eBPF non è più necessario, può essere scaricato dal kernel, liberando le risorse allocate al programma eBPF e assicurando che non venga più eseguito quando si verifica l'evento kernel collegato.
Una delle caratteristiche principali di eBPF è la garanzia di sicurezza. I programmi eBPF vengono eseguiti in una macchina virtuale con restrizioni all'interno del kernel e non possono accedere o modificare direttamente le strutture dati del kernel né causare arresti anomali o vulnerabilità di sicurezza. I programmi eBPF sono inoltre soggetti a vari controlli di runtime, come il controllo dei limiti e il controllo dei tipi, per garantire che non violino la sicurezza della memoria o altre proprietà di sicurezza.
Alla scoperta dei vantaggi di eBPF
Nel mondo odierno, gli sviluppatori utilizzano eBPF per migliorare la sicurezza, le prestazioni e la stabilità dei loro sistemi. eBPF è diventata una tecnologia molto popolare nell'ecosistema Linux grazie ai suoi numerosi vantaggi.
In primo luogo, le organizzazioni utilizzano eBPF per garantire velocità e prestazioni. Poiché i programmi eBPF vengono eseguiti all'interno del kernel Linux, funzionano con un overhead minimo rispetto ai tradizionali programmi dello spazio utente. Nei casi in cui la bassa latenza e le elevate prestazioni sono fondamentali, eBPF è la scelta ideale per portare a termine il compito.
I programmi eBPF consentono inoltre ai team tecnici di rimanere flessibili. Poiché i programmi possono essere collegati a un'ampia gamma di eventi del kernel, inclusi pacchetti di rete, chiamate di sistema e funzioni del kernel, possono essere utilizzati per un'ampia gamma di casi d'uso, tra cui il monitoraggio della rete, l'analisi della sicurezza e la profilazione delle prestazioni. I programmi eBPF possono essere caricati e scaricati dinamicamente dal kernel, il che significa che possono essere utilizzati per attività di breve durata come il debug o la risoluzione dei problemi.
Gli sviluppatori che utilizzano eBPF sono in grado di scrivere nuove funzionalità che in precedenza non potevano essere realizzate a causa di limitazioni tecniche o problemi di sicurezza. Con eBPF, possono scrivere applicazioni che sfruttano l'accelerazione hardware su dispositivi embedded come Raspberry Pi o altri sistemi basati su ARM. Just-in-time (JIT) anziché precompilato come i pacchetti software tradizionali, gli sviluppatori possono utilizzare eBPF per creare le loro applicazioni o servizi senza sacrificare le prestazioni o la scalabilità. La tecnologia richiede un tempo di configurazione minimo rispetto ad altre soluzioni, consentendo agli sviluppatori di distribuire rapidamente le loro applicazioni in ambienti di produzione con meno sforzo.Casi d'uso di eBPF
eBPF è più comunemente utilizzato per quattro casi d'uso principali: sicurezza, networking, tracciamento e osservabilità.
- Sicurezza – In genere, in ambito di sicurezza, i sistemi gestiscono in modo indipendente gli aspetti relativi al filtraggio delle chiamate di sistema. I filtri delle chiamate di sistema consentono alle applicazioni di definire esattamente quali chiamate di sistema sono autorizzate a eseguire. eBPF supporta una migliore sicurezza del sistema facilitando la visibilità su tutti gli aspetti. Interpretando tutte le chiamate di sistema e fornendo una visione a livello di pacchetto e socket di tutte le operazioni di rete, i responsabili della sicurezza dispongono del contesto necessario per migliorare il livello di controllo sui sistemi.
- Rete – eBPF supporta i requisiti di elaborazione dei pacchetti grazie alla sua efficienza e programmabilità. Lo fa aggiungendo ulteriori parser di protocollo e programmi di logica di inoltro per soddisfare i nuovi requisiti senza dover uscire dal contesto di elaborazione dei pacchetti del kernel Linux.
- Tracciamento – Gli sviluppatori associano i programmi eBPF ai punti di tracciamento e ai punti di sondaggio del kernel e delle applicazioni utente per garantire la visibilità sul comportamento di runtime di tutte le applicazioni di sistema. eBPF fornisce un contesto sia ai sistemi che alle applicazioni; la combinazione di questi elementi offre ai team tecnici informazioni approfondite che possono utilizzare per risolvere i problemi di prestazioni.
- Osservabilità – eBPF viene utilizzato per raccogliere l'aggregazione nel kernel delle metriche di sistema che i team tecnici possono personalizzare sulla base di un'ampia gamma di fonti. Invece di dover fare affidamento su esportazioni di dati di campionamento lunghe e di grandi dimensioni, eBPF aumenta la profondità della visibilità raccogliendo solo i dati assolutamente necessari, consentendo alle organizzazioni di risparmiare sui costi di overhead del sistema.
Come eBPF potenzia le moderne misure di sicurezza cloud
Un agente Cloud Workload Protection Platform (CWPP) è un elemento essenziale per la creazione di una solida strategia di sicurezza cloud. Offre protezione in tempo reale contro minacce di runtime quali ransomware e gli attacchi zero-day, il che lo distingue dagli altri controlli di sicurezza. eBPF migliora notevolmente le prestazioni e la scalabilità dei sistemi cloud che continuano a essere ampiamente adottati dalle organizzazioni globali.
CWPP registrano la telemetria del carico di lavoro, fornendo informazioni preziose per l'analisi forense. Al contrario, le soluzioni di scansione laterale, che ispezionano i volumi di archiviazione delle istanze di calcolo cloud, possono essere eseguite solo una volta al giorno e non offrono visibilità a livello di processo, con conseguenti limitazioni in termini di protezione in tempo reale e accuratezza. L'utilizzo del framework eBPF all'interno di un programma CWPP offre diversi vantaggi, tra cui i seguenti:
- Stabilità operativa – L'esecuzione di codice nel kernel rappresenta un rischio importante in quanto aumenta le possibilità di introdurre vulnerabilità nel kernel e destabilizzare l'intero sistema. Il framework eBPF include controlli di sicurezza come il compilatore JIT per evitare il crash del kernel.
- Prestazioni del sistema – I trasferimenti di dati tra il kernel e lo spazio utente sono in genere lenti e generano un sovraccarico delle prestazioni. Il framework eBPF consente ai team di osservare il comportamento del kernel ed eseguire analisi all'interno del kernel prima di trasferire un sottoinsieme dei risultati allo spazio utente, riducendo il sovraccarico necessario.
- Agilità aziendale – Operando dallo spazio utente, eBPF offre maggiore flessibilità e agilità ai team DevOps e al fornitore. DevOps può concentrarsi sull'innovazione senza preoccuparsi dei problemi di dipendenza dal kernel e il fornitore può concentrarsi sull'innovazione piuttosto che sulla manutenzione. Ciò porta a un ciclo continuo di innovazione e a una migliore esperienza del cliente.
Piattaforma Singularity
Elevate la vostra posizione di sicurezza con il rilevamento in tempo reale, la risposta automatica e la visibilità totale dell'intero ambiente digitale.
Richiedi una demoRiepilogo
eBPF è diventata rapidamente una tecnologia importante per un'ampia gamma di applicazioni, dal networking e dalla sicurezza all'osservabilità e all'analisi delle prestazioni. La sua flessibilità e le garanzie di sicurezza lo rendono uno strumento potente per personalizzare ed estendere il kernel Linux, e la sua popolarità e adozione continuano a crescere man mano che vengono scoperti e sviluppati nuovi casi d'uso.
Le organizzazioni leader continuano a investire in soluzioni come CWPP di SentinelOne, Singularity Cloud Workload Security, che hanno integrato i vantaggi del framework eBPF. Poiché gli ambienti digitali continuano a diventare sempre più dinamici e complessi e un numero elevato di carichi di lavoro viene eseguito su infrastrutture condivise, eBPF può aiutare a migliorare la visibilità e il controllo, consentendo ai team di sicurezza di monitorare e proteggere i carichi di lavoro in modo più efficace.
Contattateci per scoprire come le soluzioni di sicurezza di SentinelOne sfruttano i vantaggi di eBPF per migliorare le prestazioni e l'efficienza in ambienti diversi. Prenotate oggi stesso una demo con i nostri esperti di sicurezza.
"Domande frequenti sul filtro di pacchetti Berkeley esteso
eBPF è una macchina virtuale sicura integrata nel kernel che consente di caricare bytecode personalizzati nel kernel Linux senza modificarne il codice sorgente o aggiungere moduli. Prima dell'esecuzione, il verificatore del kernel controlla la sicurezza dei programmi eBPF (assenza di loop illimitati, accesso alla memoria fuori limite), quindi li compila JIT per ottenere una velocità quasi nativa. Si è evoluto dal classico BPF per supportare non solo il filtraggio dei pacchetti, ma anche il tracciamento, l'osservabilità e altro ancora.
eBPF può supportare applicazioni come il networking, il tracciamento e la definizione di punti di tracciamento utente. Alimenta:
- Elaborazione dei pacchetti ad alte prestazioni (ad es. XDP)
- Osservabilità approfondita e profilazione delle chiamate di sistema e del comportamento delle applicazioni
- Monitoraggio della sicurezza in tempo reale e applicazione delle politiche
- Visibilità a livello di container e politica di rete in Kubernetes
- Logica personalizzata nel kernel per il bilanciamento del carico, l'aggregazione delle metriche e il filtraggio.
Eseguendosi nel contesto del kernel, eBPF offre visibilità in tempo reale sulle chiamate di sistema, i flussi di rete e gli eventi di processo con un overhead minimo e senza riavvii del kernel. La sua sandbox impedisce l'esecuzione di codice instabile, mentre le mappe consentono agli strumenti dello spazio utente di recuperare i dati telemetrici.
Questa combinazione rileva tempestivamente minacce quali movimenti laterali o accessi non autorizzati ai file e può applicare immediatamente politiche di blocco o eliminazione all'interno del percorso degli eventi del kernel.
eBPF non è stato creato esclusivamente per la sicurezza, quindi presenta alcuni compromessi: i limiti di memoria e di istruzioni possono causare la perdita di eventi; non esiste un sistema anti-manomissione integrato per i programmi caricati; alcune funzioni "di supporto" (ad esempio, bpf_probe_write_user) possono essere utilizzate in modo improprio per l'escalation dei privilegi.
I kernel più vecchi potrebbero non disporre delle correzioni del verificatore, quindi un eBPF configurato in modo errato o dannoso può diventare un vettore rootkit se le autorizzazioni non sono controllate rigorosamente.
Le implementazioni comuni di eBPF includono:
- Filtraggio dei pacchetti di rete e bilanciamento del carico
- Tracciamento delle applicazioni e del kernel per la profilazione delle prestazioni
- Rilevamento e prevenzione delle intrusioni
- Sicurezza dei container e microsegmentazione in Kubernetes
- Raccolta di metriche personalizzate e aggregazione nel kernel per piattaforme di osservabilità.
Prima di implementare soluzioni eBPF, verificare che la versione del kernel supporti gli hook richiesti e che il verificatore disponga delle patch di sicurezza. Allocare una quantità sufficiente di CPU e memoria per evitare la perdita di eventi. Definire limiti di capacità rigorosi (ad esempio, disabilitare BPF senza privilegi), controllare i moduli eBPF di terze parti per prevenire rischi nella catena di fornitura ed eseguire le nuove politiche in modalità di audit per misurare l'impatto prima di applicare blocchi o terminazioni.
SentinelOne utilizza l'architettura eBFP per rendere più stabile e affidabile la protezione dei carichi di lavoro cloud. Fornisce rilevamento e risposta alle minacce in tempo reale, visibilità approfondita sulle attività a livello di kernel e può combattere minacce di runtime come zero-day, ransomware e altri processi dannosi. È possibile ottenere aggiornamenti continui delle immagini del sistema operativo host senza preoccupazioni di compatibilità.
SentinelOne Singularity XDR è in grado di eseguire analisi avanzate e condurre indagini forensi. È adatto a vari ambienti cloud come AWS, Azure, Google Cloud e cloud privati. Inoltre, supporta un'ampia gamma di distribuzioni Linux, runtime di container, server Windows e Kubernetes.
