4-5.MySQLユーザーへのロールの割り当てと有効化

2019年7月15日

1.ロールを定義する方法

ロールを作成するには「CRATE ROLE」で定義します。

1)構文

CREATE ROLE [ロール名];

2)実行例

mysql> CREATE ROLE ROLE01;
Query OK, 0 rows affected (0.17 sec)

スポンサードサーチ

2.ロールに権限を付与する方法

ロールに権限を付与するにはGRANTを使用します。

1)構文

GRANT 権限 TO ロール;

2)実行例

mysql> GRANT SELECT ON TABLE01 TO ROLE01;
Query OK, 0 rows affected (0.88 sec)

mysql>

 

スポンサードサーチ

3.ロールをユーザーアカウントに付与する

ロールをユーザーアカウントに付与するにはGRANTを使用します。

1)構文

GRANT ロール TO [ユーザーアカウント];

2)実行例

mysql> GRANT ROLE01 TO USER01@localhost;
Query OK, 0 rows affected (0.34 sec)

mysql>

 

4.ユーザーアカウントへロールを付与する流れ

1)権限の状況確認

まずユーザー「USER01」の権限付与の状況を確認します。

ユーザーアカウント「USER01@localhost」には権限が付いていない状態です。

mysql> SHOW GRANTS FOR USER01@localhost;
+--------------------------------------------+
| Grants for USER01@localhost                |
+--------------------------------------------+
| GRANT USAGE ON *.* TO `USER01`@`localhost` |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql>

 

2)権限の付与

ユーザー「USER01」にロール「ROLE01」を付与します。

mysql> GRANT ROLE01 TO USER01@localhost;
Query OK, 0 rows affected (0.84 sec)

mysql>

 

3)付与後の権限の状況確認

権限を付与後のユーザーアカウント「USER01」の状況を確認します。

mysql> SHOW GRANTS FOR USER01@localhost;
+--------------------------------------------+
| Grants for USER01@localhost                |
+--------------------------------------------+
| GRANT USAGE ON *.* TO `USER01`@`localhost` |
| GRANT `ROLE01`@`%` TO `USER01`@`localhost` |
+--------------------------------------------+
2 rows in set (0.00 sec)

mysql>

「USER01@localhost」に「ROLE01」が付与されていることが確認できます。

しかし、これだけでは実は作業は足りていないのです。事項のようにロールを有効かする必要があります。

スポンサードサーチ

5.ロールを有効化する。

ロールは付与しただけでは有効になりません。ユーザーに対して有効化する必要があります。
方法は3通りあります。

1)セッション内でロール有効化する方法
2)ユーザーアカウントのデフォルトロールに設定する
3)システム変数「activate_all_roles_on_login」を「on」にする

1)セッション内でロール有効化する方法

この方法ではセッション内で付与されたロールを有効にします。

(1)設定方法

以下の構文でロールを有効にします。
【構文】
SET ROLE [ロール名];

(2)実行例

①データベースを設定してみます。

mysql> USE studydb;
ERROR 1044 (42000): Access denied for user 'USER01'@'localhost' to database 'studydb'

USE文でデータベースを設定できませんでした。これはユーザーアカウント「USER01@localhost」にはデータベース「studydb」でまだアクセス許可されているテーブルが無いためです。

②権限割り当て状況を確認してみます。
ロールは付与されているのにアクセス出来ない事が確認できます。

mysql> SHOW GRANTS;
+--------------------------------------------+
| Grants for USER01@localhost |
+--------------------------------------------+
| GRANT USAGE ON *.* TO `USER01`@`localhost` |
| GRANT `ROLE01`@`%` TO `USER01`@`localhost` |←ロールは割り当てられている
+--------------------------------------------+
2 rows in set (0.01 sec)

ロール「ROLE01」がちゃんと割り当てられています。エラーになるのはロールが有効になっていないためです。

③ロールを有効にします。

mysql> set ROLE ROLE01;
Query OK, 0 rows affected (0.01 sec)

