Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

MySQL 5.7.28でのユーザ一覧についてまとめています。

以下、データベースとして、MySQLのサンプルデータベースEmployeesを使っています。

サンプルデータベースのインストール方法は、下記を参考にしてください。

【関連記事】
MySQLの入門には、GUIツールで慣れ、サンプルDBを使った学習が効果的

MySQLのユーザ一覧は、mysql.userを参照

MySQLでユーザ一覧を確認するには、以下のSQLを実行します。

mysql> select user, host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| root          | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
| user0         | localhost |
| user1         | localhost |
+---------------+-----------+

user0、user1は手動で作成したユーザです。

【関連記事】
MySQLでユーザ作成 GRANTでユーザ作成と権限設定を同時に行う方法

mysql.sessionと、mysql.sysはMySQLの内部的に使用されているアカウントで、クライアントからの接続時に使うことはできません。

mysql.sysは、システムデータベース(sysスキーマ)の所有者として使われています。rootアカウントがリネームまたは削除されたときに、sysスキーマが影響を受けないようにするためのものです。

mysql.sessionは、各種プラグインがサーバにアクセスするために使われるアカウントです。

rootアカウントが2つある理由は、接続元ごとにユーザが作成できるため

ユーザ一覧を確認するとrootアカウントが2つあるのがわかります。ひとつはhostが「%」、もうひとつはhostが「localhost」となっています。

root@localhostは、MySQLサーバ上からMySQLにローカル接続する際に使われるアカウントです。一方、root@%は、それ以外の場所から接続したrootアカウントを指します。

例えば、以下のように設定すると、リモート接続してきたrootアカウントに全権限を与えることになります。

mysql> SHOW GRANTS FOR root@localhost;
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+

mysql> SHOW GRANTS FOR root@'%';
+-------------------------------------------------------------+
| Grants for root@%                                           |
+-------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION |
+-------------------------------------------------------------+

小規模な開発環境では使い道はありますが、全権限を持つユーザがリモート接続できるので、セキュリティ面で問題有りと言えるでしょう。

ユーザ名と権限一覧を確認する

各ユーザが持つ権限一覧を表示するには、以下のSQLを実行します。全データベース・全テーブルに対するグローバル権限、データベースごとの権限、データベースのテーブルごとの権限、テーブルのカラムごとの権限の4種類が確認できます。

mysql> #グローバルの権限
mysql> SELECT * FROM information_schema.user_privileges;
+-----------------------------+---------------+-------------------------+--------------+
| GRANTEE                     | TABLE_CATALOG | PRIVILEGE_TYPE          | IS_GRANTABLE |
+-----------------------------+---------------+-------------------------+--------------+
| 'root'@'localhost'          | def           | SELECT                  | YES          |
| 'root'@'localhost'          | def           | INSERT                  | YES          |
| 'root'@'localhost'          | def           | UPDATE                  | YES          |
| 'root'@'localhost'          | def           | DELETE                  | YES          |
 :
 :
mysql> #データベースの権限
mysql> SELECT * FROM information_schema.schema_privileges; 
+-----------------------------+---------------+--------------------+-------------------------+--------------+
| GRANTEE                     | TABLE_CATALOG | TABLE_SCHEMA       | PRIVILEGE_TYPE          | IS_GRANTABLE |
+-----------------------------+---------------+--------------------+-------------------------+--------------+
| 'mysql.sys'@'localhost'     | def           | sys                | TRIGGER                 | NO           |
| 'user1'@'localhost'         | def           | employees          | SELECT                  | NO           |
| 'user1'@'localhost'         | def           | employees          | INSERT                  | NO           |
| 'user1'@'localhost'         | def           | employees          | UPDATE                  | NO           |
| 'user1'@'localhost'         | def           | employees          | DELETE                  | NO           |
| 'user1'@'localhost'         | def           | employees          | CREATE                  | NO           |
| 'user1'@'localhost'         | def           | employees          | DROP                    | NO           |
| 'user1'@'localhost'         | def           | employees          | REFERENCES              | NO           |
| 'user1'@'localhost'         | def           | employees          | INDEX                   | NO           |
| 'user1'@'localhost'         | def           | employees          | ALTER                   | NO           |
| 'user1'@'localhost'         | def           | employees          | CREATE TEMPORARY TABLES | NO           |
| 'user1'@'localhost'         | def           | employees          | LOCK TABLES             | NO           |
| 'user1'@'localhost'         | def           | employees          | EXECUTE                 | NO           |
| 'user1'@'localhost'         | def           | employees          | CREATE VIEW             | NO           |
| 'user1'@'localhost'         | def           | employees          | SHOW VIEW               | NO           |
| 'user1'@'localhost'         | def           | employees          | CREATE ROUTINE          | NO           |
| 'user1'@'localhost'         | def           | employees          | ALTER ROUTINE           | NO           |
| 'user1'@'localhost'         | def           | employees          | EVENT                   | NO           |
| 'user1'@'localhost'         | def           | employees          | TRIGGER                 | NO           |
| 'mysql.session'@'localhost' | def           | performance_schema | SELECT                  | NO           |
+-----------------------------+---------------+--------------------+-------------------------+--------------+
20 rows in set (0.00 sec)

