MySQLで権限確認する方法|SHOW GRANTSと各種権限の完全ガイド【初心者向け】

データベース・SQL

「このユーザーはどんな権限を持っているの?」
「なぜこの操作ができないの?」
「セキュリティ監査で権限を調べる必要がある」
そんなときに必要なのが、MySQLでのユーザー権限確認です。

「権限の確認って複雑そう…」
「どのコマンドを使えばいいの?」
そんな疑問をお持ちの方も多いでしょう。

実は、基本的なコマンドを覚えれば、簡単に権限の確認ができるようになります。

この記事では、MySQLでユーザーやロールに付与された権限の一覧を確認するための方法と、各種権限の概要をわかりやすく解説します。

スポンサーリンク

なぜ権限確認が重要なのか?

データベース管理における権限確認の必要性

主な理由

  • セキュリティ管理:不適切な権限付与を防ぐ
  • トラブルシューティング:操作エラーの原因特定
  • 監査対応:定期的な権限チェック
  • 権限の最小化:必要最小限の権限で運用
  • コンプライアンス:規制要件への対応

よくある権限関連の問題

実際に起こりがちなトラブル

  1. アクセス拒否エラー:「Access denied for user…」
  2. 予期しない操作制限:「テーブルは見えるのに更新できない」
  3. 権限の重複付与:「同じ権限が複数付与されている」
  4. 不要な権限:「退職者のアカウントに強力な権限が残っている」

これらの問題を防ぐために、定期的な権限確認が欠かせません。

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詳細な権限分析柔軟なクエリが可能
定期監査クエリセキュリティ管理自動化・レポート向け

今日からできること

  1. 自分の権限をSHOW GRANTSで確認してみる
  2. 管理しているユーザーの権限を一覧化する
  3. 不要な権限がないかチェックする
  4. 定期的な権限監査の仕組みを作る

権限管理で重要なポイント

  • 最小権限の原則:必要最小限の権限のみ付与
  • 定期的な監査:権限の棚卸しを習慣化
  • 証跡の保持:権限変更の履歴を記録
  • 緊急時対応:管理者権限の適切な管理

コメント

タイトルとURLをコピーしました