CHECKLIST DEFINITIVO DE SEGURIDAD EN MYSQL PARA DBAS

Un Database Administrator (DBA) no solo se encarga de que la base de datos funcione: su rol en seguridad es crítico para proteger la información. En el ecosistema MySQL (incluido MySQL Community, Enterprise Edition y herramientas oficiales o de terceros), las actividades core de seguridad se centran en proteger los datos en reposo, en tránsito y durante su uso, cumpliendo con los principios de confidencialidad, integridad y disponibilidad.

Transparent Data Encryption (TDE)

En MySQL Enterprise Edition se dispone de Transparent Data Encryption, que permite cifrar archivos de datos e índices a nivel de tablespace sin modificar las aplicaciones. El DBA configura y gestiona las claves de cifrado, rota claves cuando es necesario y garantiza que los backups también estén protegidos.

Ejemplo MySQL (Enterprise):

-- Crear un tablespace cifrado
CREATE TABLESPACE encrypted_ts
  ADD DATAFILE 'encrypted_ts.ibd'
  ENCRYPTION = 'Y';

-- Crear una tabla en el tablespace cifrado
CREATE TABLE clientes (
  id INT PRIMARY KEY,
  nombre VARCHAR(100),
  documento VARCHAR(20)
) TABLESPACE = encrypted_ts;

Data Discovery & Classification

Antes de aplicar controles de seguridad, es fundamental conocer qué datos existen y su sensibilidad. El DBA utiliza consultas sobre el diccionario de datos para identificar columnas potencialmente sensibles.

Ejemplo MySQL:

-- Buscar columnas que probablemente contengan datos sensibles
SELECT 
  TABLE_SCHEMA,
  TABLE_NAME,
  COLUMN_NAME,
  DATA_TYPE,
  COLUMN_COMMENT
FROM information_schema.COLUMNS
WHERE COLUMN_NAME REGEXP 'nombre|apellido|email|telefono|documento|tarjeta|ssn|password|clave'
  AND TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys')
ORDER BY TABLE_SCHEMA, TABLE_NAME;

Data Masking

El enmascaramiento de datos permite mostrar versiones ofuscadas de información sensible en entornos de desarrollo o reportes. Se puede implementar con vistas o funciones.

Ejemplo MySQL:

-- Vista con datos enmascarados
CREATE VIEW vista_clientes_mask AS
SELECT 
  id,
  CONCAT(LEFT(nombre, 1), '****') AS nombre_mask,
  CONCAT('****-****-****-', RIGHT(tarjeta, 4)) AS tarjeta_mask,
  CONCAT(LEFT(email, 2), '***@***', SUBSTRING_INDEX(email, '@', -1)) AS email_mask
FROM clientes;

-- Consulta segura
SELECT * FROM vista_clientes_mask;

Auditoría y monitoreo de accesos

La auditoría registra quién accedió a qué datos y cuándo. Se puede utilizar el plugin de auditoría (Enterprise) o alternativas con performance_schema y logs.

Ejemplo MySQL (habilitar auditoría básica):

-- Activar el general log temporalmente (solo para pruebas)
SET GLOBAL general_log = 'ON';
SET GLOBAL log_output = 'TABLE';

-- Consultar los accesos registrados
SELECT 
  event_time,
  user_host,
  argument
FROM mysql.general_log
WHERE command_type = 'Query'
ORDER BY event_time DESC
LIMIT 20;

-- Desactivar después de usarlo
SET GLOBAL general_log = 'OFF';

Row-Level Security y cifrado a nivel de columna

Aunque MySQL no tiene RLS nativo completo, se puede simular con vistas y roles. Para cifrado de columnas se utiliza AES_ENCRYPT / AES_DECRYPT.

Ejemplo MySQL – Cifrado de columna:

-- Insertar dato cifrado
INSERT INTO empleados (id, nombre, salario_cifrado)
VALUES (1, 'Ana López', AES_ENCRYPT('4500.00', 'MiClaveSecreta2026'));

-- Consultar dato descifrado (solo usuarios autorizados)
SELECT 
  id,
  nombre,
  AES_DECRYPT(salario_cifrado, 'MiClaveSecreta2026') AS salario
FROM empleados;

Ejemplo MySQL – Simulación de Row-Level Security:

-- Vista que restringe filas según el usuario
CREATE VIEW vista_pedidos_usuario AS
SELECT *
FROM pedidos
WHERE vendedor = SUBSTRING_INDEX(CURRENT_USER(), '@', 1);

-- El usuario solo verá sus propios pedidos
SELECT * FROM vista_pedidos_usuario;