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

Como gerenciar privilégios com funções no MySQL


Introdução


O controle de acesso e o gerenciamento de usuários são duas áreas que podem se tornar rapidamente complexas à medida que o número de usuários e diferentes entidades de banco de dados em seu sistema aumenta. Gerenciar muitos privilégios diferentes em vários objetos de banco de dados, garantir que os usuários com as mesmas responsabilidades tenham o mesmo nível de acesso e auditar e restringir o acesso tornam-se mais difíceis com o tempo.

Para ajudar a resolver isso, o MySQL tem um conceito chamado "funções" que permite agrupar pacotes de privilégios sob um determinado nome, permitindo atribuir e modificar configurações em massa. Neste guia, veremos como as funções funcionam no MySQL e como usá-las para facilitar o gerenciamento do acesso a dados para seus usuários.

Comandos


Aqui estão os principais comandos SQL que discutiremos em relação ao gerenciamento de funções do MySQL.
  • CREATE ROLE :O CREATE ROLE O comando define uma nova função dentro do sistema de banco de dados.
  • DROP ROLE :O DROP ROLE O comando faz o oposto, excluindo uma função existente.
  • GRANT :O GRANT O comando tem duas finalidades distintas relacionadas a funções:adicionar privilégios a funções e adicionar contas de usuário como membros de funções.
  • REVOKE :no contexto de funções, o REVOKE O comando remove privilégios de uma função e também remove a associação de função de contas de usuário.
  • SHOW GRANTS :O SHOW GRANTS O comando mostra os privilégios de uma determinada conta de usuário ou função.
  • SET ROLE :O SET ROLE O comando altera as funções que uma conta de usuário está usando ativamente. Isso permite que você determine quais conjuntos de permissões se aplicam à conta para a sessão.
  • SET DEFAULT ROLE :O SET DEFAULT ROLE O comando define as funções que são aplicadas automaticamente quando um cliente faz login como uma conta de usuário específica.


Privilégios necessários


Para seguir este guia, você precisará dos seguintes privilégios:
  • CREATE ROLE
  • GRANT OPTION
  • CREATE USER (para definir as funções padrão para outro usuário)
  • ROLE_ADMIN (para definir variáveis ​​do sistema que modificam o comportamento da função)
  • SYSTEM_VARIABLES_ADMIN (para definir variáveis ​​do sistema que modificam o comportamento da função)

O CREATE ROLE privilégio é uma versão menor do CREATE USER privilégio, permitindo que você crie e gerencie funções. Contas que já possuem o CREATE USER privilégio têm automaticamente toda a funcionalidade necessária para gerenciar funções.

A GRANT OPTION privilégio é necessário para atribuir privilégios a uma função. Você deve ter GRANT OPTION habilitado para quaisquer privilégios que você deseja atribuir a uma função.



O que são funções?


No MySQL, uma função é uma entidade que funciona como um contêiner ou coleção de privilégios. Os administradores podem atribuir privilégios a funções da mesma forma que atribuem privilégios a contas de usuário. Você pode adicionar contas de usuário como membros da função, permitindo que essas contas acessem os privilégios associados à função.

Basicamente, as funções funcionam como uma maneira de agrupar diferentes privilégios relacionados para facilitar o gerenciamento de privilégios. Em vez de garantir que cada usuário tenha o nível exato de acesso de que precisa, atribuindo privilégios individuais, o uso de agrupamentos de privilégios nomeados permite gerenciar menos atribuições, mais fáceis de entender.

Isso tem uma clara vantagem ao atribuir níveis de acesso, pois é mais fácil atribuir um developer , sysadmin , ou financeteam função para um usuário do que gerenciar individualmente dezenas de privilégios. Também torna rápido ajustar o acesso a várias contas de uma só vez. Se você criar um novo banco de dados para a equipe de vendas, poderá fornecer ao salesteam função de acesso a ele em vez de rastrear todas as contas que deveriam ter acesso.


Criando funções


Se você tiver uma conta com o CREATE ROLE privilégio, você pode gerenciar funções usando o CREATE ROLE comando.

Qual ​​é a sintaxe do MySQL para funções?


Os nomes de funções devem seguir um formato específico para que o MySQL os considere válidos. De muitas maneiras, eles espelham o formato usado para definir as contas de usuário do MySQL, mas com algumas diferenças importantes.

