MySQL8役割ベースのアクセス許可の管理

より柔軟かつ便利に、管理者アカウント権限の役割(ロール)のMySQL8新しい概念。いわゆる役割は、許可のいくつかのコレクションです。その後、アカウントに、コレクションの承認を置く(アカウントはIP、異なるIPを結合するため、多くの場合、アカウントのグループアカウント名別のアカウントとして扱われるのと同じであるが)、私たちは減らすか、これらのアカウントを増やす必要がある場合ように許可は、単一のアカウントの多くの変更を加えることなく、権限(ロール)のセットを変更することができます必要がある場合。これは、DBA操作と多くのメンテナンスが簡単に作るん。

ここでは、役割が使用されている方法を見て。

ロールの作成

本番環境用のすべてのライブラリの権限のニーズは、多くの場合、これらの権利のアカウントCRUDを必要とアカウントこのような開発環境として、我々はこれらの権利のために別々の役割を構築することができます。読み取りと書き込み、読み取りと書き込み、別がある場合には、二つの役割を構築することができます。

1 
2
3
4
5
6
7
8
ロール 'app_dev'、 'app_read'、 'app_write' を作成します。

mysql8 [(いずれも)]> 'app_dev'の許可を示しません。
+ ------------------------------------- +
| %@ app_devのための補助金|
+ ------------------------------------- +
| * ON GRANTのUSAGE * ``% `@ app_dev`します。|
+ ------------------------------------- +

あなたがキャラクターを作成するときは、2つの部分にホスト(デフォルト%)、すなわちロール名+ホスト名をバインドすることができ、そしてこのアカウントは違いはありません。
同じ役割も作成し、同じアカウントmysql.userテーブルに格納されます。あなたは、このテーブルを照会することによって、情報の役割を見ることができます:

1 
2
3
4
5
6
7
8
mysql.userからmysql8 [(なし)]> SELECT * FROM。
+ ----------- + ------------ + ------------- + ---- --------- + ------------- + ------------- + ------------ - + ----------- + ------------- + --------------- + ------ -------- + ----------- + ------------ + ---------------- - + ------------ + ------------ + -------------- + ------- ----- + ----------------------- + ------------------ + - ------------- + ----------------- + ------------------ + ------------------ + ---------------- + ------------- -------- + -------------------- + ------------------ + - ----------- + -------------- + ----------------------- - + ---------- + ------------ + ------------- + ---------- ---- + --------------- + ------------- + --------------- - + ---------------------- + ----------------------- + -------------------------------------------------- ---------------------- + ------------------ + -------- --------------- + ------------------- + -------------- - + ------------------ + ---------------- + ----------- ------------- + --------------------- +
| ホスト| ユーザー| Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Show_db_priv | Super_priv | Create_tmp_table_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | Create_view_priv | Show_view_priv | Create_routine_priv | Alter_routine_priv | Create_user_priv | Event_priv | Trigger_priv | Create_tablespace_priv | ssl_type | SSL_CIPHER | x509_issuer | x509_subject | max_questions | max_updates | MAX_CONNECTIONS | MAX_USER_CONNECTIONS | プラグイン| authentication_string | password_expired | password_last_changed | password_lifetime | account_locked | Create_role_priv | Drop_role_priv | Password_reuse_history | PASSWORD_REUSE_TIME |
+ ----------- + ------------ + ------------- + ---- --------- + ------------- + ------------- + ------------ - + ----------- + ------------- + --------------- + ------ -------- + ----------- + ------------ + ---------------- - + ------------ + ------------ + -------------- + ------- ----- + ----------------------- + ------------------ + - ------------- + ----------------- + ------------------ + ------------------ + ---------------- + ------------- -------- + -------------------- + ------------------ + - ----------- + -------------- + ----------------------- - + ---------- + ------------ + ------------- + ---------- ---- + --------------- + ------------- + --------------- - + ---------------------- + ----------------------- + -------------------------------------------------- ---------------------- + ------------------ + -------- --------------- + ------------------- + -------------- - + ------------------ + ---------------- + ----------- ------------- + --------------------- +
| %| app_dev | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | | | | | 0 | 0 | 0 | 0 | caching_sha2_password | | Y | 2018年6月14日11時27分:35 | NULL | Y | N | N | NULL | NULL |
| %| app_read | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | | | | | 0 | 0 | 0 | 0 | caching_sha2_password | | Y | 2018年6月14日11時27分:35 | NULL | Y | N | N | NULL | NULL |
| %| app_write | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | | | | | 0 | 0 | 0 | 0 | caching_sha2_password | | Y | 2018年6月14日11時27分:35 | NULL | Y | N | N | NULL | NULL |
| %| REPL | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | Y | N | N | N | N | N | N

