Saltar al contenido
Roadmap

$ ssh lab-05-bpf-inventory·M05 · eBPF

Observabilidad y Seguridad en el Kernel con eBPF

10.0.5.0/24xdp · tc · bpf maps

Objetivo: inventariar eBPF sin cambiar datapath.

Runtime: Linux BTF/bpftool; CAP_BPF/CAP_PERFMON o root

Lee el mecanismo; después interroga la evidencia.

La teoría define qué debe ocurrir. Las figuras y tablas reducen el mecanismo a señales observables; la topología y el inspector de paquete permiten comprobarlo después. Cada lección termina con «Lo entiendo»: márcala cuando puedas explicarla, no cuando la hayas leído.

Conceptos disponibles14

El problema: los logs de aplicación no ven todo lo que decide el kernel

Hasta aquí has usado capturas, reglas y objetos de Kubernetes para entender un flujo. Pero un paquete puede descartarse antes de llegar a la pila normal, y un proceso puede abrir un socket sin que una captura aislada te diga qué cgroup o workload lo originó. existe para observar o controlar puntos muy concretos del kernel con una semántica explícita. [1]

La pregunta no es “¿cómo escribo un programa eBPF?”. Primero es: ¿en qué momento del recorrido necesito evidencia o enforcement, y qué contexto todavía existe allí? Un XDP temprano puede descartar rápido; un hook posterior puede relacionar el flujo con un o proceso.

¿La entiendes?

Márcala sólo si puedes explicarla con tus palabras y decir por qué importa en producción.

Mapa mínimo: el mismo paquete cambia de contexto al avanzar

Flujo del mecanismo5 etapas

El paquete gana contexto mientras avanza

El hook elegido determina qué puedes decidir y qué evidencia conservas.

RX

NIC. La interfaz recibe bytes antes de que exista contexto de proceso.

Ver la figura original
NIC recibe bytes
    │
    ▼
XDP ── decisión muy temprana: DROP / PASS / REDIRECT
    │ si pasa
    ▼
stack y conntrack ── red normal del kernel
    │
    ▼
TC en veth ── interfaz, Pod y política de tránsito
    │
    ▼
socket/cgroup/LSM ── proceso, identidad u operación

No memorices todos los tipos de programa. Aprende la consecuencia del punto de enganche: un paquete descartado por XDP no llegará a TC ni a un socket; un hook de socket da contexto de proceso que XDP no tiene. [2]

¿La entiendes?

Márcala sólo si puedes explicarla con tus palabras y decir por qué importa en producción.

Ruta de estudio y conexión con el roadmap

  1. Comprende por qué el verifier acepta o rechaza un programa.
  2. Elige XDP, TC, socket, cgroup o LSM según la pregunta que quieres responder.
  3. Diseña eventos que unan paquete, PID, cgroup, y política.
  4. Inventaría programas, mapas y adjuntos antes de cambiar el datapath.

El último módulo lleva esta misma disciplina a cloud: el control no es sólo un hook local, sino rutas, perímetros, identidad y política distribuidos entre y workloads.

Referencia técnica: modelo de ejecución eBPF

eBPF se carga vía bpf() como bytecode para VM de registros, helpers y mapas. Verifier valida control flow, contexto/memoria, punteros, límites y terminación antes de admitirlo. Mapas mantienen estado; pinning/enlaces gobiernan vida. BTF/CO-RE dan tipos/portabilidad, no capacidades iguales. [3]

XDP corre RX pre-stack y retorna DROP, PASS, TX, REDIRECT o ABORTED: filtrado temprano. TC corre en interfaz ingress/egress. Socket filter ve socket; cgroup hooks y BPF LSM aportan contexto/previsión. [1]

HookMomentoUsoLímite
XDPRX pre-stackdrop/redirectno semántica socket
TCinterfaz policy/telemetríaposterior a XDP
socket filtersocketobservación procesono enforcement global
BPF LSMoperaciónprevenciónrequiere tests

Pulsa una fila para fijarla.

Evento útil incluye PID, cgroup, netns, identidad y 5-tupla. Syscall aislado no es intención; correlación con policy sí. [4]

Referencia: no cuenta para tu progreso. Vuelve aquí cuando necesites un campo o un estado concreto.

Lo que el verifier está defendiendo

eBPF no carga C arbitrario: produce instrucciones para VM y verifier demuestra que memoria/contexto, punteros, límites y terminación son seguros. Un puntero a paquete sólo es válido tras probar que hdr+1 no supera data_end. El log del verifier describe un camino que kernel no puede demostrar seguro. [5]

Flujo del mecanismo3 etapas

El verifier exige una prueba de límites

Antes de leer un campo, el programa debe demostrar que existe dentro del paquete.

inicio

data. Inicio de los bytes recibidos.

Ver la figura original
data ───────── parsed header ───────── data_end
  └── comprobar hdr + 1 <= data_end antes de leer ──┘
ObjetoConservaPregunta de seguridad
programalógica/tipo hook¿qué decide y dónde?
mapaestado¿límite/cardinalidad?
linkadjunto durable¿quién lo creó/desmonta?
BTFtipos CO-RE¿helper/contexto disponible?

Pulsa una fila para fijarla.

¿La entiendes?

Márcala sólo si puedes explicarla con tus palabras y decir por qué importa en producción.

El mismo paquete desde hooks distintos

XDP ve RX antes de socket/conntrack. DROP reduce trabajo y evita observación posterior. TC ve ingress/egress de veth; socket hooks correlacionan proceso. Elegir hook es semántica: descartar paquete malformado no equivale a autorizar proceso identificado. [2]

Figura
NIC RX → XDP (bytes/verdict) → stack/conntrack → TC veth → socket (PID/cgroup)
PreguntaHookPor qué
¿descarto flood ?XDPantes del coste de stack
¿qué Pod emitió flujo?TC/cgroupXDP no conoce PID
¿prohíbo operación?BPF LSMfiltro paquete no ve objeto
¿hay adjunto sorpresa?bpftoollogs app no ven kernel state

Pulsa una fila para fijarla.

¿La entiendes?

Márcala sólo si puedes explicarla con tus palabras y decir por qué importa en producción.

Telemetría que sirve para investigar

Un mapa src-IP sólo dice volumen. Evento accionable une timestamp, verdict, program-id, cgroup, PID, netns, 5-tupla y policy-id. Ring buffer debe monitorizar presión: perder eventos bajo carga puede ocultar incidente. [6]

Figura
evento: ts | verdict | program-id | cgroup | pid | src:port → dst:port | policy-id

¿La entiendes?

Márcala sólo si puedes explicarla con tus palabras y decir por qué importa en producción.

Checkpoint 05 · predice antes de revelar

Un DROP en XDP deja a TC sin historia que observar

Un programa XDP adjunto a la NIC descarta paquetes TCP/8080. A la vez, un programa TC ingress en el veth intenta emitir un evento para cada conexión observada, pero no registra esos paquetes.

bpftool net: xdp id 42 dev eth0
XDP id 42: TCP dst 8080 → XDP_DROP
TC ingress veth-api: contador de eventos TCP/8080 = 0
¿Qué interpretación es correcta?