Administração de Usuários e Privilégios no Banco de Dados

Todo agrupamento de bancos de dados possui um conjunto de usuários de banco de dados. Estes usuários são distintos dos usuários gerenciados pelo sistema operacional onde o servidor executa. Os usuários possuem objetos de banco de dados (por exemplo, tabelas), e podem conceder privilégios nestes objetos para outros usuários controlando, assim, quem pode acessar qual objeto.

Iremos ver como criar e gerenciar usuários, e introduz o sistema de privilégios, baseados no MySQL, mas que conceitualmente é muito similar em outros BDs.

Usuários

Conceitualmente, os usuários de banco de dados são completamente distintos dos usuários de sistema operacional. Na prática, pode ser conveniente manter correspondência, mas não é requerido. Os nomes dos usuários de banco de dados são globais para todo o agrupamento de bancos de dados (e não próprio de cada banco de dados).

Criando um usuário

Para criar um usuário deve ser utilizado o comando SQL CREATE USER:

CREATE USER 'diego'@'localhost' IDENTIFIED BY '123456';

Perceba que estou criando um usuário com nome de “diego” no servidor local, com a senha (IDENTIFIED BY) “123456”. Caso você queira criar um usuário sem senha, o que torna o sistema inseguro, você pode digitar o comando até o nome do usuário e o servidor.

Alterando a senha de um usuário

Mesmo que você defina ou não uma senha ao criar um usuário, você pode alterar a senha dele posteriormente, através do comando SET PASSWORD, seguindo o exemplo abaixo:

SET PASSWORD FOR diego = PASSWORD('abc123');

Se você configurar senhas utilizando a instrução GRANT ... IDENTIFIED BY ou o comando mysqladmin password, a função PASSWORD() é desnecessária. Ambos tomam o cuidado de criptografar a senha para você, então você deve especificar a senha como texto simples, como demonstrado lá no tópico de como conceder privilégios ao usuário.

Excluindo um usuário

Para remover um usuário existente deve ser utilizado o comando DROP USER:

DROP USER 'diego'@'localhost';

Ao excluir um usuário, todos os seus privilégios também serão excluídos.

Privilégios

O sistema de privilégios do MySQL garante que todos usuários possam fazer exatamente as operações que lhe é permitido. Quando você conecta a um servidor MySQL, sua identidade é determinada pela maquina de onde você conectou e o nome de usuário que você especificou. O sistema concede privilégios de acordo com sua identidade e com o que você deseja fazer.

Privilégio Descrição
ALL [PRIVILEGES] Todos os privilégios exceto GRANT OPTION
ALTER Permite executar ALTER TABLE
CREATE Permite executar CREATE TABLE
CREATE TEMPORARY TABLES Permite executar CREATE TEMPORARY TABLE
DELETE Permite executar DELETE
DROP Permite executar DROP TABLE
EXECUTE Permite executar stored procedures (MySQL 5.0)
FILE Permite executar SELECT … INTO OUTFILE e LOAD DATA INFILE
INDEX Permite executar CREATE INDEX e DROP INDEX
INSERT Permite executar INSERT
LOCK TABLES Permite executar LOCK TABLES em tabelas que você tenha o privilégio SELECT
PROCESS Permite executar SHOW FULL PROCESSLIST
REFERENCES Ainda não está implementado
RELOAD Permite executar FLUSH
REPLICATION CLIENT Permite ao usuário obter a localização do Master ou Slave
REPLICATION SLAVE Necessário para a replicação Slave (leitura dos eventos do log binário do Master)
SELECT Permite executar SELECT
SHOW DATABASES exibe todos os bancos de dadosE
SHUTDOWN Permite executar mysqladmin shutdownE
SUPER Permite executar CHANGE MASTER, KILL , PURGE MASTER LOGS e SET GLOBAL. Permite conectar-se ao servidor uma vez, mesmo que o max_connections tenha sido atingido
UPDATE Permite executar UPDATE
USAGE Sinônimo para “no privileges”
GRANT OPTION Permite ao usuário repassar os seus privilégios
INSERT Permite executar INSERT

Uma vez informados os privilégios do usuário, você deverá indicar o nível ao qual o privilégio se aplica, sendo possível especificar três níveis:

Os comandos GRANT e REVOKE permitem aos administradores do sistema criar usuários e conceder e revogar direitos aos usuários do MySQL 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.userGRANT ALL ON *.* e REVOKE 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 e mysql.hostGRANT ALL ON db.* e REVOKE 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_privGRANT ALL ON db.table e REVOKE ALL ON db.tableconcederã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.

Concedendo privilégio a um usuário (GRANT)

Ao conceder algum privilégio ao usuário, ele poderá executar o comando que ele recebeu o privilégio em um determinado local específico. Os mais comuns são: SELECT, INSERT, UPDATE, ALTER, DROP, INDEX e GRANT OPTION. A sintaxe é:

GRANT priv [(colunas)] [, priv [(colunas)]] ...
ON {*.* | db.* | db.tabela}
TO usuario [IDENTIFIED BY 'senha']
[, usuario [IDENTIFIED BY 'senha']] ...
[WITH [GRANT OPTION |
MAX_QUERIES_PER_HOUR contador |
MAX_UPDATES_PER_HOUR contador |
MAX_CONNECTIONS_PER_HOUR contador]]

