Por que um “GRANT USAGE” é criado na primeira vez que concedo privilégios de usuário?

101

Sou novo no lado administrativo do DBMS e estava configurando um novo banco de dados esta noite (usando MySQL) quando percebi isso. Depois de conceder a um usuário um privilégio pela primeira vez, outra concessão é criada que se parece com

GRANT USAGE on *.* TO user IDENTIFIED BY PASSWORD password

A documentação diz que o USAGEprivilégio significa "sem privilégios", então estou inferindo que isso concede trabalho hierarquicamente e talvez um usuário deva ter algum tipo de privilégio para todos os bancos de dados, então isso serve como um pega-tudo?

Também não entendo por que essa linha contém uma IDENTIFIED BYcláusula quando a concessão que criei não tem uma (principalmente porque não entendo a que propósito a IDENTIFIED BYcláusula serve).

Edit: Desculpe por não declarar isso originalmente, as concessões eram

GRANT ALL PRIVILEGES ON database.* TO admin_user
GRANT SELECT, INSERT, UPDATE, DELETE ON database.* TO user
John M Naglick
fonte
você pode nos dizer a concessão que você executou
Pentium10 de

Respostas:

144

Como você disse, no MySQL USAGEé sinônimo de "sem privilégios". Do manual de referência do MySQL :

O especificador de privilégio USAGE significa "sem privilégios". É usado em nível global com GRANT para modificar os atributos da conta, como limites de recursos ou características SSL, sem afetar os privilégios de conta existentes.

USAGEé uma forma de informar ao MySQL que existe uma conta sem conceder nenhum privilégio real a essa conta. Eles simplesmente têm permissão para usar o servidor MySQL, portanto USAGE. Corresponde a uma linha na `mysql`.`user`tabela sem nenhum conjunto de privilégios.

A IDENTIFIED BYcláusula indica que uma senha foi definida para esse usuário. Como sabemos que um usuário é quem ele diz ser? Eles se identificam enviando a senha correta de sua conta.

A senha de um usuário é um dos atributos de conta de nível global que não está vinculado a um banco de dados ou tabela específica. Ele também vive na `mysql`.`user`mesa. Se o usuário não tiver nenhum outro privilégio ON *.*, ele será concedido USAGE ON *.*e seu hash de senha será exibido lá. Isso geralmente é um efeito colateral de uma CREATE USERdeclaração. Quando um usuário é criado dessa forma, ele inicialmente não tem privilégios, portanto, é apenas concedido USAGE.

Espresso_Boy
fonte
10
Acho que é porque eles têm permissão para autenticar. Se você tentar com um usuário e / ou senha incorretos, não será possível autenticar. Um usuário com privilégio USAGE pode executar certos comandos SQL como 'selecionar 1 + 1' e 'mostrar lista de processos'.
Mircea Vutcovici
11

Eu estava tentando encontrar o significado de GRANT USAGE on *.* TOe encontrei aqui. Posso esclarecer que GRANT USAGE on *.* TO user IDENTIFIED BY PASSWORD passwordserá concedido quando você criar o usuário com o seguinte comando ( CREATE):

CREATE USER 'user'@'localhost' IDENTIFIED BY 'password'; 

Quando você concede privilégios com GRANT, novos privilégios são adicionados a ele.

5YrsLaterDBA
fonte
3

Além disso, as senhas do mysql, quando não usando a IDENTIFIED BYcláusula, podem ser valores em branco, se não em branco, eles podem ser criptografados. Mas sim USAGEé usado para modificar uma conta, concedendo limitadores de recursos simples, como MAX_QUERIES_PER_HOUR, novamente, isso pode ser especificado também usando a cláusula WITH, em conjunto com GRANT USAGE(sem privilégios adicionados) ou GRANT ALL, você também pode especificar GRANT USAGEno nível global, nível do banco de dados, nível de mesa, etc ....

s1los
fonte