As funções seguem o seguinte formato:
'<role>'@'<host>'

Assim como os usuários, as funções têm dois componentes:o nome da função e o host do qual o cliente está se conectando. No entanto, a maneira como o MySQL interpreta esses componentes é diferente.

Com funções, o '<role>' parte do nome nunca pode ficar em branco. Não existe o conceito de um papel ser "anônimo" como acontece com os usuários. Por outro lado, omitindo o '<host>' parte é ainda permitido, e o MySQL usará % como o anfitrião. No entanto, o % neste contexto é interpretado como um caractere literal, não um curinga.

Efetivamente, isso significa que, embora os nomes das funções compartilhem superficialmente o formato dos nomes das contas de usuário, eles não passam por nenhum tipo de avaliação como as contas de usuário e são apenas um rótulo com dois componentes. A razão pela qual eles fazem tem duas partes em seu nome é que você pode criar contas de usuário que podem funcionar como usuários e funções. Quando usados ​​como usuário, os componentes estão sujeitos às regras de avaliação especiais descritas no artigo de gerenciamento de usuários e, quando usados ​​como uma função, o nome é correspondido diretamente usando os nomes literais dos componentes.

Devido a essas regras, em muitos casos, os administradores optam por definir funções usando apenas o '<role>' componente. Isso faz com que o MySQL substitua um literal % caractere para o '<host>' componente, tornando efetivamente essa parte do nome invisível e inconsequente. Se você não pretende que um nome seja usado como conta de usuário e função, faça o mesmo.


Como você cria funções?


Para criar novas funções, use o CREATE ROLE comando.

A sintaxe básica fica assim:
CREATE ROLE '<role>'@'<host>';

Você também pode criar várias funções ao mesmo tempo separando cada nome de função com uma vírgula:
CREATE ROLE '<role_1>'@'<host>', '<role_2>'@'<host>', '<role_3>'@'<host>';

Se alguma das funções especificadas já existir no sistema, o comando falhará com um erro.

Para evitar isso e fazer com que o MySQL emita apenas um aviso, você pode incluir o IF NOT EXISTS cláusula após o CREATE ROLE comando antes dos nomes das funções:
CREATE ROLE IF NOT EXISTS '<role>'@'<host>';

Como mencionado acima, muitas vezes os administradores omitem o '<host>' parte do nome da função para simplificar, configurando-o implicitamente para o literal % personagem. Portanto, na prática, muitos de seus comandos de criação de função podem se parecer mais com isso:
CREATE ROLE '<role>';



Como você concede privilégios a uma função?


Depois de criar novas funções, sua próxima prioridade geralmente é torná-las significativas, concedendo-lhes privilégios.

Você concede privilégios a funções da mesma forma que concede privilégios a contas de usuário. Você fornece os privilégios exatos que deseja conceder, especifica um escopo fornecendo o banco de dados e o objeto de banco de dados onde o privilégio é válido e a entidade que deve receber os privilégios — neste caso, uma função:
GRANT <privileges> ON <database>.<object> TO '<role>'@'<host>';

Por exemplo, para conceder o SELECT privilégio para uma função chamada readapp no appdb banco de dados e todos os objetos que ele contém, você pode digitar:
GRANT SELECT ON appdb.* TO 'readapp';

Da mesma forma, você pode conceder privilégios de gravação ao mesmo banco de dados para uma função chamada writeapp digitando:
GRANT SELECT,INSERT,UPDATE,DELETE ON appdb.* TO 'writeapp';

Você pode conceder privilégios e revogá-los de funções exatamente como faria diretamente com contas de usuário. Assim, você sempre pode modificar os privilégios associados a uma função se precisar ajustar o nível de acesso que deseja fornecer.


Como você concede aos usuários associação a uma função?


Depois de adicionar privilégios às suas funções, você pode começar a adicionar membros à função para conceder a eles os privilégios associados.

Para fazer isso, o MySQL usa uma forma diferente do mesmo GRANT usamos para conceder privilégios a usuários e funções. Esse novo formulário, no entanto, adiciona funções a um usuário, permitindo que a conta do usuário acesse todos os privilégios concedidos à função.

A sintaxe básica fica assim:
GRANT '<role>'@'<host>' TO '<user>'@'<host>';

