南大通用GBase 8a对用户权限的控制方法,grant的使用

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 8a限制数据库单个用户的最大连接数

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。参考