A Sintaxe de GRANT e REVOKE


O comando GRANT é implementado no MariaDB versão 3.22.11 ou posterior. Para versões anteriores do MariaDB, a instrução GRANT não faz nada.

Os comandos GRANT e REVOKE permitem aos administradores do sistema criar usuários e conceder e revogar direitos aos usuários do MariaDB em quatro níveis de privilégios:

Para as instruções GRANT e REVOKE, tipo_priv pode ser especificado como um dos seguintes:

ALL [PRIVILEGES] Configura todos os privilégios simples exceto WITH GRANT OPTION
ALTER Permite o uso de ALTER TABLE
CREATE Permite o uso de CREATE TABLE
CREATE TEMPORARY TABLES Permite o uso de CREATE TEMPORARY TABLE
DELETE Permite o uso de DELETE
DROP Permite o uso de DROP TABLE.
EXECUTE Permite que o usuário execute stored procedures (MySQL 5.0)
FILE Permite o uso de SELECT ... INTO OUTFILE e LOAD DATA INFILE.
INDEX Permite o uso de CREATE INDEX e DROP INDEX
INSERT Permite o uso de INSERT
LOCK TABLES Permite o uso de LOCK TABLES em tabelas nas quais se tem o privilégio SELECT.
PROCESS Permite o uso de SHOW FULL PROCESSLIST
REFERENCES Para o futuro
RELOAD Permite o uso de FLUSH
REPLICATION CLIENT Da o direto ao usuário de perguntar onde o slave/master está.
REPLICATION SLAVE Necessário para a replicação dos slaves (para ler logs binário do master).
SELECT Permite o uso de SELECT
SHOW DATABASES SHOW DATABASES exibe todos os banco de dados.
SHUTDOWN Permite o uso de mysqladmin shutdown
SUPER Permite a conexão (uma vez) mesmo se max_connections tiverem sido alcançados e executa o comando CHANGE MASTER, KILL thread, mysqladmin debug, PURGE MASTER LOGS e SET GLOBAL
UPDATE Permite o uso de UPDATE
USAGE Sinônimo para sem privilégios.
GRANT OPTION Sinônimo para WITH GRANT OPTION

USAGE pode ser usado quando você quer criar um usuário sem privilégios.

Os privilégios CREATE TEMPORARY TABLES, EXECUTE, LOCK TABLES, REPLICATION ..., SHOW DATABASES e SUPER são novos na versão 4.0.2. Para usar estes novos privilégios após atualizar para 4.0.2, você tem que executar o script mysql_fix_privilege_tables. Leia "Atualizando a Tabela de Permissões".

Em versões anteriores do MariaDB, o privilégio PROCESS dá o mesmo direitos que o novo privilégio SUPER.

Para anular o privilégio grant de um usuário, utilize o valor tipo_priv de GRANT OPTION:

mysql> REVOKE GRANT OPTION ON ... FROM ...;

Os únicos valores de tipo_priv que você pode especificar para uma tabela são SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT, INDEX e ALTER.

Os únicos valores de tipo_priv que você pode especificar para uma coluna (isto é, quando você usar uma cláusula column_list) são SELECT, INSERT e UPDATE.

O MariaDB permite que você crie privilégios a nível de banco de dados mesmo se o banco de dados não existir para tornar fácil de se preparar para o uso do banco de dados. Atualmente, no entanto, o MariaDB não permite criar permissões de a nível de tabela se a tabela não existir. O MariaDB não revogará automaticamente qualquer privilégio, mesmo se você apagar uma tabela ou banco de dados.

Você pode configurar privilégios globais utilizando a sintaxe ON *.*. Você pode configurar privilégios de bancos de dados utilizando a sintaxe ON nome_bd.*. Se você especificar ON * e estiver com algum banco de dados aberto, será configurado os privilégios somente para este banco de dados. (AVISO: Se você especificar ON * e você não tem possui um banco de dados aberto, irá afetar os privilégios globais!).

Note por favor Os metacaracteres '_' e '%' são permitidos na especificação dos nomes de bancos de dados em comandos GRANT. Isto significa que se você deseja usar um caracater '_' como parte de um nome de banco de dados, você deve especificá-lo como '\_' no comando GRANT, para prevenir o usuário de poder acessar bancos de dados adicionais que correspondam ao padrão do metacaracter, ex., GRANT ... ON `foo\_bar`.* TO ....

Para acomodar concessões de direitos para usuários de máquinas arbitrárias, o MariaDB suporta a especificação do valor user_name no formato usuário@máquina. Se você desejar especificar uma string user contendo caracteres especiais (como o '-'), ou uma string contendo caracteres especiais ou meta caracteres (como o '%'), você pode colocar o usuário ou o nome de máquina entre aspas (por exemplo, 'usuário-teste'@'máquina-teste').

Você pode especificar meta caracteres no nome da máquina. Por exemplo, user@'%.loc.gov' se aplica a user para qualquer máquina no domínio loc.gov, e user@'144.155.166.%' se aplica a user em qualquer máquina na subrede de classe C 144.155.166.

O formato simples user é sinônimo de user@'%'.

O MariaDB não suporta metacaracteres em nomes de usuários. Usuários anônimos são definidos inserindo entradas com User='' na tabela mysql.user ou criando um usuário com um nome vazio com o comando GRANT.

Nota: Se você permite o acesso de usuários anônimos ao seu servidor MySQL, você deve também concecder privilégios a todos os usuários locais como user@localhost porque, de outra forma, a entrada de usuário anônimo para a máquina local na tabela mysql.user será usada quando o usuário tentar a conexão ao servidor MariaDB da máquina local!

