Criando novos usuários no MySQL

Para criar novos usuários no MySQL 5 sem utilizar uma ferramenta auxiliar como o phpMyAdmin é necessário conhecer o statement GRANT, mas somente isto não é suficiente, há pequenos detalhes que sempre atrapalham.

Neste artigo irei apresentar algumas boas práticas sobre a criação de usuários de banco de dados, a sintaxe do comando GRANT e também alguns comandos prontos para criação de alguns tipos diferentes de usuários.

Criando usuários... quais usuários?

Normalmente o que se vê nos blogs, nos artigos, inclusive nos exemplos e em muitos paineis administrativos é a utilização de apenas uma combinação de usuário e senha para toda a aplicação. Um grande erro!

Os usuários MySQL além de terem o "nome de usuário" são associados ao endereço de origem, então você verá estes usuários normalmente no formato 'nomedeusuario'@'endereçodeorigem'. Desta forma é possível que o usuário fulano tenha diferentes privilégios se estiver conectando no banco de dados através do endereço local (localhost) ou a partir de uma máquina externa.

Na prática podemos considerar ambos os usuários diferentes, inclusive no momento da criação você não pode indicar apenas o endereço de origem ou o nome de usuário, é necessário indicar as duas informações sempre.

O símbolo % é um caractere curinga que permite especificar parte de um endereço de origem ou até um usuário "que aceita todas as origens". Por exemplo o usuário 'fulano'@'192.168.0.%' pode conectar através de qualquer máquina na rede 192.168.0.0/24, o mesmo vale para nomes de máquinas desde que o servidor consiga resolver o nome do host de origem. O usuário 'fulano'@'%' poderia conectar a partir de qualquer endereço, inclusive da mesma máquina.

Se sua aplicação está no mesmo servidor que o banco de dados, para sua segurança, você deve criar um usuário com host de origem localhost para impedir que qualquer um que possuir o seu usuário e senha possa conectar de forma remota ao banco de dados.

Outra dica importante é sempre criar os usuários somente com os privilégios necessários, nada mais que isso. Não crie super usuários com privilégios de alterar a base e criar usuários a menos que sua aplicação necessite. Normalmente as aplicações apenas realizam consultas, inserções, atualizações e deleções, em alguns casos até evitando a última opção utilizando alguma técnica de softdelete. Tenha um usuário com muitos privilégios apenas para realizar as manutenções.

Observe que ao escrever o nome de usuário é conveniente envolver o nome de usuário e o endereço de origem com '. Eles devem ser envolvidos separadamente, o @ nunca deve estar dentro das aspas. É possível utilizar também ` e ".

Sintaxe do comando GRANT

A sintaxe completa do statement GRANT pode ser vista aqui. A sintaxe simplificada é:

GRANT <privilégios> ON <banco de dados>.<tabela> TO '<usuario>'@'<origem>' IDENTIFIED BY '<senha>';

A definição de senha por IDENTIFIED BY '' é opcional, não sendo necessária se o usuário já existe.

Os privilégios, que podem ser definidos separados por vírgula no espaço indicado, são:

  • ALL Equivalente ao conjunto de todos os privilégios abaixo, sem contar o privilégio de GRANT
  • ALTER Permite alterar as tabelas e criar índices
  • ALTER ROUTINE Permite alterar as stored procedures
  • CREATE ROUTINE Permite criar novas stored procedures
  • EXECUTE Permite executar stored procedures
  • CREATE Permite criar tabelas e bancos de dados
  • CREATE TEMPORARY TABLES Permite criar tabelas temporárias
  • CREATE USER Permite criar, remover, alterar e inclusive remover os privilégios de usuários (não é possível conceder novos privilégios)
  • CREATE VIEW Permite criar e alterar views
  • DELETE Permite apagar linhas
  • DROP Permite apagar views, tabelas, e bancos de dados
  • EVENT Permite manipular os eventos
  • FILE Permite com que o usuário crie e leia arquivos armazenados no servidor do banco de dados
  • GRANT OPTION Permite remover e conceder privilégios aos usuários
  • INDEX Permite criar ou apagar índices
  • INSERT Permite inserir novas linhas no banco de dados
  • LOCK TABLES Permite bloquear tabelas onde o usuário possui permissão de leitura
  • PROCESS Concede permissões para ler a lista de processos executando no servidor
  • RELOAD Permite a utilização de comandos FLUSH
  • SELECT Concede permissão de leitura ao banco de dados ou tabelas
  • SHOW DATABASES Permite ler a lista de bancos no servidor
  • SHOW VIEW Permite ler a estrutura (query geradora) das views
  • SUPER Concede poderes administrativos avançados
  • TRIGGER Permite criar, alterar e apagar triggers
  • UPDATE Permite a atualização de linhas no banco de dados
  • USAGE É equivalente a nenhuma permissão

