accorder un accès à distance à la base de données MySQL depuis n'importe quelle adresse IP


282

Je connais cette commande:

GRANT ALL PRIVILEGES
ON database.*
TO 'user'@'yourremotehost'
IDENTIFIED BY 'newpassword';

Mais cela me permet seulement d'accorder une adresse IP particulière pour accéder à cette base de données MySQL distante. Et si je le souhaite pour que tout hôte distant puisse accéder à cette base de données MySQL? Comment je fais ça? Fondamentalement, je rends cette base de données publique afin que tout le monde puisse y accéder.


1
Avant de faire cela, considérez les implications de sécurité
e18r

7
tous les systèmes ne sont pas des systèmes de production. certaines personnes en ont besoin pour le développement.
Conrad Jones

Réponses:


275
TO 'user'@'%'

% est un caractère générique - vous pouvez également faire '%.domain.com'ou '%.123.123.123'et des choses comme ça si vous en avez besoin.


@kristopolous Il y a beaucoup de choses qui pourraient provoquer cela. Cette commande concerne l'accès à distance (deux machines différentes). Si ce n'est pas ce que vous faites, ce n'est pas la bonne commande. Vous avez toujours besoin d'un mot de passe correct et d'autres choses.
Ariel

11
Vous devez utiliser les "privilèges de vidage"; pour que les changements prennent effet
Didier Sampaolo

L'astuce lors de la connexion à une instance de base de données s'exécutant sur la même instance de système d'exploitation (par exemple, votre machine de développement), consiste à passer le -h my_machine_nameparamètre. Cela incite le client à vous identifier 'user'@my_machine_name.example.complutôt que 'user'@localhost. De cette façon, vous n'avez pas besoin de créer et de gérer des comptes doubles et des autorisations pour les deux localhostet l'accès au réseau. Et, bien sûr, être sûr mysqldest lié à 0.0.0.0contre 127.0.0.1.
Charlie Reitzel

173

Activer l'accès à distance (Grant) Accueil / Tutoriels / Mysql / Activer l'accès à distance (Grant) Si vous essayez de vous connecter à votre serveur mysql à partir d'une machine distante et que vous rencontrez une erreur comme ci-dessous, cet article est pour vous.

ERREUR 1130 (HY000): l'hôte '1.2.3.4' n'est pas autorisé à se connecter à ce serveur MySQL

Changer la configuration de mysql

Commencez par éditer le fichier de configuration mysql

vim /etc/mysql/my.cnf

Mettez en commentaire les lignes suivantes.

#bind-address           = 127.0.0.1
#skip-networking

Si vous ne trouvez pas de ligne de saut de réseau, ajoutez-la et commentez-la.

Redémarrez le serveur mysql.

~ /etc/init.d/mysql restart

Modifier le privilège GRANT

Vous serez peut-être surpris de voir, même après le changement ci-dessus, que vous n'obtenez pas d'accès à distance ou que vous n'avez pas accès à toutes les bases de données.

Par défaut, le nom d'utilisateur et le mot de passe mysql que vous utilisez sont autorisés à accéder localement au serveur mysql. Il faut donc mettre à jour le privilège.

Exécutez une commande comme ci-dessous pour accéder à partir de toutes les machines. (Remplacez USERNAMEet PASSWORDpar vos informations d'identification.)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'%' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;

Exécutez une commande comme ci-dessous pour donner accès à partir d'une adresse IP spécifique. (Remplacez USERNAMEet PASSWORDpar vos informations d'identification.)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'1.2.3.4' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;

Vous pouvez remplacer 1.2.3.4 par votre IP. Vous pouvez exécuter la commande ci-dessus plusieurs fois pour accorder l'accès à partir de plusieurs adresses IP.

Vous pouvez également spécifier un USERNAME& séparé PASSWORDpour l'accès à distance.

Vous pouvez vérifier le résultat final en:

