「このユーザーはどんな権限を持っているの?」
「なぜこの操作ができないの?」
「セキュリティ監査で権限を調べる必要がある」
そんなときに必要なのが、MySQLでのユーザー権限確認です。
「権限の確認って複雑そう…」
「どのコマンドを使えばいいの?」
そんな疑問をお持ちの方も多いでしょう。
実は、基本的なコマンドを覚えれば、簡単に権限の確認ができるようになります。
この記事では、MySQLでユーザーやロールに付与された権限の一覧を確認するための方法と、各種権限の概要をわかりやすく解説します。
なぜ権限確認が重要なのか?

データベース管理における権限確認の必要性
主な理由
- セキュリティ管理:不適切な権限付与を防ぐ
- トラブルシューティング:操作エラーの原因特定
- 監査対応:定期的な権限チェック
- 権限の最小化:必要最小限の権限で運用
- コンプライアンス:規制要件への対応
よくある権限関連の問題
実際に起こりがちなトラブル
- アクセス拒否エラー:「Access denied for user…」
- 予期しない操作制限:「テーブルは見えるのに更新できない」
- 権限の重複付与:「同じ権限が複数付与されている」
- 不要な権限:「退職者のアカウントに強力な権限が残っている」
これらの問題を防ぐために、定期的な権限確認が欠かせません。
SHOW GRANTSコマンドで権限一覧を取得

基本的な使い方
自分の権限を確認する
SHOW GRANTS;
実行例
mysql> SHOW GRANTS;
+-------------------------------------------------------------------------+
| Grants for root@localhost |
+-------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO `root`@`localhost` WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+-------------------------------------------------------------------------+
2 rows in set (0.00 sec)
結果の見方
ALL PRIVILEGES ON *.*
:全データベースの全権限WITH GRANT OPTION
:他のユーザーに権限を付与する権限PROXY
:他のユーザーになりすます権限
他のユーザーの権限を確認する
特定ユーザーの権限確認
SHOW GRANTS FOR 'ユーザー名'@'ホスト';
実用例
-- 特定のユーザーの権限確認
SHOW GRANTS FOR 'webapp_user'@'localhost';
-- 現在のユーザーの権限確認(明示的)
SHOW GRANTS FOR CURRENT_USER();
-- ワイルドカードを使った確認
SHOW GRANTS FOR 'dev_user'@'%';
実行結果例
mysql> SHOW GRANTS FOR 'webapp_user'@'localhost';
+------------------------------------------------------------------------------------+
| Grants for webapp_user@localhost |
+------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `webapp_user`@`localhost` |
| GRANT SELECT, INSERT, UPDATE ON `ecommerce`.* TO `webapp_user`@`localhost` |
| GRANT SELECT ON `ecommerce`.`products` TO `webapp_user`@`localhost` |
+------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)
権限確認時の注意点
必要な権限について 他のユーザーの権限を確認するには、以下のいずれかが必要です:
mysql
データベースに対するSELECT権限- グローバルなSELECT権限
- 管理者権限
権限が不足している場合のエラー
mysql> SHOW GRANTS FOR 'other_user'@'localhost';
ERROR 1142 (42000): SELECT command denied to user 'limited_user'@'localhost'
for table 'user'
information_schemaで詳細に確認

TABLE_PRIVILEGESテーブルの活用
基本構文
SELECT *
FROM information_schema.TABLE_PRIVILEGES
WHERE GRANTEE LIKE "'ユーザー名'@'%'";
実用例:特定ユーザーのテーブル権限確認
SELECT
GRANTEE,
TABLE_SCHEMA,
TABLE_NAME,
PRIVILEGE_TYPE,
IS_GRANTABLE
FROM information_schema.TABLE_PRIVILEGES
WHERE GRANTEE = "'webapp_user'@'localhost'"
ORDER BY TABLE_SCHEMA, TABLE_NAME;
実行結果例
+---------------------------+--------------+------------+----------------+--------------+
| GRANTEE | TABLE_SCHEMA | TABLE_NAME | PRIVILEGE_TYPE | IS_GRANTABLE |
+---------------------------+--------------+------------+----------------+--------------+
| 'webapp_user'@'localhost' | ecommerce | products | SELECT | NO |
| 'webapp_user'@'localhost' | ecommerce | orders | SELECT | NO |
| 'webapp_user'@'localhost' | ecommerce | orders | INSERT | NO |
| 'webapp_user'@'localhost' | ecommerce | orders | UPDATE | NO |
+---------------------------+--------------+------------+----------------+--------------+
COLUMN_PRIVILEGESテーブルでの列レベル権限確認
列レベル権限の確認
SELECT
GRANTEE,
TABLE_SCHEMA,
TABLE_NAME,
COLUMN_NAME,
PRIVILEGE_TYPE
FROM information_schema.COLUMN_PRIVILEGES
WHERE GRANTEE = "'sensitive_user'@'localhost'"
ORDER BY TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME;
活用場面
- 個人情報列への限定的なアクセス制御
- 機密データの列レベルでの権限管理
- 細かいセキュリティ要件への対応
USER_PRIVILEGESテーブルでのグローバル権限確認
グローバル権限の詳細確認
SELECT
GRANTEE,
PRIVILEGE_TYPE,
IS_GRANTABLE
FROM information_schema.USER_PRIVILEGES
WHERE GRANTEE = "'admin_user'@'%'"
ORDER BY PRIVILEGE_TYPE;
権限の種類(Privilege Types)

