CREATE USER
La gestión de usuarios es una pieza fundamental en la administración de cualquier servidor MySQL. Antes de que alguien pueda conectarse a la base de datos, necesita una cuenta de usuario con credenciales válidas. La sentencia CREATE USER permite crear estas cuentas, definir contraseñas, restringir desde qué hosts se puede conectar el usuario y configurar políticas de autenticación y caducidad.
En este artículo aprenderás a crear usuarios de forma segura, entender el sistema de hosts de MySQL y aplicar configuraciones de autenticación avanzadas que protegen tu servidor.
Sintaxis
La sintaxis básica de CREATE USER es la siguiente:
CREATE USER [IF NOT EXISTS]
'nombre_usuario'@'host'
IDENTIFIED BY 'contraseña';MySQL identifica a cada usuario mediante la combinación de nombre y host. Esto significa que 'carlos'@'localhost' y 'carlos'@'192.168.1.50' son dos cuentas completamente distintas, cada una con sus propios privilegios y contraseña.
Comportamiento básico
Cuando ejecutas CREATE USER, MySQL registra la cuenta en la tabla mysql.user del esquema del sistema. El usuario creado no tiene ningún privilegio por defecto, únicamente puede conectarse al servidor y ejecutar sentencias que no requieren permisos especiales, como SHOW DATABASES sobre bases de datos que sean visibles para todos.
CREATE USER 'analista'@'localhost' IDENTIFIED BY 'Segura#2024!';Este comando crea un usuario llamado analista que solo puede conectarse desde la misma máquina donde corre el servidor MySQL. Si intentara conectarse desde otra máquina, la conexión sería rechazada.
Para verificar que el usuario fue creado correctamente puedes consultar la tabla del sistema:
SELECT user, host, account_locked
FROM mysql.user
WHERE user = 'analista';| user | host | account_locked |
|---|---|---|
| analista | localhost | N |
Restricciones de host
El componente de host determina desde qué direcciones IP o nombres de máquina puede conectarse el usuario. MySQL admite varias formas de especificarlo.
El valor localhost restringe la conexión a la máquina local, lo cual es ideal para aplicaciones que corren en el mismo servidor que MySQL:
CREATE USER 'app_local'@'localhost' IDENTIFIED BY 'App#Local2024';El comodín % permite la conexión desde cualquier host remoto. Es la opción más permisiva y debe usarse con precaución:
CREATE USER 'app_remota'@'%' IDENTIFIED BY 'Rem0ta#Segura!';También puedes especificar una dirección IP exacta o un rango de subred para limitar el acceso a una red interna:
CREATE USER 'dev_team'@'192.168.1.%' IDENTIFIED BY 'DevTeam#2024';En este ejemplo, dev_team puede conectarse desde cualquier máquina cuya IP comience con 192.168.1, lo cual cubre típicamente una red local completa.
Para rangos más específicos puedes utilizar la notación con máscara de subred:
CREATE USER 'oficina'@'10.0.0.0/255.255.255.0' IDENTIFIED BY 'Ofic1na#Seg';Caso práctico: creación de usuarios para una aplicación web
Imagina que administras un servidor MySQL que sirve a una aplicación web. Necesitas tres tipos de cuentas: una para la aplicación en producción, otra para el equipo de desarrollo y una cuenta de solo lectura para reportes.
-- Cuenta de la aplicación web (solo desde el servidor de aplicaciones)
CREATE USER 'webapp_prod'@'10.0.1.15' IDENTIFIED BY 'W3bApp#Pr0d!2024';
-- Cuenta para desarrolladores (desde la red de oficina)
CREATE USER 'dev_access'@'192.168.10.%' IDENTIFIED BY 'D3v#Access2024';
-- Cuenta de solo lectura para reportes (desde cualquier host interno)
CREATE USER IF NOT EXISTS 'reportes'@'10.0.%' IDENTIFIED BY 'R3p0rtes#2024';La cláusula IF NOT EXISTS evita que MySQL lance un error si el usuario ya existe. Esto resulta especialmente útil en scripts de despliegue que pueden ejecutarse múltiples veces.
Caso práctico: plugins de autenticación
MySQL soporta varios métodos de autenticación mediante plugins. Desde MySQL 8.0, el plugin predeterminado es caching_sha2_password, que ofrece un cifrado más robusto que el clásico mysql_native_password.
-- Usar el plugin predeterminado (caching_sha2_password)
CREATE USER 'usuario_moderno'@'localhost'
IDENTIFIED WITH caching_sha2_password BY 'M0derno#2024!';
-- Usar el plugin clásico (compatibilidad con clientes antiguos)
CREATE USER 'usuario_legacy'@'localhost'
IDENTIFIED WITH mysql_native_password BY 'L3gacy#2024!';Si trabajas con aplicaciones antiguas o conectores que no soportan caching_sha2_password, necesitarás usar mysql_native_password. Sin embargo, la recomendación es migrar progresivamente al plugin moderno por su mayor seguridad.
Para consultar qué plugin usa cada usuario:
SELECT user, host, plugin
FROM mysql.user
WHERE user IN ('usuario_moderno', 'usuario_legacy');| user | host | plugin |
|---|---|---|
| usuario_moderno | localhost | caching_sha2_password |
| usuario_legacy | localhost | mysql_native_password |
Caso práctico: caducidad de contraseña y límites de recursos
MySQL permite configurar políticas de caducidad de contraseña al momento de crear el usuario. Esto es fundamental en entornos que deben cumplir normativas de seguridad.
-- Contraseña que caduca en 90 días
CREATE USER 'auditor'@'localhost'
IDENTIFIED BY 'Aud1tor#2024!'
PASSWORD EXPIRE INTERVAL 90 DAY;
-- Contraseña que nunca caduca
CREATE USER 'servicio_interno'@'localhost'
IDENTIFIED BY 'S3rvicio#Int!'
PASSWORD EXPIRE NEVER;
-- Contraseña que caduca inmediatamente (el usuario debe cambiarla en su primer login)
CREATE USER 'nuevo_empleado'@'%'
IDENTIFIED BY 'Temp0ral#123'
PASSWORD EXPIRE;Además de la caducidad, puedes establecer límites de recursos para evitar que un usuario consuma demasiadas conexiones o ejecute demasiadas consultas:
CREATE USER 'consultas_api'@'%'
IDENTIFIED BY 'Api#C0nsultas2024'
WITH MAX_QUERIES_PER_HOUR 1000
MAX_UPDATES_PER_HOUR 100
MAX_CONNECTIONS_PER_HOUR 50
MAX_USER_CONNECTIONS 5;Esta configuración limita al usuario consultas_api a mil consultas por hora, cien actualizaciones, cincuenta conexiones por hora y un máximo de cinco conexiones simultáneas. Estos límites protegen al servidor contra abusos accidentales o deliberados.
Advertencia: Un usuario recién creado no tiene ningún privilegio asignado. Después de ejecutar
CREATE USER, debes usarGRANTpara otorgar los permisos necesarios. Sin privilegios, el usuario podrá conectarse pero no podrá hacer prácticamente nada útil.
Consejo: Utiliza siempre contraseñas fuertes que combinen mayúsculas, minúsculas, números y caracteres especiales. MySQL 8.0 incluye el componente
validate_passwordque puede forzar políticas de complejidad a nivel del servidor.
En el siguiente artículo aprenderás a asignar privilegios a los usuarios con la sentencia GRANT.
Escrito por Eduardo Lázaro
