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ユーザのパスワードは、ハッシュ値のみが格納されていて、元のパスワードを復元することはできない