MySQLのユーザ権限を確認する
引き続きMySQLユーザアカウントネタ。
以前の投稿にも書いた”ERROR 1045 (28000): Access denied”エラーだが、これは
ログイン時に限らず、様々な局面で遭遇する。
認証が失敗した時だけではなく、コマンドを実行しようとしているMySQL上のユーザに
適切な権限が与えられていない場合にもこのエラーになる。
MySQLサーバの仕様において、ユーザ認証が通ると次にSQL文やインスタンスの停止等
の操作を行うための権限があるかどうかがチェックされるからだ。
それから、MySQLへのアクセスは「ユーザ名&ホスト」として認識されるため、ある
ユーザをlocalhost上からのアクセスからしか許可していなければ、他のホストからの
ネットワークログインは、当然できない。
ユーザを作成する際に、そういうこともきちんと考えなければいけないのだが(汗)
そんなわけで、Access deniedエラーが発生してユーザテーブルを確認する際には、
ユーザ権限もチェックすべし。それとネットワーク越しのログインやコマンド実行が
出来ない時は、そのホストからの接続が許可されているか。
ユーザテーブルの確認コマンド。以下はユーザ名とホスト名のみ抽出。
※”mysql.user”はつまり、”データベース名.テーブル名”ということ
mysql > SELECT user,host FROM mysql.user;
すべての項目を抽出。権限情報も確認できるが、そのままだと見づらいので¥Gで。
mysql > SELECT * FROM mysql.user¥G
GRANTS文で特定のユーザの権限を確認する。
mysql > SHOW GRANTS FOR exampleuser@’localhost’;
適切な権限が足りないようであれば、改めて権限を付与する。
(現在保有している権限にプラスして指定)
mysql > GRANTS SELECT, INSERT, UPDATE, DELETE,FILE,ALTER ON test_db.* TO exampleuser@’localhost’;
mysql > FLUSH PRIVILEGES;
ちなみに上のコマンドはユーザ作成時と同様なので、該当するユーザが存在しなかった
場合は自動的に作成される。なお、権限を剥奪するにはREVOKEを使用する。
ユーザに対する全ての権限を剥奪しても、ユーザー自体が削除されるわけではないことに注意。
MySQLのユーザアカウント管理は、ちょっとクセがある気がする。
しつこいけどこういう基本をきちんと理解しておかないとあとでハマってしまうので、
甘くみてはいけないと思う。
以下は参考書「現場で使えるMySQL」からの抜粋。
ほかのRDBMSでは、ユーザーはスキーマと関連付けられたり、オブジェクトの所有者になったりするが、MySQLのユーザーは純粋に認証や権限管理のために存在する。
この違いを念頭におくべし、ってことみたいです。
関連記事
MySQLのAccess deniedエラー