

# Modelo de privilegios basado en roles de RDS para MySQL
<a name="Appendix.MySQL.CommonDBATasks.privilege-model"></a>

A partir de RDS para MySQL versión 8.0.36, no se pueden modificar las tablas de base de datos de `mysql` directamente. En concreto, no puede crear usuarios de bases de datos realizando operaciones de lenguaje de manipulación de datos (DML) en las tablas `grant`. En su lugar, se utilizan instrucciones de administración de cuentas de MySQL como `CREATE USER`, `GRANT` y `REVOKE` para conceder privilegios basados en roles a los usuarios. Tampoco puede crear otros tipos de objetos, como procedimientos almacenados en la base de datos `mysql`. Aún puede consultar las tablas de `mysql`. Si utiliza la replicación de registros binarios, los cambios realizados directamente en las tablas `mysql` de la instancia de base de datos de origen no se replican en el clúster de destino.

En algunos casos, la aplicación puede utilizar accesos directos para crear usuarios u otros objetos insertándolos en las tablas de `mysql`. Si es así, cambie el código de la aplicación para utilizar las declaraciones correspondientes, como `CREATE USER`.

Para exportar metadatos para usuarios de bases de datos durante la migración desde una base de datos MySQL externa, utilice uno de los siguientes métodos:
+ Utilice la utilidad de volcado de instancias del intérprete de comandos de MySQL con un filtro para excluir usuarios, roles y concesiones. En el siguiente ejemplo, se muestra la sintaxis de comandos que se utilizarán. Asegúrese de que `outputUrl` esté vacío.

  ```
  mysqlsh user@host -- util.dumpInstance(outputUrl,{excludeSchemas:['mysql'],users: true})
  ```

  Para obtener más información, consulte [ Instance Dump Utility, Schema Dump Utility, and Table Dump Utility](https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-dump-instance-schema.html) en el Manual de referencia de MySQL.
+ Utilice la utilidad de cliente de `mysqlpump`. Este ejemplo incluye todas las tablas, excepto las tablas de la base de datos del sistema `mysql`. También incluye las instrucciones `CREATE USER` y `GRANT` para reproducir todos los usuarios de MySQL de la base de datos migrada.

  ```
  mysqlpump --exclude-databases=mysql --users
  ```

  La utilidad de cliente `mysqlpump` ya no está disponible con MySQL 8.4. En su lugar, utilice `mysqldump`.

Para simplificar la administración de permisos para muchos usuarios o aplicaciones, puede utilizar la instrucción `CREATE ROLE` para crear un rol que tenga un conjunto de permisos. A continuación, puede utilizar las instrucciones `GRANT` y `SET ROLE` y la función `current_role` para asignar roles a usuarios o aplicaciones, cambiar el rol actual y verificar qué roles están en vigor. Para obtener más información sobre el sistema de permisos basado en roles de MySQL 8.0, consulte [Uso de roles](https://dev.mysql.com/doc/refman/8.0/en/roles.html) en el Manual de referencia de MySQL.

**importante**  
Le recomendamos encarecidamente que no utilice el usuario maestro directamente en sus aplicaciones. En lugar de ello, es mejor ceñirse a la práctica recomendada de utilizar un usuario de base de datos creado con los privilegios mínimos necesarios para su aplicación.

A partir de la versión 8.0.36, RDS para MySQ incluye un rol especial que tiene todos los siguientes privilegios. El rol se denomina `rds_superuser_role`. El usuario administrativo principal de cada instancia de base de datos ya tiene asignado este rol. El rol `rds_superuser_role` incluye los siguientes privilegios para todos los objetos de base de datos:
+  `ALTER` 
+  `APPLICATION_PASSWORD_ADMIN` 
+  `ALTER ROUTINE` 
+  `CREATE` 
+  `CREATE ROLE` 
+  `CREATE ROUTINE` 
+  `CREATE TEMPORARY TABLES` 
+  `CREATE USER` 
+  `CREATE VIEW` 
+  `DELETE` 
+  `DROP` 
+  `DROP ROLE` 
+  `EVENT` 
+  `EXECUTE` 
+  `INDEX` 
+  `INSERT` 
+  `LOCK TABLES` 
+  `PROCESS` 
+  `REFERENCES` 
+  `RELOAD` 
+  `REPLICATION CLIENT` 
+  `REPLICATION SLAVE` 
+  `ROLE_ADMIN` 
+  `SET_USER_ID` 
+  `SELECT` 
+  `SHOW DATABASES` 
+  `SHOW VIEW` 
+  `TRIGGER` 
+  `UPDATE` 
+  `XA_RECOVER_ADMIN`

 La definición de rol también incluye `WITH GRANT OPTION` para que un usuario administrativo pueda conceder ese rol a otros usuarios. En particular, el administrador debe conceder los privilegios necesarios para realizar la replicación de registros binarios con el clúster de MySQL como destino.

**sugerencia**  
 Para ver todos los detalles de los permisos, utilice la siguiente instrucción.  

```
SHOW GRANTS FOR rds_superuser_role@'%';
```

 Cuando concede acceso mediante roles en RDS para MySQL versión 8.0.36 y posteriores, también activa el rol mediante la instrucción `SET ROLE role_name` o `SET ROLE ALL`. El siguiente ejemplo muestra cómo. Sustituya el nombre de rol apropiado por `CUSTOM_ROLE`.

```
# Grant role to user
mysql> GRANT CUSTOM_ROLE TO 'user'@'domain-or-ip-address'

# Check the current roles for your user. In this case, the CUSTOM_ROLE role has not been activated.
# Only the rds_superuser_role is currently in effect.
mysql> SELECT CURRENT_ROLE();
+--------------------------+
| CURRENT_ROLE()           |
+--------------------------+
| `rds_superuser_role`@`%` |
+--------------------------+
1 row in set (0.00 sec)

# Activate all roles associated with this user using SET ROLE.
# You can activate specific roles or all roles.
# In this case, the user only has 2 roles, so we specify ALL.
mysql> SET ROLE ALL;
Query OK, 0 rows affected (0.00 sec)

# Verify role is now active
mysql> SELECT CURRENT_ROLE();
+--------------------------------------------------+
| CURRENT_ROLE()                                   |
+--------------------------------------------------+
| `CUSTOM_ROLE`@`%`,`rds_superuser_role`@`%` |
+--------------------------------------------------+
```