Skip to content

6. Hardening de servidores de bases de datos

Ya conectamos cada control técnico con la obligación legal que lo exige. Falta la última capa: el servidor mismo, en sus tres capas — motor, sistema operativo, red.

Hardening (endurecimiento de configuración) es el proceso de reducir la superficie de ataque de un sistema: eliminar o deshabilitar todo lo que no es estrictamente necesario para que el sistema cumpla su función, de forma que quede menos espacio para que algo salga mal. Un DBA no solo instala el motor: decide qué parte de esa instalación por defecto se queda y cuál se apaga. Esa decisión continua es hardening.

Una base de datos no funciona de manera aislada. Cada capa puede introducir riesgos:

Datos
↓
Motor de BD
↓
Sistema operativo
↓
Red
↓
Infraestructura

El hardening incluye eliminar configuraciones innecesarias, restringir accesos, proteger servicios y archivos, reducir exposición, aplicar actualizaciones, registrar eventos y establecer una línea base.

Más servicios
+
Más puertos
+
Más usuarios
+
Más permisos
+
Más interfaces
=
Mayor superficie de ataque

El hardening busca reducirla sin afectar la función necesaria.

Instalación funcional contra instalación segura

Section titled “Instalación funcional contra instalación segura”

Una instalación funcional no necesariamente es una instalación segura. La pregunta no es “¿funciona?”, sino:

¿Funciona con la menor exposición razonable?

FuncionalSegura
Permite conexionesPermite conexiones necesarias
Muchos servicios activosServicios necesarios
Acceso amplioAcceso restringido
Configuración predeterminadaConfiguración revisada
Privilegios ampliosMínimo privilegio
Sin línea baseLínea base documentada

Una instalación funcional es solamente el punto de partida. Una configuración segura por defecto implica escuchar solamente donde sea necesario, deshabilitar funciones no utilizadas, evitar cuentas innecesarias, restringir accesos y utilizar autenticación adecuada.

Referencia. Saltzer y Schroeder (1975), ISO/IEC 27002:2022.

Cuentas, servicios y extensiones innecesarias

Section titled “Cuentas, servicios y extensiones innecesarias”

Durante el hardening deben revisarse cuentas, roles, servicios, procesos, extensiones, módulos, puertos e interfaces. Antes de eliminar algo:

  1. identificar su función
  2. determinar dependencias
  3. evaluar impacto
  4. aplicar el cambio
  5. verificar

Los ambientes de desarrollo, pruebas y producción no deberían tratarse como uno solo. Deben controlarse por separado los datos, las credenciales, los accesos, las configuraciones, los permisos y las conexiones.

Los datos reales de producción no deberían copiarse directamente a desarrollo sin controles apropiados de protección y transformación (ver 3. Protección de datos sensibles).

Todo gestor de base de datos separa cuatro tipos de archivo. Un DBA necesita saber dónde está cada uno antes de tocar cualquier parámetro:

  • Archivos de datos — donde vive el contenido real de las tablas o colecciones.
  • Archivos de configuración — cómo se comporta el motor: puerto, memoria, quién puede conectarse.
  • Registro de escritura — bitácora de cambios antes de aplicarlos al archivo de datos. Da durabilidad ante una caída.
  • Archivos de autenticación y metadatos — quién puede conectarse y con qué método, versión del motor que creó los archivos.

Rutas habituales en una instalación de paquete

Section titled “Rutas habituales en una instalación de paquete”

En instalaciones mediante paquetes Debian/Ubuntu, las rutas habituales son:

ElementoPostgreSQLMongoDB
Configuración principal/etc/postgresql/16/main/postgresql.conf/etc/mongod.conf
Control de acceso/etc/postgresql/16/main/pg_hba.confRoles y autorización
Identificación/etc/postgresql/16/main/pg_ident.conf—
Directorio de datos/var/lib/postgresql/16/main//var/lib/mongodb/
Logs/var/log/postgresql//var/log/mongodb/
Log principal/var/log/postgresql/postgresql-16-main.log/var/log/mongodb/mongod.log
Serviciopostgresql@16-main.servicemongod.service
Puerto543227017

Las rutas pueden cambiar según versión, distribución y método de instalación. El directorio de datos no debe utilizarse como un directorio común de intercambio de archivos, y los logs ayudan a detectar conexiones, desconexiones, errores, problemas de autenticación y eventos administrativos.

PostgreSQL: estructura del directorio de datos (PGDATA)

