一、权限介绍
KingbaseES数据库中的权限控制主要分为两个层次:实例级别和数据库级别。实例级别的权限由sys_hba.conf文件控制,而数据库级别的权限则由数据库内部的权限系统控制。对于数据库以及实例的权限控制,这两者权限控制可以理解为粗粒度,细粒度。
实例级别权限:这主要通过sys_hba.conf文件进行配置,用于控制哪些用户可以连接到KingbaseES实例,以及他们可以使用哪种认证方式。sys_hba.conf文件中的每一行都定义了一个访问控制规则,用于匹配特定的连接请求。
数据库级别权限:这是数据库内部的权限系统,用于控制用户可以在数据库中执行哪些操作。例如,可以授予或撤销用户对表的SELECT、INSERT、UPDATE和DELETE权限,对数据库连接权限同理。
二、原理
要禁止某用户连接到目标数据库,我们需要在实例级别或数据库级别进行相应的配置。在实例级别,我们使用sys_hba.conf文件来拒绝该用户的连接请求。在数据库级别,我们可以撤销该用户对目标数据库的所有权限,以确保即使该用户能够连接到KingbaseES实例,也无法访问目标数据库。
三、实现方式
修改sys_hba.conf文件
data目录下找到KingbaseES的sys_hba.conf配置文件,在文件中添加或修改一行,指定该用户无法连接到目标数据库。例如,要禁止用户username从任何地址连接到数据库dbname,可以添加以下行:
host dbname username 0.0.0.0/0 reject
这表示对于来自任何IP地址(0.0.0.0/0)的、尝试连接到数据库dbname的、用户名为username的连接请求,都将被拒绝。
重启KingbaseES数据库服务生效。
撤销数据库级别权限
我们还可以在数据库级别撤销该用户的所有权限。这可以通过SQL命令来完成。首先,使用具有足够权限的用户(如超级用户)登录到KingbaseES数据库,然后执行以下命令:
REVOKE ALL PRIVILEGES ON DATABASE dbname FROM username;
REVOKE all ON DATABASE kingbase FROM public;
这将撤销用户username对数据库dbname的所有权限。即使该用户能够连接到KingbaseES实例,也无法访问数据库dbname。
注意,除了回收某用户对某数据库的所有权限,还需要回收public用户权限。否则,该用户还是可以登录目标数据库。
当然,除了回收all所有权限,我们只需要回收connect权限即可限制用户连接目标数据库。
如下测试:
kingbase=> \c kingbase system
You are now connected to database "kingbase" as userName "system".
kingbase=# REVOKE all ON DATABASE kingbase FROM public;
REVOKE
kingbase=# \c kingbase user1;
FATAL: permission denied for database "kingbase"
DETAIL: User does not have CONNECT privilege.
Previous connection kept
kingbase=# \c kingbase system
You are now connected to database "kingbase" as userName "system".
kingbase=# grant connect ON DATABASE kingbase to public;
GRANT
kingbase=# \c kingbase user1
You are now connected to database "kingbase" as userName "user1".
kingbase=> \c kingbase system
You are now connected to database "kingbase" as userName "system".
kingbase=# revoke connect ON DATABASE kingbase from public;
REVOKE
kingbase=# \c kingbase user1
FATAL: permission denied for database "kingbase"
DETAIL: User does not have CONNECT privilege.
Previous connection kept
四、注意事项
在修改配置文件或执行SQL命令之前,请务必备份相关文件或数据库存在物理备份集。
在撤销用户权限时,请确保不会影响到其他用户的正常操作。如果可能的话,最好先在测试环境中验证变更方案。