Como conceder acesso remoto ao MySQL para uma sub-rede inteira?

96

Posso facilmente conceder acesso a um IP usando este código:

$ mysql -u root -p
Enter password:    
mysql> use mysql    
mysql> GRANT ALL ON *.* to root@'192.168.1.4' IDENTIFIED BY 'your-root-password';     
mysql> FLUSH PRIVILEGES;

Mas preciso permitir que toda a sub-rede 192.168.1. * Acesse o banco de dados remotamente.

Como eu posso fazer isso?

skystar7
fonte

Respostas:

103

EDITAR: Considere ler e votar a resposta de Malvineous nesta página. As máscaras de rede são uma solução muito mais elegante.


Basta usar um sinal de porcentagem como curinga no endereço IP.

De http://dev.mysql.com/doc/refman/5.1/en/grant.html

Você pode especificar curingas no nome do host. Por exemplo, user_name@'%.example.com'aplica-se a user_namequalquer hospedeiro no example.comdomínio, e user_name@'192.168.1.%'aplica-se a user_namequalquer hospedeiro na 192.168.1sub-rede classe C.

p0lar_bear
fonte
6
Eu simplesmente fiz assim, mas, digamos, o que o faz não se aplicar a: user_name@'192.168.1.my-hacked-rnds.killing.mysql.com '???? Agora vou prosseguir, já que se trata do MySQL, sinto que não quero saber a resposta.
Florian Heigl
+ Florian, acho que é melhor do que simplesmente usar '%', pois adiciona uma camada de segurança que deve ser superada, mas acho que você ressalta sua fraqueza. Eu certamente suplemento essa configuração por outros meios, como bloquear o servidor de banco de dados em uma sub-rede separada que posso controlar o acesso por meio de um firewall para negar suas preocupações, entre outras coisas.
Josiah
23
Exemplos como '192.168.1.my-hacked-rnds.killing.mysql.com' 'são especificamente endereçados em dev.mysql.com/doc/refman/5.5/en/account-names.html : Para frustrar tais tentativas, MySQL não permite a correspondência de nomes de host que começam com dígitos e um ponto. ... Um valor curinga de IP pode corresponder apenas a endereços IP, não a nomes de host.
Stefan Lasiewski
123

Ele parece que você também pode usar uma máscara de rede , por exemplo,

GRANT ... TO 'user'@'192.168.0.0/255.255.255.0' IDENTIFIED BY ...
Malvino
fonte
7
Esta deve ser a resposta aceita, pois é a única técnica correta. Suportado desde pelo menos 5.5: dev.mysql.com/doc/refman/5.5/en/account-names.html
lifeofguenter
7
Não tente usar a notação CIDR como "172.16.0.0/16", isso não funciona. Sempre use a máscara de rede completa.
Oliver R.
Parece que você deve usar o primeiro endereço IP do intervalo; Usar, por exemplo, 192.168.0.34/255.255.255.0 irá falhar!
Sander
@SanderBackus: 192.160.0.34/255.255.255.0é o mesmo 192.168.0.34/24que não faz sentido ( /24significa que o último número pode ser de 0 a 255, ignorando seu valor de 34). Funciona se você usar uma máscara válida para o IP, como 192.168.0.34/255.255.255.252?
Malvino
@Malvineous Esse era o meu ponto. Se você usar 192.160.0.34/255.255.255.0, o mysql não permite 192.160.0.34. Eu pretendia permitir full / 24 (sim, usei máscara de rede completa, conforme documentado), mas aparentemente se você tiver que usar 192.160.0.0/255.255.255.0 para permitir o alcance total.
Sander
28

Você apenas usaria '%' como seu caractere curinga, como este:

GRANT ALL ON *.* to root@'192.168.1.%' IDENTIFIED BY 'your-root-password';
Mike Brant
fonte
12
mysql> GRANT ALL ON *.* to root@'192.168.1.%' IDENTIFIED BY 'your-root-password';  

O caractere curinga é um "%" em vez de um "*"

David Allen
fonte
6

Apenas uma observação sobre uma peculiaridade que enfrentei:
considere:

db server:  192.168.0.101
web server: 192.168.0.102

Se você tiver um usuário definido em mysql.user 'user'@'192.168.0.102'com password1 e outro 'user'@'192.168.0.%'com password2,

então,

se você tentar se conectar ao servidor db do servidor web como 'usuário' com senha 2,

isso resultará em um erro de 'Acesso negado' porque a 'user'@'192.168.0.102'autenticação de IP único é usada sobre a 'user'@'192.168.0.%'autenticação de curinga .

site80443
fonte
2
Não tenho certeza se esta é uma resposta à pergunta. Se não fornecer uma resposta direta à pergunta original, deve ser postado como um comentário.
Kmeixner
14
Kmeixner, você espera que ele escreva muito em um comentário? Use o bom senso e pare de ser um robô. Esta comunidade é para ajudar os desenvolvedores a não dificultar suas vidas.
user1735921
Obrigado por esta dica inestimável.
TenG
0

depois de conectar o servidor e quiser se conectar ao seu host, você deve seguir as etapas abaixo:

  1. escreva mysql para abrir mysql
  2. escrever ;GRANT ALL ON . to root@'write_your_ip_addres' IDENTIFIED BY 'write_password_to_connect'
  3. pressione control e X para sair do mysql
  4. Escreva nano /etc/mysql/my.cnf
  5. escreva # antes do endereço de ligação = 127.0.0.1 na pasta my.cnf
  6. # bind-address = 127.0.0.1
  7. salve a pasta my.cnf com control + X
  8. Escreva service mysql restart
  9. você pode se conectar via navicat em seu host
Murat Delen
fonte
0

Motivado pela resposta de @Malvineaus, tentei eu mesmo e percebi que não funcionou comigo.

Você pode especificar máscaras de sub-rede com '192.168.1.%' Ou '192.168.1.0/255.255.255.0', mas a sub-rede deve estar sempre em octetos completos. consulte https://mariadb.com/kb/en/create-user/#host-name-component . Como resultado, a funcionalidade entre uma forma de especificação e outra é a mesma.

Por exemplo, '192.168.1.0/255.255.255.128' não funcionará, pois não está em um limite de octeto completo.

Patric
fonte