não é possível remover "GRANT USAGE"

15

Eu estava testando algumas coisas e adicionei um:

grant usage on statistics.* to cptnotsoawesome@localhost identified by 'password';

então agora quando eu faço

show grants for cptnotsoawesome@localhost;

Eu posso ver que um deles é:

Grants for cptnotsoawesome@localhost
----------------------------------
GRANT USAGE ON *.* TO 'cptnotsoawesome'@'localhost' IDENTIFIED BY PASSWORD 'somePEW-PEWstring' 

Agora eu quero removê-lo porque acho que é um risco à segurança, então faço o seguinte:

REVOKE USAGE ON *.* FROM 'cptnotsoawesome'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

Mas ainda mostra que USAGE concede na lista de concessões.

Grants for cptnotsoawesome@localhost
----------------------------------
GRANT USAGE ON *.* TO 'cptnotsoawesome'@'localhost' IDENTIFIED BY PASSWORD 'somePEW-PEWstring' 

Alguma idéia do porquê? O que estou fazendo de errado?

Katafalkas
fonte

Respostas:

20

Sob o capô, quando você vê um usuário apenas com USAGE, ele está escrito na tabela mysql.user com todos os privilégios globais desativados.

Você afirmou originalmente que o usuário tinha o seguinte:

grant usage on statistics.* to cptnotsoawesome@localhost identified by 'password'; 

Você deve ver uma linha mysql.usercom a senha MD5 e todos os privs globais configurados comoN . Você também deve ver uma linha no mysql.db com

  • user = 'cptnotsoawesome'
  • host = 'localhost'
  • db = 'estatísticas'
  • todos os privs de níveis de banco de dados definidos como 'Y'

Você poderá vê-los com esta consulta

SELECT * FROM mysql.db
WHERE user='cptnotsoawesome'
AND host='localhost'
AND db='statistics'\G

Quando você executou o comando REVOKE, simplesmente removeu a linha de mysql.db. Isso não tocou a linha mysql.user. Assim, você ainda pode fazer login no mysql e ter apenas os privs para executar

SHOW GLOBAL VARIABLES;
SHOW GLOBAL STATUS;

Se houver um banco de dados de teste chamado testou um banco de dados cujos 5 primeiros caracteres sejam test_(procure-o usando SELECT * FROM mysql.db WHERE db LIKE 'test%';), o usuário com apenas USAGE poderá ter direitos totais sobre os bancos de dados de teste. Eu escrevi sobre isso no ServerFault, setembro de 2011 .

Se você deseja remover a linha do mysql.user, você pode executar

DROP USER cptnotsoawesome@localhost;

ou

DELETE FROM mysql.user WHERE
WHERE user='cptnotsoawesome'
AND host='localhost';
FLUSH PRIVILEGES;
RolandoMySQLDBA
fonte
9

USAGE significa que o usuário não tem nenhum privilégio.

You have to use 'DROP USER'. 

drop user cptnotsoawesome@localhost;

Na verdade, você não pode revogar USAGE, sem descartar o user.USAGE é um privilégio de nível global.

dê uma olhada neste link .

Abdul Manaf
fonte
Eu faria isso, se isso estava fazendo nada de errado com o banco de dados, como se é ameaça à segurança ou algo parecido, caso contrário - i pode simplesmente deixá-la
Katafalkas