SELECT * from information_schema.user_privileges where grantee like "'USERNAME'%";

Enfin, vous devrez peut-être également exécuter:

mysql> FLUSH PRIVILEGES;

Tester la connexion

Depuis le terminal / la ligne de commande:

mysql -h HOST -u USERNAME -pPASSWORD

Si vous obtenez un shell mysql, n'oubliez pas d'exécuter les bases de données show; pour vérifier si vous disposez des droits appropriés sur les machines distantes.

Astuce bonus: révoquer l'accès

Si vous accordez accidentellement l'accès à un utilisateur, mieux vaut avoir l'option de révocation à portée de main.

Les éléments suivants révoqueront toutes les options de USERNAME de toutes les machines:

mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'USERNAME'@'%';
Following will revoke all options for USERNAME from particular IP:

mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'USERNAME'@'1.2.3.4';
Its better to check information_schema.user_privileges table after running REVOKE command.

Si vous voyez le privilège USAGE après avoir exécuté la commande REVOKE, ça va. C'est aussi bon que pas de privilège du tout. Je ne sais pas s'il peut être révoqué.


7
Notez que j'ai dû changer de /etc/mysql/mysql.conf.d/mysqld.cnffichier au lieu de /etc/mysql/my.cnfcommenter la bind-addresspièce. La #skip-networkingligne est manquante et il ne devrait y avoir aucun effet à ajouter et à commenter la ligne.
Pawan

1
Sur MariaDB 10.1.26, le fichier de configuration est/etc/mysql/mariadb.conf.d/50-server.cnf
Kwadz

Si vous avez fait tout ce qui précède et que vous ne parvenez toujours pas à vous connecter, vérifiez les paramètres de votre pare-feu, peut-être 3306que vous
bloquez le

37

En supposant que l'étape ci-dessus est terminée et que le port MySql 3306 est libre d'accès à distance; N'oubliez pas de lier l'adresse IP publique dans le fichier de configuration mysql.

Par exemple sur mon serveur Ubuntu:

#nano /etc/mysql/my.cnf

Dans le fichier, recherchez le bloc de section [mysqld] et ajoutez la nouvelle adresse de liaison, dans cet exemple, c'est 192.168.0.116. Cela ressemblerait à quelque chose comme ça

......    
.....    
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.

bind-address        = 127.0.0.1    
bind-address        = 192.168.0.116

.....    
......

vous pouvez supprimer la liaison localhost (127.0.0.1) si vous le souhaitez, mais vous devez ensuite donner spécifiquement une adresse IP pour accéder au serveur sur la machine locale.

Ensuite, la dernière étape consiste à redémarrer le serveur MySql (sur ubuntu)

stop mysql

start mysql

ou #/etc/init.d/mysql restartpour d'autres systèmes

La base de données MySQL est désormais accessible à distance par:

mysql -u username -h 192.168.0.116 -p

/etc/init.d/mysql reloaddevrait suffire
Lorenz Lo Sauer

Je viens de le faire et je n'ai pas pu me connecter à distance au serveur mysql. J'ai ensuite essayé de commenter les adresses de liaison et cela a fonctionné. J'ai également essayé de me connecter au serveur avec mysql -u <user> -p sans spécifier l'hôte et cela a fonctionné, il semble donc que "vous pouvez supprimer la liaison avec localhost (127.0.0.1) si vous le souhaitez, mais vous devez donner une adresse IP pour accéder au serveur sur la machine locale. " n'est pas correcte. (Ubuntu 12.04 LTS server mysql Ver 14.14 Distrib 5.5.34)
Programster

5
La bind-addressdirective détermine l'adresse IP sur laquelle le serveur mysql écoute; pas les adresses IP à partir desquelles le serveur accepte les connexions.
GoZoner

1
Après avoir suivi chaque étape, cela ne fonctionne pas. bind-addressJ'obtiens une erreur lorsque je commente l'adresse localhost ou remotehost. mysql.serviceJob for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.
baermathias