Section titled “PostgreSQL: estructura del directorio de datos (PGDATA)”

Ruta típica en Docker: /var/lib/postgresql/data. En una instalación de paquete Debian o Ubuntu: /var/lib/postgresql/16/main.

Elemento dentro de PGDATAQué contiene
base/Un subdirectorio por base de datos, nombrado por su OID.
base/<oid>/<relfilenode>El archivo real de cada tabla o índice — el nombre es un identificador interno, no el nombre de la tabla.
global/Catálogos compartidos por todo el clúster: roles, lista de bases.
pg_wal/Write Ahead Log — cada cambio se escribe aquí antes que en el archivo de la tabla.
PG_VERSIONVersión mayor de PostgreSQL que creó este directorio.
postgresql.confConfiguración principal del motor.
postgresql.auto.confCambios hechos con ALTER SYSTEM — se sobreponen a postgresql.conf.
pg_hba.confQuién puede conectarse, desde dónde y con qué método.
pg_ident.confMapeo de usuarios del sistema operativo a roles de PostgreSQL.

Cada tabla se guarda en páginas fijas de 8 KB. Un valor muy grande no cabe en la página y se mueve a una estructura aparte llamada TOAST, transparente para quien consulta.

Referencia. PostgreSQL Documentation, “Database File Layout”, secc. 65.1.

MongoDB: dónde y cómo se almacenan realmente los datos

Section titled “MongoDB: dónde y cómo se almacenan realmente los datos”

Ruta típica de dbPath: /var/lib/mongodb en paquete Debian o Ubuntu, /data/db en instalación manual o en la imagen oficial de Docker.

Un documento no vive como un archivo JSON suelto. MongoDB usa el motor de almacenamiento WiredTiger (por defecto desde la versión 3.2), que organiza los documentos BSON dentro de sus propias estructuras internas en disco.

Elemento dentro de dbPathQué contiene
collection-<id>.wtUn archivo binario por colección, con páginas tipo B-tree gestionadas por WiredTiger, comprimidas por defecto con snappy.
index-<id>.wtUn archivo por cada índice de esa colección.
WiredTiger.wtEl catálogo interno que mapea cada colección e índice a su archivo físico.
journal/El equivalente al WAL de PostgreSQL — WiredTiger registra aquí cada escritura antes de aplicarla.
WiredTigerHS.wtHistorial de snapshots, usado para lecturas consistentes bajo concurrencia.

Un documento BSON es la unidad lógica que ve la aplicación. Físicamente, WiredTiger nunca guarda un archivo por documento: varios documentos comparten las mismas páginas comprimidas dentro del archivo de su colección.

Referencia. MongoDB Manual, “WiredTiger Storage Engine”.

Archivo de configuración de MongoDB: mongod.conf

Section titled “Archivo de configuración de MongoDB: mongod.conf”

Ruta típica: /etc/mongod.conf. Formato YAML, no INI como postgresql.conf.

storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
systemLog:
destination: file
path: /var/log/mongodb/mongod.log
logAppend: true
net:
port: 27017
bindIp: 127.0.0.1
security:
authorization: enabled

A diferencia de PostgreSQL, que separa configuración general y control de acceso en dos archivos, MongoDB concentra todo en mongod.conf, organizado por secciones.

Comparativa de archivos: PostgreSQL contra MongoDB

Section titled “Comparativa de archivos: PostgreSQL contra MongoDB”
ConceptoPostgreSQLMongoDB
Directorio de datosPGDATA, /var/lib/postgresql/.../maindbPath, /var/lib/mongodb
Dónde vive cada tabla o colecciónbase/<oid_bd>/<relfilenode>archivo .wt por colección dentro de dbPath
Formato internopáginas de 8 KB, TOAST para valores grandespáginas B-tree de WiredTiger, comprimidas, documentos BSON
Registro de escriturapg_wal/journal/
Configuración principalpostgresql.confmongod.conf, formato YAML
Control de accesopg_hba.conf, archivo separadosección security y net dentro de mongod.conf
Metadatos de versiónPG_VERSIONWiredTiger.wt, catálogo

Parámetros críticos que un DBA debe conocer

Section titled “Parámetros críticos que un DBA debe conocer”

El DBA debe revisar parámetros relacionados con conexiones, interfaces, autenticación, autorización, logging, TLS, límites, extensiones, archivos y almacenamiento. La configuración debe documentarse.

