Usuarios
Tabla mysql.user
Los usuarios y permisos para administrar la información de las bases de datos del servidor MySQL se almacenan en la tabla user de la base de datos mysql.
La estructura de la tabla mysql.user, contiene 51 atributos, estos almacenan el nombre del usuario, la terminal desde la cual se puede conectar, datos de la contraseña y los permisos que tendrá al conectarse.
mysql> describe user;
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host | char(255) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
| Create_tablespace_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | NULL | |
| x509_issuer | blob | NO | | NULL | |
| x509_subject | blob | NO | | NULL | |
| max_questions | int unsigned | NO | | 0 | |
| max_updates | int unsigned | NO | | 0 | |
| max_connections | int unsigned | NO | | 0 | |
| max_user_connections | int unsigned | NO | | 0 | |
| plugin | char(64) | NO | | caching_sha2_password | |
| authentication_string | text | YES | | NULL | |
| password_expired | enum('N','Y') | NO | | N | |
| password_last_changed | timestamp | YES | | NULL | |
| password_lifetime | smallint unsigned | YES | | NULL | |
| account_locked | enum('N','Y') | NO | | N | |
| Create_role_priv | enum('N','Y') | NO | | N | |
| Drop_role_priv | enum('N','Y') | NO | | N | |
| Password_reuse_history | smallint unsigned | YES | | NULL | |
| Password_reuse_time | smallint unsigned | YES | | NULL | |
| Password_require_current | enum('N','Y') | YES | | NULL | |
| User_attributes | json | YES | | NULL | |
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
51 rows in set (0.00 sec)
Para consultar la lista de usuarios y terminal desde la cual se pueden conectar, lo podemos realizar de la siguiente manera:
mysql> select user,host from user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| debian-sys-maint | localhost |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)
Visualizar permisos
Para consultar los permisos desde la sesión actual, se ejecuta la instrucción:
mysql> show grants;
Sin embargo, si queremos consultar los permisos de otro usuario, se agrega al comando anterior la instrucción FOR y nombre del usuario:
mysql> show grants for 'mysql.sys'@localhost;
Crear usuarios
Cuando se requiere añadir un usuario se pude emplear el comando CREATE, pero previo a realizar la creación del usuario, resulta de interés identificar las políticas para la definición de la contraseña, para ello se empleará el comando SHOW VARIABLES acompañado de la instrucción para realizar un filtrado del resultado.
mysql> show variables like '%validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password.check_user_name | ON |
| validate_password.dictionary_file | |
| validate_password.length | 8 |
| validate_password.mixed_case_count | 1 |
| validate_password.number_count | 1 |
| validate_password.policy | MEDIUM |
| validate_password.special_char_count | 1 |
+--------------------------------------+--------+
7 rows in set (0.00 sec)
De la consulta previa, se puede observar que la política para ingresar una contraseña debe cumplir: tener longitud de al menos ocho caracteres, mezclar mayúsculas minúsculas, al menos un número y al menos un carácter especial.
Forma incorrecta de añadir un usuario:
mysql> create user hola identified by 'hola';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
Forma correcta de añadir un usuario:
mysql> create user hola identified by 'Hola123.';
Query OK, 0 rows affected (0.01 sec)
Para verificar que el usuario se ha creado, podemos consultar la lista de usuarios de la tabla mysql.user
mysql> select user,host from user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| hola | % |
| debian-sys-maint | localhost |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
6 rows in set (0.00 sec)
Eliminar usuarios
Para borrar un usuario, podemos hacer uso del comando DROP
mysql> drop user hola;
Query OK, 0 rows affected (0.01 sec)
Posterior a eliminar esa cuenta de usuario, se puede verificar consultando la tabla que almacena esa información.
mysql> select user,host from user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| debian-sys-maint | localhost |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)
Asignar permisos
Para demostrar la asignación de permisos se creará la cuenta del usuario alumno:
mysql> create user alumno@localhost identified by 'Alumno1.';
Query OK, 0 rows affected (0.01 sec)
Ahora consultaremos los permisos predeterminados asignados al usuario alumno:
mysql> show grants for alumno@localhost;
+------------------------------------------+
| Grants for alumno@localhost |
+------------------------------------------+
| GRANT USAGE ON *.* TO `alumno`@`localhost` |
+------------------------------------------+
1 row in set (0.00 sec)
Ya estamos preparados para asignar permisos al usuario alumno, para ello se emplará el comando GRANT. con la finalidad de ejemplificar este paso, se asignarán todos los permisos sobre la tabla editoriales de la base de datos biblioteca al usuario alumno.
mysql> grant all privileges on biblioteca.editoriales to alumno@localhost;
Query OK, 0 rows affected (0.01 sec)
Verificamos los permisos que tiene asignado el usuario alumno:
mysql> show grants for alumno@localhost;
+--------------------------------------------------------------------------+
| Grants for alumno@localhost |
+--------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `alumno`@`localhost` |
| GRANT ALL PRIVILEGES ON `biblioteca`.`editoriales` TO `alumno`@`localhost` |
+--------------------------------------------------------------------------+
2 rows in set (0.00 sec)
Eliminar permisos
Así como se asignan privilegios a un usuario, también se pueden revocar dichos privilegios, para ello se emplea el comando REVOKE, el cual tiene una sintaxis similar al del comando GRANT, solo difiere en emplear la instrucción FOR en lugar de la instrucción TO. Para eliminar lo permisos que previamente habíamos asignado al usuario alumno, realizaremos la siguiente instrucción:
mysql> revoke all privileges on biblioteca.editoriales from alumno@localhost;
Query OK, 0 rows affected (0.00 sec)
Ahora verificamos los cambios realizados:
mysql> show grants for alumno@localhost;
+------------------------------------------+
| Grants for alumno@localhost |
+------------------------------------------+
| GRANT USAGE ON *.* TO `alumno`@`localhost` |
+------------------------------------------+
1 row in set (0.00 sec)