Est-il possible de fournir une adresse comme abc.abc:1234 au lieu de 192.168.0.116?
bielas

26

Pour tous ceux qui ont tâté avec ça, voici comment j'ai pu accorder les privilèges, j'espère que cela aide quelqu'un

GRANT ALL ON yourdatabasename.* TO root@'%' IDENTIFIED BY
'yourRootPassword';

Comme indiqué, il %s'agit d'un caractère générique et cela permettra à n'importe quelle adresse IP de se connecter à votre base de données. L'hypothèse que je fais ici est que lorsque vous vous connecterez, vous aurez un utilisateur nommé root(qui est le nom par défaut). Saisissez le mot de passe root et vous êtes prêt à partir. Notez que je n'ai pas de guillemets simples ( ') autour de la racine de l'utilisateur.


Pourquoi la suppression des guillemets simples de l'utilisateur est-elle importante? Pourquoi cela diffère-t-il des autres réponses (et du manuel)?
DMCoding

26

Des modifications du fichier de configuration sont nécessaires pour activer les connexions via localhost.

Pour vous connecter via des adresses IP distantes, connectez-vous en tant qu'utilisateur "root" et exécutez les requêtes ci-dessous dans mysql.

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

CREATE USER 'username'@'%' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

Cela créera un nouvel utilisateur accessible sur l'hôte local ainsi que sur les adresses IP distantes.

Commentez également la ligne ci-dessous de votre fichier my.cnf situé dans /etc/mysql/my.cnf

bind-address = 127.0.0.1

Redémarrez votre mysql en utilisant

sudo service mysql restart

Vous devriez maintenant pouvoir vous connecter à distance à votre mysql.


2
Cela ne répond pas à la question.
CHarris

1
@ChristopheHarris pourquoi le ressentez-vous? La réponse donne clairement des instructions étape par étape sur la façon de créer un nouvel utilisateur dans MySQL qui permet à la fois un hôte local et un accès distant à la base de données en utilisant cet utilisateur. Pouvez-vous expliquer plesae?
harishannam

1
Ça ne marche pas pour moi. Ont toujours la même erreur. Que j'essaye avec root ou avec un nouvel utilisateur: impossible de se connecter au serveur MySQL sur 'xxx.xxx.xxx.xxx' ([Errno 61] Connexion refusée)
baermathias

21

Utilisez cette commande:

GRANT ALL ON yourdatabasename.* TO root@'%' IDENTIFIED BY 'yourRootPassword';

Ensuite:

FLUSH PRIVILEGES; 

Puis commentez la ligne ci-dessous dans le fichier "/etc/mysql/mysql.conf.d/mysqld.cnf" (est requis!):

bind-address = 127.0.0.1 

Travaille pour moi!


Très bien. Important la subvention. Sinon, beaucoup d'erreurs pour des demandes commeyour-password-does-not-satisfy-the-current-policy-requirements
Alejandro Teixeira Muñoz

21

Pour pouvoir vous connecter avec votre utilisateur à partir de n'importe quelle adresse IP, procédez comme suit:

Autorisez le serveur mysql à accepter les connexions à distance. Pour ce fichier mysqld.conf ouvert:

sudo gedit /etc/mysql/mysql.conf.d/mysqld.cnf

Recherchez la ligne commençant par "bind-address" et définissez sa valeur sur 0.0.0.0

bind-address                    = 0.0.0.0

et enfin enregistrer le fichier.

Remarque: Si vous exécutez MySQL 8+, la bind-addressdirective ne sera pas dans le mysqld.cnffichier par défaut. Dans ce cas, ajoutez la directive au bas du fichier /etc/mysql/mysql.conf.d/mysqld.cnf.

Redémarrez maintenant le serveur mysql, avec systemdou utilisez l'ancienne servicecommande. Cela dépend de votre système d'exploitation:

sudo systemctl restart mysql # for ubuntu    
sudo systemctl restart mysqld.service # for debian

Enfin, le serveur mysql est désormais capable d'accepter les connexions à distance.

Nous devons maintenant créer un utilisateur et lui accorder une autorisation, afin que nous puissions nous connecter à distance avec cet utilisateur.

Connectez-vous à la base de données MySQL en tant que root ou à tout autre utilisateur disposant des privilèges root.

mysql -u root -p

créez maintenant l'utilisateur souhaité à la fois dans l'hôte local et dans le caractère générique '%' et accordez des autorisations sur toutes les bases de données en tant que telles.

CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypass';
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypass';

Ensuite,

GRANT ALL ON *.* TO 'myuser'@'localhost';
GRANT ALL ON *.* TO 'myuser'@'%';

Et enfin n'oubliez pas de vider les privilèges

FLUSH PRIVILEGES;

Remarque: Si vous avez configuré un pare-feu sur votre serveur de base de données, vous devrez également ouvrir le port 3306par défaut de MySQL pour autoriser le trafic vers MySQL.

J'espère que cela t'aides ;)


2
sudo systemctl restart mysqld.service est pour debian, j'ai dû utiliser sudo systemctl restart mysql.service est pour ubuntu
ani0904071

J'ai mis à jour ma réponse et ajouté la commande mysql restart pour les deux distributions. merci @ ani0904071
Imtiaz Shakil Siddique

17

Exécutez ce qui suit:

$ mysql -u root -p      
mysql> GRANT ALL ON *.* to root@'ipaddress' IDENTIFIED BY 'mysql root password';     
mysql> FLUSH PRIVILEGES;     
mysql> exit

Ensuite, essayez une connexion à partir de l'adresse IP que vous avez spécifiée:

mysql -h address-of-remove-server -u root -p   

Vous devriez pouvoir vous connecter.


15

Vous pouvez résoudre le problème de MariaDB via cette commande :

Remarque:

GRANT ALL ON *.* to root@'%' IDENTIFIED BY 'mysql root password';

%est un caractère générique. Dans ce cas, il fait référence à toutes les adresses IP.


3
dans mysql, ce que vous devez faire est (1) .change mon contenu.cnf (2) .grant utilisateur distant (3) gérer votre pare-feu pour écouter le port 3306.
未来 陆家嘴 顶尖 的 投资 人

Tu m'as sauvé la journée. Appréciez-le!
Almett


7

Pour accéder à distance à la base de données du serveur Mysql 8:

CREATE USER 'root'@'%' IDENTIFIED BY 'Pswword@123';

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