Por exemplo, se o 'reports'@'localhost' o usuário precisa ser capaz de ler dados do appdb banco de dados para gerar relatórios, podemos adicionar o readapp role para a conta de usuário, dando-lhe privilégios de seleção:
GRANT 'readapp' TO 'reports'@'localhost';

Da mesma forma, para fornecer ao 'appuser'@'localhost' a capacidade de gerenciar os dados dentro do mesmo banco de dados, podemos tornar esse usuário um membro do writeapp Função:
GRANT 'writeapp' TO 'appuser'@'localhost';

O 'appuser'@'localhost' conta agora terá a capacidade de inserir, atualizar e remover dados do banco de dados. Se novos privilégios forem adicionados ao writeapp função, o 'appuser'@'localhost' conta ganhará imediatamente esses privilégios.

Como você concede automaticamente determinadas funções a cada usuário?


Às vezes, pode haver funções às quais você deseja que todos os usuários do seu sistema tenham acesso. Você pode definir quais funções cada conta recebe automaticamente definindo as mandatory_roles variável.

Para modificar os mandatory_roles variável, seu usuário deve ter o ROLE_ADMIN e SYSTEM_VARIABLES_ADMIN privilégios. Você pode definir as funções que deseja atribuir a cada usuário digitando:
SET PERSIST mandatory_roles = '`<role_1>`@`<host>`, `<role_2>`@`<host>`, `<role_3>`@`<host>`';

Aqui, damos a cada usuário no sistema três funções automaticamente. Ao definir a variável do sistema, o valor de mandatory_roles deve ser uma string, portanto, encapsulamos toda a lista de funções entre aspas simples e usamos acentos graves para citar componentes de função individuais.

Você não pode adicionar uma função aos mandatory_roles lista que tem o SYSTEM_USER privilégio. Essa é uma medida de segurança para garantir que nem todas as sessões no sistema sejam sessões do sistema automaticamente.



Como você usa privilégios de funções?


Depois de conceder a associação de contas de usuário a funções, como você as usa? Para acessar os privilégios concedidos a uma conta por uma função, ela deve ser ativada.

Visualizando as funções ativas atuais


Antes de ativar novas funções, você pode verificar quais funções estão atualmente ativas para sua sessão de usuário.

Para visualizar as funções ativas da sua sessão, digite:
SELECT CURRENT_ROLE()

A saída exibirá zero ou mais funções ativas em sua sessão atual. Os privilégios associados a essas funções serão adicionados às ações que você tem permissão para realizar.


Como ativar funções para a sessão


Para alterar quais funções estão ativas durante sua sessão, use o SET ROLE comando. Você pode usar este comando de várias maneiras diferentes.

A sintaxe básica fica assim:
SET ROLE '<rolename>'@'<host>';

Isso ativará a função em questão. É importante observar que quaisquer funções anteriormente ativas não mencionadas no SET ROLE comando agora será desativado.

Para ativar mais de uma função por vez, separe cada função com uma vírgula:
SET ROLE '<role_1>'@'<host>', '<role_2>'@'<host>', '<role_3>'@'<host>';

Para ativar todas as funções que foram concedidas à sua conta, você pode especificar ALL em vez de uma função específica:
SET ROLE ALL;

Você também pode dizer ao MySQL para ativar todas as suas funções com exceção específica usando ALL EXCEPT :
SET ROLL ALL EXCEPT '<role_1>'@'<host>';

Outra opção é desabilitar todas as funções em sua conta especificando NONE :
SET ROLE NONE

Isso desativará todas as suas funções de usuário para a sessão, dando a você apenas os privilégios atribuídos especificamente à sua conta de usuário.

Para voltar à lista padrão de funções definidas para sua conta, use o DEFAULT palavra-chave:
SET ROLE DEFAULT


Como definir funções padrão para uma conta de usuário


As funções que são ativadas automaticamente quando você faz login como usuário e aquelas que são reativadas quando você usa SET ROLE DEFAULT são configuráveis.

Para definir os papéis que serão ativados por padrão, use o SET DEFAULT ROLE comando semelhante a como você usa o SET ROLE comando:
SET DEFAULT ROLE '<role_1>'@'<host>';

Isso definirá as funções padrão que serão ativadas para sua própria conta no login ou ao usar SET ROLE DEFAULT .

