sql >> Base de Datos >  >> RDS >> MariaDB

Monitoreo de seguridad de bases de datos para MySQL y MariaDB

La protección de datos es uno de los aspectos más significativos de la administración de una base de datos. Dependiendo de la estructura organizativa, ya sea un desarrollador, administrador de sistemas o DBA, si está administrando la base de datos de producción, debe monitorear los datos en busca de acceso y uso no autorizados. El propósito del monitoreo de seguridad es doble. Uno, para identificar actividad no autorizada en la base de datos. Y dos, para verificar si las bases de datos y sus configuraciones en toda la empresa cumplen con las políticas y estándares de seguridad.

En este artículo, dividiremos el monitoreo de la seguridad en dos categorías. Uno estará relacionado con la auditoría de las actividades de las bases de datos MySQL y MariaDB. La segunda categoría será sobre el monitoreo de sus instancias en busca de posibles brechas de seguridad.

Supervisión basada en políticas de consulta y conexión

La auditoría continua es una tarea imperativa para monitorear su entorno de base de datos. Al auditar su base de datos, puede lograr la rendición de cuentas por las acciones realizadas o el contenido al que se accedió. Además, la auditoría puede incluir algunos componentes críticos del sistema, como los asociados con los datos financieros para respaldar un conjunto preciso de regulaciones como SOX o la regulación GDPR de la UE. Por lo general, se logra registrando información sobre las operaciones de la base de datos en un archivo de registro externo.

De forma predeterminada, la auditoría en MySQL o MariaDB está deshabilitada. Usted y lo logra instalando complementos adicionales o capturando todas las consultas con el parámetro query_log. El archivo de registro de consultas generales es un registro general de lo que está realizando MySQL. El servidor registra cierta información en este registro cuando los clientes se conectan o desconectan, y registra cada instrucción SQL recibida de los clientes. Debido a problemas de rendimiento y falta de opciones de configuración, general_log no es una buena solución para fines de auditoría de seguridad.

Si usa MySQL Enterprise, puede usar el complemento MySQL Enterprise Audit, que es una extensión de la versión propietaria de MySQL. El complemento MySQL Enterprise Audit Plugin solo está disponible con MySQL Enterprise, que es una oferta comercial de Oracle. Percona y MariaDB han creado sus propias versiones de código abierto del complemento de auditoría. Por último, el complemento de McAfee para MySQL también se puede utilizar con varias versiones de MySQL. En este artículo, nos centraremos en los complementos de código abierto, aunque la versión Enterprise de Oracle parece ser la más robusta y estable.

Características de los complementos de auditoría de código abierto de MySQL

Si bien los complementos de auditoría de código abierto hacen el mismo trabajo que el complemento Enterprise de Oracle (producen resultados con consultas y conexiones de bases de datos), existen algunas diferencias arquitectónicas importantes.

Complemento de auditoría de MariaDB:el complemento de auditoría de MariaDB funciona con MariaDB, MySQL (a partir de la versión 5.5.34 y 10.0.7) y Percona Server. MariaDB comenzó a incluir el complemento de auditoría de forma predeterminada a partir de las versiones 10.0.10 y 5.5.37, y se puede instalar en cualquier versión a partir de MariaDB 5.5.20. Es el único complemento que admite Oracle MySQL, Percona Server y MariaDB. Está disponible en la plataforma Windows y Linux. Las versiones a partir de la 1.2 son las más estables y puede ser arriesgado usar versiones anteriores en su entorno de producción.

Complemento de auditoría de McAfee MySQL:este complemento no utiliza la API de auditoría de MySQL. Se actualizó recientemente para admitir MySQL 5.7. Algunas pruebas muestran que los complementos basados ​​en API pueden proporcionar un mejor rendimiento, pero debe verificarlo con su entorno.

Complemento de registro de auditoría de Percona:Percona proporciona una solución de auditoría de código abierto que se instala con Percona Server 5.5.37+ y 5.6.17+ como parte del proceso de instalación. En comparación con otros complementos de código abierto, este complemento tiene más funciones de salida de alcance, ya que genera XML, JSON y syslog.

Como tiene algunos enlaces internos al servidor para ser compatible con las características del complemento de Oracle, no está disponible como complemento independiente para otras versiones de MySQL.

Instalación del complemento basada en la extensión de auditoría de MariaDB

La instalación de los complementos MySQL de código abierto es bastante similar para las versiones de MariaDB, Percona y McAfee.
Percona y MariaDB agregan sus complementos como parte de los archivos binarios predeterminados del servidor, por lo que no es necesario descargar los complementos por separado. La versión de Percona solo admite oficialmente su propia bifurcación de MySQL, por lo que no hay descarga directa desde el sitio web del proveedor (si desea usar este complemento con MySQL, deberá obtener el complemento de un paquete de servidor de Percona). Si desea utilizar el complemento MariaDB con otras bifurcaciones de MySQL, puede encontrarlo en https://downloads.mariadb.com/Audit-Plugin/MariaDB-Audit-Plugin/. El complemento de McAfee está disponible en https://github.com/mcafee/mysql-audit/wiki/Installation.