有効になりました。再度SELECTを試してみましょう。

mysql> USE studydb
Database changed
mysql> select count(*) from TABLE01;
+----------+
| count(*) |
+----------+
| 0        |
+----------+
1 row in set (0.26 sec)

mysql>

ロールが有効になってデータベースの設定もテーブルへのアクセスもうまくいきました。

2)ユーザーアカウントのデフォルトロールに設定する

ユーザーアカウントのデフォルトロールに設定します。
これによりセッション開始と共にロールが割り当てられます。

(1)設定方法

【構文】

CREATE USER [ユーザーアカウント] IDENTIFIED BY '[パスワード]’ DEFAULT ROLE [ロール名];

ALTER USER [ユーザーアカウント] DEFAULT ROLE [ロール名];

(2)実行例

①rootユーザーでユーザー「USER01」のデフォルトロールを「ROLE01」に設定します。

mysql> ALTER USER USER01@localhost DEFAULT ROLE ROLE01;
Query OK, 0 rows affected (0.04 sec)

②「USER01」でログインして権限付与状況を確認します。

mysql> SHOW GRANTS;
+--------------------------------------------+
| Grants for USER01@localhost                |
+--------------------------------------------+
| GRANT USAGE ON *.* TO `USER01`@`localhost` |
| GRANT `ROLE01`@`%` TO `USER01`@`localhost` |←ロールが付与されています。
+--------------------------------------------+
2 rows in set (0.00 sec)

③データベースを「studydb」に設定して「TABLE01」をSELECTしてみます。

mysql> USE studydb;
Database changed
mysql> select count(*) from TABLE01;
+----------+
| count(*) |
+----------+
| 0        |
+----------+
1 row in set (0.00 sec)

↑ログインした時点でデフォルトロールが有効になっている為改めて有効化することなくSELECTがうまくいきました。

3)システム変数「activate_all_roles_on_login」を「on」にする

システム変数「activate_all_roles_on_login」を「on」にするとGRANTで権限を割り当てた時点で有効になります。

①現在の「activate_all_roles_on_login」の設定値を確認します。
以下のコマンドで値を確認できます。
SHOW VARIABLES LIKE 'activate_all_roles_on_login’;

mysql> SHOW VARIABLES LIKE 'activate_all_roles_on_login';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| activate_all_roles_on_login | OFF   |
+-----------------------------+-------+
1 row in set, 1 warning (0.13 sec)

mysql>

②「activate_all_roles_on_login」の値を「ON」に設定します。

SET GLOBAL activate_all_roles_on_login = on;

③ユーザーアカウント「USER01」の権限付与状況を確認します。

mysql> SHOW GRANTS FOR USER01@localhost;
+--------------------------------------------+
| Grants for USER01@localhost                |
+--------------------------------------------+
| GRANT USAGE ON *.* TO `USER01`@`localhost` |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql>

④ユーザーアカウント「USER01」に「ROLE01」を付与します。

mysql> GRANT ROLE01 TO USER01@localhost;
Query OK, 0 rows affected (0.01 sec)

⑤ユーザーアカウント「USER01」の権限付与状況を確認します。

mysql> SHOW GRANTS FOR USER01@localhost;
+--------------------------------------------+
| Grants for USER01@localhost         |
+--------------------------------------------+
| GRANT USAGE ON *.* TO `USER01`@`localhost` |
| GRANT `ROLE01`@`%` TO `USER01`@`localhost` |
+--------------------------------------------+
2 rows in set (0.00 sec)

mysql>

⑥ユーザーアカウント「USER01」に接続して「TABLE01」にアクセスしてみます。

mysql> USE studydb;
Database changed
mysql> SELECT COUNT(*) FROM TABLE01;
+----------+
| COUNT(*) |
+----------+
| 0        |
+----------+
1 row in set (0.02 sec)

mysql>

SETで有効にしなくてもアクセス出来ました。