DBAtlas · Atlas de operaciones de bases de datos

Hardening de seguridad de MySQL (auditoría de estado, red, TLS, autenticación, privilegios, audit, cifrado)

MySQLNivel: IntermedioDuración: 5 min (auditoría) – 3 h (hardening completo)

No es una guía de instalación: localiza y cierra las brechas de un servidor MySQL 8.4 / 8.0 en funcionamiento. Primero, la Auditoría de estado de solo lectura lista las brechas por orden de gravedad e indica a qué tarjeta lleva cada hallazgo; después se cierran las áreas una a una o todas en secuencia: bind_address, firewall y restricción de host de las cuentas; TLS, require_secure_transport y VERIFY_IDENTITY en el cliente; caching_sha2_password, política de contraseñas, root remoto y cuentas anónimas; roles y cuenta de aplicación sin DDL; audit; cifrado de tablespaces InnoDB (keyring component); backup cifrado; sistema operativo; seguimiento de versiones. Audit no existe en Community: requiere MySQL Enterprise (suscripción de pago) o Percona Server (gratuito); TDE también está en Community. Al final se vuelve a ejecutar la auditoría.

Topología: Un servidor MySQL + servidor de aplicación (verificación del cliente); réplica/InnoDB Cluster en las notas

Escenarios

  • Auditoría de estado: ¿qué brechas tengo? (solo lectura) — El primer análisis que se debe ejecutar: cuentas anónimas, sin contraseña o root remoto, acceso desde cualquier sitio (%), plugin de autenticación débil, privilegios globales, TLS, audit, cifrado, permisos de archivos y firewall; no modifica nada.
  • Hardening completo (todo en secuencia) — Servidor recién instalado o nunca bastionado: todas las áreas se aplican en un orden seguro; MySQL se reinicia varias veces (requiere ventana de mantenimiento).
  • Red y conexión: ¿quién puede conectarse y desde dónde? (bind_address, firewall, restricción de host) — MySQL escucha en todas las interfaces, las cuentas tienen host '%' y el puerto está abierto a todos. Si cambia bind_address, se necesita un reinicio.
  • Cifrar la conexión (TLS, require_secure_transport, VERIFY_IDENTITY) — Se usa el certificado autofirmado generado automáticamente, se aceptan conexiones sin cifrar o los clientes no verifican el certificado. Sin interrupción gracias a ALTER INSTANCE RELOAD TLS.
  • Autenticación y contraseñas (caching_sha2, política de contraseñas, root) — Cuentas con mysql_native_password, sin política de contraseñas, root remoto, cuentas anónimas y base de datos test. Sin interrupción.
  • Mínimo privilegio: roles y cuenta de aplicación sin DDL — Privilegios CREATE/ALTER/DROP o . en la cuenta de aplicación, cuentas con FILE/SUPER; roles de lectura/escritura/DDL e informe de privilegios. Sin interrupción.
  • Audit: ¿quién hizo qué? — El auditor pide un registro de sesiones y consultas. MySQL Community no incluye audit integrado: Enterprise Audit, Audit Log Filter de Percona Server u opciones limitadas para Community. Licencia: Enterprise Audit solo viene con la suscripción a MySQL Enterprise; Percona Audit Log Filter es gratuito.
  • Cifrar los datos en disco (cifrado de tablespaces InnoDB, keyring) — Cifrado de tablas, redo, undo y binlog frente al robo de un disco o de una copia de backup; un reinicio para instalar el keyring component y el tiempo del ALTER en tablas grandes. También está en Community sin licencia; los keyrings cifrados/KMS son de Enterprise.
  • Seguridad de los backups (backup cifrado, login-path, permisos) — Backups sin cifrar o en un directorio legible por todos, contraseña en texto plano en el script; mysqldump + GPG o XtraBackup --encrypt, cuenta de backup y login-path.
  • Lado del sistema operativo (cuenta de servicio, permisos, core dump, SELinux) — El directorio de datos o los archivos de certificado están abiertos a otros usuarios, secure_file_priv vacío, local_infile activado, SELinux desactivado. Algunos ajustes surten efecto al reiniciar.
  • Parches y versión: ¿estoy en una versión soportada? — Versión, fin de soporte (8.0 terminó en abril de 2026) y actualizaciones pendientes; para aplicarlas enlaza con la guía de upgrade. Solo lectura.

Antes de empezar

  • MySQL … está en marcha y, como root en el servidor, el comando mysql entra sin contraseña (root@localhost con auth_socket o un login-path client creado con mysql_config_editor). Si la instalación se hizo con la guía de instalación de MySQL, esto ya está listo. El SQL de los pasos se ejecuta como root mediante mysql -t.
  • Hay dos sesiones SSH distintas abiertas en el servidor; en una de ellas queda abierto el cliente mysql. Tras cambiar el host de las cuentas, require_secure_transport y el firewall, pruebe una conexión nueva en otra sesión; no cierre las sesiones anteriores hasta ver que funciona. El acceso de root@localhost por socket no cambia en ningún momento en esta guía: siempre queda como vía de vuelta.
  • Ventana de mantenimiento: en las áreas elegidas se reiniciará MySQL (bind_address, keyring component, plugin de audit, límite de core dump). En entornos con réplicas, aplíquelo primero en las réplicas.
  • La lista de todas las aplicaciones que se conectan a MySQL (IP de los servidores, cuentas, versiones de los drivers). El paso de auditoría muestra las conexiones actuales; un cliente que no esté en la lista no podrá conectarse tras la restricción.
  • Existe un backup actual con restauración probada (lógico o XtraBackup). Si se pierde el archivo de keyring, el paso de cifrado (TDE) deja los datos ilegibles: haga el backup ANTES del keyring.

