Skip to main content

Análisis de logs en Bases de datos

Mariadb para análisis de logs.

Actualización de los repositorios del sistema.

sudo apt-get update

Actualización e instalación de MariaDB

sudo apt update
sudo apt install mariadb-server
sudo systemctl status mariadb

Una vez instalada Mariadb comprobamos con el estatus:

image.png

Como no se tiene una configuración predeterminada de usuario ni password la contraseña esta vacía y el usuario por defecto es root. Ingresamos a la base de datos:

mysql -u root -p

Creamos un usuario que pueda conectarse de manera remota a las bases de datos y le otorgamos los privilegios necesarios para acceder con los siguientes comandos.

CREATE USER 'remoto'@'%' IDENTIFIED BY '1234';
grant all privileges on *.* to 'remoto'@'%' with grant option;

Realizamos la creación del usuario saliendo de root e ingresando con usuario “remoto” de manera local.

MariaDB [(none)]>exit
mysql -u remoto -p
exit

Ingresamos de forma exitosa:

image.png

Habilitamos el acceso remoto de Mariadb, salimos del usuario creado e ingresamos al archivo de configuración desde el terminal y cambiamos el valor de bind address.

nano /etc/mysql/mariadb.conf.d/50-server.cnf

image.png

Cabe destacar que esta configuración solo es recomendable para entornos de prueba, en un entorno de producción tenemos que restringir lo mas posible que dirección o direcciones IP pueden conectarse.

Reiniciamos Mariadb para aplicar los cambios.

sudo systemctl restart mariadb

Tenemos la direccion ip del servidor “192.168.24.84” con la que realizaremos la prueba remota desde nuestro terminal.

mysql -h 192.168.24.84 -P 3306 -u remoto -p

image.png

Para que se registren los logs de MariaDB se deben realizar cambios en el archivo de configuración quitando el símbolo de comentario en las siguientes lineas.

nano /etc/mysql/mariadb.conf.d/50-server.cnf

image.png

Los logs se registran en el directorio /var/lib/mysql/server_audit.log. Luego debemos instalar el plugging de auditoria en el servidor mariadb.

mysql -u remoto -p
INSTALL SONAME 'server_audit';
show plugins;
SHOW GLOBAL VARIABLES LIKE "server_Audit%";
SET GLOBAL server_audit_events= 'CONNECT,QUERY_DML,TABLE';
SET GLOBAL server_audit_logging =ON;
SHOW GLOBAL VARIABLES LIKE "server_Audit%";
SET GLOBAL server_audit_excl_users = remoto;
SHOW GRANTS FOR 'remoto';
nano /etc/mysql/mariadb.conf.d/50-server.cnf
plugin_load=server_audit=server_audit.so
sudo systemctl restart mariadb

Instalación de rsyslog en nuestro servidor MariaDB.

sudo apt-get install -y rsyslog

Después debemos enviar los registros al servidor de Wazuh. En el archivo de configuración de rsyslog, deberá definir qué enviar al servidor de Wazuh, por UDP o TCP, la dirección IP del servidor de Wazuh y el puerto.

sudo nano /etc/rsyslog.conf

image.png

Para aplicar los cambios se debe reiniciar el servicio Rsyslog.

systemctl restart rsyslog

Se debe habilitar el complemento de auditoria

nano /etc/mysql/my.cnf

image.png

Reiniciamos para aplicar los cambios

systemctl restart mariadb

Para realizar una prueba usamos una contraseña incorrecta y correcta en repetidas ocasiones desde un terminal remoto:

mysql -h 192.168.24.84 -P 3306 -u remoto -p

Verificamos el archivo de auditoria.

cat /var/log/mysql/mariadb-audit.log | grep remoto

image.png

Por ultimo verificamos el archivo syslog para confirmar que la información este correlacionada.

image.png

En el servidor configuramos la conexión remota con esta acción Wazuh también obtendrá registros de nuestro servidor MariaDB, para eso, necesitamos editar el archivo de configuración.

sudo nano /var/ossec/etc/ossec.conf
<!-- Conexion por puerto 514 a mariadb -->
  <remote>
    <connection>syslog</connection>
    <port>514</port>
    <protocol>udp</protocol>
    <allowed-ips>192.168.24.0/24</allowed-ips>
  </remote>
systemctl restart wazuh-manager.service

Para el archivo de logs en Wazuh, en el agente.

<!--  Registro de logs mariadb -->  
<localfile>
    <log_format>syslog</log_format>
    <location>/var/log/mysql/mariadb-audit.log</location>
  </localfile>
nano /var/ossec/etc/rules/local_rules.xml
<!-- 
                                            REGLAS PERSONALIZADAS MARIADB 
-->
<group name="mariadb-syslog,">
                                            <!-- Acceso fallido  -->

	<rule id="100002" level="4">
	  <if_sid>88100</if_sid>
	  <match>FAILED_CONNECT</match>
	  <description>Acceso fallido a base de datos mariadb.</description>
	</rule>
</group>
systemctl restart wazuh-manager

Con todas las configuraciones realizadas se pueden ver las alertas en el dashboard de Wazuh manager.

