Hola Fronters, espero que estén excelentemente bien. El día de hoy les traigo un artículo sobre una herramienta que descubrí el año pasado y que la verdad me gusta mucho: OSQuery.

Qué es OSQuery

OSQuery es un Framework o entorno de trabajo, cuya funcionalidad es la de recabar información de nuestro sistema operativo, bien sea Linux, Windows o Mac OSX, sin embargo NO es un sistema cualquiera, sino que utiliza como sintaxis, el Structured Query Language (SQL), como línea de comandos.

Es sumamente flexible y amigable y así como podemos estructurar nuestras consultas SQL en un motor de base de datos de los ya conocidos, como por ejemplo: MySQL; con OSQuery también podemos llevar a cabo nuestras consultas, pero de datos relacionados con nuestros equipos y servidores.

En este HowTo les enseñaré como instalar OSQuery y realizar sus primeras consultas.

Instalación y configuración

Hay varias formas de instalar OSQuery en nuestro ordenador o servidor. Vamos a explicar las más comunes:

a) En Debian 11 / Ubuntu 22.04):

Actualizamos repositorios e instalamos dependencias:

sudo apt update

sudo apt-get install -y gnupg2

Agregamos el repositorio de OSQuery:

# Agregamos el repositorio. Este repo funciona tanto para Debian como para Ubuntu:
echo "deb [arch=amd64] https://pkg.osquery.io/deb deb main" |
sudo tee /etc/apt/sources.list.d/osquery.list

# Agregamos la llave GPG delrepositorio:
sudo apt-key adv --keyserver keyserver.ubuntu.com
--recv-keys 1484120AC4E9F8A1A577AEEE97A80C63C9D8B80B

Actualizamos repositorios e instalamos OSQuery:

sudo apt update

sudo apt install osquery -y

b) En RHEL, CentOS Stream y derivados:

Los pasos para instalar OSQuery en RHEL. CentOS, Rocky Linux, AlmaLinux son los siguientes:

yum install yum-utils

curl -L https://pkg.osquery.io/rpm/GPG | sudo tee /etc/pki/rpm-gpg/RPM-GPG-KEY-osquery

sudo yum-config-manager --add-repo https://pkg.osquery.io/rpm/osquery-s3-rpm.repo

sudo yum-config-manager --enable osquery-s3-rpm-repo

sudo yum install osquery

Ya instalado OSQuery, lo que haremos es comprobar la instalación, consultando la versión del paquete instalado:

# Al ejecutar este comando
osqueryi --version

# La salida fue esta al momento de realizar la consulta. 
osqueryi version 5.7.0

Para entrar en la interface de comandos:

osqueryi

Para mostrar la ayuda:

.help

Para salir de OSQuery:

.exit

Para ver las tablas disponibles:

.tables

Si queremos ver el schema de una tabla en particular:

# Sintaxis
.schema <table>

# Por ejemplo: para visualizar el schema de la tabla processes:
.schema processes

Ejemplos de Consultas SQL en OSQuery

Para ver el nombre del proceso, puerto de escucha y el PID en donde la dirección de escucha sea «0.0.0.0»:

SELECT DISTINCT process.name, listening.port, process.pid
FROM processes AS process JOIN listening_ports
AS listening ON process.pid = listening.pid
WHERE listening.address = '0.0.0.0';

Visualizando lo siguiente:

osquery 1

Para obtener todos los programas que están cargados y ejecutándose desde Systemd (con descripción)

SELECT id, description, load_state || active_state AS executable
FROM systemd_units
WHERE (load_state != '' AND active_state != '');

Obteniendo la siguiente salida:

osquery 2

Para obtener todos los programas que están cargados y ejecutándose desde Systemd (sin descripción)

SELECT id, load_state || active_state AS executable
FROM systemd_units
WHERE (load_state != '' AND active_state != '');

Obteniendo esta salida:

osquery 3

Mostrar el PID, nombre y la ruta. uniendo los procesos conforme al PID con JOIN y utilizándolo como clave primaria, en este caso con la tabla de osquery_info:

SELECT pid, name, path FROM osquery_info JOIN processes USING (pid);

