Monitorar o desempenho e a segurança do Linux não é fácil, e as ferramentas tradicionais muitas vezes deixam passar detalhes críticos. O eBPF (Extended Berkeley Packet Filter) está mudando isso, permitindo que os administradores acompanhem chamadas de sistema, atividade de rede, uso da CPU e muito mais — tudo com o mínimo de sobrecarga. Neste artigo, explicaremos como o eBPF funciona, para que ele é usado em diversas aplicações do mundo real e quais ferramentas facilitam seu uso.
O que é o eBPF?
O eBPF, ou Extended Berkeley Packet Filter, é uma nova tecnologia que permite a execução segura e eficiente de programas definidos pelo usuário no kernel do Linux. Ao contrário das abordagens tradicionais, que dependem de amostragem incompleta ou módulos do kernel, no eBPF tudo isso é possível sem modificar diretamente o código-fonte do kernel nem carregar módulos do kernel. Inicialmente desenvolvido para filtragem de pacotes, o eBPF está hoje altamente evoluído, constituindo-se, assim, em uma estrutura incrivelmente completa para monitoramento, segurança e otimização de desempenho.
Como funciona o eBPF?
O eBPF coleta e processa dados por meio de pontos de conexão no kernel (e, às vezes, em aplicativos do espaço do usuário), armazenando os resultados em mapas acessíveis a partir do espaço do usuário. Há um verificador integrado que torna muito difícil que programas eBPF causem falhas no kernel devido a erros em sua lógica. Pense nisso como uma pequena máquina virtual conectada a eventos-chave do sistema — desde o tráfego de rede e chamadas de sistema até a execução de funções — sem adicionar uma sobrecarga de latência a esses processos.
A evolução do BPF para o eBPF
A origem da história do eBPF remonta ao Berkeley Packet Filter (BPF), em 1992. O BPF tinha como objetivo filtrar pacotes de rede de forma eficiente e segura dentro do kernel. Os desenvolvedores podiam escrever programas em uma linguagem restrita semelhante ao C, e o BPF compilava o bytecode para execução no kernel.
Ao longo do tempo, o BPF provou ser útil para muito mais do que apenas a filtragem de pacotes. No entanto, ele apresentava limitações devido ao seu projeto original. Possuía conjuntos de instruções limitados e atendia essencialmente às operações de rede. Essa constatação levou a extensões significativas para superar essas restrições e obter funcionalidades além do que o BPF anterior era capaz de realizar, levando, por fim, ao que hoje chamamos de BPF estendido (eBPF).
Com a introdução do eBPF nas versões do kernel do Linux, a funcionalidade se expandiu drasticamente. O conjunto de instruções foi ampliado, tornando-o muito mais versátil e permitindo que seja utilizado para uma gama muito mais ampla de finalidades do que apenas a filtragem de pacotes.
Além disso, é de extrema importância que os programas eBPF sejam executados em um ambiente isolado (sandbox) no kernel, o que impede que eles causem falhas no kernel, ao mesmo tempo em que garante essa proteção por meio de um verificador, que analisa os programas antes de seu carregamento. Os “maps” também foram introduzidos pelo eBPF; trata-se de estruturas de dados que permitem que os programas eBPF se comuniquem com aplicativos do espaço do usuário. Esses avanços transformaram o BPF de um simples filtro de pacotes em uma estrutura de uso geral para instrumentação do kernel.
Casos de uso do eBPF
Desde o seu lançamento, o eBPF tem sido amplamente adotado em diversos setores:
Observabilidade de rede: Oferece insights detalhados sobre o comportamento da rede, incluindo inspeção de pacotes, ajuste de desempenho e monitoramento avançado da rede, sem a sobrecarga dos métodos tradicionais. Por exemplo, o eBPF pode ser aplicado para analisar retransmissões TCP, medições de latência de rede e balanceamento de carga personalizado.Monitoramento de desempenho e observabilidade: Com o eBPF, os administradores de sistema podem obter métricas detalhadas de desempenho e rastrear eventos no kernel e até mesmo em aplicativos do espaço do usuário. Isso ajuda a melhorar o desempenho dos aplicativos e a confiabilidade do sistema, com visibilidade em tempo real de sistemas complexos. Ferramentas como Cilium e Falco aproveitam o eBPF para oferecer maior observabilidade e segurança para o Kubernetes e ambientes nativos da nuvem. Isso pode ajudar a identificar pontos de alta carga na CPU, analisar a E/S do disco e rastrear chamadas de sistema para destacar gargalos de desempenho.
Aprimoramentos de segurança: Os programas de segurança utilizam o eBPF para criar sistemas de detecção de invasões, filtragem de chamadas de sistema e aplicação de segurança em tempo de execução. Ao restringir as capacidades de softwares potencialmente maliciosos no nível do kernel, aumenta-se a segurança geral do sistema. Por exemplo, o eBPF pode monitorar chamadas execve em busca de comandos suspeitos ou rastrear o acesso a arquivos para detectar modificações não autorizadas.
eBPF para monitoramento de desempenho
A capacidade de se conectar a diversos eventos do kernel e do espaço do usuário, aliada à coleta e análise eficientes de dados, torna o eBPF uma tecnologia poderosa para o monitoramento de desempenho. Vamos explorar alguns casos de uso importantes:
Rastreamento de chamadas de sistema
As chamadas de sistema definem as interfaces entre os aplicativos e o kernel. Ao anexar kprobes a chamadas de sistema como read, write, open, close, execve etc., o eBPF pode fornecer informações detalhadas sobre o comportamento dos aplicativos. Medições de latência para essas chamadas de sistema podem ser usadas para ajudar a localizar gargalos de E/S; medir os bytes lidos ou gravados pode ser útil para compreender a taxa de transferência de dados; e rastrear os argumentos das chamadas de sistema permite compreender o comportamento do aplicativo em profundidade. Por exemplo, usar o eBPF para rastrear as chamadas de sistema read e write associadas ao acesso ao disco pode identificar por que uma consulta ao banco de dados está demorando para ser executada.
Análise do uso da CPU
Identificar pontos críticos de uso da CPU é importante para a otimização do desempenho das aplicações. O eBPF pode utilizar o perf_events para possibilitar essa análise de perfil tanto para o código do kernel quanto para o do espaço do usuário. É possível usar o perf_events para acionar programas eBPF em eventos da CPU, como erros de cache ou previsões incorretas de ramificação, permitindo identificar com precisão os gargalos de desempenho em um nível granular. Os uprobes, por outro lado, são usados para analisar funções de aplicativos no espaço do usuário a fim de identificar pontos críticos de desempenho dentro do código do aplicativo. Isso pode ser útil para otimizar caminhos críticos de código ou identificar algoritmos ineficientes.
Monitoramento do desempenho da rede
O desempenho da rede é importante para muitos aplicativos. O eBPF pode monitorar pacotes de rede e atividades de soquetes em tempo real. É possível rastrear retransmissões TCP, medir os tempos de estabelecimento de conexão, analisar a perda de pacotes ou inspecionar cabeçalhos de pacotes para compreender os padrões de tráfego por meio de programas eBPF. Por exemplo, você poderia escrever um programa eBPF para identificar um número excessivo de retransmissões TCP, o que ajudaria a diagnosticar congestionamento na rede ou falhas no hardware de rede.
Análise de E/S de disco
A lentidão nas operações de E/S do disco pode afetar negativamente o desempenho das aplicações. As atividades de leitura e gravação em disco podem ser monitoradas por meio do eBPF, que fornece informações detalhadas sobre a latência do disco, a taxa de transferência e os padrões de E/S. Com isso, também é possível identificar aplicativos limitados pela E/S, dispositivos de armazenamento lentos e os tipos de operações de E/S que estão sendo realizadas. Um exemplo seria escrever um programa eBPF para identificar quais processos estão causando a maior parte da E/S de disco, o que deve ajudar a otimizar o uso do armazenamento ou a identificar aplicativos que se beneficiariam de um armazenamento mais rápido.
Métricas e painéis em tempo real
Você pode usar ferramentas como o Prometheus e o Grafana para agregar e visualizar os dados coletados pelos programas do eBPG. Isso permite que você crie painéis em tempo real que mostram um panorama abrangente do desempenho do seu sistema. Você pode coletar métricas personalizadas e usar o Prometheus para armazenar e consultar esses dados. O Grafana pode então ser usado para criar painéis visualmente atraentes, facilitando o monitoramento do desempenho do seu sistema e a detecção de possíveis problemas.
Empresas como Netflix, Facebook e Cloudflare utilizam o eBPF para diagnosticar problemas de desempenho, otimizar sua infraestrutura e obter uma visão mais aprofundada de seus sistemas. Por exemplo, a Netflix o utiliza para analisar o desempenho da rede e identificar gargalos em sua rede de distribuição de conteúdo, enquanto o Facebook o utiliza para monitorar o desempenho de seus bancos de dados e identificar consultas lentas.
eBPF para aprimoramento da segurança
Além de suas aplicações no monitoramento de desempenho, o eBPF tornou-se uma tecnologia importante na área de segurança. Sua capacidade de inspecionar detalhadamente o comportamento do sistema e executar programas dentro do kernel o torna ideal para a criação de soluções fundamentais de segurança.
Auditoria de chamadas de sistema
As chamadas de sistema são a interface por meio da qual os aplicativos interagem com o kernel. Ao monitorar as chamadas de sistema com o eBPF, é possível acompanhar de perto o comportamento dos aplicativos e detectar eventos não autorizados. Por exemplo, ele pode rastrear chamadas `execve` para monitorar a execução de comandos ou chamadas `open` para detectar o acesso a arquivos confidenciais. Isso permite a criação de sistemas de auditoria sofisticados para alertar em tempo real sobre possíveis atividades maliciosas, como tentativas de um processo de escalar privilégios ou acessar recursos restritos.
Segurança de rede
Com o eBPF, é possível desenvolver poderosos sistemas de detecção e prevenção de invasões de rede (NIDS/NIPS). Como os programas eBPF podem ser acoplados aos pacotes de rede, eles permitem a análise em tempo real sem a sobrecarga das técnicas tradicionais de filtragem de pacotes. Atividades maliciosas na rede, como varreduras de portas, ataques de negação de serviço ou comunicação com malware, podem ser detectadas, e os pacotes podem ser descartados ou modificados para mitigar a ameaça. Por exemplo, um programa eBPF pode detectar e bloquear o tráfego de e para endereços IP maliciosos conhecidos ou rastrear padrões consistentes com um ataque DDoS, como altos volumes de pacotes SYN ou inundações de ICMP.
Segurança de contêineres
Embora os contêineres revolucionaram a implantação de aplicativos, a conteinerização também trouxe uma série de novos desafios de segurança. O eBPF está se tornando cada vez mais essencial para proteger ambientes conteinerizados. Ao monitorar chamadas de sistema e a atividade de rede dentro dos contêineres, você pode começar a aplicar suas políticas de isolamento de contêineres para evitar violações de segurança. Por exemplo, você pode usar o eBPF para permitir que um contêiner faça apenas determinadas chamadas de sistema, restringindo assim sua superfície de ataque. Além disso, você pode monitorar o tráfego de rede para garantir que seus contêineres se comuniquem apenas com entidades autorizadas.
Monitoramento da integridade dos arquivos
Detectar modificações não autorizadas em arquivos críticos é essencial para manter a integridade do sistema. Isso pode ser usado para rastrear alterações nos arquivos e alertá-lo sempre que ocorrer alguma atividade suspeita. Por exemplo, você poderia escrever um programa eBPF para acompanhar as alterações feitas nos arquivos de configuração ou nos binários do sistema, a fim de detectar possíveis invasões ou infecções por malware.
Aplicação de segurança em tempo de execução
Ele oferece um mecanismo para a aplicação de segurança em tempo de execução, uma vez que é capaz de interceptar e modificar chamadas de sistema. Os programas eBPF podem ser utilizados para impedir comportamentos maliciosos, bloqueando ou modificando chamadas de sistema antes que elas sejam executadas. Por exemplo, ele pode impedir que um processo acesse um arquivo confidencial ou restringir os argumentos que podem ser passados em uma determinada chamada de sistema.
Considerações finais
O eBPF está mudando a forma como monitoramos e protegemos os sistemas Linux, permitindo a observabilidade em tempo real com sobrecarga mínima. Desde a identificação de gargalos de desempenho até a aplicação de políticas de segurança, ele oferece uma abordagem poderosa e eficiente. À medida que a adoção nas empresas cresce, o eBPF desempenhará um papel ainda mais importante na observabilidade do sistema e na detecção de ameaças.
Mas o monitoramento é apenas metade do caminho — manter o kernel do Linux seguro é igualmente fundamental. A aplicação oportuna de patches do kernel é necessário para mitigar vulnerabilidades, mas as atualizações tradicionais geralmente exigem tempo de inatividade. O KernelCare Enterprise da TuxCare da TuxCare elimina esse problema com a aplicação de patches em tempo real, permitindo que você aplique correções de segurança ao kernel do Linux sem reinicializações ou interrupções no serviço. O KernelCare oferece suporte a todas as principais distribuições Linux corporativas, incluindo CentOS, RHEL e AlmaLinux, Rocky Linux, Ubuntu, Amazon Linux e Oracle Linux.