Antes de comenzar la instalación del complemento, puede verificar si el complemento está presente en el sistema. La ubicación del complemento dinámico (no requiere reiniciar la instancia) se puede verificar con:

SHOW GLOBAL VARIABLES LIKE 'plugin_dir';

+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| plugin_dir    | /usr/lib64/mysql/plugin/ |
+---------------+--------------------------+

Verifique el directorio devuelto en el nivel del sistema de archivos para asegurarse de que tiene una copia de la biblioteca de complementos. Si no tiene server_audit.so o server_audit.dll dentro de /usr/lib64/mysql/plugin/, lo más probable es que su versión de MariaDB no sea compatible y deba actualizarla a la última versión.

La sintaxis para instalar el complemento MariaDB es:

INSTALL SONAME 'server_audit';

Para verificar los complementos instalados, debe ejecutar:

SHOW PLUGINS;
MariaDB [(none)]> show plugins;
+-------------------------------+----------+--------------------+--------------------+---------+
| Name                          | Status   | Type               | Library            | License |
+-------------------------------+----------+--------------------+--------------------+---------+
| binlog                        | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| mysql_native_password         | ACTIVE   | AUTHENTICATION     | NULL               | GPL     |
| mysql_old_password            | ACTIVE   | AUTHENTICATION     | NULL               | GPL     |
| wsrep                         | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| MRG_MyISAM                    | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| MEMORY                        | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| CSV                           | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| MyISAM                        | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| CLIENT_STATISTICS             | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INDEX_STATISTICS              | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| TABLE_STATISTICS              | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| USER_STATISTICS               | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| PERFORMANCE_SCHEMA            | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| InnoDB                        | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| INNODB_TRX                    | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_LOCKS                  | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_LOCK_WAITS             | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP                    | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
...
| INNODB_MUTEXES                | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_SEMAPHORE_WAITS    | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_TABLESPACES_ENCRYPTION | ACTIVE   | INFORMATION SCHEMA | NULL               | BSD     |
| INNODB_TABLESPACES_SCRUBBING  | ACTIVE   | INFORMATION SCHEMA | NULL               | BSD     |
| Aria                          | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| SEQUENCE                      | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| user_variables                | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| FEEDBACK                      | DISABLED | INFORMATION SCHEMA | NULL               | GPL     |
| partition                     | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| rpl_semi_sync_master          | ACTIVE   | REPLICATION        | semisync_master.so | GPL     |
| rpl_semi_sync_slave           | ACTIVE   | REPLICATION        | semisync_slave.so  | GPL     |
| SERVER_AUDIT                  | ACTIVE   | AUDIT              | server_audit.so    | GPL     |
+-------------------------------+----------+--------------------+--------------------+---------+

Si necesita información adicional, consulte la tabla PLUGINS en la base de datos information_schema que contiene información más detallada.

Otra forma de instalar el complemento es habilitar el complemento en my.cnf y reiniciar la instancia. Un ejemplo de una configuración de complemento de auditoría básica de MariaDB podría ser:

server_audit_events=CONNECT
server_audit_file_path=/var/log/mysql/audit.log
server_audit_file_rotate_size=1073741824
server_audit_file_rotations=8
server_audit_logging=ON
server_audit_incl_users=
server_audit_excl_users=
server_audit_output_type=FILE
server_audit_query_log_limit=1024

La configuración anterior debe colocarse en my.cnf. El complemento de auditoría creará el archivo /var/log/mysql/audit.log que rotará en un tamaño de 1 GB y habrá ocho rotaciones hasta que se sobrescriba el archivo. El archivo contendrá solo información sobre las conexiones.

Actualmente, hay dieciséis configuraciones que puede usar para ajustar el complemento de auditoría de MariaDB.

server_audit_events
server_audit_excl_users
server_audit_file_path
server_audit_file_rotate_now
server_audit_file_rotate_size
server_audit_file_rotations
server_audit_incl_users
server_audit_loc_info
server_audit_logging
server_audit_mode
server_audit_output_type
Server_audit_query_log_limit
server_audit_syslog_facility
server_audit_syslog_ident
server_audit_syslog_info
server_audit_syslog_priority

Entre ellos, puede encontrar opciones para incluir o excluir usuarios, establecer diferentes eventos de registro (CONECTAR o CONSULTAR) y cambiar entre archivo y syslog.

Para asegurarse de que el complemento se habilitará al iniciar el servidor, debe establecer
plugin_load=server_audit=server_audit.so en su configuración de my.cnf. Dicha configuración puede protegerse adicionalmente mediante server_audit=FORCE_PLUS_PERMANENT, que deshabilitará la opción de desinstalación del complemento.

