すべてのホストからのMySQLルートアクセス


152

MySQLサーバーをリモートのUbuntuマシンにインストールしました。rootユーザーは、で定義されているmysql.userテーブルこの方法:

mysql> SELECT host, user, password FROM user WHERE user = 'root';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| localhost        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ip-10-48-110-188 | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| 127.0.0.1        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ::1              | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

root標準のmysqlクライアントを使用して、同じリモートマシンのコマンドラインインターフェイスからユーザーとアクセスできます。ここで、インターネット上のすべてのホストからのルートアクセス許可したいので、次の行を追加してみました(host列を除いて、前のダンプの最初の行とまったく同じです)。

mysql> SELECT host, user, password FROM user WHERE host = '%';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| %                | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

しかし、個人用PCのクライアントからは引き続き通知されます(サーバーのIPはわかりません)。

SQLエラー(2003):'46 .xxx 'のMySQLサーバーに接続できません(10061)

認証エラーなのかネットワークエラーなのかわかりません。サーバーのファイアウォールで、0.0.0.0 / 0に対してポート3306 / TCPを有効にしましたありません...


ポート3306のマシンにTelnetで接続できますか
mihaisimi

3
ほとんどの場合、MySQLデーモンは46.xxxをリッスンせず、ローカルホストのみをリッスンします。bind-addressmy.cnfで探してください
Maxim Krizhanovsky

1
つまり、world + dogには、ルートパスワードのハッシュ、インターネット上の任意のホストからルートにアクセスできるという知識、およびIPアドレスの最初のバイトが含まれています。これはほんの少しの心配ではないと思いますか?
eggyal

回答:


362

そのプロセスには2つのステップがあります。

a)権限を付与します。rootユーザーとして'password'、現在のrootパスワードに置き換えて実行します。

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

b)すべてのアドレスにバインド:

最も簡単な方法は、ファイルの行をコメント化することmy.cnfです。

#bind-address = 127.0.0.1 

とmysqlを再起動します

service mysql restart

デフォルトではlocalhostにのみバインドされますが、コメント化すると、見つかったすべてのインターフェースにバインドされます。行をコメント化することはと同等bind-address=*です。

mysqlサービスがバインドされている場所を確認するには、rootとして実行します。

netstat -tupan | grep mysql

Ubuntu 16の更新:

構成ファイルは(現在)

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

(少なくとも標準のUbuntu 16)


5
OK、問題は結合アドレスでした。ありがとうございました。@Darhazerありがとうございます:)
-s

2
現在の許可を照会するには、次のようにします。 `SHOW GRANTS FOR 'root' @ '%';
robsch

5
root @%が他のユーザーに権限を付与できるようにするには、ステップ(a)の直後に次のコマンドを実行します。GRANT USAGE ON *。* TO 'root' @ '%' WITH GRANT OPTION;
カレブ2015

1
構成ファイルは(現在)/etc/mysql/mysql.conf.d/mysqld.cnf(少なくとも標準のUbuntu 16では)
jgp

2
私はリモートからリモートでサーバーに接続できるようにするには、これを行うために必要な:USE mysql; UPDATE user SET Grant_priv='Y' WHERE user='root';
Sviderskiyドミトリ

35

次のクエリを実行します。

use mysql;

update user set host='%' where host='localhost'

注:本番環境での使用は推奨されません。


2
これは完璧な解決策ではありません。うまくいくかもしれません。私にはエラーが発生しました:エラー1062(23000):キー 'PRIMARY'の重複したエントリ '%-root'
Scriptlabs

2
@Scriptlabs、可能性があります 'localhost'のホストを持つユーザーテーブルに複数のエントリがあります。そして、root.localhost、root.127.0.0.1、root。:: 1を含む、rootを持つ複数の行。したがって、更新するよりも、別のユーザーを追加した方がいいので、私はこの回答に反対票を投じています。
マイクパーセル

4
FLUSH PRIVILEGESではありません。直後にも必要ですか?
Nom1fan 2017

1
これは私のために働いています。これを試して。update mysql.user set host='%' where user='root'
nur zazin


7

MYSQL 8.0-mysqlコマンドラインクライアントを開く
すべての権限を*。* TO 'root' @ 'localhost'に付与します。
mysql
UPDATE mysql.user SET host = '%' WHERE user = 'root';を使用します。
mysqlサービスを再起動します


4

Raspbianで実行されているMariaDB-bind-addressを含むファイルを特定するのは困難です。MariaDBにはあまり役に立たない情報がありますこの件に関してを。

使った

# sudo grep -R bind-address /etc 

いまいましいものがある場所を見つけるために。

上記の誰もが指摘したように、mysqlで権限とホストを設定する必要もありました。

また、Raspberry Piへのリモート接続用に3306ポートを開く楽しみもありました-最終的に使用されたiptables-persistent

今はすべてうまくいきます。


1

OSに多くのネットワークが接続されている場合は、my.confファイルのbind-addresでこのネットワークの1つを指定する必要があります。例:

[mysqld]
bind-address = 127.100.10.234

このIPはethX構成からのものです。


1
詳細を追加してください。その設定はどのファイルまたはフレームワークで発生する必要がありますか?ethX構成についてより具体的にしてください。
BPS

1

私の場合、「バインドアドレス」設定が問題でした。私の場合、mysqlが何らかの理由でデフォルトを127.0.0.1に設定しmy.cnfたため、この設定をコメント化して役に立たなかった。

MySqlが現在使用している設定を確認するには、ローカルボックスでコマンドラインを開きます。

mysql -h localhost -u myname -pmypass mydb

現在の設定を読み取ります。

Show variables where variable_name like "bind%"

すべてのホストからのアクセスを許可する場合は、ここに0.0.0.0が表示されます。そうでない場合は/etc/mysql/my.cnf、[mysqld]セクションの下で編集してbind-addressを設定します。

bind-address=0.0.0.0

最後に、MySqlサーバーを再起動して、新しい設定を取得します。

sudo service mysql restart

もう一度試して、新しい設定が反映されているかどうかを確認してください。


-2

mysql_update 必要なものです。

MySqlがすでにこれを実行するツールを丁寧に作成したときに、なぜこの問題を修正するためのより複雑な方法に従うのかはわかりません...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.