sexta-feira, 22 de julho de 2011

Autenticação no MySQL

Ontem havia tido problemas com a autenticação no servidor de Banco de Dados MySQL. O problema consistia em saber como o MySQL identifica os usuários.
Como muita gente já deve saber todo o esquema se segurança fica armazenado na base de dados mysql que é criada ao se instalar o MySQL. 
Nessa base de dados existe uma tabela chamada user onde armazena as informações de autenticação e os privilégios globais dos usuários. Aqui é bom lembrar que o identificado do usuário é apenas o campo user e não os campos host + user, apesar de se poder cadastrar o mesmo nome de usuário em vários hosts.
Na tabela db dessa mesma base de dados, são armazenados os privilégios dos usuários para cada base de dados. Aqui também, pode-se definir os campos host + db + user. Como o usuário é identificado apenas pelo username (campo user da tabela user) podemos usar nos campos host e db o caractere coringa "%", não é necessário colocar uma entrada com  host + user iguais aos da tabela user

Por exemplo, podemos ter os seguintes dados na tabela user:
/------+---------------\
| Host | User          |
+------+---------------+
| abc  | root          |
| xyz  | root          |
| www  | root          |
\------+---------------/


E na tabela db:
/------+----------+---------------\
| Host | Db       | User          |
+------+----------+---------------+
| %    | teste%   | root          |
\------+----------+---------------/

Ou seja, o usuário root, pode-se conectar dos hosts abc, xyz e www, e não importa por qual host ele se conectar, poderá acessar qualquer base de dados cujo nome começa com teste.

Abaixo segue como o MySQL autentica os usuários:
  1. Verifica se o usuário, senha e host existem na tabela user. Se tudo ocorreu normalmente, atribui as permissões globais especificadas na tabela .
  2. Depois da autenticação, verifica se o usuário (apenas o campo user) possui permissões específicas nas bases de dados (tabela db).
  3. Faz o mesmo tipo de verificação para tabelas em bases de dados e colunas em tabelas.

Nenhum comentário: