GBase 8a通过grant语句,对用户访问对象进行限制,本文介绍一些简单的概念和用法,来应对业务需求。
目录导航
语法
grant 权限 on 对象 to 用户
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user IDENTIFIED BY [[PASSWORD] [password]]
 [WITH with_option ...]
object_type:
 TABLE | FUNCTION | PROCEDURE
priv_level:
 * | *.* | database_name.* |database_name.table_name
 | table_name | database_name.routine_name
对其中每个部分解释一下
权限
多个权限,可以一次性授权,用逗号分割。 如果是ALL,则代表所有权限(不包括unmask)。
gbase> grant select,insert on testdb.abc to abc;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
| 权限名字 | 说明 | 对应gbase.user字段 | 
| SELECT | 允许使用 SELECT | Select_priv | 
| INSERT | 允许使用 INSERT | Insert_priv | 
| UPDATE | 允许使用 UPDATE | Update_priv | 
| DELETE | 允许使用 DELETE | Delete_priv | 
| CREATE | 允许使用 CREATE TABLE | Create_priv | 
| DROP | 允许使用 DROP TABLE | Drop_priv | 
| RELOAD | 允许使用 FLUSH | Reload_priv | 
| SHUTDOWN | 允许使用 gbaseadmin shutdown | Shutdown_priv | 
| PROCESS | 允许使用 SHOW FULL PROCESSLISTS | Process_priv | 
| FILE | 允许使用 SELECT...FROM TABLE_NAME INTO OUTFILE、LOAD DATA 等 | File_priv | 
| GRANT OPTION | 允许授予权限 | Grant_priv | 
| REFERENCES | 不支持 | References_priv | 
| INDEX | 允许使用 CREATE INDEX 和 DROP INDEX | Index_priv | 
| ALTER | 允许使用 ALTER TABLE | Alter_priv | 
| SHOW DATABASES | 显示所有数据库 | Show_db_priv | 
| SUPER | 允许使用 KILL 和 SET GLOBAL 语句 | Super_priv | 
| CREATE TEMPORARY TABLE | 允许使用 CREATE TEMPORARY TABLE | Create_tmp_table_priv | 
| Lock_tables_priv | ||
| EXECUTE | 允许用户运行已存储的子程序 | Execute_priv | 
| REPLICATION SLAVE | 不支持 | Repl_slave_priv | 
| unmask | 脱敏数据 | Unmask_priv | 
| CREATE VIEW | 允许使用 CREATE VIEW | Create_view_priv | 
| SHOW VIEW | 允许使用 SHOW CREATE VIEW | Show_view_priv | 
| CREATE ROUTINE | 创建已存储的子程序 | Create_routine_priv | 
| ALTER ROUTINE | 更改或取消已存储的子程序 | Alter_routine_priv | 
| CREATE USER | 允许使用 CREATE USER, DROP USER, RENAME USER 和 REVOKE ALL PRIVILEGES | Create_user_priv | 
| EVENT | 创建、修改、删除 EVENT 的权限 | Event_priv | 
| TRIGGER | 不支持 | Trigger_priv | 
| USAGE | 仅仅用于连接登录数据库,主要用来设置 with option 部分 | |
| ALL [PRIVILEGES] | 设置除 GRANT OPTION 之外的所有简单权限 | 
对象
支持库级和表级两类。
86或95兼容模式
*.* 所有对象
db.* 全库所有对象
db.object 库下面某个对象,可以是表,视图和存储过程的名字
gbase> grant select on *.* to abc;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
gbase> grant select on testdb.* to abc;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
gbase> grant select on testdb.abc to abc;
Query OK, 0 rows affected (Elapsed: 00:00:00.01)
在95多VC环境
- *.*.* 是所有vc的所有对象
 - vc1.*.* 是vc1集群下的所有对象
 - vc1.testdb.* 是vc1集群下testdb库下的所有对象
 - vc1.testdb.t1 是vc1集群下testdb库下的t1表
 