Você pode verificar se isto se aplica a você executando a seguinte instrução:

mysql> SELECT Host,User FROM mysql.user WHERE User='';

No momento, GRANT suporta somente nomes de máquinas, tabelas bancos de dados e colunas até 60 caracteres. Um nome de usuário pode ter até 16 caracteres.

Os privilégios para uma tabela ou coluna são formados através do OU lógico dos privilégios em cada um dos quatro níveis de privilégios. Por exemplo, se a tabela mysql.user especifica que um usuário tem um privilégio global select, isto não pode ser negado por uma entrada no nível de banco de dados, tabela ou coluna.

Os privilégios para uma coluna podem ser calculados da seguinte forma:

privilégios globais OR (privilégios de banco de dados AND privilégios de máquina)
OR privilégios de tabela OR privilégios de coluna

Na maioria dos casos, os direitos a um usuário são atribuídos em apenas um dos níveis de privilégios, portanto a vida normalmente não é tão complicada como mostrado acima. Os detalhes do procedimento de verificação dos privilégios são apresentados em "Detalhes Gerais de Segurança e o Sistema de Privilégio de Acesso do MariaDB".

Se você concede privilégios para uma combinação de usuário e máquina que não existem na tabela mysql.user, um registro é adicionado e permanece lá até ser removido com um comando DELETE. Em outras palavras, GRANT pode criar registros na tabela user, mas REVOKE não as removerá; para removê-las você deve usar a instrução explícita DELETE.

Na Versão 3.22.12 ou posterior do MariaDB, se um novo usuário é criado ou se você possui privilégios de concessão globais, a senha do usuário será especificada utilizando a cláusula IDENTIFIED BY, se uma for dada. Se o usuário já possui uma senha, ela é trocada pela nova.

Se você não quiser enviar a senha em texto puro você pode usar a opção PASSWORD seguido de uma senha embaralhada da função SQL PASSWORD() ou da função da API C make_scrambled_password(char *to, const char *password).

CUIDADO: Se você criar um novo usuário mas não especificar uma cláusula IDENTIFIED BY, o usuário não possuirá uma senha. Isto não é seguro.

Senhas podem também ser configuradas com o comando SET PASSWORD. Leia "Sintaxe de SET".

Se você conceder privilégios para um banco de dados, uma entrada na tabela mysql.db é criada se necessário. Quando todos os privilégios para o banco de dados forem removidos com REVOKE, este registro é removido.

Se um usuário não tem privilégios em uma tabela, a tabela não é mostrada quando o usuário solicita uma lista de tabelas (com a instrução SHOW TABLES por exemplo). O mesmo é verdade para SHOW DATABASES

A cláusula WITH GRANT OPTION dá ao usuário habilidade de fornecer à outros usuários quaisquer privilégios que ele tenha em um nível específico de privilégio. Você deve ter cuidado ao fornecer o privilégio grant, pois dois usuários podem se unir para unir privilégios!

MAX_QUERIES_PER_HOUR #, MAX_UPDATES_PER_HOUR # e MAX_CONNECTIONS_PER_HOUR # sãp novos no MariaDB versão 4.0.2. Estas opções limitam o número de consultas/atualizações e logins que o usuários pode fazer durente uma hora. Se # é 0 (padrão), então isto significa que não há limites para aquele usuário. Leia "Limitando os Recursos dos Usuários". Nota: para especificar qualquer destas opções para um usuário existente sem adicionar outros privilégios adicionais, use GRANT USAGE ON *.* ... WITH MAX_....

Você não pode conceder a outro usuário um privilégio que não possua; o privilégio GRANT possibilita fornecer somente os privilégios que possuir.

Esteja ciente que quando conceder a um usuário o privilégio GRANT em um nível particular de privilégios, qualquer privilégio que o usuário já possua (ou seja fornecido no futuro!) nesse nível também pode ser concedido por este usuário. Suponha que você conceda a um usuário o privilégio INSERT em um banco de dados. Se você conceder o privilégio SELECT no banco de dados e especificar WITH GRANT OPTION, o usuário além de poder repassar o privilégio SELECT poderá também repassar o insert. Se você concede o privilégio UPDATE para o usuário no banco de dados, o usuário poderá conceder os privilégios INSERT, SELECT e UPDATE.

Você não deve conceder privilégios ALTER a um usuário comum. Se você fizer isto, o usuário pode tentar enganar o sistema de privilégios renomeando tabelas!

Perceba que se você estiver utilizando privilégios de tabelas ou colunas, mesmo que para apenas um usuário, o servidor examina os privilégios de tabelas e colunas para todos os usuários e isto irá deixar o MariaDB um pouco mais lento.

Quando o mysqld inicia, todos os privilégios são lidos na memória. Privilégios de bancos de dados, tabelas e colunas são iniciados um vez, e privilégios ao nível de usuário fazem efeito na próxima vez que o usuário conectar. Modificações nas tabelas de permissões que você realiza utilizando GRANT ou REVOKE são percebidas pelo servidor imediatamente. Se você modificar as tabelas de permissões manualmente (utilizando INSERT, UPDATE, etc), você deve executar uma instrução FLUSH PRIVILEGES ou executar mysqladmin flush-privileges para dizer ao servidor para recarregar as tabelas de permissões. Leia "Quando as Alterações nos Privilégios tem Efeito".

As maiores diferenças entre o padrão SQL e versões MariaDB de GRANT são:

Para uma descrição do uso de REQUIRE, veja "Usando Conexões Seguras".

Retornar