Como implementar um log de auditoria de ações admin no servidor de MU Online
Configure um sistema de log de auditoria completo para comandos GM e ações administrativas no servidor de MU Online, cobrindo banco de dados, arquivos de log e boas práticas de retenção.
Servidores de MU Online com equipe de Game Masters e administradores precisam de uma coisa que muitos negligenciam até que algo dê errado: um log de auditoria confiável de cada ação administrativa executada. Quando um item de altíssimo valor aparece do nada, quando uma conta é banida sem justificati
Servidores de MU Online com equipe de Game Masters e administradores precisam de uma coisa que muitos negligenciam até que algo dê errado: um log de auditoria confiável de cada ação administrativa executada. Quando um item de altíssimo valor aparece do nada, quando uma conta é banida sem justificativa clara ou quando um GM abusa de comandos de spawn, a única forma de investigar com precisão é ter um registro imutável de quem fez o quê, quando e com quais parâmetros. Este tutorial mostra como estruturar esse sistema, desde a captura dos comandos GM até o armazenamento seguro e a consulta dos registros.
Por que um log de auditoria é indispensável
Sem log de auditoria, qualquer investigação sobre abuso administrativo vira "palavra contra palavra" — o administrador não tem como provar o que aconteceu, e o jogador afetado não tem como contestar uma decisão injusta. Além do aspecto de confiança com a comunidade, o log de auditoria também protege a própria equipe de GMs: um administrador honesto acusado injustamente de abuso pode provar sua inocência mostrando o registro exato das ações executadas. Em servidores com equipe grande, esse sistema também ajuda a identificar padrões de uso excessivo de comandos por um GM específico, antes que isso vire um problema maior.
O que deve ser registrado
| Categoria de ação | Exemplos | Nível de detalhe necessário |
|---|---|---|
| Comandos de item | Criar item, deletar item, mover item entre contas | Item exato, opções, quantidade, conta afetada |
| Comandos de personagem | Alterar level, reset, stats, posição no mapa | Valor anterior e novo valor |
| Comandos de conta | Banimento, desbloqueio, alteração de senha | Motivo informado, duração da ação |
| Comandos de economia | Adicionar/remover Zen, Jewels em massa | Quantidade exata e conta destino |
| Ações via painel web | Edição de conta, aprovação de saque, moderação de fórum | Usuário admin, IP de origem, timestamp |
Estrutura de tabela de log no banco de dados
Uma abordagem comum é criar uma tabela dedicada, separada das tabelas de jogo, para armazenar os registros de auditoria:
CREATE TABLE admin_audit_log (
id BIGINT IDENTITY(1,1) PRIMARY KEY,
admin_account VARCHAR(50) NOT NULL,
admin_ip VARCHAR(45) NULL,
action_type VARCHAR(50) NOT NULL,
target_account VARCHAR(50) NULL,
target_character VARCHAR(50) NULL,
command_raw VARCHAR(500) NULL,
previous_value VARCHAR(500) NULL,
new_value VARCHAR(500) NULL,
reason VARCHAR(500) NULL,
created_at DATETIME NOT NULL DEFAULT GETDATE()
);
Essa estrutura cobre tanto comandos in-game quanto ações do painel web, desde que ambos os sistemas gravem nessa mesma tabela (ou em tabelas espelhadas com formato compatível para consulta unificada).
Capturando comandos GM no GameServer
A maioria dos emuladores processa comandos GM em uma função central que interpreta o texto digitado no chat (algo como HandleGMCommand ou equivalente). O ponto de interceptação ideal é logo após a validação de permissão do comando e antes (ou logo depois) da execução, para garantir que só comandos realmente aceitos e executados sejam logados — evitando poluir o log com tentativas inválidas, que podem ser tratadas em um log separado de "tentativas negadas".
[GMCommand] Recebido: /additem 14 6 13 255 255 0 0
[GMCommand] Autorizado para conta: GMADMIN01
[Audit] INSERT admin_audit_log (action_type='ADD_ITEM', admin_account='GMADMIN01', command_raw='/additem 14 6 13 255 255 0 0', target_character='PlayerX', created_at=NOW())
Capturando ações do painel administrativo web
No lado do painel web (geralmente PHP, Node.js ou similar), cada rota administrativa sensível deve chamar uma função central de auditoria antes de confirmar a ação ao usuário. Um exemplo simplificado em PHP:
function logAdminAction($adminAccount, $actionType, $targetAccount, $reason = null) {
$stmt = $pdo->prepare(
"INSERT INTO admin_audit_log (admin_account, admin_ip, action_type, target_account, reason, created_at)
VALUES (?, ?, ?, ?, ?, NOW())"
);
$stmt->execute([$adminAccount, $_SERVER['REMOTE_ADDR'], $actionType, $targetAccount, $reason]);
}
// Uso na rota de banimento
logAdminAction($_SESSION['admin_user'], 'BAN_ACCOUNT', $targetAccount, $_POST['ban_reason']);
Toda ação irreversível ou sensível (banimento, edição de saldo, exclusão de personagem) deve exigir preenchimento de um motivo antes de ser executada — isso melhora drasticamente a qualidade dos registros para investigação futura.
Permissões e proteção contra adulteração
O usuário de banco de dados usado pelo GameServer e pelo painel web para inserir logs deve ter permissão apenas de INSERT na tabela de auditoria, nunca UPDATE ou DELETE. Isso impede que um GM com acesso a comandos de banco (ou um invasor que comprometa uma conta de GM) apague seu próprio rastro. Idealmente, a exclusão de registros antigos (dentro da política de retenção) deve ser feita por um processo administrativo separado, executado apenas pelo administrador raiz do sistema, com registro da própria limpeza em um log de nível ainda mais alto.
Consultando e analisando os logs
Um painel de consulta simples, com filtros por conta de admin, tipo de ação, conta afetada e intervalo de data, já resolve a maioria das investigações. Para servidores maiores, vale considerar alertas automáticos: por exemplo, notificar a liderança quando um mesmo GM executa um volume incomum de comandos de item em curto espaço de tempo, ou quando uma ação de alto impacto (adicionar Zen em massa) é executada fora do horário normal de atividade daquele administrador.
Política de retenção e arquivamento
Defina um período de retenção ativa (por exemplo, 90 a 180 dias) em que os logs ficam totalmente acessíveis para consulta rápida, e um processo de arquivamento para registros mais antigos, movendo-os para armazenamento compactado em vez de apagá-los. Isso mantém a tabela principal de log performática para consultas do dia a dia, sem perder o histórico completo para investigações que envolvam eventos antigos.
Boas práticas de comunicação com a equipe
Um sistema de auditoria só funciona bem se a equipe de GMs souber que ele existe e entender seu propósito como proteção mútua, não como vigilância hostil. Comunicar isso claramente na integração de novos administradores, e reforçar que o motivo de cada ação sensível deve ser preenchido com honestidade, cria uma cultura de responsabilidade que reduz abusos antes mesmo de qualquer investigação ser necessária.
Erros comuns e soluções
| Sintoma | Causa provável | Solução |
|---|---|---|
| Log não registra ações do painel web | Auditoria implementada só no GameServer | Adicione chamada de log em todas as rotas administrativas sensíveis |
| Registros sumindo ou sendo alterados | Conta de banco com permissão de DELETE/UPDATE na tabela de log | Restrinja permissão da conta de aplicação só a INSERT |
| Tabela de log crescendo demais e afetando performance | Ausência de política de retenção e arquivamento | Defina período ativo e processo de arquivamento periódico |
| Motivo da ação sempre em branco | Campo de justificativa não é obrigatório na interface | Torne o campo de motivo obrigatório para ações sensíveis |
| Dificuldade de investigar incidente antigo | Falta de índice adequado na tabela de log | Crie índices por conta, tipo de ação e data |
Checklist de implementação do log de auditoria
- Tabela de auditoria criada e separada das tabelas de jogo.
- Comandos GM in-game capturados e gravados no log.
- Ações do painel administrativo web também gravadas no mesmo sistema.
- Conta de banco de dados restrita a INSERT na tabela de log.
- Campo de motivo obrigatório para ações sensíveis.
- Política de retenção e arquivamento definida e documentada.
- Painel de consulta com filtros básicos disponível para a liderança.
Com o log de auditoria implementado, sua equipe administrativa ganha uma camada de accountability que protege tanto os jogadores quanto os próprios GMs, e o próximo passo natural é revisar as demais práticas de segurança e configuração geral do servidor no tutorial de criação de servidor de MU Online.
Perguntas frequentes
Log de auditoria impacta a performance do servidor?
O impacto é pequeno se a auditoria for feita de forma assíncrona (gravação em fila ou tabela separada, sem travar o processamento do comando). Gravar log de forma síncrona em cada comando GM pode gerar latência perceptível apenas em servidores com uso intenso e mal otimizado do banco de dados.
Preciso logar apenas comandos GM ou também ações administrativas via painel web?
O ideal é logar os dois. Comandos GM feitos in-game (via chat de comando) e ações feitas por administradores no painel web (banimentos, edição de conta, alteração de itens) devem estar no mesmo sistema de auditoria, para dar visão completa de qualquer ação administrativa sobre o servidor.
Por quanto tempo devo manter os logs de auditoria armazenados?
Um período comum é de 90 a 180 dias para logs detalhados, com possibilidade de arquivar (não apagar) registros mais antigos em formato compactado para investigações de longo prazo. Definir uma política de retenção evita que a tabela de logs cresça indefinidamente e comprometa a performance do banco.
Como evitar que um GM malicioso apague seus próprios logs?
A tabela ou arquivo de log de auditoria não deve ser acessível para edição/exclusão pelas mesmas contas que ela audita. O ideal é usar permissões de banco separadas (a conta do GameServer só insere registros, nunca deleta) e um usuário de banco distinto, com senha guardada apenas pelo administrador raiz do sistema.
Log de auditoria substitui um sistema de backup do banco de dados?
Não. O log de auditoria registra quem fez o quê e quando, mas não é um mecanismo de recuperação de dados. Backup regular do banco continua sendo essencial e deve ser mantido separadamente, como uma segunda camada de proteção.