eBPF: A próxima geração do Linux

De acordo com especialistas, o eBPF é uma tecnologia revolucionária. Para eles, também é a próxima geração do Linux devido a todas as capacidades que ele oferece aos desenvolvedores. Mas, quais são essas capacidades? Como o eBPF pode ajudar a resolver problemas do dia a dia?

O que é eBPF?

Para entender o que é e como funciona, precisamos revisar as origens dessa tecnologia primeiro.

Origens do eBPF

Talvez o conceito de BPF (Berkeley Packet Filter) seja familiar para você. Lançado em 1992 e desenvolvido por Steven McCanne e Van Jacobson, “BPF originou-se como uma tecnologia para otimizar os filtros de pacotes. Se você executar tcpdump com uma expressão (correspondente em um host ou porta), ele é compilado em bytecode BPF ideal que é executado por uma máquina virtual em uma sandbox no kernel ”, como Brendan Gregg explica neste post. Em outro texto, Gregg também sinaliza a melhoria do rastreamento do Linux ao longo dos anos. No entanto, em sua experiência, ele enfrentou algumas limitações usando BPF e kernels. 

Trabalhando em torno dessas limitações, Alexei Starovoitov propôs inicialmente uma reescrita. Em seguida, ele desenvolveu eBPF, ou extended Berkeley Packet Filter, com Daniel Borkmann em 2014. 

Uma forma de aprimorar e ampliar o BPF

Hoje em dia, seus desenvolvedores apresentam o eBPF como “uma tecnologia revolucionária com origens no kernel de Linux que pode executar programas em modo sandbox em um kernel do sistema operacional. Ele pode ser usado para estender com segurança e eficiência as capacidades do kernel sem a necessidade de alterar o código-fonte ou carregar os módulos do kernel”. Isso permite a possibilidade de “se executar em eventos que não sejam pacotes e fazer ações que não sejam filtragem”, como Gregg refere. 

Usando o eBPF, é viável introduzir novas soluções relacionadas ao gerenciamento de SDN; mitigação de DDoS e detecção de intrusão por meio da queda precoce de pacotes; melhorar o desempenho da rede, balanceamento de carga, observabilidade, e muito mais. 

Visão geral do eBFP. Fonte

Como funciona o eBPF?

Como o livro BPF Performance Tools, editado pela OReilly, aponta, eBPF é “uma tecnologia flexível e eficiente composta por um conjunto de instruções, objetos de armazenamento e funções auxiliares’. Ele pode ser considerado uma máquina virtual devido à sua especificação de conjunto de instruções virtuais. Estas instruções são executadas por um runtime BPF [referindo-se a eBPF] do kernel de Linux, que inclui um interpretador e um compilador JIT para transformar instruções BPF em instruções nativas para execução. As instruções do BPF devem primeiro passar por um verificador que garanta a segurança, certificando que o programa BPF não trave ou corrompa o kernel (no entanto, não impede que o usuário final escreva programas sem lógica que podem ser executados, mas não fazem sentido). 

Uma explicação gráfica do funcionamento do eBPF. Fonte

Fundamentos do eBPF

Programas eBPF

Para funcionar, são necessários programas compatíveis com eBPF. A seguir, algumas considerações para estes programas:

  • Eles devem ser orientados por eventos.
  • São executados quando o kernel ou um aplicativo passa por um determinado hook point.
  • Os hooks predefinidos incluem chamadas de sistema, entrada/saída de função, rastreamento do kernel, eventos de rede e outros.
  • Se um hook predefinido não existe para uma necessidade particular, é possível criar um kernel probe (kprobe) ou um user probe (uprobe) para anexar programas eBPF em quase qualquer lugar do kernel ou aplicações de usuário.
  • É possível escrevê-los indiretamente (através de projetos como Cilium, bcc ou bpftrace que fornecem uma abstração em cima do eBPF) ou diretamente (quando não existe abstração de nível superior).