Se seu usuário tiver o CREATE USER privilégio, você pode definir as funções padrão para outras contas:
SET DEFAULT ROLE ALL TO '<user>'@'<host>';

Aqui, especificamos que o '<user>'@'<host>' conta deve ativar automaticamente todas as suas funções na autenticação.

Essa sintaxe também pode ser usada para definir as funções padrão para mais de uma conta, separando cada usuário com uma vírgula:
SET DEFAULT ROLE ALL TO '<user_1>'@'<host>', '<user_2>'@'<host>';


Ativando todas as funções para todos os usuários por padrão


Se você quiser que todas as contas em seu servidor MySQL ativem todas as suas funções por padrão, você pode alterar uma configuração do sistema para fazer isso.

Quando o activate_all_roles_on_login for definida como true, o MySQL ativará automaticamente todas as funções associadas a uma conta ao efetuar login. Isso substitui as configurações especificadas por SET DEFAULT ROLE .

Para ativar este recurso, você deve ter o SYSTEM_VARIABLES_ADMIN e ROLE_ADMIN privilégios. Habilite o recurso digitando:
SET PERSIST activate_all_roles_on_login = ON;

Isso fará com que as contas de usuário ativem automaticamente todas as funções no login. No entanto, SET ROLE DEFAULT ainda permitirá que você ative apenas as funções padrão associadas a uma conta.



Mostrar privilégios existentes obtidos de funções


Para entender quais privilégios estão disponíveis em sua conta, você pode usar o SHOW GRANTS comando.

Para verificar as concessões habilitadas para um usuário, digite:
SHOW GRANTS FOR '<user>'@'<host>';

A saída mostrará todos os privilégios atribuídos diretamente à conta do usuário, bem como todas as funções das quais o usuário é membro.

Depois de saber de quais funções uma conta é membro, você pode verificar quais privilégios essas funções fornecem ao usuário digitando:
SHOW GRANTS FOR '<user>'@'<host>' USING '<role>'@'<host>';

Por exemplo, para verificar os privilégios do 'reports'@'localhost' usuário, incluindo aqueles concedidos por sua associação no readapp função, você pode usar:
SHOW GRANTS FOR 'reports'@'localhost' USING 'readapp';

Isso mostrará todos os privilégios concedidos explicitamente ao 'reports'@'localhost' conta de usuário, bem como aqueles adicionados pelo readapp Função.


Revogar uma função de um usuário


Então, o que acontece quando você deseja remover uma função de um usuário? Semelhante a como o GRANT comando pode adicionar novos privilégios a um usuário ou função ou adicionar funções a um usuário, o comando REVOKE O comando pode remover privilégios de um usuário ou função e também pode remover a associação de função de um usuário.

A sintaxe básica usada para remover uma função de uma conta de usuário é assim:
REVOKE '<role>' FROM '<user>'@'<host>';

Após executar uma instrução como essa, o usuário não terá mais acesso aos privilégios que foram concedidos por meio do role.

Como exemplo, podemos revogar o writeapp função do 'appuser'@'localhost' conta de usuário digitando:
REVOKE 'writeapp' FROM 'appuser'@'localhost';

No entanto, se o usuário tiver recebido um privilégio por outros meios (diretamente concedido ou concedido por associação com uma função diferente), ele ainda terá acesso a esse privilégio. Portanto, se o 'appuser'@'localhost' o usuário também era membro do readapp papel que concedemos anteriormente, eles ainda teriam SELECT privilégios no appdb base de dados.


Conclusão


O uso de funções para distribuir privilégios em seus bancos de dados MySQL pode ajudar a simplificar a sobrecarga de gerenciamento e a complexidade de seu sistema de controle de acesso. É muito mais fácil garantir que os usuários com as mesmas responsabilidades tenham os mesmos privilégios usando funções do que conceder muitos privilégios diferentes diretamente.

Da mesma forma, os papéis permitem que você seja explícito sobre a intenção por trás da concessão de privilégios. Em vez de conceder um grande número de privilégios a contas sem qualquer comentário, nomes de funções cuidadosamente escolhidos podem ajudar a distinguir entre diferentes motivos de acesso. Ao reservar um tempo para criar e organizar funções com antecedência, sua capacidade de gerenciar o acesso do usuário a diferentes partes de seus dados será mais simples a longo prazo.