pg_hba.conf es uno de los archivos más importantes para el control de acceso en PostgreSQL. Una regla determina tipo de conexión, base de datos, usuario, origen y método de autenticación:

host db_app usuario_app red_autorizada scram-sha-256

En MongoDB, autenticación (¿quién eres?) y autorización (¿qué puedes hacer?) son conceptos diferentes. La autorización basada en roles permite limitar las operaciones disponibles para cada usuario.

Parámetro en postgresql.confPor defectoQué decide el DBA
port5432Cambiarlo retrasa escaneos automáticos, no sustituye el control de acceso.
listen_addresseslocalhost, en el paquete upstreamRestringir a las IP que realmente necesitan conectarse.
max_connections100Evita agotamiento de memoria, también es un vector de disponibilidad.
superuser_reserved_connections3Garantiza acceso del DBA durante un incidente.
password_encryptionscram-sha-256 desde PG 14Verificar que no quede en md5.
statement_timeoutSin límiteCorta sesiones colgadas que agotan conexiones.
shared_preload_librariesVacíoCada extensión cargada es superficie de ataque adicional.

Cambiar el puerto por defecto es seguridad por oscuridad — el mismo principio de Kerckhoffs del tema 4: no reemplaza pg_hba.conf ni un firewall.

Parámetro en mongod.confPor defectoQué decide el DBA
net.port27017Mismo matiz que en PostgreSQL.
net.bindIp127.0.0.1 desde la versión 3.6Ampliarlo solo a las IP necesarias, nunca a 0.0.0.0 en producción.
net.maxIncomingConnections65536Equivalente a max_connections, dimensionar.
security.authorizationdisabledDebe quedar enabled (ver tema 2).
setParameter.enableLocalhostAuthBypasstrueDeshabilitar una vez creado el primer usuario.
security.javascriptEnabledtrueDeshabilitar si la app no usa $where o mapReduce.

MongoDB 3.6 cambió bindIp a localhost por defecto como respuesta directa a incidentes como el de 2017 (ver más abajo). El --auth con publicación abierta que usan los laboratorios de este curso deshace ese default seguro por conveniencia de laboratorio, no porque MongoDB venga inseguro por naturaleza.

Referencia. MongoDB Manual, “Configuration File Options”, MongoDB Engineering Blog.

ElementoPostgreSQLMongoDB
Clientepsqlmongosh
Serviciopostgresql@16-mainmongod
Puerto543227017
Configuraciónpostgresql.confmongod.conf
Control de accesopg_hba.confRoles + autorización
Datos/var/lib/postgresql/16/main//var/lib/mongodb/
Logs/var/log/postgresql//var/log/mongodb/
Estadopg_isreadyconexión con mongosh
Redlisten_addressesbindIp
Comunicación seguraTLSTLS

No son equivalencias funcionales exactas. Utiliza esta tabla como referencia durante las prácticas, no como sustituto de la documentación oficial del motor.

Lo mínimo que un DBA debe conocer del sistema operativo

Section titled “Lo mínimo que un DBA debe conocer del sistema operativo”

Esto no reemplaza al equipo de infraestructura. Es la base que un DBA necesita para no depender de otro equipo en una emergencia.

ElementoEn qué consiste
Actualizaciones automáticasParches de seguridad del sistema operativo aplicados sin depender de que alguien lo recuerde — por ejemplo, unattended-upgrades en Debian o Ubuntu.
SSH endurecidoPermitRootLogin no, PasswordAuthentication no, dentro de /etc/ssh/sshd_config. Solo acceso por llave, nunca root directo.
Firewall de hostufw o firewalld como complemento del firewall de red, no como sustituto.
Cuentas de usuarioSin cuentas compartidas. Acceso administrativo vía sudo, nunca sesión root compartida entre varias personas.
Protección contra fuerza brutafail2ban o equivalente sobre el servicio SSH.
MAC a nivel de sistema operativoSELinux o AppArmor — el modelo MAC del tema 2 aplicado al sistema operativo, no solo a la base de datos.
ElementoQué implica
Usuario del servicioPostgreSQL corre como postgres, MongoDB como mongodb, nunca como root.
Permisos de archivos de configuraciónpostgresql.conf, pg_hba.conf y mongod.conf, con chmod 600, propietario del servicio.
Permisos de datos y respaldosDirectorio de datos con chmod 700 — un respaldo sin cifrar y con permisos abiertos deshace el cifrado en reposo del tema 4.
Gestión de parchesParchar el motor y parchar el sistema operativo son procesos distintos que el DBA debe coordinar.