役割への許可

私たちは、3つの役割の上に構築されたが、この役割は、我々はまた、承認のための役割に必要な、3つしか使用権です。アカウントを認可するライセンスとはまったく同じです。

1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql8 [(なし)]>試験に削除し、SELECT、INSERT、UPDATEを付与* app_devへ。
影響を受けたクエリOK、0行(0.02秒)

mysql8 [(なし)]>グラント試験で選択* app_readします。
影響を受けたクエリOK、0行(0.10秒)

mysql8 [(なし)]> app_readを表示グラント。
+ -------------------------------------------- +
| %@ app_readのための補助金|
+ -------------------------------------------- +
| * ON GRANTのUSAGE * ``% `@ app_read`します。|
| test` `ON GRANT SELECT * TO` app_read` `%` @。|
+ -------------------------------------------- +
セットで2行(0.00秒)

mysql8 [(なし)]> app_devを表示グラント。
+ ------------------------------------------------- ------------------ +
| %@ app_devのための補助金|
+ ------------------------------------------------- ------------------ +
| * ON GRANTのUSAGE * ``% `@ app_dev`します。|
| SELECT、INSERT、UPDATE、DELETE test` `ONを許可*`% `@` app_dev`します。|
+ ------------------------------------------------- ------------------ +

各文字を見た後、適切な権限を持っているために私たちを承認しました。

アカウントへの役割の承認

のは、特定のアカウントを作成し、アカウントの適切な役割を承認してみましょう。

1 
2
3
4
5
6
7
8
9
10
11
12
13
mysql8 [(なし)]> [dev01 'によってmysql_native_passwordで識別されるユーザのdev01を作成します。
影響を受けたクエリOK、0行(0.04秒)

mysql8 [(なし)]> dev01にapp_devを付与しません。
影響を受けたクエリOK、0行(0.05秒)

mysql8 [(なし)]> dev01を表示グラント。
+ ------------------------------------ +
| %@ dev01のための補助金|
+ ------------------------------------ +
| GRANTのON USAGE * * TO ``% `@ dev01`。|
| GRANT `app_dev``% `@ TO` dev01` `%` @ |
+ ------------------------------------ +

私たちは、アカウントdev01を作成し、権限ロールがapp_devすると、表示、役割ではなく、特定の権限を確認するには、show助成金の許可を実行します。あなたが特定の権限を確認したい場合は、このショーの助成を行う必要があります。

1 
2
3
4
5
6
7
8
mysql8[(none)]>show grants for dev01 using app_dev;
+-----------------------------------------------------------------+
| Grants for dev01@% |
+-----------------------------------------------------------------+
| GRANT USAGE ON *.* TO `dev01`@`%` |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `test`.* TO `dev01`@`%` |
| GRANT `app_dev`@`%` TO `dev01`@`%` |
+-----------------------------------------------------------------+

通过使用using app_dev,会将账号和角色的权限一并显示。

我们给角色app_dev添加create权限

1
2
3
4
5
6
7
8
9
10
11
12
mysql8[(none)]>grant create on test.* to app_dev;
Query OK, 0 rows affected (0.10 sec)

mysql8[(none)]>show grants for dev01 using app_dev;
+-------------------------------------------------------------------------+
| Grants for dev01@% |
+-------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `dev01`@`%` |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE ON `test`.* TO `dev01`@`%` |
| GRANT `app_dev`@`%` TO `dev01`@`%` |
+-------------------------------------------------------------------------+
3 rows in set (0.00 sec)

可以看到给角色添加权限后,dev01账号也具有了create权限。

激活角色

上面的一些列操作貌似完美,dev02账号可以使用了,其实还不行!使用dev01账号登陆:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> show grants for dev01 using app_dev;
+-------------------------------------------------------------------------+
| Grants for dev01@% |
+-------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `dev01`@`%` |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE ON `test`.* TO `dev01`@`%` |
| GRANT `app_dev`@`%` TO `dev01`@`%` |
+-------------------------------------------------------------------------+
3 rows in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.01 sec)

