任意のIPアドレスからのMySQLデータベースへのリモートアクセスを許可する


280

私はこのコマンドを知っています:

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

しかし、それでは、このリモートMySQLデータベースにアクセスするために特定のIPアドレスを許可することしかできません。リモートホストがこのMySQLデータベースにアクセスできるようにしたい場合はどうすればよいですか?それ、どうやったら出来るの?基本的に私はこのデータベースを公開していますので、誰でもアクセスできます。


1
これを行う前に、セキュリティへの影響を考慮してください。security.stackexchange.com/questions/63881/...
e18r

7
すべてのシステムが生産システムであるとは限りません。一部の人々は開発のためにこれを必要とします。
コンラッドジョーンズ

回答:


272
TO 'user'@'%'

%はワイルドカードです。必要に応じて、'%.domain.com'または'%.123.123.123'そのようにすることもできます。


@kristopolousそれを引き起こす可能性のあることがたくさんあります。このコマンドは、リモートアクセス(2つの異なるマシン)に関するものです。それがあなたがしていることでないなら、これは正しいコマンドではありません。それでも正しいパスワードなどが必要です。
アリエル

11
「フラッシュ特権」を使用する必要があります。変更を有効にするため
Didier Sampaolo 2015年

同じOSインスタンス(開発マシンなど)で実行されているdbインスタンスに接続する際の秘訣は、-h my_machine_nameパラメーターを渡すことです。これはクライアントをだまして'user'@my_machine_name.example.com、ではなく、として識別します'user'@localhost。このようにして、デュアルアカウントを作成して維持しlocalhost、ネットワークアクセスとその両方に付与する必要はありません。そして、もちろん、確認することmysqldにバインドされている0.0.0.0127.0.0.1
チャーリーReitzel

173

リモートアクセスを有効にする(Grant)ホーム/チュートリアル/ Mysql /リモートアクセスを有効にする(Grant)リモートマシンからmysqlサーバーに接続しようとして、以下のようなエラーが発生した場合、この記事は役に立ちます。

エラー1130(HY000):ホスト '1.2.3.4'はこのMySQLサーバーへの接続を許可されていません

mysql設定を変更する

mysql設定ファイルの編集から始めます

vim /etc/mysql/my.cnf

次の行をコメント化します。

#bind-address           = 127.0.0.1
#skip-networking

skip-networking行が見つからない場合は、追加してコメント化します。

mysqlサーバーを再起動します。

~ /etc/init.d/mysql restart

GRANT特権を変更する

上記の変更を行っても、リモートアクセスができない、またはすべてのデータベースにアクセスできないが、驚くかもしれません。

デフォルトでは、使用しているmysqlのユーザー名とパスワードは、mysql-serverへのローカルアクセスを許可されています。したがって、特権を更新する必要があります。

以下のようなコマンドを実行して、すべてのマシンからアクセスします。(置き換えUSERNAMEPASSWORD、資格情報によります。)

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

以下のようなコマンドを実行して、特定のIPからのアクセスを許可します。(置き換えUSERNAMEPASSWORD、資格情報によります。)

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

1.2.3.4をIPに置き換えることができます。上記のコマンドを何度も実行して、複数のIPからのアクセスを許可できます。

リモートアクセス用に個別のUSERNAMEPASSWORDを指定することもできます。

次の方法で最終結果を確認できます。

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

最後に、以下を実行する必要がある場合もあります。

mysql> FLUSH PRIVILEGES;

テスト接続

端末/コマンドラインから:

mysql -h HOST -u USERNAME -pPASSWORD

mysqlシェルを入手した場合は、show databasesを実行することを忘れないでください。リモートマシンから適切な権限があるかどうかを確認します。

ボーナスヒント:アクセス権を取り消す

誤ってユーザーにアクセスを許可する場合は、取り消しオプションを用意しておくと便利です。

以下は、すべてのマシンからUSERNAMEのすべてのオプションを取り消します。

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.

REVOKEコマンドを実行した後にUSAGE特権が表示された場合は、問題ありません。それは全く特権がないと同じくらい良いです。取り消すことができるかどうかはわかりません。


7
パートをコメントアウトするのでは/etc/mysql/mysql.conf.d/mysqld.cnfなく、ファイルを変更する必要があったことに注意してください。行が不足しているとの行を追加し、コメントのない影響があってはなりません。/etc/mysql/my.cnfbind-address#skip-networking
Pawan

1
MariaDB 10.1.26では、構成ファイルは/etc/mysql/mariadb.conf.d/50-server.cnf
Kwadz

上記のすべてを行っても接続できない場合は、ファイアウォールの設定を確認してください。ポート3306またはブロックしているポートがブロックされている可能性があります
avn

37

上記のステップが完了し、MySqlポート3306がリモートで自由にアクセスできると仮定します。mysql構成ファイルでパブリックIPアドレスをバインドすることを忘れないでください。

たとえば、私のubuntuサーバーでは:

#nano /etc/mysql/my.cnf

ファイルで、[mysqld]セクションブロックを検索し、新しいバインドアドレスを追加します。この例では、192.168.0.116です。こんな感じになります