mysql> #テーブルの権限
mysql> SELECT * FROM information_schema.table_privileges;
+-----------------------------+---------------+--------------+------------+----------------+--------------+
| GRANTEE                     | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | PRIVILEGE_TYPE | IS_GRANTABLE |
+-----------------------------+---------------+--------------+------------+----------------+--------------+
| 'mysql.session'@'localhost' | def           | mysql        | user       | SELECT         | NO           |
| 'mysql.sys'@'localhost'     | def           | sys          | sys_config | SELECT         | NO           |
+-----------------------------+---------------+--------------+------------+----------------+--------------+
2 rows in set (0.00 sec)

mysql> #カラムの権限 ※カラムの権限は設定なし
mysql> SELECT * FROM information_schema.column_privileges;
Empty set (0.00 sec)

mysql.userのカラム一覧を確認する

MySQLのユーザ一覧は、mysql.userテーブルのカラムをselect文で取得することで表示します。

mysql.userのカラム一覧は、以下のSQLで確認できます。

mysql>  SHOW COLUMNS FROM mysql.user;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field                  | Type                              | Null | Key | Default               | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host                   | char(60)                          | NO   | PRI |                       |       |
| User                   | char(32)                          | NO   | PRI |                       |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N                     |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| File_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| References_priv        | enum('N','Y')                     | NO   |     | N                     |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N                     |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N                     |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N                     |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N                     |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N                     |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N                     |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |                       |       |
| ssl_cipher             | blob                              | NO   |     | NULL                  |       |
| x509_issuer            | blob                              | NO   |     | NULL                  |       |
| x509_subject           | blob                              | NO   |     | NULL                  |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0                     |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0                     |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0                     |       |
| max_user_connections   | int(11) unsigned                  | NO   |     | 0                     |       |
| plugin                 | char(64)                          | NO   |     | mysql_native_password |       |
| authentication_string  | text                              | YES  |     | NULL                  |       |
| password_expired       | enum('N','Y')                     | NO   |     | N                     |       |
| password_last_changed  | timestamp                         | YES  |     | NULL                  |       |
| password_lifetime      | smallint(5) unsigned              | YES  |     | NULL                  |       |
| account_locked         | enum('N','Y')                     | NO   |     | N                     |       |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+

MySQL5.7では、passwordカラムがなくなり、authentication_string にパスワードのハッシュ値が格納されるようになるなど、バージョンにより仕様が変わることがあります。

ユーザ名とパスワードを確認する

MySQL5.7で、ユーザ名とパスワードのハッシュ値を確認するには、以下のSQLを実行します。

mysql> select user, authentication_string from mysql.user;
+---------------+-------------------------------------------+
| user          | authentication_string                     |
+---------------+-------------------------------------------+
| root          | *27C01464AD101AED1E65AC21152499A396B4CF72 |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| root          | *27C01464AD101AED1E65AC21152499A396B4CF72 |
| user1         | *5A767C0D9E22BF6774C7DE4CCC45067CD1D290A1 |
| user0         | *AE399CE35FF8F5000D01BEA80A73A726CAB22335 |
+---------------+-------------------------------------------+

authentication_stringは、パスワードのハッシュ値が格納されています。この情報から、元のパスワードを知ることはできません。

まとめ

ポテパンダの一言メモ
  • MySQLでユーザ一覧を確認するには、mysql.userテーブルをselect
  • アカウントは接続元ごとに設定が可能
  • ユーザ名と権限の一覧は、information_schemaテーブルをselectする
  • MySQLユーザのパスワードは、ハッシュ値のみが格納されていて、元のパスワードを復元することはできない

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。