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:
- Nível Global
Privilégios globais aplicam para todos os bancos de dados em um determinado servidor. Estes privilégios são armazenados na tabela
mysql.user
.GRANT ALL ON *.*
eREVOKE ALL ON *.*
concederão e revogarão apenas privilégios globais. - Nível dos bancos de dados
Privilégios de bancos de dados aplicam-se a todas as tabelas em um determinado banco de dados. Estes privilégios são armazenados nas tabelas
mysql.db
emysql.host
.GRANT ALL ON db.*
eREVOKE ALL ON db.*
concederão e revogarão apenas privilégios de banco de dados. - Nível das tabelas
Privilégios de tabelas aplicam-se a todas as colunas em uma determinada tabela. Estes privilégios são armazenados na tabela
mysql.tables_priv
.GRANT ALL ON db.table
eREVOKE ALL ON db.table
concederão e revogarão apenas privilégios de tabelas. - Nível das colunas
Privilégios de colunas aplicam-se a uma única coluna em uma determinada tabela. Estes privilégios são armazenados na tabela
mysql.columns_priv
.
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:
- No MariaDB privilégios são fornecidos para uma combinação de usuário e máquina e não somente para um usuário.
- O SQL-99 não possui privilégios no nível global ou de bancos de dados, e não suporta todos os tipos de privilégios que o MariaDB suporta. O MariaDB não suporta os privilégios
TRIGGER
,EXECUTE
ouUNDER
do SQL-99. - Os privilégios do SQL-99 são estruturadados em uma maneira hierárquica. Se você remover um usuário, todos os privilégios do usuário são removidos. No MariaDB os privilégios concedidos não são removidos automaticamente, mas você deve removê-los se necessário.
- Se no MariaDB você possuir o privilégio
INSERT
em somente parte das colunas em uma tabela, você pode executar instruçõesINSERT
na tabela; As colunas em que você não tem o privilégioINSERT
irão receber seus valores padrões. O SQL-99 necessita que você tenha o privilégioINSERT
em todas as colunas. - Quando você remove uma tabela no SQL-99, todos os privilégios para a tabela são removidos. Se você remover um privilégio no SQL-99, todos os privilégios que foram concedidos baseado neste privilégio são também removidos. No MySQL, privilégios só podem ser removidos com comandos
REVOKE
explícitos ou manipulando as tabelas de permissões do MariaDB.
Para uma descrição do uso de REQUIRE
, veja "Usando Conexões Seguras".