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:

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:

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:

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