5
  • DÉMARRER MYSQL en utilisant l'utilisateur admin
    • mysql -u admin-user -p (SAISIR LE MOT DE PASSE SUR L'INVITE)
  • Créez un nouvel utilisateur:
    • CREATE USER 'newuser' @ '%' IDENTIFIED BY 'password'; (% -> anyhost)
  • Accorder des privilèges:
    • GRANT SELECT, DELETE, INSERT, UPDATE ON db_name. * TO 'newuser' @ '%';
    • RINCER LES PRIVILÈGES;

Si vous exécutez une instance EC2, n'oubliez pas d'ajouter les règles entrantes dans le groupe de sécurité avec MYSQL / Aurura.


5

Modifier le fichier:

/etc/mysql/percona-server.cnf

Ajoutez le code ci-dessous dans le fichier.

[mysqld] bind-address = 0.0.0.0

Créez un utilisateur pour l'accès à distance.

$ mysql -u root -p      
mysql> GRANT ALL ON *.* to snippetbucketdotcom@'%' IDENTIFIED BY 'tejastank';   
mysql> FLUSH PRIVILEGES;    
mysql> exit

Tous les serveurs Linux fonctionnent,

Pour MSWin c: \ Find insatallation location \ file path


[mysqld] doit ajouter un fichier, sinon cela ne fonctionnera pas correctement
Tejas Tank

3

Créez simplement l'utilisateur dans une base de données comme

GRANT ALL PRIVILEGES ON <database_name>.* TO '<username>'@'%' IDENTIFIED BY '<password>'

Ensuite aller à

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnfet changez la ligne bind-address = 127.0.0.1enbind-address = 0.0.0.0

Après cela, vous pouvez vous connecter à cette base de données à partir de n'importe quelle adresse IP.


3

Ouvrez votre mysql consoleet exécutez la commande suivante (entrez le nom, le nom d'utilisateur et le mot de passe de votre base de données):

DONNER TOUT SUR votre nom de base de données. * À admin @ '%' IDENTIFIÉ PAR 'yourRootPassword';

Ensuite, exécutez:

RINCER LES PRIVILÈGES;

Ouvrez la ligne de commande et ouvrez le fichier à l' /etc/mysql/mysql.conf.d/mysqld.cnfaide de n'importe quel éditeur avec root privileges.

Par exemple:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Commentez ensuite la ligne ci-dessous:

bind-address = 127.0.0.1

Redémarrez mysql pour refléter les changements en utilisant la commande:

sudo service mysql restart

Prendre plaisir ;)


2

Vous devez changer le fichier de configuration mysql:

Commencez par éditer le fichier de configuration mysql

vim /etc/mysql/my.cnf

ajouter:

bind-address = 0.0.0.0

0

Dans les panneaux de sites Web comme cPanel, vous pouvez ajouter un seul %(signe de pourcentage) dans les noms d'hôtes autorisés pour accéder à votre base de données MySQL.

En ajoutant un seul, %vous pouvez accéder à votre base de données à partir de n'importe quelle adresse IP ou site Web, même à partir d'applications de bureau.


s'il vous plaît ne faites pas référence à quelque chose comme cPanel lorsqu'une requête directe est présentée, cela ne montrera jamais un résultat de travail pour quelqu'un d'autre
Tobias Hagenbeek

@TobiasHagenbeek Merci pour vos commentaires. Cette méthode / astuce n'est pas inventée par moi (elle est courante sur Internet). Mais je suis l'un des testeurs de cette méthode et j'ai trouvé que c'est la méthode la plus simple et la plus efficace, c'est pourquoi je l'ai publiée ici. Je sais que cette méthode comporte des risques de sécurité qui peuvent être négligés.
Muhammad Saqib

0

Par exemple dans mon CentOS

sudo gedit /etc/mysql/my.cnf

commenter les lignes suivantes

# bind-address = 127.0.0.1

puis

sudo service mysqld restart


0

Si vous souhaitez accorder l'accès à distance à votre base de données à partir de n'importe quelle adresse IP, exécutez la commande mysql et exécutez ensuite la commande suivante.

GRANT ALL PRIVILEGES ON *.*
TO 'root'@'%' 
IDENTIFIED BY 'password' 
WITH GRANT OPTION;

0

ce qui a fonctionné sur Ubuntu est d'accorder tous les privilèges à l'utilisateur:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'yourpassword' WITH GRANT OPTION;

et définir l'adresse de liaison dans /etc/mysql/mysql.conf.d/mysqld.cnf:

bind-address            = 0.0.0.0

puis redémarrage du démon mysql:

service mysql restart

-7

Vous pouvez désactiver toute la sécurité en éditant /etc/my.cnf:

skip-grant-tables

cela supprime toutes les exigences de mot de passe
kristopole

5
Notez qu'il n'est pas conseillé d'avoir cette option activée dans un environnement de production, car cela permet à quiconque de se connecter sans mot de passe!
AStopher

cependant, ceci est idéal pour un environnement de développement
DMCoding

Cela permet aux gens de pirater votre base de données sans utiliser de mot de passe.
MilkyWay90

@DanielJames même pour l'environnement de développement, c'est une idée terrible
Dragas
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.