MySQL tiene su propio sistema de autenticación y privilegios, independiente del sistema operativo. Cada usuario se identifica por su nombre y el host desde el que conecta (usuario@host). Un mismo nombre de usuario con distintos hosts son cuentas distintas. La gestión correcta de usuarios y privilegios es fundamental para la seguridad de la base de datos.
En este capítulo cubrimos crear, modificar y eliminar usuarios, asignar y revocar privilegios, y las buenas prácticas de seguridad para cuentas de base de datos.
Crear usuarios
-- Crear un usuario que solo puede conectar desde localhost CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'contraseña_fuerte'; -- Usuario que puede conectar desde cualquier host (menos seguro) CREATE USER 'appuser'@'%' IDENTIFIED BY 'contraseña_fuerte'; -- Con IF NOT EXISTS (no falla si ya existe) CREATE USER IF NOT EXISTS 'appuser'@'localhost' IDENTIFIED BY 'contraseña_fuerte'; -- Cambiar la contraseña de un usuario ALTER USER 'appuser'@'localhost' IDENTIFIED BY 'nueva_contraseña'; -- o para el usuario actual: ALTER USER CURRENT_USER() IDENTIFIED BY 'nueva_contraseña';
GRANT: asignar privilegios
-- Privilegios sobre una base de datos completa GRANT SELECT, INSERT, UPDATE, DELETE ON tienda.* TO 'appuser'@'localhost'; -- Todos los privilegios sobre una base de datos (no dar GRANT OPTION) GRANT ALL PRIVILEGES ON tienda.* TO 'appuser'@'localhost'; -- Privilegios sobre una tabla específica GRANT SELECT, INSERT ON tienda.clientes TO 'readonly_user'@'localhost'; -- Privilegios sobre columnas específicas GRANT SELECT (nombre, email), UPDATE (ciudad) ON tienda.clientes TO 'partial'@'localhost'; -- Privilegios globales (sobre todas las bases de datos) — solo para admins GRANT RELOAD, PROCESS ON *.* TO 'dbadmin'@'localhost'; -- Aplicar los cambios inmediatamente FLUSH PRIVILEGES;
Tipos de privilegios
|
Privilegio | Qué permite |
SELECT | Leer filas |
INSERT | Insertar filas |
UPDATE | Modificar filas |
DELETE | Eliminar filas |
CREATE | Crear tablas y bases de datos |
DROP | Eliminar tablas y bases de datos |
INDEX | Crear y eliminar índices |
ALTER | Modificar la estructura de tablas |
EXECUTE | Ejecutar procedimientos almacenados |
SUPER | Administración avanzada del servidor |
ALL PRIVILEGES | Todos los privilegios anteriores |
Ver los privilegios de un usuario
-- Ver mis propios privilegios SHOW GRANTS; -- Ver los privilegios de otro usuario SHOW GRANTS FOR 'appuser'@'localhost'; -- Ver todos los usuarios SELECT user, host, authentication_string, plugin FROM mysql.user;
REVOKE: quitar privilegios
-- Quitar el privilegio DELETE al usuario de la aplicación REVOKE DELETE ON tienda.* FROM 'appuser'@'localhost'; -- Quitar todos los privilegios sobre una base de datos REVOKE ALL PRIVILEGES ON tienda.* FROM 'appuser'@'localhost';
Eliminar usuarios
DROP USER 'appuser'@'localhost'; DROP USER IF EXISTS 'appuser'@'localhost';
Roles (MySQL 8+)
-- Crear un rol con un conjunto de privilegios CREATE ROLE 'app_readonly'; GRANT SELECT ON tienda.* TO 'app_readonly'; -- Crear un rol con acceso de lectura/escritura CREATE ROLE 'app_rw'; GRANT SELECT, INSERT, UPDATE, DELETE ON tienda.* TO 'app_rw'; -- Asignar el rol a un usuario GRANT 'app_rw' TO 'appuser'@'localhost'; -- El usuario debe activar el rol en su sesión o establecerlo por defecto: SET DEFAULT ROLE 'app_rw' TO 'appuser'@'localhost';