Veja abaixo alguns exemplos de concessão de privilégios para o usuário:

GRANT select ON blog.pessoas TO "diego"; Estou concedendo o comando "select" para a tabela "pessoas" dentro do BD "blog" ao usuário "diego".
GRANT all ON blog.* TO "diego" WITH GRANT OPTION; Estou concedendo todos os comandos para todas as tabelas dentro do BD "blog" ao usuário "diego", e ele terá habilidade de fornecer à outros usuários quaisquer privilégios que ele tenha em um nível específico de privilégio. Cuidado com este tipo de comando, pois pode ser uma brecha de segurança.
GRANT select, insert, update ON blog.* TO "diego"; Estou concedendo os comandos de SELECT, INSERT e UPDATE para todas as tabelas dentro do BD "blog" ao usuário "diego".
GRANT all ON *.* TO "diego" WITH GRANT OPTION; O usuário "diego" terá todos os privilégios em todos os BDs e tabelas, com a possibilidade de conceder privilégios a outros usuários. Neste caso, seria praticamente um root, mas não poderia tomar a vaga dele e nem alterar seus privilégios.
GRANT select ON blog.* TO "diego" IDENTIFIED BY "123456"; Aqui, estamos criando o usuário "diego" com a senha "123456" e já concedendo o privilégio de utilizar o SELECT dentro do BD "blog", em qualquer tabela (*).

Revogando privilégio de um usuário (REVOKE)

Quando damos algum privilégio e ele precisa ser retirado depois, ou por um erro de concessão ou porque não é mais necessário o usuário ter aquele privilégio, podemos remover utilizar o comando REVOKE, seguindo a sintaxe abaixo:

REVOKE priv [(colunas)] [, priv [(colunas)]] ...
ON {*.* | db.* | db.tabela}
FROM usuario [, user] ...

Vou revogar os privilégios concedidos anteriormente, na mesma ordem. Vejamos os exemplos abaixo:

REVOKE select ON blog.pessoas FROM "diego";
REVOKE all, grant option FROM "diego";
REVOKE select, insert, update ON blog.* FROM "diego";
REVOKE all, grant option FROM "diego";
REVOKE select ON blog.* FROM "diego";

Verificando os privilégios de um usuário

Utilize o comando SHOW GRANTS FOR:

SHOW GRANTS FOR usuario;

Assim, será exibido toda a lista de privilégios que o determinado usuário tem, demonstrando os BDs e tabelas.

Limitando os recursos por usuário

O gerenciamento de três recursos é introduzido no nível de usuário individual:

  • Número de todas as consultas por hora: Todos os comandos que podiam ser executados por um usuário.
  • Número de todas as atualizações por hora: Qualquer comando que altera qualquer tabela ou banco de dados.
  • Número de conexões feitas por hora: Novas conexões abertas por hora.

Todos os usuários não são limitados por padrão no uso dos recursos acima, a menos que os limites sejam garantidos a eles. Estes limites podem ser concedidos apenas através do GRANT (*.*) global, usando esta sintaxe:

GRANT ... WITH MAX_QUERIES_PER_HOUR N1
               MAX_UPDATES_PER_HOUR N2
               MAX_CONNECTIONS_PER_HOUR N3;

Se os usuários alcançam o limite de conexões dentro de uma hora, não será aceita mais nenhuma conexão até o fim desta hora. De forma parecida se o usuário alcança o limite do número de consultas ou atualizações, consultas ou atualizações adicionais serão rejeitadas até que a hora acabe. Em todos os casos, uma mensagem de erro apropriada é enviada.

Se você gostou desse material, compartilhe com seus amigos nas redes sociais e inscreva-se no blog para receber atualizações de minhas postagens! Abraços!

Sou bacharel em Sistemas de Informação pela Estácio de Sá (Alagoas), especialista em Gestão Estratégica da Tecnologia da Informação pela Univ. Gama Filho (UGF) e pós-graduando em Gestão da Segurança da Informação pela Univ. do Sul de Santa Catarina (UNISUL). Certificações que possuo: EC-Council CEH, CompTIA (Security+, CySA+ e Pentest+), EXIN (EHF e ISO 27001), MCSO, MCRM, ITIL v3. Tenho interesse por todas as áreas da informática, mas em especial em Gestão e Governança de TI, Segurança da Informação e Ethical Hacking.

5 Responses to “Administração de Usuários e Privilégios no Banco de Dados”

  1. Alessandra disse:

    Estou com um problema em meu banco Postgres. Tenho uma Base de dados na qual um usuário X é o Owner dessa base, porém ele está sem nenhum direito sobre seus objetos. Já tentei o comando:
    ALTER DATABASE name OWNER TO new_owner……Também tentei: GRANT ALL PRIVILEGES ON DATABASE xxx TO xxx;

  2. felipe disse:

    ola estou com um problema que não consigo resolver, quero dar os privilégios para um usuário mais não sei qual os comando que coloca pra que ele tenho somente privilégios em um banco somente

  3. neisjb disse:

    Preciso de ajuda:
    Como faço para limitar um usuário a poder criar somente 3 banco de dados?

    Tipo criei o usuário ‘João’ só que joão pode criar só 3 banco de dados!
    Você pode me ajudar??

Deixe um comentário

O seu endereço de e-mail não será publicado.