UNINSTALL PLUGIN server_audit;

ERROR 1702 (HY000):
Plugin 'server_audit' is force_plus_permanent and can not be unloaded

Aquí hay algunas entradas de muestra producidas por el complemento de auditoría de MariaDB:

20180817 20:00:01,slave,cmon,cmon,31,0,DISCONNECT,information_schema,,0
20180817 20:47:01,slave,cmon,cmon,17,0,DISCONNECT,information_schema,,0
20180817 20:47:02,slave,cmon,cmon,19,0,DISCONNECT,information_schema,,0
20180817 20:47:02,slave,cmon,cmon,18,0,DISCONNECT,information_schema,,0
20180819 17:19:19,slave,cmon,cmon,12,0,CONNECT,information_schema,,0
20180819 17:19:19,slave,root,localhost,13,0,FAILED_CONNECT,,,1045
20180819 17:19:19,slave,root,localhost,13,0,DISCONNECT,,,0
20180819 17:19:20,slave,cmon,cmon,14,0,CONNECT,mysql,,0
20180819 17:19:20,slave,cmon,cmon,14,0,DISCONNECT,mysql,,0
20180819 17:19:21,slave,cmon,cmon,15,0,CONNECT,information_schema,,0
20180819 17:19:21,slave,cmon,cmon,16,0,CONNECT,information_schema,,0
20180819 19:00:01,slave,cmon,cmon,17,0,CONNECT,information_schema,,0
20180819 19:00:01,slave,cmon,cmon,17,0,DISCONNECT,information_schema,,0

Informe de cambios de esquema

Si solo necesita realizar un seguimiento de los cambios de DDL, puede utilizar el informe operativo de ClusterControl sobre el cambio de esquema. El Informe de detección de cambios de esquema muestra cualquier cambio de DDL en su base de datos. Esta funcionalidad requiere un parámetro adicional en el archivo de configuración de ClusterControl. Si no está configurado, verá la siguiente información:schema_change_detection_address no está configurado en /etc/cmon.d/cmon_1.cnf. Una vez que esté en su lugar, una salida de ejemplo puede ser como la siguiente:

Se puede configurar con un horario y los informes se envían por correo electrónico a los destinatarios.

ClusterControl:programar informe operativo

Evaluación de seguridad de la base de datos MySQL

Comprobación de actualización del paquete

Primero, comenzaremos con los controles de seguridad. Estar actualizado con los parches de MySQL ayudará a reducir los riesgos asociados con las vulnerabilidades conocidas presentes en el servidor MySQL. Puede mantener su entorno actualizado utilizando el repositorio de paquetes de los proveedores. En función de esta información, puede crear sus propios informes o usar herramientas como ClusterControl para verificar su entorno y alertarlo sobre posibles actualizaciones.

El informe de actualización de ClusterControl recopila información del sistema operativo y la compara con los paquetes disponibles en el repositorio. El informe se divide en cuatro secciones; resumen de actualización, paquetes de base de datos, paquetes de seguridad y otros paquetes. Puede comparar rápidamente lo que ha instalado en su sistema y encontrar una actualización o parche recomendado.

ClusterControl:informe de actualización ClusterControl:Detalles del informe de actualización

Para compararlos manualmente puedes ejecutar

SHOW VARIABLES WHERE variable_name LIKE "version";

Con boletines de seguridad como:
https://www.oracle.com/technetwork/topics/security/alerts-086861.html
https://nvd.nist.gov/view/vuln/search- resultados?adv_search=true&cves=on&cpe_vendor=cpe%3a%2f%3aoracle&cpe_produ
https://www.percona.com/doc/percona-server/LATEST/release-notes/release-notes_index.html
https://downloads.mariadb.org/mariadb/+releases/
https://www.cvedetails.com/vulnerability-list/vendor_id-12010/Mariadb.html
https://www. cvedetails.com/vulnerability-list/vendor_id-13000/Percona.html

O repositorios de proveedores:

En Debian

sudo apt list mysql-server

En RHEL/Centos

yum list | grep -i mariadb-server

Cuentas sin contraseña

Las contraseñas en blanco permiten que un usuario inicie sesión sin usar una contraseña. MySQL solía venir con un conjunto de usuarios creados previamente, algunos de los cuales pueden conectarse a la base de datos sin contraseña o, peor aún, usuarios anónimos. Afortunadamente, esto ha cambiado en MySQL 5.7. Finalmente, viene solo con una cuenta raíz que usa la contraseña que elijas en el momento de la instalación.

Para cada fila devuelta del procedimiento de auditoría, establezca una contraseña:

SELECT User,host
FROM mysql.user
WHERE authentication_string='';

Además, puede instalar un complemento de validación de contraseña e implementar una política más segura:

