Neste artigo, falaremos sobre o novo recurso do sistema de privilégios relacionado ao MySQL 8, que é o Roles. Então, vamos falar sobre papéis, este artigo é totalmente dedicado a papéis.
Outros usuários podem ter privilégios complexos, um exemplo comum para isso é um usuário usado para reportar, esse usuário não precisa escrever nenhum dado, mas também existe a possibilidade de não precisar ler todos os dados. É muito provável que ele possa ser usado apenas para algumas tabelas ou colunas específicas, ou só possa ter acesso selecionado a um conjunto de visualizações que também será específico.
Esses privilégios podem aumentar rapidamente e acabar em definições de usuário muito longas, não usaremos uma definição e mais concessões estão abrindo espaço para mais erros. No MySQL 8, esses conjuntos de privilégios podem ser definidos como funções e funções podem ser concedidas a usuários em vez de privilégios básicos do MySQL. As funções são uma coleção de privilégios que concedemos aos usuários.
Assim como um novo usuário criado com o comando create user que usamos para criar uma função conforme mencionado abaixo;
CREATE ROLE 'reportrole';
Você pode criar várias funções como abaixo da consulta de uma só vez.
CREATE ROLE 'app_ro', 'app_w', 'app_dev';
Nova função criada com o comando create role não terá privilégios associados a ela, permissões podem ser concedidas a esta função como se fosse um usuário normal.
No exemplo abaixo, concedemos o privilégio select em todas as tabelas no banco de dados COMPANY para a função reportrole que criamos acima.
GRANT SELECT ON company.* to repotrole;
O asterisco (*) representa todas as tabelas dentro do banco de dados da empresa.
As funções podem ser concedidas aos usuários do MySQL, no exemplo abaixo, estamos criando o ‘company_ro’ no usuário localhost.
CREATE USER IF NOT EXISTS 'company_ro'@'localhost' IDENTIFIED WITH mysql_native_password BY 'company_pass' WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;
Lembre-se de que o usuário não é apenas um nome de usuário, mas sim seu usuário no host no MySQL e, em seguida, a função repotrole pode ser concedida a ele com grant repotrole ao usuário, conforme mostrado abaixo.
GRANT 'repotrole' to 'company_ro'@'localhost';
A função de função atual do MySQL ajuda a determinar qual função o usuário atual possui.
mysql> select current_role(); +----------------+ | current_role() | +----------------+ | NONE | +----------------+
Os privilégios da função se acumulam, o que significa que os usuários terão os privilégios descritos pela União dos privilégios de base e suas funções. Muito importante que, se o usuário receber o papel, ele não seja ativado por padrão. veremos este último no final desta seção.
Definindo funções obrigatórias
Os papéis obrigatórios são papéis que serão associados por todos os usuários, por padrão é controlado pela variável obrigatória.
SET PERSIST required_roles =‘role1,role2′;
mysql> SET PERSIST required_roles='dbt3_read23';
Funções obrigatórias, como funções explicitamente concedidas, não entram em vigor até serem ativadas, você verá como ativar a função posteriormente neste post.
Funções de prática
Vamos fazer isso de forma prática, criamos um role e o atribuímos a vários usuários, adicionaremos privilégios em todas as tabelas do banco de dados da empresa e adicionaremos outro privilégio select na tabela sys conforme mostrado abaixo.
mysql> create role 'repotrole';
Portanto, conceda os privilégios ao usuário do relatório.
mysql> grant select on company.* to 'repotrole'; mysql> grant select on sys.version to 'repotrole';
Vamos criar para usuários, user1 no localhost e user2 no localhost com senhas diferentes
mysql> create user 'user1'@'localhost' identified by 'foo'; mysql> create user 'user2'@'localhost' identified by 'bar'; mysql> grant 'repotrole' to 'user1'@'localhost'; mysql> grant 'repotrole' to 'user2'@'localhost';
Eles são criados, atribua a função de repotrole a eles e, em seguida, verifique com show grants se eles têm a função de repotrole.
mysql> show grants for 'user1'@'localhost'; +----------------------------------------------+ | Grants for [email protected] | +----------------------------------------------+ | GRANT USAGE ON *.* TO `user1`@`localhost` | | GRANT `repotrole`@`%` TO `user1`@`localhost` | +----------------------------------------------+ mysql> show grants for 'user2'@'localhost'; +----------------------------------------------+ | Grants for [email protected] | +----------------------------------------------+ | GRANT USAGE ON *.* TO `user2`@`localhost` | | GRANT `repotrole`@`%` TO `user2`@`localhost` | +----------------------------------------------+
Eles fazem isso em vez de ter que especificar os dois privilégios para os dois usuários que acabamos de criar a função de repotrole e essa função adicionou os dois privilégios aos novos usuários que criamos.
Verifique os usuários com pt-show-grants também.
Usuário1
[[email protected] ~]# pt-show-grants | grep user1 -- Grants for 'dbt3_user1'@'%' CREATE USER IF NOT EXISTS 'dbt3_user1'@'%'; ALTER USER 'dbt3_user1'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT; GRANT USAGE ON *.* TO `dbt3_user1`@`%`; GRANT `dbt3_reader`@`%` TO `dbt3_user1`@`%`; -- Grants for 'user1'@'localhost' CREATE USER IF NOT EXISTS 'user1'@'localhost'; ALTER USER 'user1'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*F3A2A51A9B0F2BE2468926B4132313728C250DBF' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT; GRANT USAGE ON *.* TO `user1`@`localhost`; GRANT `repotrole`@`%` TO `user1`@`localhost`;
Usuário2
[[email protected] ~]# pt-show-grants | grep user2 -- Grants for 'dbt3_user2'@'%' CREATE USER IF NOT EXISTS 'dbt3_user2'@'%'; ALTER USER 'dbt3_user2'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' DEFAULT ROLE `dbt3_read23`@`%` REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT; GRANT USAGE ON *.* TO `dbt3_user2`@`%`; -- Grants for 'user2'@'localhost' CREATE USER IF NOT EXISTS 'user2'@'localhost'; ALTER USER 'user2'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*E8D46CE25265E545D225A8A6F1BAF642FEBEE5CB' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT; GRANT USAGE ON *.* TO `user2`@`localhost`; GRANT `repotrole`@`%` TO `user2`@`localhost`;
Então pt-show-grannts mostra o papel de repotrol para ambos os usuários.
Se você quiser aprender a usar pt-show-grants use o link abaixo
Instalar e usar o Percona Toolkit no Centos 7
Vamos iniciar o cliente MySQL novamente e desta vez conceder a função repotrol para o usuário comp1.
mysql> grant 'repotrole' to 'comp1'@'localhost';
Vamos sair do cliente MySQL e do usuário Logan comp1, apenas especifique o nome de usuário e a senha na linha de comando.
Especificar a senha na linha de comando em sistemas de produção não é uma boa ideia, pois ela ficará registrada no histórico. Vamos verificar as permissões com concessões de show.
mysql> show grants; +----------------------------------------------------------------+ | Grants for [email protected] | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO `comp1`@`localhost` | | GRANT `dbt3_read23`@`%`,`repotrole`@`%` TO `comp1`@`localhost` |
Portanto, o usuário tem a função de repotrole, mas seus privilégios ainda não estão ativados. Você pode ver que a função 'dbt3_read23' já existe porque esta função foi definida como PERSIST required_roles , ao criar um novo usuário esta função será atribuída automaticamente.
Ativação de funções
Podemos usar set role repotrol para ativar a função e, em seguida, verificamos as concessões de exibição.
mysql> set role 'repotrole'; Query OK, 0 rows affected (0.00 sec) mysql> show grants; +----------------------------------------------------------------+ | Grants for [email protected] | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO `comp1`@`localhost` | | GRANT SELECT ON `company`.* TO `comp1`@`localhost` | | GRANT SELECT ON `sys`.`version` TO `comp1`@`localhost` | | GRANT `dbt3_read23`@`%`,`repotrole`@`%` TO `comp1`@`localhost` | +----------------------------------------------------------------+
Você pode ver que o usuário comp1 já tinha privilégios para todas as tabelas da empresa, por isso concedemos a função a este usuário para este exercício, mas a função repotrol adicionará o novo privilégio à tabela de versões do sistema.
Podemos voltar para a função padrão e verificar os privilégios novamente.
mysql> set role none; Query OK, 0 rows affected (0.00 sec) mysql> show grants; +----------------------------------------------------------------+ | Grants for [email protected] | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO `comp1`@`localhost` | | GRANT `dbt3_read23`@`%`,`repotrole`@`%` TO `comp1`@`localhost` | +----------------------------------------------------------------+ This time the user kept the dbt3_read23 role because it had it as base privileges but it won't have the privilege to sys.version table that version anymore because that came from the role.