Gestión de Usuarios y Seguridad en MariaDB
1. Ejemplo de Escalado de Privilegios Mal Configurado
Supón que tienes un usuario llamado usuario_inseguro
al que sin querer le diste permisos como este:
GRANT SELECT, INSERT, UPDATE ON base_datos.* TO 'usuario_inseguro'@'localhost' WITH GRANT OPTION;
Con ese WITH GRANT OPTION
, el usuario puede dar permisos a otros usuarios o incluso a sí mismo.
El usuario se da más permisos
GRANT ALL PRIVILEGES ON base_datos.* TO 'usuario_inseguro'@'localhost';
También podría crear otro usuario con más privilegios
CREATE USER 'nuevo_jefe'@'localhost' IDENTIFIED BY '1234';
GRANT ALL PRIVILEGES ON *.* TO 'nuevo_jefe'@'localhost' WITH GRANT OPTION;
2. Cómo evitar esto (Buenas Prácticas)
Nunca uses WITH GRANT OPTION
salvo que sea necesario
Crea usuarios con permisos específicos
GRANT SELECT, INSERT ON base_datos.ventas TO 'usuario_ventas'@'localhost';
Revisa qué privilegios tiene un usuario
SHOW GRANTS FOR 'usuario_inseguro'@'localhost';
Revoca privilegios si hay algo raro
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'usuario_inseguro'@'localhost';
Verificar si un usuario tiene GRANT OPTION
SELECT user, host, Grant_priv FROM mysql.user WHERE user = 'usuario_inseguro';
3. Ver Usuarios Conectados
Ver conexiones activas (usuarios conectados y lo que hacen)
SHOW PROCESSLIST;
Ver conexiones activas de forma más limpia
SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE
FROM information_schema.PROCESSLIST;
Ver solo conexiones activas distintas
SELECT DISTINCT user, host
FROM information_schema.PROCESSLIST;
Ver usuarios creados (no necesariamente conectados)
SELECT user, host FROM mysql.user;
Requiere permiso PROCESS
para ver conexiones ajenas
GRANT PROCESS ON *.* TO 'usuario'@'localhost';
4. Resumen
Situación | Riesgo | Solución |
---|---|---|
Usuario con WITH GRANT OPTION | Escala fácil | Evita este privilegio |
Usuario con privilegios en *.* | Control total | Limita a bases/tables específicas |
Revisión de permisos | Necesaria | SHOW GRANTS , mysql.user |