El proceso del motor no debería ejecutarse como root: si un servicio es comprometido, sus privilegios deben estar limitados.

Un respaldo contiene información que puede ser tan sensible como la base de datos original. Debe protegerse su acceso, almacenamiento, transmisión, cifrado, retención y eliminación.

¿Qué ocurriría si un atacante obtiene nuestro respaldo?

No todos los usuarios deben administrar el servidor. Deben controlarse las cuentas administrativas, el acceso remoto, los privilegios, sudo, el acceso al sistema operativo y el acceso a la base de datos.

Principio. Administrar una base de datos no implica administrar todo el servidor.

ElementoEn qué consiste
SegmentaciónEl servidor vive en una subred privada, nunca expuesto directamente a internet.
FirewallSolo el servidor de aplicación tiene regla de entrada al puerto del motor.
Listas de control de accesopg_hba.conf o bindIp más firewall trabajan juntos — defensa en profundidad, no alternativas entre sí.
Acceso administrativoPor túnel SSH o VPN, mismo mecanismo ya visto en el tema 4.

Una allowlist define explícitamente qué orígenes están autorizados.

Servidor de aplicación
↓
TCP 5432
↓
Servidor PostgreSQL

en lugar de:

Cualquier origen
↓
TCP 5432
↓
Servidor PostgreSQL

Una política básica de firewall se expresa como “permitir lo necesario y bloquear lo innecesario”. Es preferible autorizar explícitamente lo necesario.

Un servidor de base de datos no necesita estar expuesto directamente a Internet. El acceso administrativo puede realizarse mediante redes privadas, VPN, túneles seguros, bastiones o canales administrativos controlados. El puerto del motor no debería exponerse públicamente si la operación no lo requiere.

Cuando una conexión falla, analiza por capas:

Cliente → Conectividad → Firewall → Puerto → Servicio
→ Configuración → Autenticación → Autorización → Permisos

No cambies cinco configuraciones al mismo tiempo. Primero identifica dónde está el problema.

ElementoPor qué importa
Cuentas de ejemploDeshabilitar cualquier usuario o base de datos de demostración que venga con la instalación por defecto.
Revisión periódica de extensionesNo basta con revisar al instalar — una extensión puede agregarse meses después sin que nadie lo documente.
Swap del sistema operativoSi el motor puede paginar datos sensibles a memoria virtual, un swap sin cifrar filtra esos datos fuera del control del motor.
Aislamiento del usuario del servicioEl usuario del sistema operativo que corre el motor solo debe tener permisos sobre su propio directorio de datos.

Una línea base (baseline) de configuración segura es un documento de referencia — normalmente un checklist — contra el que se compara la configuración real de un servidor. El CIS PostgreSQL Benchmark, del Center for Internet Security, es un ejemplo público y ampliamente usado de este tipo de checklist para PostgreSQL (REF-U2-11). Documentar los cambios de seguridad realizados y revisar la configuración periódicamente son parte integral de mantener esa línea base vigente.

Sin línea base es difícil determinar si un servidor continúa endurecido.

Estado inicial
↓
Hardening
↓
Estado esperado

Una línea base puede definir usuarios autorizados, servicios necesarios, puertos e interfaces permitidos, autenticación requerida, privilegios, archivos protegidos, logging, actualizaciones y reglas de firewall. La línea base debe ser verificable.

CapaVerificaciones
Sistema operativoUsuarios identificados, privilegios revisados, acceso administrativo restringido, servicios innecesarios deshabilitados, actualizaciones aplicadas, logs disponibles.
Base de datosUsuarios y roles revisados, privilegios mínimos, conexiones restringidas, autenticación configurada, TLS evaluado, logging revisado.
RedPuertos necesarios identificados, origen permitido definido, firewall configurado, exposición pública evaluada.

Todo cambio relevante debe registrar:

¿Qué se cambió?
¿Por qué?
¿Quién lo realizó?
¿Cuándo?
¿Qué riesgo reduce?
¿Cómo se verificó?
¿Qué impacto tuvo?
¿Cómo revertirlo?

Esto convierte una modificación técnica en un cambio administrado.

Revisión periódica y deriva de configuración

Section titled “Revisión periódica y deriva de configuración”

