

# Modelo de privilégios baseados em perfis para o RDS para MySQL
<a name="Appendix.MySQL.CommonDBATasks.privilege-model"></a>

Iniciando com o RDS para MySQL versão 8.0.36, não é possível modificar as tabelas no banco de dados `mysql` diretamente. Especificamente, não é possível criar usuários de banco de dados executando operações de linguagem de manipulação de dados (DML) nas tabelas `grant`. Em vez disso, use declarações de gerenciamento de contas do MySQL, como `CREATE USER`, `GRANT` e `REVOKE`, para conceder privilégios baseados em perfil aos usuários. Você também não pode criar outros tipos de objeto, como procedimentos armazenados no banco de dados do `mysql`. Você ainda pode consultar as tabelas `mysql`. Se você utilizar a replicação de logs binários, as alterações feitas diretamente nas tabelas `mysql` na instância de banco de dados de origem não serão replicadas no cluster de destino.

Em alguns casos, sua aplicação pode utilizar atalhos para criar usuários ou outros objetos inserindo-os nas tabelas `mysql`. Em caso afirmativo, altere o código da aplicação para utilizar as instruções correspondentes, como `CREATE USER`.

Para exportar metadados para usuários de banco de dados durante a migração de um banco de dados MySQL externo, use um dos seguintes comandos:
+ Use o utilitário de despejo de instância do MySQL Shell com um filtro para excluir usuários, perfis e concessões. O exemplo a seguir mostra a sintaxe de comando a ser usada. Verifique se `outputUrl` está vazio.

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

  Para ter mais informações, 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) no MySQL Reference Manual.
+ Use o utilitário de cliente `mysqlpump`. Este exemplo inclui todas as tabelas, exceto aquelas no banco de dados do sistema `mysql`. Ela também inclui as instruções `CREATE USER` e `GRANT` para reproduzir todos os usuários do MySQL no banco de dados migrado.

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

  O utilitário cliente `mysqlpump` não está mais disponível no MySQL 8.4. Em seu lugar, use `mysqldump`.

Para simplificar o gerenciamento de permissões para vários usuários ou aplicações, é possível utilizar a instrução `CREATE ROLE` para criar uma função que tenha um conjunto de permissões. Em seguida, você pode utilizar as instruções `GRANT` e `SET ROLE` e a função `current_role` para atribuir funções a usuários ou aplicações, alternar a função atual e verificar quais funções estão em vigor. Para obter mais informações sobre o sistema de permissões baseadas em funções no MySQL 8.0, consulte o tópico sobre como [Usar funções](https://dev.mysql.com/doc/refman/8.0/en/roles.html), no Guia de referência do MySQL.

**Importante**  
É altamente recomendável não usar o usuário mestre diretamente nas aplicações. Em vez disso, siga as práticas recomendadas de usar um usuário do banco de dados criado com os privilégios mínimos obrigatórios para a aplicação.

Iniciando com a versão 8.0.36, o RDS para MySQL inclui um perfil especial que tem todos os privilégios a seguir. Essa função se chama `rds_superuser_role`. O usuário administrativo principal de cada instância de banco de dados já tem esse perfil concedido. A função `rds_superuser_role` inclui os seguintes privilégios para todos os objetos de banco de dados:
+  `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`

 A definição da função também inclui `WITH GRANT OPTION`, permitindo que um usuário administrativo a conceda para outros usuários. Especificamente, o administrador deve conceder quaisquer privilégios necessários para executar a replicação de logs binários com o cluster do MySQL como destino.

**dica**  
 Para ver os detalhes completos das permissões, use a declaração a seguir.  

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

 Ao conceder acesso utilizando perfis no RDS para MySQL versão 8.0.36 e posterior, você também ativa o perfil utilizando a declaração `SET ROLE role_name` ou `SET ROLE ALL`. O exemplo a seguir mostra como. Substitua o nome da função apropriado para `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`@`%` |
+--------------------------------------------------+
```