Saltar la navegación

3. Control de acceso

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)

Tarea 3.1 - Usuarios

Fecha de entrega:
25 de octubre
Modalidad:
Binas o individual

Desarrollo de la actividad:

  • Realizar un vídeo tutorial para crear usuarios
    • Crear un usuario con las siguientes características:
      • Sólo permitirá la consulta de información de una tabla
      • Demostrar que no puede visualizar más tablas
      • Demostrar que puede visualizar la información de la tabla para la cual se le asignó el permiso
      • Demostrar que no permite insertar / actualizar / eliminar información
      • Añadirle permisos para insertar información
      • Demostrar que puede añadir información
    • Borrar al usuario creado
      • Demostrar que ya no existe ese usuario

Detalles de la entrega:

  • El vídeo debe durar entre dos y tres minutos
  • Debe tener los créditos de los participantes (indicar quiénes hicieron el vídeo)
  • Subir el vídeo a youtube o a google drive (para el último caso, permitir que cualquiera que tenga el enlace, tenga permiso para ver el vídeo)
  • Enviar el enlace (no adjuntar el vídeo) al correo jpena@suryucatan.tecnm.mx
  • Escribir el correo con asunto: 5A ó 5B + Apellido1 Nombre1, Apellido2 Nombre2  + - Tarea 3.1 (ejemplo del asunto de correo: 5B Peña Jimmy, Peña Jair - Tarea 3.1)