Translate

viernes, 6 de febrero de 2026

Seguridad y Mantenimiento de la Base de Datos

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

Tipo

Descripción

Ejemplo

SELECT

Leer datos

GRANT SELECT ON clientes TO usuario;

INSERT

Agregar registros

GRANT INSERT ON pedidos TO usuario;

UPDATE

Modificar registros

GRANT UPDATE ON productos TO usuario;

DELETE

Eliminar registros

GRANT DELETE ON pedidos TO usuario;

EXECUTE

Ejecutar funciones o procedimientos

GRANT EXECUTE ON sp_backup TO admin;


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

  1. Usar consultas parametrizadas o prepared statements.


# Ejemplo en Python con psycopg2

cur.execute("SELECT * FROM usuarios WHERE nombre = %s AND clave = %s", (user, password))

  1. Validar y sanitizar entradas.

    • Aceptar solo tipos esperados (números, fechas, correos, etc.).

    • Rechazar caracteres especiales o comillas innecesarias.

  2. Evitar concatenar strings en consultas.

  3. 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.



Respaldo y Recuperación (Backup & Recovery)

La recuperación ante fallos depende directamente de la estrategia de respaldo adoptada.
Un buen plan de backups asegura que la información pueda restaurarse ante:

  • Fallos del hardware.

  • Errores humanos.

  • Corrupción de datos.

  • Ataques o pérdida de información.


Estrategias de Respaldo

Tipo de Backup

Descripción

Ventajas

Desventajas

Full (Completo)

Copia total de la base de datos.

Restauración rápida, simple.

Consumo alto de tiempo y espacio.

Incremental

Copia solo los cambios desde el último backup (de cualquier tipo).

Rápido, eficiente.

Restauración más lenta (requiere varios archivos).

Diferencial

Copia los cambios desde el último backup completo.

Restauración más simple que incremental.

Tamaño intermedio.

Ejemplo (PostgreSQL):

pg_dump -U postgres -F c -f backup_full.dump nombre_bd

Ejemplo (MySQL):

mysqldump -u root -p --single-transaction nombre_bd > backup.sql


Planes de Recuperación ante Desastres (DRP – Disaster Recovery Plan)

Un DRP define los pasos para restaurar la operación del sistema tras un evento catastrófico.

Elementos clave de un DRP:

  1. Punto de Recuperación (RPO):
    Cantidad máxima de datos que se puede perder (por ejemplo, 1 hora de transacciones).

  2. Tiempo de Recuperación (RTO):
    Tiempo máximo aceptable para restablecer el servicio.

  3. Ubicaciones redundantes:
    Copias de datos en diferentes regiones o centros de datos.

  4. Automatización de restauración:
    Scripts o herramientas que aceleren el proceso.

Ejemplo:
En AWS, se puede configurar RDS Cross-Region Replication y automated backups para recuperación rápida.


Automatización de Tareas de Mantenimiento

El mantenimiento preventivo garantiza que la base de datos se mantenga óptima y libre de problemas de rendimiento.

Tareas comunes:

Tarea

Descripción

Herramienta / Comando

Purga de datos

Eliminar registros obsoletos o temporales

DELETE o PARTITION DROP programado

Reconstrucción de índices

Reorganizar estructuras fragmentadas

REINDEX, ALTER INDEX REBUILD

Actualización de estadísticas

Mantener planes de ejecución óptimos

ANALYZE, UPDATE STATISTICS

Vacuum (PostgreSQL)

Reclaim de espacio y optimización

VACUUM FULL

Backup programado

Ejecución automática de respaldos

cron, pgAgent, SQL Server Agent

Ejemplo de cron diario (Linux):

0 2 * * * pg_dump -U postgres -F c -f /backups/backup_$(date +\%F).dump nombre_bd



Buenas prácticas de mantenimiento

  • Automatizar todas las tareas críticas (respaldo, vacuum, reindex).
  • Probar periódicamente los backups restaurándolos en entornos de prueba.
  • Monitorear espacio en disco y logs de errores.
  • Revisar alertas del motor (errores de I/O, locks, estadísticas viejas).