Outras noções básicas

  • Loader & Verification Architecture: o programa passa pela verificação e compilação JIT antes de ser anexado ao hook solicitado.
  • Maps: a documentação indica que “os programas eBPF podem alavancar o conceito de mapas para armazenar e recuperar dados em um amplo conjunto de estruturas de dados”. 
  • Helper calls: chamadas de função podem ser transformadas em funções auxiliares para evitar chamadas em funções arbitrárias do kernel.
  • Tail and function calls: eles podem chamar e executar outro programa eBPF e substituir o contexto de execução.

Toolchains de desenvolvimento

As toolchains ajudam no desenvolvimento e gerenciamento de programas eBPF. Alguns dos mais populares e usados são:

  • BCC: um framework para escrever programas python com programas eBPF embutidos dentro deles. 
  • bpftrace: é uma linguagem de rastreamento de alto nível para Linux eBPF.
  • eBPF Go Library: para desacoplar o processo de obtenção do bytecode eBPF e o carregamento e gerenciamento de programas eBPF.
  • libbpf C/C++ Library: para desacoplar o carregamento de arquivos de objetos eBPF gerados a partir do compilador clang/LLVM no kernel.

Segurança

Qualquer erro na implementação afeta componentes vitais da infraestrutura do software. Além disso, a natureza de código aberto desta tecnologia pode gerar algum efeito no sistema. Por isso, a segurança é fundamental para garantir o sucesso. Neste assunto, o eBPF oferece segurança multicamadas que inclui: privilégios necessários, verificador, processo de hardening e abstrações do contexto do runtime.

Por que usar o eBPF?

  • Programabilidade: permite “adicionar analisadores de protocolo (parsers) adicionais e programar facilmente qualquer lógica de encaminhamento para atender aos requisitos que podem mudar”, de acordo com os criadores.
  • Rede: a programabilidade facilita a criação de soluções de rede para qualquer tipo de projeto, incluindo processamento de pacotes.
  • Rastreamento e criação de perfil: anexando programas a pontos de rastreamento, aos pontos de probing do kernel e a aplicativos de usuário, é possível obter visibilidade e gerar insights.
  • Observabilidade e monitoramento: métricas, histogramas, eventos… Os dados provêm de diferentes fontes, gerando mais visibilidade. 
  • Segurança: ser capaz de visualizar operações de rede permite uma maneira de detectar problemas e aumentar o controle, usando a filtragem de chamadas do sistema, filtragem no nível da rede e rastreamento de contexto do processo.

Fundação BPF

O número, e a diversidade, de implementações e casos de uso para o eBFP aumentaram substancialmente desde o seu lançamento. É um bom sinal, pois atualmente está ajudando a criar soluções na vida real. No entanto, a documentação para os projetos nem sempre é a melhor, com informações espalhadas em diferentes fontes e plataformas. Além disso, não há parâmetros padronizados. Como Alexei Starovoitov observou no 7º aniversário do eBFP, “isso leva a uma experiência de usuário confusa. As implementações do BPF competem entre si.”

Em resposta, a Fundação BPF e o Comitê Gestor BPF foram criados “para otimizar a colaboração entre os projetos e garantir que o núcleo do eBPF seja bem mantido e equipado com um roteiro e visão claros para o futuro brilhante à frente do projecto. É aqui que a Fundação eBPF entra e estabelece um comitê de direção do eBPF para cuidar da direção técnica e da visão do eBPF”.

Os desenvolvedores que trabalham com essa tecnologia também podem contribuir com esse assunto através das comunidades.

Resumo

O eBPF “cresceu de uma curiosidade do Linux para uma pedra angular da maneira como muitas tecnologias são construídas, mas isso não veio sem uma quantidade razoável de problemas”, reflete seu criador Alexei Starovoitov.Atualmente, ele está sendo amplamente usado para conduzir uma grande variedade de casos de uso. Da segurança à observabilidade, balanceamento de carga, desenvolvimento de novos aplicativos e muito mais. Grandes e pequenas empresas do mundo da tecnologia já incorporaram o eBPF como parte de seu stack. E eles estão relatando resultados positivos.

Scroll to Top