web-dev-qa-db-ja.com

MySQLデータベースから特権を削除する

これが重複した質問であると考える前に、私は、それがいくぶんあいまいなケースであっても、私はユニークだと思います。

数日前、Ubuntu 10.04サーバー上のMySQLのバージョンを5.3.3にアップグレードしました(10.04のUbuntuリリースよりも先です)。今日、私は何かのためにphpMyAdminにログインしようとしましたが、やや恐ろしいConnection for controluser as defined in your configuration failedエラーを発見しました。

これを修正する方法に関するいくつかのSO質問からの説明に従った後、私は行き詰まりました。

  • phpMyAdminの再構成 を試みましたが、成功しませんでした。
  • phpMyAdminをアンインストールして再インストールする を試みましたが、DBから特権を削除できず、失敗しました。
  • その後、ユーザーの 手動で特権を削除する を試みました-いくらか愚かなことですが、DBから追加し、次にデータベースを削除してから、ユーザー(flush privilegesを使用)を削除します。
  • PhpMyAdminのインストール全体を完全に削除し(アプリケーションと/ etc/phpmyadminディレクトリを削除)、再インストール(apt-getを使用)しましたが、phpmyadminユーザーのアクセス許可は既に存在すると言いました。

granting access to database phpmyadmin for phpmyadmin@localhost: already exists

だから、ここに私が残っているものがあります。私は変更も取り消しもできない許可を持っています:

mysql> show grants for 'phpmyadmin'@'localhost';
+-------------------------------------------------------------------------------------------------------------------+
| Grants for phpmyadmin@localhost                                                                                   |
+-------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'phpmyadmin'@'localhost' IDENTIFIED BY PASSWORD '*46CFC7938B60837F46B610A2D10C248874555C14' |
| GRANT ALL PRIVILEGES ON `phpmyadmin`.* TO 'phpmyadmin'@'localhost'                                                |
+-------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.26 sec)

mysql> revoke usage on *.* from 'phpmyadmin'@'localhost';
ERROR 1141 (42000): There is no such grant defined for user 'phpmyadmin' on Host 'localhost'

mysql> revoke usage on *.* from 'phpmyadmin'@'localhost' identified by 'trustno1';
ERROR 1141 (42000): There is no such grant defined for user 'phpmyadmin' on Host 'localhost'

(心配する必要はありません、私はもうこのパスワードを使用していませんが、以前使用したパスワードであり、新しいphpmyadminインストール用に選択したパスワードではありません)。

これらの許可/特権を完全に削除するにはどうすればよいですか?必要な場合(DBではなくphpmyadmin)、最初からやり直すことができてうれしいです。

50
Cyntech

MysqlのUSAGE特権は、単に、グローバルレベル*.*で定義されたユーザー 'phpadmin' @ 'localhost'に対する特権がないことを意味します。さらに、同じユーザーがデータベースphpmyadmin phpadmin.*に対してALL特権を持っています。

したがって、すべての特権を削除し、最初から完全に開始する場合は、次の手順を実行します。

  • データベースレベルのすべての権限を取り消します。

    REVOKE ALL PRIVILEGES ON phpmyadmin.* FROM 'phpmyadmin'@'localhost';

  • ユーザー「phpmyadmin」@「localhost」をドロップします

    DROP USER 'phpmyadmin'@'localhost';

上記の手順により、インスタンスからユーザーが完全に削除されます。つまり、最初からユーザーを再作成できます。

上記の内容の背景を少し説明すると、ユーザーを作成するとすぐにmysql.userテーブルが作成されます。その中のレコードを見ると、ユーザーとすべての特権が'N'に設定されていることがわかります。 show grants for 'phpmyadmin'@'localhost';を実行すると、上記の出力が表示されます。単に「ユーザーのグローバルレベルでの特権はありません」に変換されます。これで、データベースレベルでこのユーザーにALL付与され、これはテーブルmysql.dbに保存されます。 SELECT * FROM mysql.db WHERE db = 'nameofdb';を実行すると、すべての特権で'Y'が表示されます。

上記の説明は、現在データベースにあるシナリオを示しています。したがって、USAGE特権のみを持つユーザーは、このユーザーは接続できますが、SHOW GLOBAL VARIABLES; SHOW GLOBAL STATUS;以外には他の特権はありません。

100
Flo Doe

補足として、revoke usage on *.* from 'phpmyadmin'@'localhost';が機能しない理由は非常に簡単です。USAGEと呼ばれる許可はありません。

実際の名前付き許可はMySQLドキュメントにあります

許可USAGEは論理的な許可です。どうやって? 'phpmyadmin' @ 'localhost'にはmysql.userにエントリがあります(user = 'phpmyadmin'およびHost = 'localhost')。 mysql.userのすべての行は、意味的にUSAGEを意味します。 DROP USER 'phpmyadmin'@'localhost';を実行すると問題なく動作するはずです。内部では、実際にこれを実行しています:

DELETE FROM mysql.user WHERE user='phpmyadmin' and Host='localhost';
DELETE FROM mysql.db   WHERE user='phpmyadmin' and Host='localhost';
FLUSH PRIVILEGES;

したがって、mysql.userから文字列を削除すると、REVOKE USAGEを文字通り実行できない場合でも、REVOKE USAGEを実行することになります。

14
RolandoMySQLDBA