Tutorial Linux eBPF
eBPF significa Extended Berkeley Packet Filter. Quando você trabalha com Linux e quer interagir com o kernel, você precisa de um framework como o eBPF para te ajudar. O eBPF é uma estrutura projetada para ajudar os desenvolvedores a executar os programas de kernel de baixo nível sem impedimentos.
Com o eBPF, você pode carregar e executar o software rapidamente com configuração de sobrecarga mínima. Se você é novo no eBPF e está trabalhando com programas do kernel, este guia o ajudará a entender o eBPF e como usá-lo. Apresentaremos algumas instâncias de injeção de código no kernel usando eBPF. Vamos começar!
O que é eBPF
eBPF é um acrônimo para Extended Berkeley Packer Filter. Ele atua como uma interface no kernel do Linux que permite aos desenvolvedores injetar o código para interagir com o kernel, como modificar seu comportamento ou observá-lo.
O eBPF foi lançado pela primeira vez como um rastreador de pacotes, mas foi posteriormente estendido em 2014 e integrado ao kernel do Linux. Embora ajude principalmente no rastreamento de tarefas, ele possui muitas funcionalidades, incluindo permitir que os aplicativos do espaço do usuário executem os programas no espaço do kernel.
A memória de um computador tem o espaço do usuário e o espaço do kernel. Os programas do usuário são executados no espaço do usuário enquanto o espaço do kernel é reservado para executar os drivers e o kernel. Os programas do usuário não podem ser executados no espaço do kernel. O objetivo é garantir que os programas inseguros ou outras vulnerabilidades não possam ser inseridos no kernel e travá-lo.
No entanto, o eBPF oferece um caminho para você executar os programas do usuário no espaço do kernel como bytecode. Como os códigos de byte são difíceis de escrever, você precisa de estruturas de desenvolvimento como BCC ou Bpftrace para escrever os programas eBPF. Essas estruturas são de código aberto e qualquer pessoa pode usá-las. Você pode instalar as estruturas BCC ou Bpftrace e criar programas eBPF.
Instalando BCC
O BCC é uma coleção de ferramentas de coleção do compilador BPF que ajudam a escrever e executar os programas eBPF.
Comece atualizando seu repositório apt:
Instale as ferramentas de coleta do compilador BPF com o seguinte comando:
As ferramentas BCC apropriadas para sua arquitetura de kernel são buscadas e instaladas. Pressione “y” para confirmar a instalação.
Você pode verificar se o BCC está instalado e funcionando executando uma de suas ferramentas para obter o PID de qualquer comando executado no terminal.
Abra duas janelas de terminal. Execute o seguinte comando bpfcc no primeiro terminal:
Execute alguns comandos como na imagem a seguir no segundo terminal:
Se BCC e eBPF estiverem funcionando no primeiro terminal, você verá os PIDs dos comandos inseridos na segunda janela e os timestamps.
Seu BCC está instalado. Agora você pode executar os diferentes programas eBPF para injetar o código no kernel para diferentes propósitos.
Instalando o Bpftrace
Além de usar a estrutura BCC, você pode usar a estrutura Bpftrace. É ideal para diferentes tarefas e oferece um utilitário de linha de comando que permite aos usuários executar os comandos eBPF diretamente.
Instale-o com o seguinte comando:
Com o Bpftrace instalado, você pode implantar seus programas eBPF. Vejamos alguns exemplos de implantação de vários programas usando o utilitário de linha de comando.
No repositório Bpftrace GitHub, você pode implantar os diferentes programas “one-liners”. Por exemplo, você pode listar o consumo de disco por diferentes processos executando o seguinte programa:
Na saída, você notará que as colunas exibem o nome do processo, o tamanho do disco e o tamanho do disco.
A saída exibe todos os processos em seu kernel.
Se você também deseja verificar as contagens de syscall por processo, pode utilizar o programa one-liners Bpftrace com o seguinte comando:
As syscalls são exibidas após pressionar Ctrl + C para encerrar o comando. A saída exibe o nome do processo e um relatório que contém o mapa é exibido como uma matriz associativa.
O count() popula a contagem da frequência de vezes que o sistema chama para cada processo acontecer. Se quiser listar todos os probes, você pode usar o comando bpftrace -l para listá-los conforme ilustrado a seguir:
É assim que você trabalha com o programa eBPF no Linux.
Conclusão
eBPF é uma maneira de inserir o código no kernel do Linux. Você pode usar as estruturas como BCC e Bpftrace para criar e executar os programas eBPF. Esta postagem apresentou o eBPF e a estrutura para escrever e executar os programas eBPF. Além disso, apresentamos alguns exemplos de programas eBPF que você pode executar. É isso!