David Bohm

Hay dos frases que definen mi manera de pensar:
Realmente no hemos prestado mucha atención al pensamiento como un proceso; hemos participado en pensamientos, pero sólo hemos prestado atención al contenido, no al proceso.
La capacidad de percibir o pensar de manera diferente es más importante que el conocimiento adquirido.
Ambas son de David Bohm.

lunes, 4 de mayo de 2020

osquery, la navaja suiza del sysadmin

La aplicación osquery es una de esas herramientas open source que cuando eres administrador de sistemas y la descubres, realmente te quedas sin palabras.

Digamos que es una herramienta que va a estar vigilando tu equipo, o los equipos de toda la red que administras o los servidores que tienes que sufrir. El escalado es muy potente, hasta llegar a miles y miles de activos en tu infraestructura.

Se puede instalar en tu propio equipo o en un servidor para controlar que es lo que está pasando en él, independientemente de la plataforma que tengas, está soportado para Windows, Mac OS y Linux. En su página web oficial hay gran cantidad de información, y la documentación es bastante extensa y la puedes consultar aquí.

Si nos centramos en una máquina linux, está soportado sobre bastantes tipos de distribuciones, por ejemplo para instalar en...

Arch y familia:
   # pacman -S osquery

ElementaryOS y familia debian:
   # apt-get install osquery

CentOS y familia Red Hat:
   # yum install osquery

Si lo queremos instalar en un equipo o servidor Windows, podemos ver el proceso aquí y también en la web de chocolatey aquí.

Vale, y que vigila, pues me atrevería a decir de forma atrevida que practicamente todo. Digamos que transforma tu sistema operativo en una base de datos en donde las tablas SQL representan conceptos abstractos como procesos en ejecución, módulos de kernel cargados, plugins de navegador, conexiones de red abiertas, eventos de hardware, etcétera.

Se ejecuta en modo demonio/servicio y se encarga de ir agregando los resultados de las consultas que realiza el programa sobre la máquina como registros de un motor SQLite.

Y ¿como consultamos los parámetros de nuestra maquina en este recolector de información?, pues con simples comandos SQL a través de su consola.

Una vez instalado podríamos arrancar el demonio y activarlo para futuros reinicios:

   # systemctl start osqueryd
   # systemctl enable osqueryd

Para lanzar la consola, ejecutariamos:

   # osqueryi

Y entramos en un shell propio, un CLI, sobre el que podemos lanzar las consultas de forma interactiva. Además es totalmente agnostico de plataforma, por lo que las consultas son genéricas y creo que es ahí donde reside su potencia cuando administras infraestructuras mixtas, tiene una buena adaptabilidad a los diferentes sistemas operativos.

Pongamos algunos ejemplos de comandos y esas consultas para entender como podríamos aprovecharnos de este software, comencemos sacando la ayuda:

   osquery> .help

Si queremos ver las tablas generadas:

   osquery> .tables

Si queremos podemos utilizar pragma table_info, nativo de SQLite, para conocer la información de una tabla concreta con los campos que contiene para poder construir sentencias SQL apropiadas, por ejemplo:

   osquery> pragma table_info('system_info');

Hay que tener en cuenta que dependiendo de la plataforma, habrá bastantes tablas comunes pero se generarán otras tablas especificas para el sistema operativo que está corriendo.

Ejemplos sencillos, genéricos y que se describen por si solos podrian ser:

   osquery> select * from uptime;
   osquery> select * from system_info;
   osquery> select * from os_version;
   osquery> select * from time;
   osquery> select * from crontab;
   osquery> select * from processes;
   osquery> select * from users;
   osquery> select * from kernel_modules;
   osquery> select * from etc_hosts;
   osquery> select * from interface_addresses;
   osquery> select * from routes;
   osquery> select * from process_open_files;
   osquery> select * from syslog_events;

Y ahora veamos ejemplos mas elaborados, algunos extraidos de esta web, para comprender la potencia de este punto único de encuentro para muchas preguntas que nos podemos hacer sobre un equipo, servidor o infraestructura completa.

Para saber cual es el hostname del equipo:

   osquery> select hostname from system_info;

Si por ejemplo queremos obtener información del procesador del sistema, podríamos lanzar algo así:

   osquery> select cpu_type, cpu_brand from system_info;

Si queremos saber como está el almacenamiento local en el punto de montaje raiz:

   osquery> select path, type, round((blocks_available * blocks_size *10e-10),2) as gigs_free from mounts where path='/';

Si queremos conocer los puertos que están a la escucha:

   osquery> select * from listening_ports;

Si queremos encontrar los procesos que están corriendo sobre el puerto 80:

   osquery> select pid from listening ports where port = 80;

Al tratarse de meras consultas SQL, podríamos llegar a generar joins de varias tablas por lo que la información se vuelve mas completa, por ejemplo al hilo de los dos comandos anteriores podemos unir procesos y puertos que están escuchando:

    osquery> select p.pid, p.name, p.state,p.uid, lp.port from processes p join listening_ports lp on p.pid = lp.pid and lp.port=80;
Y si nos vamos a un ejemplo mas trabajado, podríamos por ejemplo querer saber cuales es el top 10 de los procesos que están consumiendo mas CPU:

    osquery> select pid, uid, name, round(((user_time + system_time) / (cpu_time.tsb - cpu_time.itsb)) * 100, 2) as percentage from processes, (select (sum(user) + sum(nice) + sum(system) + sum(idle) * 1.0) as tsb, sum(coalesce(idle, 0)) + sum(coalesce(iowait, 0)) as itsb from cpu_time ) as cpu_time order by user_time+system_time desc limit 10;
Y podriamos hacer lo mismo con el top 10 de los procesos que ocupan mas memoria:

    osquery> select pid, name, round((total_size * '10e-7'), 2) as used from processes order by total_size desc limit 10;

Este ejemplo también es muy interesante, saber quien está logueado en nuestro sistema:

   osquery> select * from loggued_in_users;

Si queremos conocer cuales han sido los últimos inicios de sesión, no solo los actuales:

   osquery> select * from last;

Si queremos salir de la consola:

   osquery> .exit

Y por último, me parece interesante saber donde se encuentran los ficheros mas relevantes de osquery, tanto para distribuciones de la familia de centOS como de debian, estas serían las rutas por defecto:

   - Configuración: /etc/osquery/osquery.conf
   - Logs: /var/log/osquery
   - Binarios: /usr/bin
   - Packs: /usr/share/osquery/packs

Si te estás preguntando que son los packs, digamos que son conjuntos de consultas a modo de reglas para buscar información interesante o mas concreta.

En el caso de Windows todo debería de ir a la ruta: C:\Program Files\osquery

   - Configuración: C:\Program Files\osquery\osquery.conf
   - Logs: C:\Program Files\osquery\log
   - Binarios: C:\Program Files\osquery
   - Packs: C:\Program Files\osquery\packs

Una herramienta que si vemos su potencial instalado y ejecutado en local, imagínate si la despliegas en red y centralizas la información obtenida... Brutal!!!

SaluDOS

No hay comentarios:

Publicar un comentario