image.png

Elaboración de reglas en Wazuh manager para la auditoria de bases de datos.

El primer paso para las reglas personalizadas esta en el servidor de wazuh manager, ingresamos al archivo de configuración y añadimos el directorio de reglas personalizadas.

nano /var/ossec/etc/ossec.conf

Dentro del archivo de configuración en <ossec_config> y <ruleset>

  <ruleset>
<!-- Código anterior ... -->

<!-- Directorio de reglas locales de wazuh -->
    <rule_dir>/var/ossec/etc/rules/local_rules.xml</rule_dir>
  </ruleset>

Decodificador para MariaDB

La creación de un decoder para Mariadb es necesaria para la interpretación de Wazuh manager para posteriormente crear alertas generadas por actividades realizadas dentro de las bases de datos.
Los tipos de logs de mariadb generados por el plugin de auditoria son de la siguiente manera:

  • Para el caso de conexión fallida:
    20240321 13:54:26,server2,remoto,192.168.24.68,45,0,FAILED_CONNECT,,,1045
  • Para eliminación de base de datos y tablas 
    20240317 16:10:02,server2,remoto,192.168.24.68,31,65,QUERY,mysql,'drop database dbprueba',0
    20240316 19:26:25,server2,remoto,192.168.24.68,71,140,QUERY,uno,'drop table tablapru',0

Ejemplo de decodificador, en el archivo de decodificadores locales de Wazuh:

<decoder name="mariadb-syslog">
    <prematch>^(\d+ \d\d:\d\d:\d\d),</prematch>
    <regex offset="after_prematch">^\w+,(\w+),(\S+),\d+,\d+,(\w+),</regex>
    <order>dstuser,srcip,action</order>
</decoder>

El nombre del decodificador es muy importante ya que tiene que pertenecer al grupo de decodificadores por defecto de Wazuh para que no entre en conflicto con los decodificadores que interpreta Wazuh manager si es que estos están dentro de los programas monitoreados por defecto.
Se realiza la prueba de este decodificador donde pre-match es la coincidencia de elementos al principio de cada log, y la parte de regex es la que nos importa para extraer los datos necesarios para nosotros, que se extraen en el apartado order.
Para verificar su funcionamiento tenemos una herramienta llamada decoders test en Wazuh manager que nos indica si los datos que necesitamos se pudieron extraer de forma correcta.

image.png  image.png

Podemos observar los tipos de logs generados por el plugin de auditoria de mariadb enviados a Wazuh manager para que sea decodificado por nuestro decodificador y posteriormente reconoce los datos requeridos como el nombre del decodificador, usuarios e IP proveniente.

Para la siguiente fase debemos crear reglas personalizadas a partir de estos decodificadores.

Reglas personalizadas para MariaDB.

Debemos crear una regla personalizada para que este detecte cuando una base de datos ha sido borrada. En este caso la regla se activa cuando Wazuh manager encuentra la palabras drop database, ingresamos al archivo de configuración.
nano /var/ossec/etc/rules/local_rules.xml

<!-- 
                                            REGLAS PERSONALIZADAS MARIADB 
-->
<group name="mariadb-syslog,">
                                            <!-- Acceso fallido  -->
	<rule id="100002" level="4">
	  <if_sid>88100</if_sid>
	  <match>FAILED_CONNECT</match>
	  <description>Acceso fallido a base de datos mariadb.</description>
	</rule>
                                <!-- Eliminación de tabla, base de datos, usuario  -->
    <rule id="100003" level="4">
        <if_sid>88100</if_sid>
        <match>DROP TABLE</match>
        <description>Tabla eliminada en Mariadb.</description>
    </rule>	
	<rule id="100004" level="6">
        <if_sid>88100</if_sid>
        <match>DROP DATABASE</match>
        <description>Base de datos eliminada en Mariadb</description>
	</rule>
	<rule id="100005" level="8">
        <if_sid>88100</if_sid>
        <match>DROP USER</match>
        <description>Alerta inusual usuario eliminado en Mariadb</description>
	</rule>
                                <!-- Creación de usuario o cambio de atributos  -->
	<rule id="100006" level="3">
        <if_sid>88100</if_sid>
        <match>CREATE USER</match>
        <description>Usuario creado en Mariadb</description>
	</rule>
	<rule id="100007" level="8">
        <if_sid>88100</if_sid>
        <match>GRANT ALL PRIVILEGES</match>
        <description>Alerta inusual se han cambiado los atributos de un usuario en Mariadb</description>
	</rule>	
</group>

Para realizar la prueba ingresamos de forma remota 

mysql -h 192.168.24.84 -P 3306 -u remoto -p

Se crea una base de datos de prueba y se elimina.

image.png    image.png

Posteriormente observamos la alerta en Wazuh manager.

image.png

Posteriormente podemos realizar una regla mas en caso de que se elimine una tabla dentro de una base de datos:

image.png

Revisando las alertas generadas en el dashboard de Wazuh manager podemos observar una alerta de nivel 7 con la ubicación del archivo de log para obtener mas información.

image.png