グローバル権限
主要なグローバル権限
権限名 | 内容 | 使用場面 |
---|---|---|
ALL PRIVILEGES | すべての権限 | スーパーユーザー |
CREATE USER | ユーザー作成・削除 | DBA作業 |
SUPER | 高度な管理操作 | システム管理 |
PROCESS | プロセス一覧表示 | パフォーマンス監視 |
RELOAD | 設定の再読み込み | サーバー管理 |
SHUTDOWN | サーバー停止 | メンテナンス作業 |
グローバル権限の確認例
-- 管理者権限を持つユーザーの確認
SELECT GRANTEE, PRIVILEGE_TYPE
FROM information_schema.USER_PRIVILEGES
WHERE PRIVILEGE_TYPE IN ('SUPER', 'CREATE USER', 'RELOAD')
ORDER BY GRANTEE, PRIVILEGE_TYPE;
データベース権限
主要なデータベース権限
権限名 | 内容 | 使用場面 |
---|---|---|
CREATE | データベース・テーブル作成 | 開発者、設計者 |
DROP | データベース・テーブル削除 | 管理者、開発リーダー |
GRANT OPTION | 権限の付与 | DBA、権限管理者 |
SHOW VIEW | ビューの定義表示 | 開発者、分析者 |
TRIGGER | トリガーの作成・削除 | 開発者 |
テーブル権限
基本的なCRUD権限
権限名 | 内容 | 使用場面 |
---|---|---|
SELECT | データの読み取り | 全般的な利用 |
INSERT | データの追加 | アプリケーション |
UPDATE | データの更新 | アプリケーション |
DELETE | データの削除 | 管理機能 |
INDEX | インデックスの作成・削除 | DBA、パフォーマンスチューニング |
テーブル権限の確認例
SELECT
SUBSTRING_INDEX(GRANTEE, '@', 1) as user_name,
TABLE_SCHEMA as database_name,
TABLE_NAME,
GROUP_CONCAT(PRIVILEGE_TYPE ORDER BY PRIVILEGE_TYPE) as privileges
FROM information_schema.TABLE_PRIVILEGES
WHERE TABLE_SCHEMA = 'ecommerce'
GROUP BY GRANTEE, TABLE_SCHEMA, TABLE_NAME
ORDER BY user_name, TABLE_NAME;
動的権限(MySQL 8.0以降)
MySQL 8.0で追加された動的権限
権限名 | 内容 | 使用場面 |
---|---|---|
BINLOG_ADMIN | バイナリログ管理 | レプリケーション管理 |
SYSTEM_VARIABLES_ADMIN | システム変数変更 | 設定管理 |
CONNECTION_ADMIN | 接続制限の回避 | 緊急時アクセス |
ROLE_ADMIN | ロール管理 | 権限管理 |
動的権限の確認
-- MySQL 8.0での動的権限確認
SELECT
GRANTEE,
PRIVILEGE_TYPE,
IS_GRANTABLE
FROM information_schema.USER_PRIVILEGES
WHERE PRIVILEGE_TYPE LIKE '%_ADMIN'
ORDER BY GRANTEE;
実践的な権限確認クエリ集

全ユーザーの権限サマリー
システム全体の権限概要
SELECT
SUBSTRING_INDEX(GRANTEE, '@', 1) as username,
SUBSTRING_INDEX(GRANTEE, '@', -1) as hostname,
COUNT(*) as privilege_count,
GROUP_CONCAT(DISTINCT PRIVILEGE_TYPE ORDER BY PRIVILEGE_TYPE) as privileges
FROM information_schema.USER_PRIVILEGES
GROUP BY GRANTEE
ORDER BY username;
特定の権限を持つユーザーの一覧
危険な権限を持つユーザーの特定
SELECT DISTINCT
SUBSTRING_INDEX(GRANTEE, '@', 1) as username,
SUBSTRING_INDEX(GRANTEE, '@', -1) as hostname
FROM information_schema.USER_PRIVILEGES
WHERE PRIVILEGE_TYPE IN ('SUPER', 'ALL PRIVILEGES', 'CREATE USER')
ORDER BY username;
データベース別の権限分析
データベースごとのアクセス権限概要
SELECT
TABLE_SCHEMA as database_name,
COUNT(DISTINCT GRANTEE) as user_count,
COUNT(*) as total_privileges,
GROUP_CONCAT(DISTINCT PRIVILEGE_TYPE ORDER BY PRIVILEGE_TYPE) as privilege_types
FROM information_schema.TABLE_PRIVILEGES
GROUP BY TABLE_SCHEMA
ORDER BY database_name;
セキュリティ監査のための権限チェック

