Connexion à distance sur une base de données

Résolu/Fermé
honey22 Messages postés 119 Date d'inscription mardi 21 août 2012 Statut Membre Dernière intervention 3 juillet 2014 - 10 juil. 2013 à 14:40
 arad - 3 sept. 2013 à 11:27
Bonjour,

J'ai actuellemet un serveur IIS configuré en local avec une base de données MySQL et PhpMyAdmin avec un CRM développé en ASP.
Cependant j'ai besoin de recueillir les informations des formulaires de remplis sur mon site internet et de les mettre dans ma base en local. Le souci est que ça m'affiche :

Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[MySQL][ODBC 3.51 Driver]Can't connect to MySQL server on 'IpDeMonServeur' (10060)

J'ai trouvé pas mal de trucs sur le net, et j'ai tout essayé, rien ne change.. (définir un utilisateur avec tous les droits, regarder le my.ini de MySQL mais pas trouvé de bind-adress ou skip-networking)

Ma connexion sur le serveur distant (chez LWS) :
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DRIVER={MySQL ODBC 3.51 Driver}; SERVER=xxx.xxx.xxx.xxx; PORT=3306; DATABASE=xxxx; UID=xxxx;PASSWORD=xxxx; OPTION=3"

Quelqu'un aurait une idée ? S'il vous plait..

2 réponses

heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
10 juil. 2013 à 21:40
Bonsoir,

La création de tous les droits accordés par l'administrateur à un utilisateur 'jean' pour tous les objets de SA base se fait par l'une des commandes suivantes :

1: GRANT ALL PRIVILEGES ON Base.* TO jean@localhost IDENTIFIED BY 'mdp';
2: GRANT ALL PRIVILEGES ON Base.* TO jean@192.168.0.15 IDENTIFIED BY 'mdp';
3: GRANT ALL PRIVILEGES ON Base.* TO jean@% IDENTIFIED BY 'mdp';
4: GRANT ALL PRIVILEGES ON Base.* TO jean IDENTIFIED BY 'mdp';

mpd = mot de passe

Dans l'exemple 1, Jean ne pourra interroger sa base de données qu'à partir de la machine sur laquelle se trouve le serveur MySQL, c'est à dire en local. Soit lui-même à la console mysql soit par un script lui appartenant et se trouvant sur la machine locale.