......    
.....    
# 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

.....    
......

必要に応じてlocalhost(127.0.0.1)バインディングを削除できますが、ローカルマシン上のサーバーにアクセスするには、具体的にIPアドレスを指定する必要があります。

次に、最後のステップは、MySQLサーバーを再起動することです(ubuntu上)。

stop mysql

start mysql

または#/etc/init.d/mysql restart他のシステム

これで、MySQLデータベースにリモートでアクセスできます。

mysql -u username -h 192.168.0.116 -p

/etc/init.d/mysql reload十分なはずです
Lorenz Lo Sauer 2013

私はこれをやっただけで、mysqlサーバーにリモートで接続できませんでした。次に、bind-addressesをコメント化してみましたが、うまくいきました。また、ホストを指定せずにmysql -u <user> -pを使用してサーバーにログインしようとしても機能したため、「必要に応じてlocalhost(127.0.0.1)バインディングを削除できますが、具体的にはローカルマシン上のサーバーにアクセスするためのIPアドレスを指定してください。」不正解です。(ubuntu 12.04 LTSサーバーmysql Ver 14.14 Distrib 5.5.34)
Programster

5
bind-addressディレクティブは、MySQLというIPアドレスを決定するサーバが上のリッスンを。サーバーが接続を受け入れるIPアドレスではありません
GoZoner 2014

1
すべての手順を実行した後、それは機能しません。bind-addresslocalhostまたは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 2017

192.168.0.116の代わりにabc.abc:1234のようなアドレスを提供することは可能ですか?
ビエラ2017年

26

これをいじった人のために、ここに私が特権を与える方法があります、それが誰かを助けることを願っています

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

%ワイルドカードが記載されているように、これにより任意のIPアドレスがデータベースに接続できるようになります。ここでの仮定は、接続すると名前が付けられたユーザーrootがいることです(ただし、これはデフォルトです)。rootパスワードを入力すれば、準備は完了です。'ユーザーrootの前後に単一引用符()がないことに注意してください。


ユーザーから単一引用符を削除することが重要なのはなぜですか?なぜこれが他の回答(およびマニュアル)と異なるのですか?
DMCoding 2016年

26

localhost経由の接続を有効にするには、構成ファイルの変更が必要です。

リモートIP経由で接続するには、「root」ユーザーとしてログインし、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;

これにより、ローカルホストおよびリモートIPからアクセスできる新しいユーザーが作成されます。

/etc/mysql/my.cnfにあるmy.cnfファイルの以下の行もコメント化します

bind-address = 127.0.0.1

を使用してmysqlを再起動します

sudo service mysql restart

これで、mysqlにリモートで接続できるはずです。


2
これは質問の答えにはなりません。
シャリス

1
@ChristopheHarrisなぜあなたはそう感じますか?答えは明らかに、MySQLで新しいユーザーを作成する方法を段階的に説明し、そのユーザーを使用してローカルホストとリモートアクセスの両方でDBにアクセスできるようにします。プレサエは説明できますか?
ハリシャンナム2016

1
うまくいきません。それでも同じエラーが発生します。rootでも新しいユーザーでも、「xxx.xxx.xxx.xxx」でMySQLサーバーに接続できません([Errno 61]接続が拒否されました)
baermathias

21

次のコマンドを使用します。

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

次に:

FLUSH PRIVILEGES; 

次に、ファイル "/etc/mysql/mysql.conf.d/mysqld.cnf"の以下の行をコメント化します(必須です!):

bind-address = 127.0.0.1 

私のために働く!


とても良いものです。重要な助成金。そうでない場合、次のようなリクエストに対する多くのエラーyour-password-does-not-satisfy-the-current-policy-requirements
Alejandro TeixeiraMuñoz19年

21

任意のIPアドレスからユーザーと接続できるようにするには、次のようにします。

mysqlサーバーがリモート接続を受け入れることを許可します。この開いているmysqld.confファイルの場合:

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

「bind-address」で始まる行を検索し、その値を0.0.0.0に設定します

bind-address                    = 0.0.0.0

最後にファイルを保存します。

注:MySQL 8以降を実行している場合、bind-addressディレクティブはmysqld.cnfデフォルトではファイルにありません。この場合、ディレクティブをファイルの最後に追加します/etc/mysql/mysql.conf.d/mysqld.cnf

さて、MySQLサーバを再起動するとのいずれかsystemdまたは古い使用serviceコマンドをコマンドを。これはオペレーティングシステムによって異なります。

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

最後に、mysqlサーバーはリモート接続を受け入れることができます。

次に、ユーザーを作成して権限を付与する必要があります。これにより、このユーザーでリモートでログインできるようになります。

MySQLデータベースにrootまたはroot権限を持つ他のユーザーとして接続します。

mysql -u root -p

ここで、localhostと '%'ワイルドカードの両方に目的のユーザーを作成し、すべてのDBにそのようなアクセス許可を付与します。

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

そして、

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

そして最後に特権をフラッシュすることを忘れないでください

FLUSH PRIVILEGES;

