web-dev-qa-db-ja.com

MySQLユーザーへのホストアクセス許可の再割り当て

特定のホストからのアクセスを許可するように設定された数千のMySQLユーザーがいます。問題は、今度は2台のマシン(将来的には同じマシン)を使用して、それぞれのデータベースにアクセスするために同じアカウントを使用する必要があることです。

内部ネットワークのワイルドカードに適合するように、各ユーザーアカウントのホスト部分を実行して変更するための、迅速かつ簡単な(可能な限り自動化された)方法が欲しい。例えば:

'bugsy' @ 'internalfoo'は 'bugsy' DBにアクセスできます。

内部ネットワークのどこからでもバグのあるアクセスを許可したい

'bugsy'@'10.0.0.%'は 'bugsy' DBにアクセスできます。

56
Nick Jennings

参考のために、解決策は次のとおりです。

UPDATE mysql.user SET Host = '10.0.0.%' WHERE Host = 'internalfoo' AND user != 'root';
UPDATE mysql.db SET Host = '10.0.0.%' WHERE Host = 'internalfoo' AND user != 'root';
FLUSH PRIVILEGES;
111
Nick Jennings

受け入れられた回答はユーザーの名前を変更するだけでしたが、特権は残されていました。

私は使用することをお勧めします:

RENAME USER 'foo'@'1.2.3.4' TO 'foo'@'1.2.3.5';

MySQLドキュメント によると:

RENAME USERにより、古いユーザーが保持している特権が、新しいユーザーが保持している特権になります。

84
Pedro

より一般的な答えは

UPDATE mysql.user SET Host = {newhost} WHERE user = {youruser}
5
e18r

私はこれをする必要がなかったので、一粒の塩と「テスト、テスト、テスト」の大きな助けを借りてこれを取ってください。

(安全な制御されたテスト環境で)mysql.userおよびおそらくmysql.dbテーブルのHost列を直接変更するとどうなりますか? (たとえば、updateステートメントを使用)。MySQLはユーザーのホストをパスワードエンコーディングの一部として使用するとは思わない(PASSWORD関数はそれを提案しない)が、確実に試してみる必要があります。 FLUSH PRIVILEGES コマンドの発行(またはサーバーの停止と再起動)が必要になる場合があります。

一部のストレージエンジン(たとえば、MyISAM)では、ユーザーが作成したビューの.frmファイルもチェック/変更する必要があります。 .frmファイルには、定義者のホストを含​​む定義者が保存されます。 (Ihaveは、間違った構成を引き起こしたホスト間でデータベースを移動するときに、間違ったホストが記録されるようにする必要がありました...)

1
T.J. Crowder

私が許可を得ていた同様の問題は失敗しました。私のセットアップでは、SSHのみでログインします。だから私は問題を修正するためにしたことは

Sudo MySQL
SELECT User, Host FROM mysql.user WHERE Host <> '%';
MariaDB [(none)]> SELECT User, Host FROM mysql.user WHERE Host <> '%';
+-------+-------------+
| User  | Host        |
+-------+-------------+
| root  | 169.254.0.% |
| foo   | 192.168.0.% |
| bar   | 192.168.0.% |
+-------+-------------+
4 rows in set (0.00 sec)

これらのユーザーを「localhost」に移動する必要があります。だから私は次を発行しました:

UPDATE mysql.user SET Host = 'localhost' WHERE user = 'foo';
UPDATE mysql.user SET Host = 'localhost' WHERE user = 'bar';

SELECT User、Host FROM mysql.user WHERE Host <> '%';を実行します。再び、私たちは見ます:

MariaDB [(none)]> SELECT User, Host FROM mysql.user WHERE Host <> '%';
+-------+-------------+
| User  | Host        |
+-------+-------------+
| root  | 169.254.0.% |
| foo   | localhost   |
| bar   | localhost   |
+-------+-------------+
4 rows in set (0.00 sec)

そして、私は再び正常に働くことができました。それが誰かを助けることを願っています。

$ mysql -u foo -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 74
Server version: 10.1.23-MariaDB-9+deb9u1 Raspbian 9.0

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
1
jhayton

RENAME USERで同じエラーを受け取りましたが、GRANTSは現在受け入れられているソリューションではカバーされていません。

最も信頼できる方法は、古いユーザーに対してSHOW GRANTSを実行し、ユーザーの名前やホストに関して変更したいものを見つけて置き換えて実行し、最後にDROP USER古いユーザーを実行することです。 FLUSH PRIVILEGESを実行することを忘れないでください(新しいユーザーの許可を追加した後、これを実行し、新しいユーザーをテストし、古いユーザーを削除し、適切な測定のために再度フラッシュするのが最善です)。

> 'olduser' @ 'oldhost'の付与を表示; 
 + --------------------------- -------------------------------------------------- ------ + 
 | olduser @ oldhostの付与| 
 + -------------------------------------- --------------------------------------------- + 
 |パスワード「* PASSHASH」により識別される「olduser」@「oldhost」への*。*の使用許可| 
 | GRANT SELECT ON `db`。* TO 'olduser' @ 'oldhost' | 
 + --------------------------- -------------------------------------------------- ------ + 
 2行セット(0.000秒)
 
> GRANT USAGE ON *。* TO 'newuser' @ 'newhost' IDENTIFIED BY PASSWORD '* SAME_PASSHASH '; 
クエリOK、影響を受けた行は0(0.006秒)
 
> GRANT SELECT ON `db`。* TO' newuser '@' newhost '; 
クエリOK、0行影響(0.007秒)
 
> DROP USER 'olduser' @ 'oldhost'; 
クエリOK、0行影響(0.016秒)
0
CrackerJack9