Dans l'exemple 2, Jean ne pourra interroger sa base de données qu'à partir de la machine 192.168.0.15 uniquement (attention si le serveur se trouve sur Internet (n° IP publique). 192.168.0.15 est une IP privée qui ne pourra donc pas être atteinte par le serveur. Il faudrait indiquer l'adresse IP publique du routeur.

Les exemples 3 et 4 sont équivalents. Pour MySQL, % est un caractère de substitution (ex: "SELECT .... WHERE nom LIKE 'dup%';"). Donc, 'jean@%' signifie par 'jean' à partir de n'importe quelle machine. Ne pas marquer de localisation, comme l'exemple 4, équivaut à l'exemple 3.

Certains FAI, pour des raisons de sécurité n'autorisent que les accès en localhost (ex: Free.fr).
Pour ma part, je suis hébergé sur un serveur privé et je me suis accordé les droits à partir de n'importe où. De ce fait, à partir de mon PC à la maison, j'ouvre une session SSH (avec PuTTY) et je peux travailler sur ma base distante comme si elle était sur mon PC domestique. J'ai aussi un espace web avec PHP/MySQL chez Free. Ce que je fais avec une base de mon serveur privé, je ne peux pas le faire avec ma base chez Free pour cette raison.

Je pense qu'il faut demander à ton hébergeur si les droits d'accès MySQL sont seulement accordés en local (pour eux) ou si tu peux y accéder à distance.
7
honey22 Messages postés 119 Date d'inscription mardi 21 août 2012 Statut Membre Dernière intervention 3 juillet 2014 29
11 juil. 2013 à 11:22
Tout d'abord, merci de votre réponse si rapide !! :)

Je suis déjà passer par là, je connaissais déjà le principe des droits et des utilisateurs MySQL, mais merci beaucoup, avec tes explications c'est quand même plus clair que ce que j'avais en tête même si j'ai déjà fait la même chose.
Ensuite, le problème n'est pas que ma base est distante, au contraire, ma base est en local, et je souhaite y accéder depuis mon site qui est chez LWS (donc distant). La base est chez moi, et donc je peux configurer comme je le souhaite. J'ai même essayé en mettant tous les privilèges à tout le monde venant de l'extérieur pour voir si cela fonctionnait, et rien. Toujours la même erreur..

Afin de mieux comprendre la situation, prenons l'exemple de la page de formulaire. Sur monsite.fr j'ai un formulaire avec les champs nom / prénom / adresse email. Le visiteur complète ce formulaire et quand il clique sur ok, une page actionform.asp enregistre les données dans la base de données, et place un cookie sur le pc de l'utilisateur. Je voudrais donc pouvoir via monsite.fr dans ma base qui est ici en local mais accessible avec son adresse IP fixe.
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
11 juil. 2013 à 14:18
Je ne sais pas comment est installé ton réseau sur ta machine mais ordinairement :
- les machines présentes sur Internet ont des numéros IP publiques
- les machines sur les réseaux domestiques ont des numéros IP privés

Numéros IP privés pour réseaux locaux :
Classe A : 10.0.0.0
Classe B : 172.16.0.0 à 172.31.0.0
Classe C : 192.168.0.0 à 192.168.255.0
Ces numéros IP ne se seront donc jamais attribués sur internet.

Config classique d'un réseau local privé qui pourrait être le tien :
 
+-------------+
| serveur web |
| hébergement |
|    (LWS)    |
| 105.7.19.12 | <== IP publique (du serveur)
+-------+-----+
        |
   @ Internet @
        |
        |
+-------+-------+
| 80.105.213.8  | <== IP publique (par FAI)
| Modem/Routeur |
|  192.168.0.1  | <== IP privée (passerelle)
+---+---+---+---+
        |   |
        |   +-------> autres machines du LAN
+-------+-------+
| 192.168.0.15  |
| PC domestique |
| serveur MySQL |
|    etc...     |
+---------------+


Tous les numéros IP indiqués dans la suite feront référence au schéma ci-dessus.

Le numéro IP de ton PC sur lequel tourne le serveur MySQL (dans l'exemple: 192.168.0.15) est un numéro IP qui ne sera jamais vu ni adressable sur Internet car c'est un numéro privé. Le script contenu dans la page web sur le serveur web qui se trouve sur Internet et qui contient ton formulaire ne pourra jamais atteindre le serveur MySQL se trouvant sur une machine ayant un numéro privé.

Le modem/routeur fait normalement du NAT (Network Address Translation) C'est à dire de la translation d'adresse. Quand un paquet IP provenant d'une machine privée va vers Internet, le modem/routeur remplace l'adresse IP du demandeur (IP privée) par la sienne propre (IP publique).

Si l'on s'en réfère à l'exemple du croquis : sur ton PC (192.168.0.15) tu demandes une page web sur ton serveur (105.7.19.12). La demande qui part de ton PC en paquets IP va contenir l'adresse du demandeur (toi : 192.168.0.15). Le modem/routeur faisant du NAT, va remplacer ton adresse par la sienne à savoir par 80.105.213.8). Les paquets IP arriveront sur ton serveur et ce dernier "croira" que la demande émane de 80.105.213.8. Il enverra donc la réponse à ce numéro IP et ton modem/routeur va recevoir les paquets IP de la réponse et il remplacera alors, dans ces paquets son adresse (80.105.213.8) par celle du véritable destinataire : 192.168.0.15.

Les paquets qui viennent d'Internet vers le réseau local ne sont que des réponses à des questions émanant du réseau local. Or ton script sur ton serveur web, quand il veut s'adresser à ton serveur MySQL sur ton réseau local n'effectue pas de réponse et il ne peut pas, à partir d'Internet, s'adresser directement à un numéro IP privé.

Généralement les modems/routeurs gèrent aussi des règles de sécurité et font office de firewall. C'est à dire qu'une demande provenant d'Internet vers une machine privée sera refusée. Cela protège le réseau privé. Toutefois, tous les services ne sont pas refusés ex abrupto. Certaines organisations peuvent souhaiter mettre sur leur réseau un serveur web adressable depuis Internet. Il peut donc y avoir une zone du réseau local qui sera accessible de l'Internet et pour laquelle la surveillance sera moins policière. On appelle cette zone une DMZ (DeMilitary Zone, une zone démilitarisée).

Beaucoup de modems/routeurs gèrent les DMZ. Dans ton cas (et pour l'exemple ci-dessus), il faudrait indiquer au modem/routeur une DMZ dont le numéro IP serait 192.168.0.15 (ta machine). Ensuite, pour éviter que n'importe quoi n'arrive sur ton PC, tu filtres les services. En l'occurrence si tu ne veux laisser passer que les requêtes MySQL, tu autorises le service 3306 pour aller sur la DMZ. Si ton PC domestique héberge un serveur web lui aussi, il faut autoriser le service 80 vers la DMZ pour que celui-ci soit accessible à partir de l'internet ou ne pas l'autoriser dans le cas contraire. Etc.. pour les autres services à autoriser sur la DMZ (FTP: 21, SMTP: 25, etc...)

En résumé:

- Ton PC: serveur MySQL avec tous les droits à partir de n'importe où ou mieux, seulement à partir de ton servur web (105.7.19.12), pour l'utilisateur autorisé,
- modem/routeur: Définir comme DMZ ta machine (192.168.0.15) et autoriser le service MySQL (3306) vers la DMZ

Normalement, le script se trouvant sur le serveur web d'Internet, en s'adressant à ton IP publique (ou à un nom DNS dynamique correspondant -voir un peu plus loin-), port 3306 sera redirigé vers la DMZ (en l'occurrence ta machine) où le service 3306 est autorisé. Comme l'utilisateur peut adresser ses requêtes à partir de n'importe où (ou juste de ton serveur web), la requête sera acceptée et exécutée. Sauf... si ton fournisseur d'accès change parfois ton numéro IP (adressage dynamique de l'IP publique de ton modem/routeur: 80.105.213.8). Dans ce cas, si cela peut se produire, recourir à des services tels que no-IP, DynDNS qui remplissent le rôle de DNS pour les machine à adressage dynamique.

Voilà. j'espère avoir répondu et que ça marchera... :o)
Bonne continuation.
3
honey22 Messages postés 119 Date d'inscription mardi 21 août 2012 Statut Membre Dernière intervention 3 juillet 2014 29
29 juil. 2013 à 15:13
Bonjour,

tout d'abord une immense merci pour avoir pris le temps de répondre, et surtout d'apporter une réponse si complète et bien expliqué !
Depuis, le problème a été traité différemment, mais ça revient un peu à ça. En fait, nous avons chercher à exécuter une page en local dans une page sur le site (en la cachant dans une image, ou dans un iframe). Nous avons utilisé No-ip pour obtenir une adresse fixe. Pour se qui est de la connexion à la base de données, c'est donc la page en local qui s'en charge et y rentre les données, et cette page récupère elle même les données en utilisant une url longue.

Encore merci de ta réponse qui m'a beaucoup éclairé, et permis de mieux comprendre !
Bonne après midi :)
0
Bonjour à tous,

heliconius, est-ce-que tu peux en dire un peu plus sur la démarche à suivre pour se connecter à la bdd du serveur local depuis chez toi ?? Avec putty et ssh, c'est exactement ce que j'essaie de faire... Je cherche à atteindre une BDD mysql qui se trouve sur le serveur local de mon entreprise depuis chez moi donc internet... J'ai une machine windows
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
Modifié par heliconius le 22/08/2013 à 17:43
Bonjour,

Je vais essayer de te répondre simplement. Pour les besoins de l'explication, on va supposer que les trois machines ci-dessous sont installées sous Unix (ou Linux, même combax). On verra pour Windows après.

+----------------+   +----------------+   +----------------+
|   SRV1  S+C    |   |    host1  C    |   |   SRV2  S+C    |
|  82.13.2.103   |   |  64.136.7.13   |   |  118.5.97.39   |
|                |   |                |   |                |
| BDD1,BDD2,BDD3 |   |                |   | BDDa,BDDb,BDDc |
| morpho,elise,  |   |                |   | kawa,suzu,...  |
| jo, ...        |   |                |   |                |
| u=jo           |   | u=luc,elise,jo |   | u=morpho       |
+----------------+   +----------------+   +----------------+

"u=" signifie : liste des utilisateurs Unix. Les autres sont des utilisateurs MySQL.

- SRV1 (82.13.2.103) contient un serveur MySQL et un client MySQL (S+C), serveur sur lequel les bases de données BDD1,BDD2 et BDD3 ont été créées avec des utilisateurs MySQL : morpho, elise, jo et d'autres ainsi qu'un utilisateur Unix parmi d'autres : jo.

- SRV2 (118.5.97.39) contient un serveur MySQL et un client MySQL (S+C), serveur sur lequel les bases de données BDDa,BDDb et BDDc ont été créées avec des utilisateurs MySQL : kawa, suzu et d'autres utilisateurs MySQL et, parmi d'autres, un utilisateur Unix : morpho.

- host1 (64.136.7.13) contient un client MySQL (C) installé et des utilisateurs Unix : luc, elise, jo.

Supposons que l'administrateur MySQL (pas forcément l'administrateur Unix de la machine SRV1) ait tapé les trois commandes suivantes :

- GRANT ALL PRIVILEGES ON BDD1.* TO 'jo'@'localhost' IDENTIFIED BY 'abcDef';
- GRANT ALL PRIVILEGES ON BDD3.* TO 'morpho'@'118.5.97.39' IDENTIFIED BY '67890';
- GRANT ALL PRIVILEGES ON BDD2.* TO 'elise'@'%' IDENTIFIED BY '12345';
    ou, ce qui revient au même
  GRANT ALL PRIVILEGES ON BDD2.* TO 'elise' IDENTIFIED BY '12345';

NB:
Sous MySQL le caractère % est un caractère générique. Donc :
... TO 'elise'@'%' IDENTIFIED BY ...
est équivalent à :
... TO 'elise' IDENTIFIED BY ...
parce que dans la première commande on précise qu'elle a accès de n'importe où et dans la seconde commande on n'a pas précisé à partir d'où elise pouvait interagir avec sa base de données. Elle peut donc le faire à partir de n'importe où.


Cela veut dire que :

1er cas
-------
l'utilisteur Unix jo (ayant un compte Unix sur la machine host1) possède un compte MySQL (sur la machine SRV1) et il ne peut utiliser sa base de données BDD1 qu'en local. Autrement dit, deux possibilités lui sont offertes :

- soit il a la possibilité de se connecter à SRV1 par SSH, de lancer le client MySQL local (commande Unix mysql) pour se connecter au serveur MySQL avec son login (jo) et mot de passe (abcDef) et d'interroger sa base de donnée comme dans tout client MySQL normal. Sa commande sera :

jo@SRV1~$ mysql -u jo -pabcDef (suivi, une fois connecté par "use BDD1;")

- soit ses commandes MySQL (interrogations, modifications, suppressions) peuvent être placées dans un script PHP situé en local, sur la machine SRV1, et exécuté via le web comme sur un site web avec interraction avec la base de données. Si l'exécution est lancée à distance, le script exécutant des commandes MySQL est local.

2ème cas
--------
L'utilisateur Unix morpho (sur SRV2), ayant un compte MySQL (sur SRV1) peut (lorsqu'il est situé sur la machine SRV2, et UNIQUEMENT sur celle-ci) utiliser le client MySQL de la machine SRV2 pour interroger le serveur MySQL se trouvant sur SRV1. Ses commandes pourront être :

morpho@SRV2~$ mysql -h 82.13.2.103 -u morpho -p67890 (suivi, une fois connecté par "use BDD3;")
ou encore, directement en ligne de dommande, par :
morpho@SRV2~$ mysql -h 82.13.2.103 -u morpho -p67890 -D BDD3 -e "select * from clients order by nom,prenom;"

Morpho se trouve sur SRV2 et interroge sa base de données qui se trouve sur SRV1 sans se connecter à la machine SRV1 par SSH. Mais il ne pourra faire cela QUE de la machine SRV2 (118.5.97.39)

3ème cas
--------
L'utilisateur Unix elise se trouvant sur la machine host1 (64.136.7.13) pourra faire comme morpho, utiliser le client MySQL de la machine où elle est connectée pour interroger sa base de données (BDD2) se trouvant sur SRV1 et sans avoir à se connecter à SRV1 par SSH mais elle pourra le faire de n'importe où, à partir de n'importe quelle machine pouvant avoir accès à SRV1.

elise@host1~$ mysql -h 82.13.2.103 -u elise -p12345 (suivi, une fois connecté par "use BDD2;")
ou encore
elise@SRV2~$ mysql -h 82.13.2.103 -u elise -p12345 -D DBB2 -e "select nom,prenom,tel from personnes order by nom,prenom;"
ou encore
elise@SRV2~$ mysql --host=82.13.2.103 --user=elise --password=12345 --database=DBB2 --execute="select nom,prenom,tel from personnes order by nom,prenom;"

Naturellement, elise peut aussi se connecter à la machine SRV1 par SSH (en utilisant le compte Unix de jo, par exemple ou après s'y être fait créer un compte Unix). Elle peut alors travailler avec sa base de données en se connectant au serveur MySQL local avec ses propres identifiant et mot de passe MySQL.

Pour résumer le serveur MySQL de la machine SRV1 est accessible :

- en local à : jo, elise
- à partir de SRV2 à : morpho, elise
- de partout à : elise

- Utiliser SSH (avec la commande ssh sous Unix ou avec le logiciel PuTTY sous Windows) revient à se connecter sur la machine et donc se trouver en local.
- Pour une utilisation distante, il faut utiliser le client MySQL de la machine sur laquelle on se trouve et, avec celui-ci, interroger le serveur MySQL distant. Pour que cela soit possible il faut que l'administrateur MySQL du serveur distant ait accordé les privilèges nécessaires.

Le cas Windows
--------------
Quand on est sous Windows, il faut ouvrir une fenêtre DOS (cmd.exe) et lancer (si on en a installé un) un client mysql. Le plus simple pour en obtenir un est d'installer easyphp qui installe un environnement complet MySQL/PHP avec un serveur et un client MySQL. Il existe même des versions portables pouvant s'installer sur une clef USB qu'on peut emmener n'importe où, ce qui permet de disposer d'un client MySQL partout.

Sinon, une autre solution est de télécharger l'excellent freeware Database Browser en version portable (clef USB) à l'URL https://portableapps.com/apps et si les droits de connexion distante au serveur MySQL ont été accordés par l'administrateur MySQL, on peut se connecter et gérer sa base dans une interface graphique.

Lorsque le réseau fonctionne normalement, la possibilité de connexion au serveur MySQL ne dépend donc pas du logiciel, du programme ou du client utilisé, il dépend des droits que l'administrateur MySQL a accordés.

Pour ceux et celles qui pourraient gérer un serveur MySQL (avec easyphp, par exemple), ils/elles pourront aller dans la base mysql du serveur et consulter la table user. Ils pourront avoir quelque chose de similaire à ceci :

mysql> use mysql;
Database changed

mysql> select User,Password,Host from user;
+------------------+-------------------------------------------+-----------+
| User             | Password                                  | Host      |
+------------------+-------------------------------------------+-----------+
| psa_GhYrtCB15mKs | *C9A48795E37DAF568DE25B0BD89F4208879CBF41 |localhost  | 
| debian-sys-maint | *208879CAF568DE25B0E37DAC9A48795E3B0BD55A |localhost  | 
| admin            | *E37DAC9A568DE25B079CAF568DEE37DAC9BD55A7 |localhost  | 
| horde            | *568DE25BC9A4879CBF45E37DAF90A0BD89F4208F |localhost  | 
| heliconius       | *F568DEEA568DE25B079CAFE37DAC9EE37DA52A73 | %         | 
| demos            | *568D079A568DEE37DAC79CAF569BD55A7EEE25B9 | %         | 
| sys2534          | *5B079A568568DE25E25BC9A487DAC9A568DAC9E2 | %         | 
+------------------+-------------------------------------------+-----------+
7 rows in set (0.00 sec)


Voilà. J'espère avoir répondu à ta question.
0
Merci à toi heliconius d'avoir pris le temps de me fournir une réponse complète. Mon problème ne se trouvait pas à ce niveau, j'avais un profil mysql avec % en host. Le problème venait du par-feu du serveur auquel je voulais accéder tout simplement. Il suffisait juste d'inscrire mon ip pour avoir l'accès. Mon ip n'est pas fixe mais je la change tout les 4,5 jours ce n'est pas très grave.
0