注意,多vc下必须用三段,虽然2段*.*写法也能用,但测试结果是没有权限访问
gbase> drop user user1;
Query OK, 0 rows affected (Elapsed: 00:00:00.02)
gbase> grant all on vc1.* to user1 identified by '1234';
Query OK, 0 rows affected (Elapsed: 00:00:00.01)
gbase> ^CAborted
[gbase@gbase_rh7_001 gcinstall]$ gccli -uuser1 -p1234 vc1.testdb
ERROR 1044 (42000): Access denied for user 'user1'@'%' to database 'testdb'
[gbase@gbase_rh7_001 gcinstall]$ gccli -uuser1 -p1234
GBase client 9.5.2.45.58675fc1. Copyright (c) 2004-2023, GBase.  All Rights Reserved.
gbase> use vc vc1;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
gbase> use testdb;
ERROR 1044 (42000): Access denied for user 'user1'@'%' to database 'testdb'
gbase> show grants;
+--------------------------------------------------------------------------------------------------------+
| Grants for user1@%                                                                                     |
+--------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.*.* TO 'user1'@'%' IDENTIFIED BY PASSWORD '*A4B6157319038724E3560894F7F932C8886EBFCF' |
| GRANT ALL PRIVILEGES ON "vc00001"."vc1".* TO 'user1'@'%'                                               |
+--------------------------------------------------------------------------------------------------------+
2 rows in set (Elapsed: 00:00:00.00)
gbase> ^CAborted
必须用三段方式
gbase> drop user user1;
Query OK, 0 rows affected (Elapsed: 00:00:00.04)
gbase> grant all on vc1.*.* to user1 identified by '1234';
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
gbase> ^CAborted
[gbase@gbase_rh7_001 gcinstall]$ gccli -uuser1 -p1234 vc1.testdb
GBase client 9.5.2.45.58675fc1. Copyright (c) 2004-2023, GBase.  All Rights Reserved.
gbase> ^CAborted
[gbase@gbase_rh7_001 gcinstall]$ gccli -uroot
GBase client 9.5.2.45.58675fc1. Copyright (c) 2004-2023, GBase.  All Rights Reserved.
gbase> grant all on *.*.* to user1 identified by '1234';
Query OK, 0 rows affected (Elapsed: 00:00:00.05)
gbase>
with_option
grant option
如果同时将grant权限也授权给用户,则可以用 grant option进行,比如
grant all on *.* to user2 with grant option;
这样当使用user2登录时,可以grant给别的用户授权了。
当然,可以单独追加这个授权,比如
gbase> grant grant option on *.* to user2;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
resource_option
一些资源限制,比如最大连接数等。
MAX_USER_CONNECTIONS
gbase> grant all on *.* to user3 identified by '111111' with MAX_USER_CONNECTIONS 10;
Query OK, 0 rows affected (Elapsed: 00:00:00.01)
gbase> select * from gbase.user where user='user3' \G
*************************** 1. row ***************************
                   Host: %
                   User: user3
               Password: *FD571203974BA9AFE270FE62151AE967ECA5E0AA
            Select_priv: Y
            Insert_priv: Y
            Update_priv: Y
            Delete_priv: Y
            Create_priv: Y
              Drop_priv: Y
            Reload_priv: Y
          Shutdown_priv: Y
           Process_priv: Y
              File_priv: Y
             Grant_priv: N
        References_priv: Y
             Index_priv: Y
             Alter_priv: Y
           Show_db_priv: Y
             Super_priv: Y
  Create_tmp_table_priv: Y
       Lock_tables_priv: Y
           Execute_priv: Y
        Repl_slave_priv: Y
            Unmask_priv: Y
       Create_view_priv: Y
         Show_view_priv: Y
    Create_routine_priv: Y
     Alter_routine_priv: Y
       Create_user_priv: Y
             Event_priv: Y
           Trigger_priv: Y
               ssl_type:
             ssl_cipher:
            x509_issuer:
           x509_subject:
          max_questions: 0
            max_updates: 0
        max_connections: 0
   max_user_connections: 10
               max_cpus: 0
           max_memories: 0
          max_tmp_space: 0
         resource_group: 0
          task_priority: 2
user_limit_storage_size:
      user_storage_size: 0
                    UID: 3
1 row in set (Elapsed: 00:00:00.00)
使用建议
权限和对象是2个维度,dba需要根据安全要求进行设置。
| 范围 | 用户 | 说明 | 语法 | 
| 整个数据库 | 1个 | 管理员权限 | grant all on *.* | 
| 1个库 | 1个 | 库管理元 | grant all on 库名.* | 
| 1个库 | 多个 | 按表授权 | grant all on 库名.表名 | 
| 1个库,1个表 | 多个用户 | 按权限,表细分 | grant X1,X2 on 库名.表名 | 
一个有多个用户,权限完全相同,不想每次都重复授权。可以用角色role。参考