PolarDB-X は MySQL 8.0 互換のロールベースアクセス制御(RBAC)をサポートします。このトピックでは、各ロール管理操作の構文と実行可能な例を説明します。
完全な MySQL 8.0 のロール仕様については、「ロールベースのアクセス制御」をご参照ください。
操作一覧
| 操作 | ステートメント |
|---|---|
| ロールの作成 | CREATE ROLE |
| ロールの削除 | DROP ROLE |
| ロールへの権限付与 | GRANT ... ON ... TO role |
| ユーザーへのロール割り当て | GRANT role TO user |
| ユーザーのデフォルトロール設定 | SET DEFAULT ROLE |
| 現在のセッションにおけるロールの有効化 | SET ROLE |
| ロールまたはユーザーの権限確認 | SHOW GRANTS |
| ロールからの権限剥奪 | REVOKE ... ON ... FROM role |
| ユーザーからのロール割り当て解除 | REVOKE role FROM user |
ロールの作成
CREATE ROLE role [, role]...ロール名は「名前」と「ホスト」の 2 つの部分で構成されます。
名前:必須項目です。空欄にすることはできません。
ホスト:IP アドレスである必要があります。アンダースコア(
_)およびパーセント記号(%)を含めることができますが、いずれもワイルドカードとして解釈されません。空欄の場合は、ホスト値として%が使用されます。%はワイルドカード展開ではなく、完全に一致する場合のみマッチします。
例:
mysql> CREATE ROLE 'role_ro'@'%', 'role_write';ロールの削除
DROP ROLE role [, role] ...例:
mysql> DROP ROLE 'role_ro'@'%';ロールへの権限付与
この構文を使用すると、データベース権限(例:SELECT や ALL PRIVILEGES など)をロールに直接付与できます。この形式には、権限レベルを指定する ON 句が含まれます。
GRANT priv_type [, priv_type] ... ON priv_level TO role [, role]... [WITH GRANT OPTION]例:
mysql> GRANT ALL PRIVILEGES ON db1.* TO 'role_write';ユーザーへのロール割り当て
この構文を使用して、ユーザーにロールを割り当てます。
GRANT role [, role] ...
TO user_or_role [, user_or_role] ...
[WITH ADMIN OPTION]前提条件:
実行アカウントには
CREATE_USER権限が必要です。実行アカウントは、割り当てるロールに対して管理者権限(admin permission)を保持している必要があります。
WITH ADMIN OPTIONを指定すると、受信者にその割り当てられたロールに対する管理者権限が付与されます。
例:
mysql> GRANT 'role_write' TO 'user1'@'127.0.0.1';ロールを割り当てても、自動的に有効化されるわけではありません。ユーザーのセッションは、ロールが明示的に有効化されるまで、そのロールの権限を取得しません。SET DEFAULT ROLE および SET ROLE を使用してロールを有効化してください(以下のセクションを参照)。
ユーザーのデフォルトロール設定
SET DEFAULT ROLE は、ユーザーが接続した際に自動的に有効化されるロールを指定します。
SET DEFAULT ROLE
{NONE | ALL | role [, role ] ...}
TO user [, user ] ...前提条件:
指定するロールは、あらかじめ
GRANTを使用してユーザーに割り当てられている必要があります。ユーザーが該当ロールを既に割り当てられているか、あるいは
CREATE_USER権限を保持している必要があります。
例:
mysql> SET DEFAULT ROLE 'role_write' TO 'user1'@'127.0.0.1';現在のセッションにおけるロールの有効化
SET ROLE は、現在の接続において有効なロールを変更します。この変更はセッション終了後に永続化されません。
SET ROLE {
DEFAULT
| NONE
| ALL
| ALL EXCEPT role [, role ] ...
| role [, role ] ...
}SET ROLE DEFAULTは、SET DEFAULT ROLEで設定されたロールを有効化します。有効化されたロールは、現在の接続にのみ適用されます。
例:
mysql> SET ROLE 'role_write';現在有効なロールを確認するには、SELECT CURRENT_ROLE() を実行します:
mysql> SELECT CURRENT_ROLE();
+------------------+
| CURRENT_ROLE() |
+------------------+
| 'role_write'@'%' |
+------------------+権限の確認
SHOW GRANTS は、ユーザーまたはロールの権限およびロール割り当て情報を表示します。USING 句を追加すると、出力内でロールの権限をインライン展開できます。
SHOW GRANTS
[FOR user_or_role
[USING role [, role] ...]]例 — ロールの権限を確認:
mysql> SHOW GRANTS FOR 'role_write'@'%';
+---------------------------------------------------+
| GRANTS FOR 'ROLE_WRITE'@'%' |
+---------------------------------------------------+
| GRANT USAGE ON *.* TO 'role_write'@'%' |
| GRANT ALL PRIVILEGES ON db1.* TO 'role_write'@'%' |
+---------------------------------------------------+例 — ユーザーの権限を確認(ロール権限をインライン展開):
mysql> SHOW GRANTS FOR 'user1'@'127.0.0.1' USING 'role_write';
+------------------------------------------------------+
| GRANTS FOR 'USER1'@'127.0.0.1' |
+------------------------------------------------------+
| GRANT USAGE ON *.* TO 'user1'@'127.0.0.1' |
| GRANT ALL PRIVILEGES ON db1.* TO 'user1'@'127.0.0.1' |
| GRANT 'role_write'@'%' TO 'user1'@'127.0.0.1' |
+------------------------------------------------------+
-- user1 として実行
mysql> SELECT CURRENT_ROLE();
+------------------+
| CURRENT_ROLE() |
+------------------+
| 'role_write'@'%' |
+------------------+ロールからの権限剥奪
この構文を使用して、ロールから特定の権限を削除します。
REVOKE priv_type [, priv_type] ... ON priv_level FROM role [, role]...例:
mysql> REVOKE ALL PRIVILEGES ON db1.* FROM 'role_write';
mysql> SHOW GRANTS FOR 'role_write'@'%';
+----------------------------------------+
| GRANTS FOR 'ROLE_WRITE'@'%' |
+----------------------------------------+
| GRANT USAGE ON *.* TO 'role_write'@'%' |
+----------------------------------------+ユーザーからのロール割り当て解除
この構文を使用して、ユーザーからロールの割り当てを解除します。
REVOKE role [, role ] ... FROM user_or_role [, user_or_role ] ...例:
mysql> SHOW GRANTS FOR 'user1'@'127.0.0.1';
+-----------------------------------------------+
| GRANTS FOR 'USER1'@'127.0.0.1' |
+-----------------------------------------------+
| GRANT USAGE ON *.* TO 'user1'@'127.0.0.1' |
| GRANT SELECT ON db1.* TO 'user1'@'127.0.0.1' |
| GRANT 'role_write'@'%' TO 'user1'@'127.0.0.1' |
+-----------------------------------------------+
mysql> REVOKE 'role_write' FROM 'user1'@'127.0.0.1';
mysql> SHOW GRANTS FOR 'user1'@'127.0.0.1';
+----------------------------------------------+
| GRANTS FOR 'USER1'@'127.0.0.1' |
+----------------------------------------------+
| GRANT USAGE ON *.* TO 'user1'@'127.0.0.1' |
| GRANT SELECT ON db1.* TO 'user1'@'127.0.0.1' |
+----------------------------------------------+