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