发现权限也有,但并看不到test库,什么也无法执行。为什么呢?角色没有被激活

1
2
3
4
5
6
7
8
mysql> select current_role()
-> ;
+----------------+
| current_role() |
+----------------+
| NONE |
+----------------+
1 row in set (0.00 sec)

执行select current_role()发现是None. 所授权的角色并没有被激活,因此这个账号 还是废柴一个。

对账号激活权限也很简单

1
2
mysql8[(none)]>set default role all to dev01;
Query OK, 0 rows affected (0.06 sec)

这样对dev01授予的所有角色都会被激活。再使用dev01登陆就正常访问了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
+--------------------+
2 rows in set (0.01 sec)


mysql> select current_role();
+----------------+
| current_role() |
+----------------+
| `app_dev`@`%` |
+----------------+
1 row in set (0.00 sec)

可以看到当前激活的角色为app_dev.

感觉流程太繁琐了,都授权完了还要激活,但MySQL8 提供已一个参数,可以使角色在账号登陆后自动被激活。

1
2
3
4
5
6
7
8
9
10
mysql8[(none)]>show global variables like 'activate_all_roles_on_login';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| activate_all_roles_on_login | OFF |
+-----------------------------+-------+
1 row in set (0.01 sec)

mysql8[(none)]>set global activate_all_roles_on_login=ON;
Query OK, 0 rows affected (0.00 sec)

把activate_all_roles_on_login设置为ON就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql8[(none)]>create user query identified with mysql_native_password by 'query';
Query OK, 0 rows affected (0.04 sec)

mysql8[(none)]>grant app_read to query;
Query OK, 0 rows affected (0.06 sec)

mysql8[(none)]>show grants for query using app_read;
+-----------------------------------------+
| Grants for query@% |
+-----------------------------------------+
| GRANT USAGE ON *.* TO `query`@`%` |
| GRANT SELECT ON `test`.* TO `query`@`%` |
| GRANT `app_read`@`%` TO `query`@`%` |
+-----------------------------------------+
3 rows in set (0.00 sec)

mysql8[(none)]>exit

使用query账号登陆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
+--------------------+
2 rows in set (0.00 sec)

mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| query@% |
+----------------+
1 row in set (0.00 sec)

mysql> select current_role();
+----------------+
| current_role() |
+----------------+
| `app_read`@`%` |
+----------------+
1 row in set (0.00 sec)

可以看到角色已被激活。

角色和账号交互使用

角色和账号没有什么区别,可以把一个账号当做一个角色,将其授权给其它账号。详见MySQL 官方文档

1 
2
3
4
5
6
7
8
USER「U1」を作成します。
ROLE「R1」を作成します。
GRANT SELECT ON DB1 * 'U1'に。
GRANT SELECT ONのDB2 * TO 'R1'。;
USER「U2」を作成します。
R2 'の役割を作成します。
GRANT 'U1' 'U2'に、R1 '';
GRANT 'U1'、 'R2'にR1 '';

これは右、あまりにも柔軟性がありますか?私は彼のあごのうち怖がっていました!

オリジナルリンク大列  https://www.dazhuanlan.com/2019/08/15/5d551447abf4d/

おすすめ

転載: www.cnblogs.com/chinatrump/p/11416261.html