INSTALL PLUGIN validate_password SONAME 'validate_password.so';

SHOW VARIABLES LIKE 'default_password_lifetime';
SHOW VARIABLES LIKE 'validate_password%';

Un buen comienzo puede ser:

plugin-load=validate_password.so
validate-password=FORCE_PLUS_PERMANENT
validate_password_length=14
validate_password_mixed_case_count=1
validate_password_number_count=1
validate_password_special_char_count=1
validate_password_policy=MEDIUM

Por supuesto, estas configuraciones dependerán de las necesidades de su negocio.

Supervisión de acceso remoto

Evitar el uso de comodines en los nombres de host ayuda a controlar las ubicaciones específicas desde las que un usuario determinado puede conectarse e interactuar con la base de datos.

Debe asegurarse de que cada usuario pueda conectarse a MySQL solo desde hosts específicos. Siempre puede definir varias entradas para el mismo usuario, esto debería ayudar a reducir la necesidad de comodines.

Ejecute la siguiente instrucción SQL para evaluar esta recomendación (asegúrese de que no se devuelvan filas):

SELECT user, host FROM mysql.user WHERE host = '%';

Base de datos de prueba

La instalación predeterminada de MySQL viene con una base de datos no utilizada llamada prueba y la base de datos de prueba está disponible para todos los usuarios, especialmente para los usuarios anónimos. Dichos usuarios pueden crear tablas y escribir en ellas. Esto puede convertirse potencialmente en un problema por sí solo, y las escrituras agregarían algunos gastos generales y reducirían el rendimiento de la base de datos. Se recomienda descartar la base de datos de prueba. Para determinar si la base de datos de prueba está presente, ejecute:

SHOW DATABASES LIKE 'test';

Si nota que la base de datos de prueba está presente, esto podría deberse a que el script mysql_secure_installation que descarta la base de datos de prueba (así como otras actividades relacionadas con la seguridad) no se ejecutó.

CARGAR ARCHIVO DE DATOS

Si tanto el servidor como el cliente tienen la capacidad de ejecutar LOAD DATA LOCAL INFILE, un cliente podrá cargar datos desde un archivo local a un servidor MySQL remoto. El parámetro local_infile dicta si los archivos ubicados en la computadora del cliente MySQL se pueden cargar o seleccionar a través de LOAD DATA INFILE o SELECT local_file.

Esto, potencialmente, puede ayudar a leer los archivos a los que el cliente tiene acceso; por ejemplo, en un servidor de aplicaciones, uno podría acceder a cualquier dato al que tenga acceso el servidor HTTP. Para evitarlo, debe configurar local-infile=0 en my.cnf.

Ejecute la siguiente instrucción SQL y asegúrese de que el campo Valor esté desactivado:

SHOW VARIABLES WHERE Variable_name = 'local_infile';

Supervisión de espacios de tablas no cifrados

A partir de MySQL 5.7.11, InnoDB admite el cifrado de datos para tablas almacenadas en espacios de tabla de archivo por tabla. Esta función proporciona cifrado en reposo para archivos de datos de espacios de tablas físicos. Para examinar si sus tablas han sido cifradas, ejecute:

mysql> SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES
       WHERE CREATE_OPTIONS LIKE '%ENCRYPTION="Y"%';

+--------------+------------+----------------+
| TABLE_SCHEMA | TABLE_NAME | CREATE_OPTIONS |
+--------------+------------+----------------+
| test         | t1         | ENCRYPTION="Y" |
+--------------+------------+----------------+

Como parte del cifrado, también debe considerar el cifrado del registro binario. El servidor MySQL escribe mucha información en registros binarios.

Validación de conexión de cifrado

En algunas configuraciones, la base de datos no debe ser accesible a través de la red si cada conexión se administra localmente, a través del socket Unix. En tales casos, puede agregar la variable 'skip-networking' en my.cnf. La omisión de redes evita que MySQL use cualquier conexión TCP/IP, y solo el socket Unix sería posible en Linux.

Sin embargo, esta es una situación bastante rara, ya que es común acceder a MySQL a través de la red. Luego debe controlar que sus conexiones estén encriptadas. MySQL admite SSL como un medio para cifrar el tráfico entre servidores MySQL (replicación) y entre servidores MySQL y clientes. Si usa el clúster de Galera, hay funciones similares disponibles:tanto la comunicación dentro del clúster como las conexiones con los clientes se pueden cifrar mediante SSL. Para comprobar si utiliza el cifrado SSL, ejecute las siguientes consultas:

SHOW variables WHERE variable_name = 'have_ssl'; 
select ssl_verify_server_cert from mysql.slave_master_info;

Eso es todo por ahora. Esta no es una lista completa, infórmenos si hay otras comprobaciones que esté realizando hoy en sus bases de datos de producción.