Como posso alterar meu usuário mysql que possui todos os privilégios em um banco de dados para ter apenas privilégios de seleção em uma tabela específica?

2

Eu dei ao meu usuário mysql o tratamento "GRANT ALL PRIVILEGES ON database_name. * para my_user @ localhost". Agora gostaria de ser mais detalhado, começando com a redução de privilégios em uma tabela específica.

Espero que o mysql tenha ou possa ser configurado para seguir uma política de "menor quantidade de privilégios", para que eu possa manter a configuração atual e diminuí-la para a única tabela. Mas eu não vi nada assim nos documentos ou on-line.

Além de remover a concessão e a concessão de nível de banco de dados em nível de tabela, existe uma maneira de obter o mesmo resultado adicionando outra regra?

    
por Glenn 19.01.2011 / 05:20

2 respostas

3

Todos os privilégios no MySQL são aditivos; não há nenhum conceito de privilégio subtrativo.

Você deve remover o GRANT ALL ON db.* ... e atribuir as permissões de nível de tabela granular desejadas.

Tenha em mente que você tem um amplo conjunto de privilégios disponível para você no MySQL. Talvez você possa começar com um nível de banco de dados GRANT SELECT que forneça acesso somente leitura ao seu usuário. Então você pode adicionar seletivamente os privilégios destrutivos por tabela, conforme ditado por suas necessidades.

    
por 19.01.2011 / 06:09
0

Infelizmente, se um usuário já tiver privilégios no nível de banco de dados, executar revoke all on db.table from user@host; não criará todos os privilégios existentes no nível de tabela (exceto o que você está revogando) para você.

A melhor maneira que eu posso pensar em fazer isso é adicionar todos os privilégios de nível de tabela que você precisa para o usuário e, em seguida, revogar o privilégio de nível de banco de dados.

O MySQL mantém seus privilégios em diferentes tabelas no banco de dados mysql , dependendo do contexto para o qual o privilégio serve.

  • Se você conceder um privilégio em *.* , isso será na tabela mysql.User .
  • Se você conceder um privilégio em db.* , isso será na tabela mysql.db .
  • Se você conceder um privilégio em db.table , isso será na tabela mysql.tables_priv .
  • Se você conceder privilégios de coluna em db.table , a tabela mysql.columns_priv será usada.

Portanto, executar a revogação final abaixo apenas remove as entradas da tabela db e deixa tudo o que já estava na tabela tables_priv .

Exemplo: o usuário já tem isto:

mysql> grant all on db.* to user@host;

Você executa isso:

mysql> grant all on db.table1 to user@host;
mysql> grant all on db.table2 to user@host;
mysql> grant all on db.table3 to user@host;
mysql> grant all on db.table4 to user@host;
mysql> revoke all on db.* from user@host;

O usuário poderá acessar db.table5 até executar o comando revogar. O usuário terá acesso às outras quatro tabelas antes e depois da revogação.

A exceção a isso (sempre há uma exceção) é com privilégios de coluna. Se você conceder privilégios de coluna a um usuário que já tenha privilégios de nível de tabela na mesma tabela, eles existirão na tabela columns_priv , mas não serão exibidos em um comando show grants e desaparecerão se você executar um revoke ... on db.table from user@host; comando.

Você deve poder criar scripts para adicionar todos os privilégios de nível de tabela, em vez de criá-los manualmente.

    
por 24.11.2011 / 17:27