Para visualizar los atributos de un fichero en especifico, en este caso, el /dev/zero:

SELECT * FROM FILE WHERE path = '/dev/zero';

Y los mostrará en formato de tabla. Aunque se puede apreciar la info, resulta un poco incomodo o inmanejable la forma de visualizarla.

+-----------+-----------+----------+-------+-----+-----+------+--------+------+------------+------------+------------+------------+-------+------------+---------+-----------+| path | directory | filename | inode | uid | gid | mode | device | size | block_size | atime | mtime | ctime | btime | hard_links | symlink | type |+-----------+-----------+----------+-------+-----+-----+------+--------+------+------------+------------+------------+------------+-------+------------+---------+-----------+| /dev/zero | /dev | zero | 10241 | 0 | 0 | 0666 | 261 | 0 | 4096 | 1653689583 | 1653689583 | 1653689583 | 0 | 1 | 0 | character |+-----------+-----------+----------+-------+-----+-----+------+--------+------+------------+------------+------------+------------+-------+------------+---------+-----------+

Para cambiar el modo de visualización podremos escribir y volvemos a ejecutar la consulta:

.mode line

Y ahora al volver a ejecutar la consulta:

SELECT * FROM FILE WHERE path = '/dev/zero';

Y ahora si podemos ver la consulta en modo lineal, siendo más legible:

path = /dev/zero
directory = /dev
filename = zero
inode = 10241
uid = 0
gid = 0
mode = 0666
device = 261
size = 0
block_size = 4096
atime = 1653689583
mtime = 1653689583
ctime = 1653689583
btime = 0
hard_links = 1
symlink = 0
type = character

Modos de Visualización de datos en OSQuery

Existen varios modos adicionales de salida o de visualización que nos ayudan a presentar los datos de forma más adecuada, según sea el contexto o la necesidad:

# El modo por defecto, que es la salida al estilo SQL (tabla formateada)
pretty 

# Valores separados por comas
csv

# Columnas alineadas a la izquierda
column

# Un valor por línea
line

# Valores separados por una cadena
list

Para elegir como queremos visualizar la salida de OSQuery:

# Escogemos el modo de visualización:
.mode line

# Y ahora ejecutamos la consulta:
SELECT path, inode, size, type FROM file WHERE path IN (SELECT '/dev/zero');

path = /dev/zero
inode = 304
size = 0
type = character

Esto nos traerá el hash del ultimo archivo modificado en la ruta /etc:

.mode line

SELECT path, mtime, sha256 FROM file JOIN hash USING (path)
WHERE file.directory = '/etc' ORDER BY mtime DESC LIMIT 1;

Para saber si los servidores tienen el plugin de let’sEncrypt para cPanel instalado:

select * from rpm_packages where name = 'letsencrypt-cpanel';name = letsencrypt-cpanel version = 0.19.9<br>release = 3 source = letsencrypt-cpanel-0.19.9-3.src.rpm size = 12944797 sha1 = edb612e9ed1be6a130a7f9421048ecf3ba3a7031 arch = x86_64<br>epoch = install_time = 1655931219 vendor = none package_group = default

Palabras finales

OSQuery es una herramienta altamente customizable y con un amplio margen de posibilidades de implementación y consulta, e incluso, puede llegar a servir como base para otros sistemas o herramientas que buscan hacer la vida más fácil a los Administradores de sistemas a la hora de obtener datos de su Infraestructura.

Espero que les haya gustado este contenido y, de ser así, comenta y comparte.

Hasta luego fronters!

Referencias

https://github.com/osquery/osquery

https://osquery.readthedocs.io/en/latest/introduction/sql/

https://osquery.io/schema/5.3.0/

https://blog.trailofbits.com/2020/10/14/osquery-using-d-bus-to-query-systemd-data/

https://osquery.readthedocs.io/en/stable/introduction/sql/

https://linuxhint.com/install_osquery_ubuntu/

https://medium.com/uptycs/sql-introduction-for-osquery-2e6c8dff3ee0

https://www.liquidweb.com/kb/install-osquery-centos/