Controle de Acesso, Estágio 1: Verificação da Conexão
Quando você tenta se conectar a um servidor MySQL, o servidor aceita ou rejeita a conexão baseado na sua identidade e se pode ou não verificar sua identidade fornecendo a senha correta. Senão, o servidor nega o acesso a você completamente. De outra forma, o servidor aceita a conexão, entra no estágio 2 e espera por requisiçiões.
Sua identidade é baseada em duas partes de informação:
- A máquina de onde está conectando
- Seu nome de usuário no MySQL
A conferência da identidade é feita utilizando os tres campos de escopo da tabela user
(Host
, User
e Password
). O servidor aceita a conexão somente se uma entrada na tabela user
coincidir com a máquina, nome de usuário e a senha fornecidos.
Valores dos campos escopo na tabela user
podem ser especificados como segue:
- Um valor
Host
deve ser um nome de máquina ou um número IP ou'localhost'
para indicar a máquina local.
- Você pode utilizar os metacaracteres '
%
' e '_
' no campoHost
. - Um valor
Host
de'%'
coincide com qualquer nome de máquina.
- Um valor
Host
em branco significa que o privilégio deve ser adicionado com a entrada na tabelahost
que coincide com o nome de máquina fornecido. Você pode encontrar mais informações sobre isto no próximo - Como no MariaDB Versão 3.23, para valores
Host
especificados como números IP, você pode especificar uma máscara de rede indicando quantos bits de endereço serão usados para o número da rede. Por exemplo:
mysql>
GRANT ALL PRIVILEGES ON db.*
->TO david@'192.58.197.0/255.255.255.0';
Isto permitirá que todos a se conectarem a partir de determinado IP cuja condição seguinte seja verdadeira:
IP_usuário & máscara_rede = ip_maquina.
No exemplo acima todos IPs no Intervalo 192.58.197.0 - 192.58.197.255 podem se conectar ao servidor MySQL.
- Metacaracteres não são permitidos no campo
User
, mas você pode especificar um valor em branco, que combina com qualquer nome. Se a entrada na tabelauser
que casa com uma nova conexão tem o nome do usuário em branco, o usuário é considerado como um usuário anônimo (o usuário sem nome), em vez do nome que o cliente especificou. Isto significa que um nome de usuário em branco é usado para todos as verificações de acessos durante a conexão. (Isto é, durante o estágio 2). - O campo
Password
pode ficar em branco. O que não significa que qualquer senha possa ser usada, significa que o usuário deve conectar sem especificar uma senha.
Valores de Password
que não estão em branco são apresentados como senhas criptografadas. O MariaDB não armazena senhas na forma de texto puro para qualquer um ver. Em vez disso, a senha fornecida por um usuário que está tentando se conectar é criptografada (utilizando a função PASSWORD()
). A senha criptografada é então usada quando o cliente/servidor estiver conferindo se a senha é correta (Isto é feito sem a senha criptografada sempre trafegando sobre a conexão.) Perceba que do ponto de vista do MariaDB a senha criptografada é a senha REAL, portanto você não deve passá-la para ninguém! Em particular, não forneça a usuários normais acesso de leitura para as tabelas no banco de dados MariaDB
! A partir da versão 4.1, o MariaDB emprega um mecanismo de senha e login diferente que é seguro mesmo se fizerem um sniff nos pacotes TCP/IP e/ou o Banco de Dados MariaDB é capturado.
Os exemplos abaixo mostram várias combinações de valores de Host
e User
nos registros da tabela user
aplicando a novas conexões:
Valor em host
| Valor em user
| Conexões casadas com o registro |
'thomas.loc.gov'
| ''
| Qualquer usuário, conectando de thomas.loc.gov
|
'%'
| 'fred'
| fred , conectando a partir de qualquer máquina
|
'%'
| ''
| Qualquer usuário, conectando a partir de qualquer máquina |
'%.loc.gov'
| 'fred'
| fred , conectando de qualquer máquina do domínio loc.gov
|
'x.y.%'
| 'fred'
| fred , conectando de x.y.net , x.y.com ,x.y.edu , etc. (Isto provavelmente não é útil)
|
'144.155.166.177'
| 'fred'
| fred , conectando da máquina com endereço IP 144.155.166.177
|
'144.155.166.%'
| 'fred'
| fred , conectando de qualquer máquina na subrede de classe C 144.155.166
|
'144.155.166.0/255.255.255.0'
| 'fred'
| o mesmo que no exemplo anterior |
Como você pode usar valores coringas de IP no campo Host
(por exemplo, '144.155.166.%'
combina com todas máquinas em uma subrede), existe a possibilidade que alguém possa tentar explorar esta capacidade nomeando a máquina como 144.155.166.algumlugar.com
. Para evitar tais tentativas, O MariaDB desabilita a combinação com nomes de máquina que iniciam com dígitos e um ponto. Portanto se você possui uma máquina nomeada como 1.2.foo.com
, este nome nunca irá combinar com uma coluna Host
das tabelas de permissões. Somente um número IP pode combinar com um valor coringa de IP.
Uma conexão de entrada pode coincidir com mais de uma entrada na tabela user
. Por exemplo, uma conexão a partir de thomas.loc.gov
pelo usuário fred
pode combinar com diversas das entradas vistas na tabela anterior. Como o servidor escolhe qual entrada usar se mais de uma coincide? O servidor resolve esta questão ordenando a tabela user
no tempo de inicialização, depois procura pelas entradas na ordem da classificação quando um usuário tenta se conectar. A primeira entrada que coincidir é a que será usada.
A ordenação da tabela user
funciona da forma mostrada a seguir. Suponha que a tabela user
se pareça com isto:
+-----------+----------+- | Host | User | ... +-----------+----------+- | % | root | ... | % | jeffrey | ... | localhost | root | ... | localhost | | ... +-----------+----------+-
Quando o servidor lê a tabela, ele ordena as entradas com os valores mais específicos de Host
primeiro ('%'
na coluna Host
significa qualquer máquina
e é menos específico). Entradas com o mesmo valor Host
são ordenadas com os valores mais específicos de User
primeiro (um valor em branco na coluna User
significa qualquer usuário
e é menos específico). O resultado da tabela user
ordenada ficaria assim:
+-----------+----------+- | Host | User | ... +-----------+----------+- | localhost | root | ... | localhost | | ... | % | jeffrey | ... | % | root | ... +-----------+----------+-
Quando uma conexão é iniciada, o servidor procura entre as entradas ordenadas e utiliza a primeira entrada coincidente. Para uma conexão a partir de localhost
feito por jeffrey
, as entradas com 'localhost'
na coluna Host
coincide primeiro. Destas, a entrada com o nome do usuário em branco combina com o nome da máquina e o nome do usuário. (A entrada '%'/'jeffrey'
também casaria, mas ela não é a primeira entrada coincidente na tabela.
Aqui está outro exemplo. Suponha que a tabela user
fosse assim:
+----------------+----------+- | Host | User | ... +----------------+----------+- | % | jeffrey | ... | thomas.loc.gov | | ... +----------------+----------+-
A tabela ordenada pareceria com isto:
+----------------+----------+- | Host | User | ... +----------------+----------+- | thomas.loc.gov | | ... | % | jeffrey | ... +----------------+----------+-
Uma conexão a partir de thomas.loc.gov
feita por jeffrey
coincide com a primeira entrada, no entanto, uma conexão de whitehouse.gov
fetia por jeffrey
coincidiria com a segunda entrada na tabela.
Um erro comum é pensar que para um determinado usuário, todas as entradas que citam explicitamente este usuário serão usadas primeiro quando o usuário tentar encontrar uma combinação para a conexão. Simplesmente isto não é verdade. O exemplo anterior ilustra isto, onde uma conexão de thomas.loc.gov
feita por jeffrey
combina primeiro não com a entrada contendo 'jeffrey'
no valor do campo user
, mas sim pela entrada sem o nome de usuário!
Se você tiver problemas conectando ao servidor, imprima a tabela user
e ordene-a na manualmente para ver onde se deu o primeiro coincidência de valores. Se a conexão obtiver sucesso mas os seus privilégios não são os esperados, você pode usar a função CURRENT_USER()
(nova na versão 4.0.6) para ver com qual combinação usuário/máquina a sua conexão coincide. Leia "Funções Diversas".