不適切な権限の検出
過剰な権限を持つユーザーの検出
-- ALLまたはSUPER権限を持つユーザー
SELECT
GRANTEE,
PRIVILEGE_TYPE,
'HIGH_RISK' as risk_level
FROM information_schema.USER_PRIVILEGES
WHERE PRIVILEGE_TYPE IN ('ALL PRIVILEGES', 'SUPER')
UNION ALL
-- WITH GRANT OPTIONを持つユーザー
SELECT
GRANTEE,
CONCAT(PRIVILEGE_TYPE, ' WITH GRANT OPTION') as PRIVILEGE_TYPE,
'MEDIUM_RISK' as risk_level
FROM information_schema.USER_PRIVILEGES
WHERE IS_GRANTABLE = 'YES'
ORDER BY risk_level, GRANTEE;
未使用ユーザーの検出
最近ログインしていないユーザーの確認
-- パフォーマンススキーマを使用(MySQL 5.7以降)
SELECT
p.USER as username,
p.HOST as hostname,
p.CURRENT_CONNECTIONS,
p.TOTAL_CONNECTIONS,
'POTENTIALLY_UNUSED' as status
FROM performance_schema.accounts p
LEFT JOIN information_schema.USER_PRIVILEGES up
ON CONCAT(QUOTE(p.USER), '@', QUOTE(p.HOST)) = up.GRANTEE
WHERE p.TOTAL_CONNECTIONS = 0
AND up.GRANTEE IS NOT NULL
ORDER BY username;
権限管理のベストプラクティス
定期的な権限監査
月次権限チェックのクエリ例
-- 管理者権限を持つユーザーの一覧(月次レポート用)
SELECT
DATE(NOW()) as check_date,
SUBSTRING_INDEX(GRANTEE, '@', 1) as username,
SUBSTRING_INDEX(GRANTEE, '@', -1) as hostname,
GROUP_CONCAT(PRIVILEGE_TYPE ORDER BY PRIVILEGE_TYPE) as admin_privileges
FROM information_schema.USER_PRIVILEGES
WHERE PRIVILEGE_TYPE IN (
'ALL PRIVILEGES', 'SUPER', 'CREATE USER',
'RELOAD', 'SHUTDOWN', 'PROCESS'
)
GROUP BY GRANTEE
ORDER BY username;
権限の最小化チェック
過剰な権限の特定
-- SELECT権限のみで十分な可能性があるユーザー
SELECT
tp.GRANTEE,
tp.TABLE_SCHEMA,
COUNT(*) as privilege_count,
GROUP_CONCAT(tp.PRIVILEGE_TYPE) as current_privileges
FROM information_schema.TABLE_PRIVILEGES tp
WHERE tp.TABLE_SCHEMA NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
GROUP BY tp.GRANTEE, tp.TABLE_SCHEMA
HAVING COUNT(*) > 1
AND FIND_IN_SET('SELECT', GROUP_CONCAT(tp.PRIVILEGE_TYPE)) > 0
ORDER BY privilege_count DESC;
まとめ
MySQLでの権限確認は、SHOW GRANTSコマンドとinformation_schemaの活用が基本であり、セキュアなデータベース運用に欠かせないスキルです。
今回のポイントをおさらい
確認方法 | 用途 | 特徴 |
---|---|---|
SHOW GRANTS | 基本的な権限確認 | シンプルで分かりやすい |
information_schema | 詳細な権限分析 | 柔軟なクエリが可能 |
定期監査クエリ | セキュリティ管理 | 自動化・レポート向け |
今日からできること
- 自分の権限をSHOW GRANTSで確認してみる
- 管理しているユーザーの権限を一覧化する
- 不要な権限がないかチェックする
- 定期的な権限監査の仕組みを作る
権限管理で重要なポイント
- 最小権限の原則:必要最小限の権限のみ付与
- 定期的な監査:権限の棚卸しを習慣化
- 証跡の保持:権限変更の履歴を記録
- 緊急時対応:管理者権限の適切な管理
コメント