注:データベースサーバーにファイアウォールを設定している場合は、ポートも開く必要があります。 3306 MySQLへのトラフィックを許可するために、MySQLのデフォルトポートをます。

お役に立てれば ;)


2
sudo systemctl restart mysqld.serviceはdebian用であり、sudo systemctl restart mysql.serviceはubuntu用でした
ani0904071

私は私の答えを更新し、両方のディストリビューションにmysql restartコマンドを追加しました。おかげで@ ani0904071
Imtiaz Shakil Siddique

17

以下を実行します。

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

次に、指定したIPアドレスから接続を試みます。

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

接続できるはずです。


15

このコマンドでMariaDBの問題を解決できます

注意:

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

%ワイルドカードです。この場合、すべてのIPアドレスを指します。


3
mysqlでは、(1).my.cnfコンテンツを変更する(2).grantリモートユーザー(3)ファイアウォールを処理して3306ポートをリッスンする必要があります。
未来陆家嘴顶尖的投资人

あなたは私の日を救った。感謝します!
Almett 2017年


7

データベースMysqlサーバー8にリモートアクセスするには:

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

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

FLUSH PRIVILEGES;

5
  • 管理ユーザーを使用してMYSQLを開始する
    • mysql -u admin-user -p(プロンプトにパスワードを入力)
  • 新しいユーザーを作成します。
    • CREATE USER 'newuser' @ '%' IDENTIFIED BY 'password'; (%-> anyhost)
  • 権限を付与:
    • GR_SELECT、DELETE、INSERT、UPDATE ON db_name。* TO 'newuser' @ '%';
    • FLUSH PRIVILEGES;

EC2インスタンスを実行している場合は、MYSQL / Aururaでセキュリティグループにインバウンドルールを追加することを忘れないでください。


5

ファイルを編集:

/etc/mysql/percona-server.cnf

ファイルのコードの下に追加します。

[mysqld] bind-address = 0.0.0.0

リモートアクセス用のユーザーを作成します。

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

すべてのLinuxサーバーが動作し、

MSWin c:\の場合、インストール場所\ファイルパスを検索


[mysqld]ファイルを追加する必要があります。そうしないと正しく機能しません
Tejas Tank

3

のようないくつかのデータベースにユーザーを作成するだけです

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

次に行きます

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnfbind-address = 127.0.0.1を次のように変更しますbind-address = 0.0.0.0

その後、任意のIPからそのデータベースに接続できます。


3

を開きmysql console、次のコマンドを実行します(データベース名、ユーザー名、パスワードを入力します)。

yourdatabasenameのすべてを付与します。* admin @ '%'に 'yourRootPassword'によって識別されます。

次に実行:

FLUSH PRIVILEGES;

コマンドラインを開き、/etc/mysql/mysql.conf.d/mysqld.cnf任意のエディターを使用してファイルを開きますroot privileges

例えば:

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

次に、以下の行をコメント化します。

bind-address = 127.0.0.1

mysqlを再起動して、コマンドを使用して変更を反映します。

sudo service mysql restart

楽しい ;)


2

mysql構成ファイルを変更する必要があります。

mysql設定ファイルの編集から始めます

vim /etc/mysql/my.cnf

追加:

bind-address = 0.0.0.0

0

cPanelなどのWebサイトパネルでは%、MySQLデータベースにアクセスするために許可されたホスト名に単一(パーセント記号)を追加できます。

シングル%を追加することで、デスクトップアプリケーションからでも、任意のIPまたはWebサイトからデータベースにアクセスできます。


ストレートクエリが提示されているときは、cPanelのようなものを参照しないでください。これは、他の誰にとっても
有効な

@TobiasHagenbeekご意見ありがとうございます。この方法/トリックは私が発明したものではありません(インターネットでは一般的です)。しかし、私はこの方法のテスターの1人であり、これが最も簡単で実用的な方法であることがわかりました。この方法には無視できるセキュリティリスクがあることは知っています。
ムハンマド

0

たとえば、私のCentOS

sudo gedit /etc/mysql/my.cnf

次の行をコメント化します

#bind-address = 127.0.0.1

その後

sudoサービスmysqld再起動


0

任意のIPアドレスからデータベースへのリモートアクセスを許可する場合は、mysqlコマンドを実行してから、次のコマンドを実行します。

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

0

Ubuntuで機能していたのは、ユーザーにすべての特権を付与することです。

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

バインドアドレスを設定します/etc/mysql/mysql.conf.d/mysqld.cnf

bind-address            = 0.0.0.0

次に、mysqlデーモンを再起動します。

service mysql restart

-7

/etc/my.cnfを編集して、すべてのセキュリティを無効にすることができます。

skip-grant-tables

これにより、すべてのパスワード要件が削除されます
kristopolous

5
このオプションを運用環境で有効にすることはお勧めできません。これにより、パスワードなしで誰でも接続できるようになります。
AStopher

しかし、これは、DEV環境に理想的である
DMCoding

これにより、ユーザーはパスワードを使用せずにデータベースをハッキングできます。
MilkyWay90

@DanielJamesは開発環境にとってもひどい考えです
Dragas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.