El hardening no es una actividad de una sola vez. Cambian el software, los usuarios, los servicios, las aplicaciones, las vulnerabilidades, los requisitos y la arquitectura. Con el tiempo, nuevos servicios, usuarios, puertos o configuraciones modificadas alejan al servidor de su línea base: eso es deriva de configuración, y la revisión periódica busca detectarla.

¿El servidor sigue cumpliendo la línea base seis meses después?

El hardening debe producir evidencia. La evidencia debe demostrar el cambio, por ejemplo:

ElementoCapaAntesDespués
Puerto publicado por el contenedorHostAbierto a todoRestringido a red interna
listen_addresses o bindIpMotor* o 0.0.0.0Solo las necesarias
pg_hba.confMotorAcepta cualquier origenRestringido a rango de red
Extensiones no usadasMotorPueden estar instaladasEliminadas
Cuentas de ejemploMotorPresentesDeshabilitadas
SSHSistema operativoAcepta contraseña y rootSolo llave, sin root directo

Caso real: MongoDB sin autenticación (2017)

Section titled “Caso real: MongoDB sin autenticación (2017)”

Miles de instancias MongoDB expuestas en internet sin autenticación habilitada fueron secuestradas por atacantes en cuestión de horas, antes de que la versión 3.6 cambiara el default de bindIp (REF-U2-13). La configuración por defecto de un SGBD no es una configuración segura.

Ningún hardening inicial es suficiente si el software nunca se actualiza: las vulnerabilidades conocidas siguen siendo explotables mientras el parche correspondiente no se aplique. El reporte oficial de la GAO (Government Accountability Office de Estados Unidos) sobre la brecha de datos de Equifax en 2017 —una de las más grandes de la historia, con información de más de 145 millones de personas comprometida— identificó fallas relacionadas con identificación y detección de vulnerabilidades, segmentación del acceso a las bases de datos, y gobierno de los datos como parte de las causas que permitieron el ataque (REF-U2-12).

Pero actualizar también requiere control:

Identificar → Evaluar → Probar → Aplicar → Verificar → Documentar

El DBA debe conocer la versión instalada, la versión disponible, las vulnerabilidades relevantes, la dependencia con aplicaciones, la ventana de mantenimiento, el procedimiento de reversión y la evidencia posterior. No basta con decir “está actualizado”: debe poder demostrarse.

La seguridad debe combinar controles. Si una capa falla, otras pueden limitar el impacto.

Datos → Roles y privilegios → Motor de BD → Sistema operativo
→ Firewall → Segmentación → Red

El principio de mínimo privilegio aplica en todas las capas:

CapaEjemplo
Base de datosGRANT SELECT
Sistema operativosudo systemctl reload postgresql
RedPermitir únicamente el origen autorizado

Un servidor endurecido combina usuarios, privilegios, configuración, archivos, servicios, red, logs, parches y línea base. Ningún control individual resuelve todos los riesgos.

Preguntar → Observar → Decidir → Cambiar → Verificar → Documentar

El objetivo no es memorizar comandos, sino aprender a tomar decisiones de administración segura. La evidencia de hardening puede incluir comandos ejecutados, configuración antes y después, servicios activos, puertos abiertos, permisos, usuarios, reglas de acceso, logs y pruebas de conexión. Una evidencia debe permitir que otra persona comprenda qué ocurrió.

Actividad 7 — Reducción de superficie de ataque. Identifica servicios activos y puertos, relaciona puertos y procesos, revisa configuraciones, identifica componentes innecesarios, analiza privilegios, aplica cambios controlados, verifica el funcionamiento y documenta la evidencia. Instrucciones completas en la Actividad 7, guía técnica en el Laboratorio 4.

  • The PostgreSQL Global Development Group, “Database File Layout”, secc. 65.1.
  • MongoDB Manual, “WiredTiger Storage Engine”, “Configuration File Options”.
  • The PostgreSQL Global Development Group, cap. 20 “Client Authentication” (REF-U2-02).
  • Center for Internet Security, CIS PostgreSQL Benchmark (REF-U2-11).
  • U.S. GAO, GAO-18-559, caso Equifax (REF-U2-12).
  • The Register, ataques a MongoDB sin autenticación (2017) (REF-U2-13).

Ver Referencias de la unidad para la ficha completa de cada fuente.

Ya protegimos clientes en las tres capas: acceso, datos y servidor. Revisa el cierre de la unidad antes de avanzar a la Unidad 3.