GRANT / REVOKE
| 対応: | SQL-92(1992) |
|---|
データベースユーザーへの権限付与(GRANT)や権限の剥奪(REVOKE)を行う命令です。セキュリティ管理に使用します。
構文
ユーザーに権限を付与します。
GRANT 権限 ON データベース名.テーブル名 TO 'ユーザー名'@'ホスト名';
付与した権限を他のユーザーへ委任できる権限を付与します。
GRANT 権限 ON データベース名.テーブル名 TO 'ユーザー名'@'ホスト名' WITH GRANT OPTION;
ユーザーから権限を剥奪します。
REVOKE 権限 ON データベース名.テーブル名 FROM 'ユーザー名'@'ホスト名';
ユーザーの権限を確認します(MySQL)。
SHOW GRANTS FOR 'ユーザー名'@'ホスト名';
権限一覧
| 権限 | 概要 |
|---|---|
| SELECT | データの参照を許可します。 |
| INSERT | データの挿入を許可します。 |
| UPDATE | データの更新を許可します。 |
| DELETE | データの削除を許可します。 |
| CREATE | テーブル・データベースの作成を許可します。 |
| DROP | テーブル・データベースの削除を許可します。 |
| ALTER | テーブル定義の変更を許可します。 |
| INDEX | インデックスの作成・削除を許可します。 |
| ALL PRIVILEGES | すべての権限を付与します。管理者ユーザーに使用します。 |
| WITH GRANT OPTION | 受け取った権限を他のユーザーに付与する権限も与えます。 |
サンプルコード
以下の3つのユーザーを例に説明します。データベース名は『shop_db』とします。
アプリケーション用ユーザーに SELECT・INSERT・UPDATE・DELETE を許可します。
sample_grant_revoke.sql
GRANT SELECT, INSERT, UPDATE, DELETE
ON shop_db.*
TO 'app_user'@'localhost';
Query OK, 0 rows affected
読み取り専用のレポートユーザーを作成します。
sample_grant_revoke.sql
GRANT SELECT
ON shop_db.*
TO 'report_user'@'%';
Query OK, 0 rows affected
特定テーブルのみアクセスを許可します。
sample_grant_revoke.sql
GRANT SELECT
ON shop_db.products
TO 'public_user'@'%';
Query OK, 0 rows affected
管理者ユーザーにすべての権限を付与します。
sample_grant_revoke.sql
GRANT ALL PRIVILEGES
ON shop_db.*
TO 'admin_user'@'localhost'
WITH GRANT OPTION;
Query OK, 0 rows affected
レポートユーザーから SELECT 権限を剥奪します。
sample_grant_revoke.sql
REVOKE SELECT
ON shop_db.*
FROM 'report_user'@'%';
Query OK, 0 rows affected
ユーザーの権限を確認します(MySQL)。
sample_grant_revoke.sql
SHOW GRANTS FOR 'app_user'@'localhost';
+-------------------------------------------------------------------------------+ | Grants for app_user@localhost | +-------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO `app_user`@`localhost` | | GRANT SELECT, INSERT, UPDATE, DELETE ON `shop_db`.* TO `app_user`@`localhost` | +-------------------------------------------------------------------------------+ 2 rows in set
権限変更を即時反映します(MySQL)。『GRANT』文を直接実行した場合はこのコマンドは不要ですが、権限テーブルを手動で編集した場合に変更を反映させるために使用します。
sample_grant_revoke.sql
FLUSH PRIVILEGES;
Query OK, 0 rows affected
データベース別の書き方
MySQL は『GRANT』『REVOKE』を使用します。ユーザーは「ユーザー名@ホスト名」の形式で指定します。
GRANT SELECT, INSERT, UPDATE, DELETE ON shop_db.* TO 'app_user'@'localhost'; REVOKE SELECT ON shop_db.* FROM 'report_user'@'%'; SHOW GRANTS FOR 'app_user'@'localhost';
PostgreSQL は MySQL と似た構文ですが、ユーザー指定に『@ホスト名』は使用しません。ロール(役割)ベースの権限管理に対応しています。
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user; -- ユーザーの権限を確認します(PostgreSQL)。 SELECT * FROM information_schema.role_table_grants WHERE grantee = 'app_user';
SQLite はファイルベースのデータベースのため、『GRANT』『REVOKE』コマンドはありません。アクセス制御はファイルシステムの権限で管理します。
概要
『GRANT』と『REVOKE』はDCL(データ制御言語)に分類されます。本番環境では最小権限の原則(Principle of Least Privilege)に従い、アプリケーションに必要な権限だけを付与することが重要です。例えば参照のみを行うAPIユーザーにはSELECTだけ、データ書き込みを行うユーザーにはSELECT・INSERT・UPDATE・DELETEのみを付与します。
MySQLでは「ユーザー名@ホスト名」の形式でユーザーを識別します。『%』はすべてのホストを意味し、『localhost』はローカル接続のみを意味します。セキュリティの観点から、外部公開するユーザーには必要最小限の権限を設定してください。
トランザクション制御については『TRANSACTION / COMMIT / ROLLBACK』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。