O comportamento e disponibilidade dos privilégios acima podem variar de acordo com a versão do MySQL. Eventos estão disponíveis apenas na versão 5.1 para cima, enquanto as triggers só podem ser editadas por usuários com super privilégios em versões inferiores a 5.0.

Criando alguns usuários

Agora que já temos a sintaxe básica, vamos criar alguns usuários. No exemplo abaixo utilizarei além do GRANT o statement CREATE USER para criar os usuários. Isso deixa um pouco mais organizada a criação de usuários com privilégios diferentes em tabelas diferentes.

Para o exemplo abaixo pensamos na seguinte situação: criar o usuário DBA com permissões para realizar tudo em todas as tabelas do banco de dados, e dois usuários, FULANO com permissões para uma aplicação simples que está na mesma máquina e CICLANO que será utilizado para manutenção da base cujo FULANO irá ler as informações, chamada de BD01. Para complicar um pouco a história, o CICLANO só poderá acessar esta base através de uma aplicação que está na máquina de IP 192.168.0.45.

/* Criando o usuário DBA */
CREATE USER 'dba'@'%' IDENTIFIED BY 'senhaMuitoDificil';
GRANT ALL ON *.* TO 'dba'@'%' WITH GRANT OPTION;

/* Criando o usuário FULANO */
CREATE USER 'fulano'@'localhost' IDENTIFIED BY 'outraSenha';
GRANT SELECT,UPDATE,DELETE,INSERT ON BD01.* TO 'fulano'@'localhost';

/* Criando o usuário CICLANO */
CREATE USER 'ciclano'@'192.168.0.45' IDENTIFIED BY 'ehOutraSenha';
GRANT ALL ON BD01.* TO 'ciclano'@'192.168.0.45';

/* Recarregando as permissões na memória do servidor */
FLUSH PRIVILEGES;

Caso você altere as permissões de todos os usuários, inclusive do usuário ROOT e não consiga mais acessar o banco de dados, você pode iniciar o serviço com a opção --skip-grant-tables, conectar com qualquer usuário e senha e executar UPDATE mysql.user SET Password=PASSWORD('NovaSenhaAqui') WHERE User='root';.

Note que com esta opção o serviço do MySQL vai ignorar qualquer privilégio e dará acesso total a todos que conectarem ao banco de dados, após trocar a senha reinicie o serviço sem o parâmetro o quanto antes por razões óbvias.

Considerações finais

Note que o MySQL permite concedeer privilégios exclusivos a nível de coluna, porém quanto maior a quantidade de regras para definir privilégios maior o trabalho necessário para conferir se o usuário que está lendo a tabela possui permissões.

Referências

MySQL Grant Sintax

MySQL Adding User Accounts

MySQL Criando usuários

Redefinindo senha de root

Adicionar um comentário
e-mail:nome:
Links e parágrafos são identificados automaticamente
Negrito: **texto em negrito** = texto em negrito
Itálico: */texto em itálico*/ = texto em itálico
Trecho de código inline: ``<?php echo $var; ?>`` = <?php echo $var; ?>
Bloco de código:
```<?php
echo $var;
?>```
<?php
echo $var;
?>

Formatações disponíveisVeja o resultado da formatação
Repita os caracteres da imagem aqui:
Se não conseguir identificar a imagem clique sobre ela para recarregar
Enviar comentário

Informações

Criado
29/Jan, a 1:40
URL Reduzida
http://phc.tc/mgu
Tags
MySQL
Compartilhe

Tópicos

Leia também