Cómo segregar la red de la base de datos de tu servidor de MU Online
Aísla la base de datos de cuentas, personajes e ítems de tu servidor de MU Online en una red propia, con acceso restringido por IP, cuentas de servicio con privilegio mínimo y cifrado en tránsito.
La base de datos es el activo más crítico de cualquier servidor de MU Online privado: en ella viven las cuentas, contraseñas (con hash), personajes, ítems, historial de transacciones y logs de moderación. Una filtración o compromiso de la base de datos no es solo un incidente técnico —es el fin de l
La base de datos es el activo más crítico de cualquier servidor de MU Online privado: en ella viven las cuentas, contraseñas (con hash), personajes, ítems, historial de transacciones y logs de moderación. Una filtración o compromiso de la base de datos no es solo un incidente técnico —es el fin de la confianza de la comunidad en el servidor. Segregar la red de la base de datos significa tratarla con un nivel de aislamiento y control por encima del resto de la infraestructura, incluso si la red general ya está segmentada. Este tutorial detalla cómo hacerlo en la práctica: aislamiento de red, cuentas de servicio con privilegio mínimo, cifrado en tránsito y backup seguro.
Por qué la base de datos merece aislamiento adicional
Incluso en una infraestructura ya segmentada (ConnectServer público, GameServer interno, base de datos interna), la base de datos suele ser el único componente donde un compromiso tiene un impacto catastrófico e irreversible —los ítems y el Zen pueden recrearse, pero los datos de cuenta filtrados (aunque con hash) y el historial de compras, no. Por eso la base de datos justifica una capa extra: red propia, cuentas de acceso más restringidas que las usadas por el GameServer para otros fines, y auditoría más rigurosa de quién accede y cuándo.
Aislando la base de datos en su propia subred
Incluso dentro de una VPC ya segmentada, coloca la base de datos en una subred dedicada, sin ruta de salida a internet (egress bloqueado por defecto, excepto hacia destinos de backup explícitamente liberados):
VPC: 10.0.0.0/16
├── Subred Pública: 10.0.1.0/24
├── Subred Aplicación: 10.0.2.0/24 → GameServer
└── Subred Base de Datos: 10.0.3.0/24 → MSSQL/MySQL (sin ruta a internet)
La ausencia de ruta de salida a internet significa que, aunque la base de datos sea comprometida, un atacante no puede exfiltrar datos fácilmente hacia afuera —primero necesitaría comprometer otro componente con ruta de salida, lo que agrega un paso extra de dificultad.
Reglas de firewall específicas para la base de datos
| Origen permitido | Puerto | Finalidad |
|---|---|---|
| IP interna del GameServer | 1433 (MSSQL) / 3306 (MySQL) | Lectura/escritura de cuentas, personajes, ítems |
| IP interna del sitio (solo lectura) | Mismo puerto, cuenta con permiso SELECT únicamente | Exhibición de ranking y datos públicos |
| Servidor de backup interno | Mismo puerto o puerto de replicación | Rutina de backup programada |
| Cualquier otro origen | — | Bloqueado |
Ninguna regla debe liberar el puerto de la base de datos a 0.0.0.0/0 (cualquier origen) bajo ninguna circunstancia —ese es el error de configuración más común y más grave encontrado en servidores privados comprometidos.
Cuentas de servicio con privilegio mínimo
Un error frecuente es usar la cuenta de administrador de la base de datos (sa en MSSQL, root en MySQL) directamente en la configuración del GameServer. En su lugar, crea cuentas de servicio dedicadas por finalidad:
-- MSSQL: cuenta de servicio para el GameServer, con permisos específicos
CREATE LOGIN gameserver_svc WITH PASSWORD = 'SenhaForteAleatoria!2026';
CREATE USER gameserver_svc FOR LOGIN gameserver_svc;
ALTER ROLE db_datareader ADD MEMBER gameserver_svc;
ALTER ROLE db_datawriter ADD MEMBER gameserver_svc;
-- Sin permiso de DROP, ALTER ni control del servidor
-- Cuenta separada, solo lectura, para el sitio/ranking
CREATE LOGIN site_readonly WITH PASSWORD = 'OutraSenhaForte!2026';
CREATE USER site_readonly FOR LOGIN site_readonly;
ALTER ROLE db_datareader ADD MEMBER site_readonly;
Con esta separación, aunque la credencial del sitio se filtre (por ejemplo, por una vulnerabilidad en el CMS), el atacante solo podrá leer datos, nunca alterar personajes, ítems o saldo de Zen.
Diferenciando cuenta de aplicación y cuenta de administración
| Cuenta | Uso | Permisos |
|---|---|---|
gameserver_svc | Usada por el proceso del GameServer | Lectura/escritura en las tablas de juego, sin DDL |
site_readonly | Usada por el sitio para ranking/estadísticas | Solo lectura |
dba_admin | Usada manualmente por administradores para mantenimiento | Privilegio total, pero login restringido por IP y con MFA cuando sea posible |
backup_svc | Usada por el job de backup programado | Permiso de backup únicamente (db_backupoperator), no de lectura de datos |
Nunca reutilices la misma credencial entre finalidades diferentes —esto elimina la posibilidad de rastrear qué componente realizó qué acción en caso de incidente.
Cifrando la conexión en tránsito
Activa TLS en la conexión entre el GameServer/sitio y la base de datos, especialmente si los componentes no están en la misma máquina física. Para MSSQL, esto se configura en el SQL Server Configuration Manager (Force Encryption) y en la cadena de conexión del GameServer:
[Database]
Server=10.0.3.10
Database=MuOnline
User=gameserver_svc
Password=SenhaForteAleatoria!2026
Encrypt=yes
TrustServerCertificate=no
Para MySQL, usa require_secure_transport=ON en la configuración del servidor y ssl-mode=REQUIRED en la cadena de conexión del cliente. El costo de rendimiento de TLS es bajo comparado con el riesgo de que credenciales y datos viajen en texto claro dentro de la red interna.
Backup seguro y aislado
El job de backup debe correr dentro del mismo segmento privado de la base de datos, nunca ser extraído desde afuera por una conexión de entrada. El flujo recomendado:
- El servidor de base de datos (o un servidor de backup interno en el mismo segmento) ejecuta el backup localmente, generando el archivo
.bak/dump. - Una regla de firewall de salida (egress), no de entrada, permite que ese servidor envíe el archivo a un destino externo (storage en la nube, otro centro de datos).
- El destino externo tiene control de acceso propio (cifrado en reposo, versionado, retención).
#!/bin/bash
# Ejecutado localmente en el segmento de la base de datos
BACKUP_FILE="/backups/mu_$(date +%Y%m%d).bak"
sqlcmd -S localhost -Q "BACKUP DATABASE MuOnline TO DISK='$BACKUP_FILE'"
# Envío a storage externo vía egress liberado específicamente para este destino
aws s3 cp "$BACKUP_FILE" s3://mu-backups-privado/ --sse AES256
Nunca abras un puerto de entrada en el segmento de la base de datos solo para permitir que un script externo "extraiga" el backup —eso reintroduce exactamente la exposición que la segregación debería eliminar.
Auditoría de acceso a la base de datos
Activa el registro de conexiones y consultas sensibles (login, DDL, permisos alterados) en la propia base de datos:
-- MSSQL: auditoría de login
CREATE SERVER AUDIT MuServerAudit
TO FILE (FILEPATH = 'C:\AuditLogs\')
WITH (ON_FAILURE = CONTINUE);
CREATE SERVER AUDIT SPECIFICATION MuLoginAudit
FOR SERVER AUDIT MuServerAudit
ADD (FAILED_LOGIN_GROUP), ADD (SUCCESSFUL_LOGIN_GROUP)
WITH (STATE = ON);
Revisa estos logs periódicamente (idealmente con alerta automática) para detectar intentos de login con cuentas inesperadas o desde IPs fuera de lo habitual.
Separando ambientes (producción, staging, desarrollo)
Nunca compartas la misma base de datos entre producción y ambientes de prueba. Una base de staging debe correr en su propia subred, con datos sintéticos o una copia anonimizada de producción (sin contraseñas reales, sin datos de pago), evitando que un error en un script de prueba afecte a jugadores reales.
| Ambiente | Red | Datos |
|---|---|---|
| Producción | Subred privada dedicada, acceso restringido | Datos reales de jugadores |
| Staging | Subred separada, aislada de producción | Copia anonimizada o datos sintéticos |
| Desarrollo local | Máquina del desarrollador, sin acceso externo | Solo datos sintéticos |
Errores comunes y soluciones
| Síntoma | Causa probable | Solución |
|---|---|---|
| Base de datos accesible desde cualquier IP | Regla de firewall con origen 0.0.0.0/0 | Restringe a orígenes específicos (GameServer, backup, sitio solo lectura) |
| Credencial de administrador usada por el GameServer | Configuración inicial usando sa/root directamente | Crea una cuenta de servicio con permisos mínimos (db_datareader/db_datawriter) |
| Datos viajando sin cifrado | TLS no habilitado en la cadena de conexión | Activa Encrypt=yes/ssl-mode=REQUIRED según el motor de base de datos |
| El backup expone un puerto de entrada en el segmento de la base de datos | Script externo "extrayendo" el backup vía conexión de entrada | Corre el backup localmente y envíalo vía egress liberado específicamente |
| Ambiente de staging usando la base de producción | Ausencia de una base de prueba separada | Aprovisiona una base de staging aislada con datos sintéticos o anonimizados |
Lista de verificación de segregación de la red de base de datos
- Base de datos en subred propia, sin ruta de salida por defecto a internet.
- Firewall liberando solo orígenes específicos (GameServer, backup, sitio solo lectura).
- Cuentas de servicio con privilegio mínimo, separadas por finalidad.
- TLS habilitado en la conexión entre la aplicación y la base de datos.
- Backup ejecutado localmente en el segmento, enviado vía egress controlado.
- Auditoría de login y acciones sensibles habilitada en la base de datos.
- Ambientes de producción, staging y desarrollo totalmente separados.
Con la base de datos debidamente aislada, revisa también la segmentación de los demás componentes de la infraestructura —consulta el tutorial de segmentación de la red del GameServer para garantizar que toda la cadena, desde el cliente hasta el dato más sensible, esté protegida de forma consistente.
Preguntas frecuentes
¿Cuál es la diferencia entre segmentar la red del GameServer y segregar la red de la base de datos?
Son complementarias. Segmentar la red del GameServer aísla los componentes de aplicación (ConnectServer, GameServer, sitio) entre sí; segregar la red de la base de datos va más allá, tratando la base de datos como el activo más crítico y aplicando controles adicionales específicos —cifrado, cuentas de servicio con privilegio mínimo, backup aislado.
¿Necesito un servidor de base de datos totalmente separado físicamente?
No necesariamente separado físicamente, pero sí lógicamente aislado —en una subred propia, sin ruta directa a internet, con firewall restringiendo quién puede conectarse. En proveedores de nube, esto se hace con subredes privadas y security groups, sin costo de hardware adicional.
¿Vale la pena cifrar la conexión entre el GameServer y la base de datos?
Sí, especialmente si ambos componentes no están en la misma máquina física o si la red interna no es totalmente confiable (ej. red compartida de un proveedor de hosting). TLS en la conexión de la base de datos (MSSQL/MySQL) tiene un costo de rendimiento bajo y evita que credenciales y datos viajen en texto claro.
¿Cómo hago backup de una base de datos aislada sin internet?
Configura el job de backup para correr localmente en el propio servidor de base de datos o en un servidor de backup dedicado dentro del mismo segmento privado, enviando los archivos generados a un destino externo (storage en la nube, otro centro de datos) a través de una regla de firewall de salida específica, no de entrada.
¿Una cuenta de base de datos con privilegio de administrador (sa/root) es realmente un problema si solo la usa el GameServer?
Sí. Si el GameServer se ve comprometido (por una vulnerabilidad de código, por ejemplo), un atacante con acceso a la credencial de administrador de la base de datos puede hacer cualquier cosa —eliminar tablas, exfiltrar todo, crear cuentas de acceso persistente. Una cuenta de servicio con permisos mínimos limita el daño posible incluso en ese escenario.