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;