Fases de la guía

  • Auditoría de estado (solo lectura) — Listar los hallazgos dentro de la base de datos · Auditar el lado del sistema operativo
  • Antes de empezar: punto de retorno — Copiar la configuración, las cuentas y los privilegios actuales · Activar el directorio de configuración adicional
  • Privilegios — 1. Diagnóstico — Mostrar los privilegios de las cuentas
  • Privilegios — 3. Aplicación — Crear los roles y concederles privilegios · Crear las cuentas y asignarles los roles · Retirar los privilegios directos de la cuenta de aplicación · Informe de privilegios
  • Privilegios — 4. Verificación — Verificar que los privilegios efectivos no incluyen DDL · Prueba de DDL desde el servidor de aplicación
  • Privilegios — 5. Después — Mantener bloqueada la cuenta de migration cuando no se usa
  • Autenticación — 1. Diagnóstico — Mostrar los plugins de autenticación, la configuración de contraseñas y las cuentas por defecto
  • Autenticación — 2. Red de seguridad — Comprobar la compatibilidad de los drivers
  • Autenticación — 3. Aplicación — Eliminar las cuentas anónimas, el root remoto y la base de datos test · Configurar la política de contraseñas (validate_password, historial) · Migrar las cuentas mysql_native_password a caching_sha2_password · Crear la cuenta personal de DBA
  • Autenticación — 4. Verificación — Verificar el estado de las cuentas · Probar el acceso como root desde el servidor de aplicación
  • TLS — 1. Diagnóstico — Mostrar la configuración TLS actual y los clientes sin cifrar
  • TLS — 3. Aplicación — Crear la CA de prueba y el certificado del servidor · Crear la clave y la solicitud de firma (CSR) · Instalar el certificado firmado · Verificar el certificado y la clave · Asignar la etiqueta SELinux · Pasar el servidor al nuevo certificado (sin interrupción) …
  • TLS — 4. Verificación — Verificar que se rechazan las conexiones sin cifrar
  • TLS — 5. Después: renovación del certificado — Procedimiento de renovación del certificado
  • Red — 1. Diagnóstico: ¿quién se conecta y desde dónde? — Mostrar la dirección de escucha, los hosts de las cuentas y los clientes activos
  • Red — 3. Aplicación — Restringir las cuentas con host '%' a la red de aplicación · Restringir la dirección de escucha (efectivo tras el reinicio) · Abrir el puerto en el firewall solo a las redes permitidas · Reiniciar MySQL para aplicar la dirección de escucha
  • Red — 4. Verificación — Probar la conexión desde el servidor de aplicación (sesión nueva)
  • Audit — 1. Diagnóstico — Mostrar los plugins de audit y la configuración de logs
  • Audit — 3. Aplicación — Community: registrar los inicios de sesión fallidos y el texto de las sentencias DML · Instalar el plugin Enterprise Audit · Definir los filtros de Enterprise Audit · Instalar el componente Percona Audit Log Filter · Definir los filtros de audit de Percona · Reenviar el log de audit a un servidor central (rsyslog imfile) …
  • Audit — 4. Verificación — Hacer un cambio y ver su traza
  • Backup — 1. Diagnóstico — Mostrar el estado de cifrado de los backups y los archivos de contraseñas
  • Backup — 3. Aplicación — Crear la cuenta de backup con el mínimo privilegio · Guardar la contraseña en un login-path · Importar la clave pública GPG · Script de backup cifrado · Script de backup cifrado con XtraBackup · Archivo de clave, directorio de backups y prueba manual …
  • Backup — 4. Verificación — Comprobar que el backup cifrado se puede abrir
  • Sistema operativo — 1. Diagnóstico — Cuenta de servicio, permisos, privilegios de archivos y SELinux
  • Sistema operativo — 3. Aplicación — Limitar la importación/exportación de archivos · Corregir los permisos del directorio de datos y de los archivos de clave · Desactivar los core dumps · Recargar systemd y reiniciar MySQL · Evitar que las contraseñas acaben en el historial de comandos · Mantener SELinux en Enforcing
  • Sistema operativo — 4. Verificación — Verificar los cambios
  • Cifrado — 1. Diagnóstico — Mostrar el estado del keyring y del cifrado
  • Cifrado — 2. Red de seguridad — Backup completo antes de cifrar
  • Cifrado — 3. Aplicación — Escribir el manifest del keyring component · Preparar el directorio y la configuración del keyring · Reiniciar para cargar el keyring · Activar el cifrado de redo, undo, binlog y tablas nuevas · Cifrar las tablas de la base de datos de la aplicación · Hacer backup del archivo de keyring
  • Cifrado — 4. Verificación — Verificar el cifrado y el keyring
Abrir el plan paso a paso para su entorno →