Comment accorder un accès distant à MySQL pour tout un sous-réseau?

93

Je peux facilement accorder l'accès à une adresse IP en utilisant ce code:

$ 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;

Mais je dois autoriser tout le sous-réseau 192.168.1. * À accéder à distance à la base de données.

Comment puis je faire ça?

skystar7
la source

Réponses:

100

EDIT: Pensez à regarder et à voter pour la réponse de Malvineous sur cette page. Les masques de réseau sont une solution beaucoup plus élégante.


Utilisez simplement un signe de pourcentage comme caractère générique dans l'adresse IP.

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

Vous pouvez spécifier des caractères génériques dans le nom d'hôte. Par exemple, user_name@'%.example.com's'applique à user_namepour n'importe quel hôte du example.comdomaine et user_name@'192.168.1.%'s'applique à user_namepour n'importe quel hôte du 192.168.1sous-réseau de classe C.

p0lar_bear
la source
6
Je l'ai juste fait comme ça, mais, disons, qu'est-ce qui fait que cela ne s'applique pas à: nom_utilisateur@'192.168.1.my-hacked-rnds.killing.mysql.com '???? Je vais maintenant continuer, puisque c'est MySQL, je sens que je ne veux pas connaître la réponse.
Florian Heigl
+ Florian, je pense qu'il vaut mieux utiliser simplement «%» car cela ajoute une couche de sécurité qui doit être surmontée, mais je pense que vous faites un bon point sur sa faiblesse. Je complète certainement cette configuration par d'autres moyens, tels que le verrouillage du serveur de base de données dans un sous-réseau séparé auquel je peux contrôler l'accès via un pare-feu pour nier vos préoccupations, entre autres.
Josiah
22
Des exemples tels que '192.168.1.my-hacked-rnds.killing.mysql.com' 'sont spécifiquement traités dans dev.mysql.com/doc/refman/5.5/en/account-names.html : pour déjouer de telles tentatives, MySQL interdit la correspondance sur les noms d'hôte commençant par des chiffres et un point. ... Une valeur générique IP ne peut correspondre qu'à des adresses IP, pas à des noms d'hôte.
Stefan Lasiewski
118

Il semble que vous pouvez également utiliser un masque de réseau , par exemple

GRANT ... TO 'user'@'192.168.0.0/255.255.255.0' IDENTIFIED BY ...
Malvineous
la source
7
Cela devrait être la réponse acceptée car c'est la seule technique correcte. Prise en charge depuis au moins la version 5.5: dev.mysql.com/doc/refman/5.5/en/account-names.html
lifeofguenter
6
N'essayez pas d'utiliser la notation CIDR comme "172.16.0.0/16", cela ne fonctionne pas. Utilisez toujours le masque de réseau complet.
Oliver R.
Il semble que vous deviez utiliser la première adresse IP de la plage; L'utilisation par exemple de 192.168.0.34/255.255.255.0 échouera!
Sander
@SanderBackus: 192.160.0.34/255.255.255.0est le même que 192.168.0.34/24ce qui n'a pas vraiment de sens ( /24signifie que le dernier nombre peut être de 0 à 255, en ignorant votre valeur de 34). Cela fonctionne-t-il si vous utilisez un masque valide pour l'adresse IP, comme 192.168.0.34/255.255.255.252?
Malvineous
@Malvineous C'était mon argument. Si vous utilisez 192.160.0.34/255.255.255.0 mysql n'autorise pas 192.160.0.34. Je voulais autoriser full / 24 (oui, j'ai utilisé un masque de réseau complet, comme documenté), mais apparemment, si vous devez utiliser 192.160.0.0/255.255.255.0 pour autoriser une plage complète.
Sander le
28

Vous utiliseriez simplement '%' comme joker comme ceci:

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

Le caractère générique est un "%" au lieu d'un "*"

David Allen
la source
5

Juste une note d'une particularité à laquelle j'ai été confronté:
Considérez:

db server:  192.168.0.101
web server: 192.168.0.102

Si vous avez un utilisateur défini dans mysql.user comme 'user'@'192.168.0.102'avec password1 et un autre 'user'@'192.168.0.%'avec password2,

puis,

si vous essayez de vous connecter au serveur de base de données à partir du serveur Web en tant qu'utilisateur avec mot de passe2,

il en résultera une erreur «Accès refusé» car l' 'user'@'192.168.0.102'authentification IP unique est utilisée sur l' 'user'@'192.168.0.%'authentification générique .

site80443
la source
2
Je ne suis pas sûr que ce soit une réponse à la question. S'il ne fournit pas de réponse directe à la question initiale, il doit être publié sous forme de commentaire.
Kmeixner le
13
Kmeixner, tu t'attends à ce qu'il écrive autant dans un commentaire? Faites preuve de bon sens et arrêtez d'être un robot. Cette communauté a pour but d'aider les développeurs à ne pas se compliquer la vie.
user1735921
0

après avoir connecté le serveur et que vous souhaitez vous connecter sur votre hôte, vous devez suivre les étapes ci-dessous:

  1. écrire mysql pour ouvrir mysql
  2. écrire GRANT ALL ON . to root@'write_your_ip_addres' IDENTIFIED BY 'write_password_to_connect' ;
  3. appuyez sur control et X pour quitter mysql
  4. écrire nano /etc/mysql/my.cnf
  5. écrire # avant bind-address = 127.0.0.1 dans le dossier my.cnf
  6. # adresse-de-liaison = 127.0.0.1
  7. enregistrer le dossier my.cnf avec contrôle + X
  8. écrire service mysql restart
  9. vous pouvez vous connecter via navicat sur votre hôte
murat delen
la source
0

Motivé par la réponse @Malvineaus, je l'ai essayé moi-même et j'ai remarqué que cela ne fonctionnait pas pour moi.

Vous pouvez spécifier des masques de sous-réseau avec «192.168.1.%» Ou «192.168.1.0/255.255.255.0», mais le sous-réseau doit toujours être sur des octets complets. voir https://mariadb.com/kb/en/create-user/#host-name-component . En conséquence, la fonctionnalité entre une manière de spécification et l'autre est la même.

Par exemple '192.168.1.0/255.255.255.128' ne fonctionnera pas car il n'est pas sur une limite d'octet complète.

Patric
la source