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 sistemamysql
. Ela também inclui as instruçõesCREATE USER
eGRANT
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
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
ou role_name
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 activemysql>
SELECT CURRENT_ROLE();+--------------------------------------------------+ | CURRENT_ROLE() | +--------------------------------------------------+ | `CUSTOM_ROLE`@`%`,`rds_superuser_role`@`%` | +--------------------------------------------------+