MySQLでユーザー一覧を取得する方法 権限とパスワード一覧も取得!

皆さんMySQL使ってますか?データベースを久々にメンテナンスするときや、MySQLの勉強でユーザーをたくさん作ってしまったときなどにユーザーの一覧を取得したくなる時ってありますよね。

今回はMySQLでユーザーの一覧を取得する方法を基礎から解説します。また、同時にわかると色々と便利なパスワードハッシュとユーザーの権限も一覧で取得する方法を紹介します。さっそくいってみましょう!

目次

mysql.userとは?

まず理解しておきたいのが、mysql.userについてです。これはデフォルトで存在するmysqlデータベースに存在するuserというテーブルです。

userテーブルにユーザーに関する様々な情報が格納されています。rootでログインした上で、試しに次のコマンドを実行してみてください。

SHOW COLUMNS FROM mysql.user;

このコマンドは、mysql.userからカラムを表示しなさい、という意味になります。カラムとはテーブルの各項目、列に当たるものでしたね。バージョンによって表示される個数は若干異なりますが、50個前後の項目がズラッと並んだはずです。

ユーザーごとにこれらの項目の値を持つテーブルがmysql.userなのです。次の章では実際にこのテーブルから必要な情報を取得してみましょう。

ユーザー一覧を取得するコマンド

まずはオーソドックスに全ユーザーの全情報を取得してみましょう。そのためのコマンドがこちらです。

SELECT * FROM mysql.user;

試しに実行してみるとわかると思いますが、とても読めたものではありません。50個近いカラムが横に並んで、それがユーザーの数だけあるのですから、よほど横に長いターミナルでもないとまともに表として表示できないでしょう。

ということで、必要な情報のみを抽出するSQL文を加えていきます。とりあえず、ホスト名とユーザーがわかればユーザー一覧と言えそうですから、この2つのカラムを表示させましょう。そのためのSQL文がこちらになります。

SELECT Host, User FROM mysql.user;

実行結果

+-----------+------------------+
| Host      | User             |
+-----------+------------------+
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+

次の章では少し応用的な利用法を紹介します。

パスワードハッシュの取得方法

この章ではユーザーのパスワードハッシュを取得する方法を紹介します。パスワードハッシュはなにか、というと、ユーザーごとに設定してあるパスワードにハッシュ関数を適用してハッシュ値にしたものになります。

セキュリティの話が絡んでくるので、あまり深入りせずにざっくり説明すると、たとえrootとはいえ他のユーザーのパスワードが簡単にわかってしまうのは色々と問題があるわけです。

ですが一方で、パスワードが設定してあるかどうかを確認したい、という思いもrootにはあります。MySQLではCREATE USERでパスワードを設定せずにユーザー作成ができてしまいますからね。

そこで、mysql.userにはパスワードのハッシュ値、つまりパスワードハッシュが格納されているわけです。パスワードハッシュがあればパスワードが何かしら設定されているのはわかりますが、ハッシュ値なので中身が何なのかはわかりません。

利便性とセキュリティのバランスが取れているわけです。それではそのパスワードハッシュを取得する方法を見ていきましょう。いきなり注意点ですが、MySQL5.5以前ではパスワードハッシュはPasswordカラムで取得できました。

ですが、5.6以降からは次で紹介するカラム名に切り替わりました。MySQL5.7以降ではSELECTにPasswordを指定するとエラーとなります。以前からMySQLを扱っていたり、古めのデータベースをいじる場合は注意してください。

SELECT Host, User, authentication_string FROM mysql.user;

実行結果

+-----------+------------------+------------------------------------------------------------------------+
| Host      | User             | authentication_string                                                  |
+-----------+------------------+------------------------------------------------------------------------+
| localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.session    | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.sys        | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | root             | *FED2AA8C2E1E5C8AB9C72C22D060965F275D5A9A                              |
+-----------+------------------+------------------------------------------------------------------------+

前章で紹介したSQL文のSELECTにauthentication_stringというカラムが追加されました。このカラムにユーザーのパスワードハッシュが格納されています。ちなみにパスワードを設定していないユーザーは次のように空白になります。

+------------------+------------------------------------------------------------------------+
| User             | authentication_string                                                  |
+------------------+------------------------------------------------------------------------+
| testuser         |                                                                        |

ユーザーの権限一覧を取得する方法

それでは最後にユーザーの権限を一覧で取得する方法を紹介します。

ユーザー権限に関してもmysql.userに記載があるため、一つずつSELECTで拾っていく方法もありますが、より手っ取り早く取得できるSQL文がありますので、こちらを使ったほうが楽でしょう。

SHOW GRANTS FOR user;

userには「ユーザー名@ホスト名」の書式を記入します。そのため実際は次のような形になります。

SHOW GRANTS FOR root@localhost;

実行結果

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                                                                                                                                                                                                                                                                                                |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `root`@`localhost` WITH GRANT OPTION |
| GRANT BACKUP_ADMIN,BINLOG_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SET_USER_ID,SYSTEM_VARIABLES_ADMIN,XA_RECOVER_ADMIN ON *.* TO `root`@`localhost` WITH GRANT OPTION                                                                                                  |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION                                                                                                                                                                                                                                                                                                                                             |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

なお、MySQLにログインしているカレントユーザーの権限を知りたい場合は次のSQL文でもいけます。

SHOW GRANTS FOR current_user();

まとめ

いかがでしたか?今回はmysql.userに関する基本的なところから、ユーザー一覧を取得するSQL文、パスワードハッシュを取得する方法、ユーザーの権限一覧を取得する方法までみてきました。

MySQLはこういった細かいノウハウを学んでいくことでどんどん上達することができます。頑張って基礎を積み重ねていきましょう。この記事が皆様のMySQL学習の一助となれば幸いです。

この記事を書いた人

フリーのエンジニア・ライター。
プログラミング、ライティング、マーケティングなど、あらゆる手段を駆使して、
ハッピーなフルリモートワーカーを目指し中。

最近興味がある分野は深層強化学習。
積みゲー、積ん読がどんどん増加しているのがここ数年の悩み。
実は侍エンジニア塾の卒業生だったりします。

目次