Cómo implementar un log de auditoría de acciones admin en el servidor de MU Online
Configura un sistema de log de auditoría completo para comandos GM y acciones administrativas en el servidor de MU Online, cubriendo base de datos, archivos de log y buenas prácticas de retención.
Los servidores de MU Online con equipo de Game Masters y administradores necesitan algo que muchos descuidan hasta que algo sale mal: un log de auditoría confiable de cada acción administrativa ejecutada. Cuando aparece de la nada un ítem de altísimo valor, cuando se banea una cuenta sin justificaci
Los servidores de MU Online con equipo de Game Masters y administradores necesitan algo que muchos descuidan hasta que algo sale mal: un log de auditoría confiable de cada acción administrativa ejecutada. Cuando aparece de la nada un ítem de altísimo valor, cuando se banea una cuenta sin justificación clara o cuando un GM abusa de comandos de spawn, la única forma de investigar con precisión es tener un registro inmutable de quién hizo qué, cuándo y con qué parámetros. Este tutorial muestra cómo estructurar ese sistema, desde la captura de los comandos GM hasta el almacenamiento seguro y la consulta de los registros.
Por qué un log de auditoría es indispensable
Sin un log de auditoría, cualquier investigación sobre abuso administrativo se convierte en "palabra contra palabra" — el administrador no tiene forma de probar lo que pasó, y el jugador afectado no tiene forma de refutar una decisión injusta. Además del aspecto de confianza con la comunidad, el log de auditoría también protege al propio equipo de GMs: un administrador honesto acusado injustamente de abuso puede probar su inocencia mostrando el registro exacto de las acciones ejecutadas. En servidores con un equipo grande, este sistema también ayuda a identificar patrones de uso excesivo de comandos por parte de un GM específico, antes de que se convierta en un problema mayor.
Qué debe registrarse
| Categoría de acción | Ejemplos | Nivel de detalle necesario |
|---|---|---|
| Comandos de ítem | Crear ítem, eliminar ítem, mover ítem entre cuentas | Ítem exacto, opciones, cantidad, cuenta afectada |
| Comandos de personaje | Alterar nivel, reset, stats, posición en el mapa | Valor anterior y nuevo valor |
| Comandos de cuenta | Baneo, desbloqueo, cambio de contraseña | Motivo informado, duración de la acción |
| Comandos de economía | Agregar/quitar Zen, Jewels en masa | Cantidad exacta y cuenta destino |
| Acciones vía panel web | Edición de cuenta, aprobación de retiro, moderación de foro | Usuario admin, IP de origen, timestamp |
Estructura de tabla de log en la base de datos
Un enfoque común es crear una tabla dedicada, separada de las tablas del juego, para almacenar los registros de auditoría:
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()
);
Esta estructura cubre tanto comandos in-game como acciones del panel web, siempre que ambos sistemas escriban en esta misma tabla (o en tablas espejadas con formato compatible para consulta unificada).
Capturando comandos GM en el GameServer
La mayoría de los emuladores procesa los comandos GM en una función central que interpreta el texto escrito en el chat (algo como HandleGMCommand o equivalente). El punto de interceptación ideal es justo después de la validación de permiso del comando y antes (o justo después) de la ejecución, para garantizar que solo se registren comandos realmente aceptados y ejecutados — evitando saturar el log con intentos inválidos, que pueden manejarse en un log separado de "intentos denegados".
[GMCommand] Recibido: /additem 14 6 13 255 255 0 0
[GMCommand] Autorizado para cuenta: 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 acciones del panel administrativo web
En el lado del panel web (generalmente PHP, Node.js o similar), cada ruta administrativa sensible debe llamar a una función central de auditoría antes de confirmar la acción al usuario. Un ejemplo simplificado en 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 en la ruta de baneo
logAdminAction($_SESSION['admin_user'], 'BAN_ACCOUNT', $targetAccount, $_POST['ban_reason']);
Toda acción irreversible o sensible (baneo, edición de saldo, eliminación de personaje) debe exigir el llenado de un motivo antes de ejecutarse — eso mejora drásticamente la calidad de los registros para investigaciones futuras.
Permisos y protección contra manipulación
El usuario de base de datos utilizado por el GameServer y por el panel web para insertar logs debe tener permiso solo de INSERT en la tabla de auditoría, nunca UPDATE ni DELETE. Esto impide que un GM con acceso a comandos de base de datos (o un atacante que comprometa una cuenta de GM) borre su propio rastro. Idealmente, la eliminación de registros antiguos (dentro de la política de retención) debe hacerla un proceso administrativo separado, ejecutado solo por el administrador raíz del sistema, con registro de la propia limpieza en un log de nivel aún más alto.
Consultando y analizando los logs
Un panel de consulta simple, con filtros por cuenta de admin, tipo de acción, cuenta afectada e intervalo de fecha, ya resuelve la mayoría de las investigaciones. Para servidores más grandes, vale la pena considerar alertas automáticas: por ejemplo, notificar al liderazgo cuando un mismo GM ejecuta un volumen inusual de comandos de ítem en poco tiempo, o cuando se ejecuta una acción de alto impacto (agregar Zen en masa) fuera del horario normal de actividad de ese administrador.
Política de retención y archivado
Define un período de retención activa (por ejemplo, 90 a 180 días) en el que los logs quedan totalmente accesibles para consulta rápida, y un proceso de archivado para los registros más antiguos, moviéndolos a almacenamiento comprimido en vez de borrarlos. Esto mantiene la tabla principal de log con buen rendimiento para las consultas del día a día, sin perder el historial completo para investigaciones que involucren eventos antiguos.
Buenas prácticas de comunicación con el equipo
Un sistema de auditoría solo funciona bien si el equipo de GMs sabe que existe y entiende su propósito como protección mutua, no como vigilancia hostil. Comunicar esto claramente en la incorporación de nuevos administradores, y reforzar que el motivo de cada acción sensible debe llenarse con honestidad, crea una cultura de responsabilidad que reduce los abusos incluso antes de que sea necesaria cualquier investigación.
Errores comunes y soluciones
| Síntoma | Causa probable | Solución |
|---|---|---|
| El log no registra acciones del panel web | Auditoría implementada solo en el GameServer | Agrega la llamada de log en todas las rutas administrativas sensibles |
| Registros que desaparecen o se alteran | Cuenta de base de datos con permiso de DELETE/UPDATE en la tabla de log | Restringe el permiso de la cuenta de aplicación solo a INSERT |
| Tabla de log creciendo demasiado y afectando el rendimiento | Ausencia de política de retención y archivado | Define un período activo y un proceso de archivado periódico |
| El motivo de la acción siempre queda en blanco | El campo de justificación no es obligatorio en la interfaz | Haz obligatorio el campo de motivo para acciones sensibles |
| Dificultad para investigar un incidente antiguo | Falta de índice adecuado en la tabla de log | Crea índices por cuenta, tipo de acción y fecha |
Lista de verificación de implementación del log de auditoría
- Tabla de auditoría creada y separada de las tablas del juego.
- Comandos GM in-game capturados y registrados en el log.
- Acciones del panel administrativo web también registradas en el mismo sistema.
- Cuenta de base de datos restringida a INSERT en la tabla de log.
- Campo de motivo obligatorio para acciones sensibles.
- Política de retención y archivado definida y documentada.
- Panel de consulta con filtros básicos disponible para el liderazgo.
Con el log de auditoría implementado, tu equipo administrativo gana una capa de rendición de cuentas que protege tanto a los jugadores como a los propios GMs, y el siguiente paso natural es revisar las demás prácticas de seguridad y configuración general del servidor en el tutorial de creación de servidor de MU Online.
Preguntas frecuentes
¿El log de auditoría afecta el rendimiento del servidor?
El impacto es pequeño si la auditoría se hace de forma asíncrona (escritura en cola o tabla separada, sin bloquear el procesamiento del comando). Registrar el log de forma síncrona en cada comando GM puede generar latencia perceptible solo en servidores con uso intenso y una base de datos mal optimizada.
¿Necesito registrar solo comandos GM o también acciones administrativas vía panel web?
Lo ideal es registrar ambos. Los comandos GM hechos in-game (vía chat de comando) y las acciones realizadas por administradores en el panel web (baneos, edición de cuenta, alteración de ítems) deben estar en el mismo sistema de auditoría, para dar una visión completa de cualquier acción administrativa sobre el servidor.
¿Durante cuánto tiempo debo mantener almacenados los logs de auditoría?
Un período común es de 90 a 180 días para logs detallados, con la posibilidad de archivar (no borrar) los registros más antiguos en formato comprimido para investigaciones a largo plazo. Definir una política de retención evita que la tabla de logs crezca indefinidamente y comprometa el rendimiento de la base de datos.
¿Cómo evitar que un GM malicioso borre sus propios logs?
La tabla o el archivo de log de auditoría no debe ser accesible para edición/eliminación por las mismas cuentas que audita. Lo ideal es usar permisos de base de datos separados (la cuenta del GameServer solo inserta registros, nunca borra) y un usuario de base de datos distinto, con la contraseña guardada solo por el administrador raíz del sistema.
¿El log de auditoría reemplaza un sistema de backup de la base de datos?
No. El log de auditoría registra quién hizo qué y cuándo, pero no es un mecanismo de recuperación de datos. El backup regular de la base de datos sigue siendo esencial y debe mantenerse por separado, como una segunda capa de protección.