La seguridad es uno de los pilares más importantes de la administración de bases de datos.
El objetivo es proteger los datos contra accesos no autorizados, evitar ataques y preservar la integridad de la información.
Autenticación y Autorización (Roles y Permisos)
Autenticación
Proceso de verificar la identidad del usuario que intenta acceder a la base de datos.
Ejemplo:
En PostgreSQL:
CREATE USER app_user WITH PASSWORD 'segura123';
En MySQL:
CREATE USER app_user'@'localhost' IDENTIFIED BY 'segura123';
Buenas prácticas:
Usar contraseñas robustas.
Implementar autenticación integrada (LDAP, Active Directory, IAM).
Evitar el uso de cuentas compartidas.
Autorización
Define qué puede hacer cada usuario dentro del sistema, mediante roles y permisos.
Ejemplo:
CREATE ROLE ventas;
GRANT SELECT, INSERT ON pedidos TO ventas;
GRANT ventas TO app_user;
Principio del mínimo privilegio:
Otorgar solo los permisos estrictamente necesarios.
Tipos de permisos más comunes
Inyección SQL: Prevención
La inyección SQL (SQL Injection) es uno de los ataques más frecuentes en aplicaciones conectadas a bases de datos.
Consiste en insertar código SQL malicioso en campos de entrada para manipular consultas.
Ejemplo de ataque:
-- Entrada del usuario
' OR 1=1 --
-- Consulta final vulnerable
SELECT * FROM usuarios WHERE nombre = '' OR 1=1 --' AND clave = '';
Esto devuelve todos los usuarios.
Prevención
Usar consultas parametrizadas o prepared statements.
# Ejemplo en Python con psycopg2
cur.execute("SELECT * FROM usuarios WHERE nombre = %s AND clave = %s", (user, password))
Validar y sanitizar entradas.
Aceptar solo tipos esperados (números, fechas, correos, etc.).
Rechazar caracteres especiales o comillas innecesarias.
Evitar concatenar strings en consultas.
Restringir permisos del usuario de conexión.
Que el usuario de la aplicación tenga solo permisos de lectura/escritura, no de administración.
Cifrado de Datos Sensibles
El cifrado protege la confidencialidad de la información, incluso si el almacenamiento físico es comprometido.
1. Cifrado en Reposo
Protege los datos almacenados en disco (archivos, backups, logs).
Ejemplo:
PostgreSQL + pgcrypto:
SELECT pgp_sym_encrypt('123456789', 'claveSecreta');
SELECT pgp_sym_decrypt(columna_cifrada, 'claveSecreta');
MySQL:
SELECT AES_ENCRYPT('123456789', 'clave');
SELECT AES_DECRYPT(campo, 'clave');
2. Cifrado en Tránsito
Usar SSL/TLS para proteger las conexiones.
Configurar los clientes con sslmode=require.
3. Cifrado a nivel de columna o campo
Ideal para datos como contraseñas, documentos, tarjetas o DNIs.
Consejo:
Usar funciones de hash (como bcrypt o SHA-256) para contraseñas, no cifrado reversible.
