Modelo de privilégios baseados em perfis para o RDS para MySQL - Amazon Relational Database Service

Modelo de privilégios baseados em perfis para o RDS para MySQL

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 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

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, 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`@`%` | +--------------------------------------------------+