Como segregar a rede do banco de dados do seu servidor de MU Online
Isole o banco de dados de contas, personagens e itens do seu servidor de MU Online em uma rede própria, com acesso restrito por IP, contas de serviço com privilégio mínimo e criptografia em trânsito.
O banco de dados é o ativo mais crítico de qualquer servidor de MU Online privado: nele vivem as contas, senhas (com hash), personagens, itens, histórico de transações e logs de moderação. Um vazamento ou comprometimento do banco não é apenas um incidente técnico — é o fim da confiança da comunidade
O banco de dados é o ativo mais crítico de qualquer servidor de MU Online privado: nele vivem as contas, senhas (com hash), personagens, itens, histórico de transações e logs de moderação. Um vazamento ou comprometimento do banco não é apenas um incidente técnico — é o fim da confiança da comunidade no servidor. Segregar a rede do banco de dados significa tratá-lo com um nível de isolamento e controle acima do resto da infraestrutura, mesmo que a rede geral já esteja segmentada. Este tutorial detalha como fazer isso na prática: isolamento de rede, contas de serviço com privilégio mínimo, criptografia em trânsito e backup seguro.
Por que o banco merece isolamento adicional
Mesmo em uma infraestrutura já segmentada (ConnectServer público, GameServer interno, banco interno), o banco costuma ser o único componente onde um comprometimento tem impacto catastrófico e irreversível — itens e Zen podem ser recriados, mas dados de conta vazados (mesmo com hash) e histórico de compras não. Por isso o banco justifica uma camada extra: rede própria, contas de acesso mais restritas que as usadas pelo GameServer para outras finalidades, e auditoria mais rigorosa de quem acessa e quando.
Isolando o banco em sua própria subnet
Mesmo dentro de uma VPC já segmentada, coloque o banco em uma subnet dedicada, sem rota de saída para a internet (egress bloqueado por padrão, exceto para destinos de backup explicitamente liberados):
VPC: 10.0.0.0/16
├── Subnet Pública: 10.0.1.0/24
├── Subnet Aplicação: 10.0.2.0/24 → GameServer
└── Subnet Banco: 10.0.3.0/24 → MSSQL/MySQL (sem rota à internet)
A ausência de rota de saída para a internet significa que, mesmo que o banco seja comprometido, um invasor não consegue facilmente exfiltrar dados diretamente para fora — ele precisaria antes comprometer outro componente com rota de saída, o que adiciona uma etapa extra de dificuldade.
Regras de firewall específicas para o banco
| Origem permitida | Porta | Finalidade |
|---|---|---|
| IP interno do GameServer | 1433 (MSSQL) / 3306 (MySQL) | Leitura/escrita de contas, personagens, itens |
| IP interno do site (somente leitura) | Mesma porta, conta com permissão SELECT apenas | Exibição de ranking e dados públicos |
| Servidor de backup interno | Mesma porta ou porta de replicação | Rotina de backup agendada |
| Qualquer outra origem | — | Bloqueado |
Nenhuma regra deve liberar a porta do banco para 0.0.0.0/0 (qualquer origem) em hipótese alguma — esse é o erro de configuração mais comum e mais grave encontrado em servidores privados comprometidos.
Contas de serviço com privilégio mínimo
Um erro frequente é usar a conta de administrador do banco (sa no MSSQL, root no MySQL) diretamente na configuração do GameServer. Em vez disso, crie contas de serviço dedicadas por finalidade:
-- MSSQL: conta de serviço para o GameServer, com permissões específicas
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;
-- Sem permissão de DROP, ALTER ou controle de servidor
-- Conta separada, somente leitura, para o site/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;
Com essa separação, mesmo que a credencial do site vaze (por exemplo, por uma vulnerabilidade no CMS), o invasor só consegue ler dados, nunca alterar personagens, itens ou saldo de Zen.
Diferenciando conta de aplicação e conta de administração
| Conta | Uso | Permissões |
|---|---|---|
gameserver_svc | Usada pelo processo do GameServer | Leitura/escrita nas tabelas de jogo, sem DDL |
site_readonly | Usada pelo site para ranking/estatísticas | Somente leitura |
dba_admin | Usada manualmente por administradores para manutenção | Privilégio total, mas login restrito por IP e com MFA quando possível |
backup_svc | Usada pelo job de backup agendado | Permissão de backup apenas (db_backupoperator), não de leitura de dados |
Nunca reutilize a mesma credencial entre finalidades diferentes — isso elimina a possibilidade de rastrear qual componente fez qual ação em caso de incidente.
Criptografando a conexão em trânsito
Ative TLS na conexão entre GameServer/site e o banco de dados, especialmente se os componentes não estiverem na mesma máquina física. Para MSSQL, isso é configurado no SQL Server Configuration Manager (Force Encryption) e na connection string do GameServer:
[Database]
Server=10.0.3.10
Database=MuOnline
User=gameserver_svc
Password=SenhaForteAleatoria!2026
Encrypt=yes
TrustServerCertificate=no
Para MySQL, use require_secure_transport=ON na configuração do servidor e ssl-mode=REQUIRED na string de conexão do cliente. O custo de performance do TLS é baixo comparado ao risco de credenciais e dados trafegando em texto claro dentro da rede interna.
Backup seguro e isolado
O job de backup deve rodar dentro do mesmo segmento privado do banco, nunca puxado de fora por uma conexão de entrada. O fluxo recomendado:
- O servidor de banco (ou um servidor de backup interno no mesmo segmento) executa o backup localmente, gerando o arquivo
.bak/dump. - Uma regra de firewall de saída (egress), não de entrada, permite que esse servidor envie o arquivo para um destino externo (storage em nuvem, outro datacenter).
- O destino externo tem controle de acesso próprio (criptografia at-rest, versionamento, retenção).
#!/bin/bash
# Executado localmente no segmento do banco
BACKUP_FILE="/backups/mu_$(date +%Y%m%d).bak"
sqlcmd -S localhost -Q "BACKUP DATABASE MuOnline TO DISK='$BACKUP_FILE'"
# Envio para storage externo via egress liberado especificamente para este destino
aws s3 cp "$BACKUP_FILE" s3://mu-backups-privado/ --sse AES256
Nunca abra uma porta de entrada no segmento do banco só para permitir que um script externo "puxe" o backup — isso reintroduz exatamente a exposição que a segregação deveria eliminar.
Auditoria de acesso ao banco
Ative logging de conexões e queries sensíveis (login, DDL, permissões alteradas) no próprio banco:
-- MSSQL: auditoria 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);
Revise esses logs periodicamente (idealmente com alerta automático) para detectar tentativas de login com contas inesperadas ou de IPs fora do padrão.
Separando ambientes (produção, staging, desenvolvimento)
Nunca compartilhe o mesmo banco entre produção e ambientes de teste. Um banco de staging deve rodar em sua própria subnet, com dados sintéticos ou uma cópia anonimizada de produção (sem senhas reais, sem dados de pagamento), evitando que um erro em um script de teste afete jogadores reais.
| Ambiente | Rede | Dados |
|---|---|---|
| Produção | Subnet privada dedicada, acesso restrito | Dados reais de jogadores |
| Staging | Subnet separada, isolada de produção | Cópia anonimizada ou dados sintéticos |
| Desenvolvimento local | Máquina do desenvolvedor, sem acesso externo | Dados sintéticos apenas |
Erros comuns e soluções
| Sintoma | Causa provável | Solução |
|---|---|---|
| Banco acessível de qualquer IP | Regra de firewall com origem 0.0.0.0/0 | Restrinja a origens específicas (GameServer, backup, site somente leitura) |
| Credencial de administrador usada pelo GameServer | Configuração inicial usando sa/root diretamente | Crie conta de serviço com permissões mínimas (db_datareader/db_datawriter) |
| Dados trafegando sem criptografia | TLS não habilitado na connection string | Ative Encrypt=yes/ssl-mode=REQUIRED conforme o SGBD |
| Backup expõe porta de entrada no segmento do banco | Script externo "puxando" o backup via conexão de entrada | Rode o backup localmente e envie via egress liberado especificamente |
| Ambiente de staging usando banco de produção | Ausência de banco de teste separado | Provisione um banco de staging isolado com dados sintéticos ou anonimizados |
Checklist de segregação da rede do banco de dados
- Banco em subnet própria, sem rota de saída padrão à internet.
- Firewall liberando apenas origens específicas (GameServer, backup, site somente leitura).
- Contas de serviço com privilégio mínimo, separadas por finalidade.
- TLS habilitado na conexão entre aplicação e banco.
- Backup executado localmente no segmento, enviado via egress controlado.
- Auditoria de login e ações sensíveis habilitada no banco.
- Ambientes de produção, staging e desenvolvimento totalmente separados.
Com o banco de dados devidamente isolado, revise também a segmentação dos demais componentes da infraestrutura — veja o tutorial de segmentação da rede do GameServer para garantir que toda a cadeia, do cliente até o dado mais sensível, está protegida de forma consistente.
Perguntas frequentes
Qual a diferença entre segmentar a rede do GameServer e segregar a rede do banco?
São complementares. Segmentar a rede do GameServer isola os componentes de aplicação (ConnectServer, GameServer, site) entre si; segregar a rede do banco vai além, tratando o banco de dados como o ativo mais crítico e aplicando controles adicionais específicos — criptografia, contas de serviço com privilégio mínimo, backup isolado.
Preciso de um servidor de banco de dados totalmente separado fisicamente?
Não necessariamente separado fisicamente, mas sim logicamente isolado — em uma subnet própria, sem rota direta à internet, com firewall restringindo quem pode se conectar. Em provedores de nuvem, isso é feito com subnets privadas e security groups, sem custo de hardware adicional.
Vale a pena criptografar a conexão entre GameServer e banco de dados?
Sim, especialmente se os dois componentes não estão na mesma máquina física ou se a rede interna não é totalmente confiável (ex. rede compartilhada de um provedor de hospedagem). TLS na conexão do banco (MSSQL/MySQL) tem custo de performance baixo e evita que credenciais e dados trafeguem em texto claro.
Como faço backup de um banco que está isolado sem internet?
Configure o job de backup para rodar localmente no próprio servidor de banco ou em um servidor de backup dedicado dentro do mesmo segmento privado, enviando os arquivos gerados para um destino externo (storage em nuvem, outro datacenter) através de uma regra de firewall de saída específica, não de entrada.
Uma conta de banco com privilégio de administrador (sa/root) é realmente um problema se só o GameServer usa ela?
Sim. Se o GameServer for comprometido (por uma vulnerabilidade de código, por exemplo), um invasor com acesso à credencial de admin do banco pode fazer qualquer coisa — dropar tabelas, exfiltrar tudo, criar contas de acesso persistente. Uma conta de serviço com permissões mínimas limita o estrago possível mesmo nesse cenário.