bpftrace: Observación profunda del núcleo con eBPF

bpftrace es una herrameinta avanzada de rastreo dinámico construida sobre la infraestructura eBPF. Permite una visión detallada del comportamiento tanto a nivel de núcleo como en el espacio de usuario mediante un lenguaje de scripting de alto nivel.

Requisitos del sistema

  • Núcleo de Linux: Versión 4.9 como mínimo; se requiere la serie 5.x para funcionalidad completa.
  • Distribuciones populares: Soporte completo a partir de Ubuntu 18.04 y CentOS 8, aunque este último con limitaciones en versiones anteriores.
  • Sistemas nacionales (China): Disponibilidad en OpenEuler 22.03 (núcleo 5.10) y soporte parcial en Kylin V10.

Monitoreo de llamadas al sistema

Conteo de invocaciones

Para obtener un histograma de la frecuencia de cada llamada al sistema:

bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[str(args->id)] = count(); }'

Rastreo de funciones del núcleo

Se puede interceptar cualquier función interna del núcleo. Por ejemplo, para ver los picos de asignación de memoria:

bpftrace -e 'kprobe:__alloc_pages_nodemask { @[kstack] = count(); }'

Análisis de rendimiento

Perfiles de uso de CPU

Generar datos para un gráfico de llamas (flame graph) que muestre los puntos calientes de la CPU:

bpftrace -e 'profile:hz:99 { @[ustack] = count(); }' > perf_stack.log

Latencia en operaciones de E/S

Medir la distribución de tiempos de respuesta de solicitudes de bloques de disco:

bpftrace -e 'tracepoint:block:block_rq_issue { @start = nsecs; }
             tracepoint:block:block_rq_complete /@start/ {
               @latencia_us = hist((nsecs - @start) / 1000);
               clear(@start);
             }'

Seguridad y auditoría

Alerta por acceso a archivos sensibles

Disparar una alerta en tiempo real cuando se intenta leer el archivo de contraseñas del sistema:

bpftrace -e 'tracepoint:syscalls:sys_enter_openat {
  if (str(args->filename) == "/etc/shadow") {
    printf("ALERTA: Proceso %s (PID %d) intentó acceder a shadow.\n", comm, pid);
  }
}'

Seguimiento de ejecución de comandos

Registrar los comandos ejecutados por el sistema, útil para detectar actividades inusuales:

bpftrace -e 'tracepoint:syscalls:sys_enter_execve { 
  printf("PID: %d | Comando: %s\n", pid, str(args->argv[0])); 
}'

Observación en entornos de contenedores

El poder de bpftrace se extiende al interior de los contenedores. Para identificar las operaciones de archivo que ocurran dentro de un cgroup específico:

bpftrace -e 'tracepoint:syscalls:sys_enter_openat /cgroup == "kubepods"/ {
  printf("cgroup: %s | Proceso: %s | Fichero: %s\n",
         cgroup, comm, str(args->filename));
}'

Etiquetas: bpftrace eBPF monitor del sistema analisis de rendimiento seguridad

Publicado el 6-27 16:28