Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Usando funções novas no MySQL 8


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.