在数据库管理中,用户权限是数据安全的核心组成部分,合理配置用户权限可以防止未经授权的访问和数据泄露。
1、用户(User)和角色(Role)管理
在金仓数据库中,USER 和 ROLE 概念上是相同的(类似于PostgreSQL),主要区别在于:
- 用户(USER):通常用于登录数据库(默认有LOGIN权限)。
- 角色(ROLE):主要用于权限分组,也可以被用户继承。
1.1 创建用户
CREATE USER 用户名 [ WITH ] option [ ... ] 例:CREATE USER username WITH PASSWORD 'password';
-- 或CREATE ROLE username WITH LOGIN PASSWORD 'password';
可选参数 | 解释 |
---|---|
SUPERUSER | 超级用户 |
CREATEDB | 允许创建数据库 |
CREATEROLE | 允许创建角色 |
LONGIN | 允许登录 |
PASSWORD | 指定密码 |
新用户的默认权限:创建新用户帐户时,默认此用户有连接(LOGIN)数据库的权限,用户帐户可以具有默认角色和表空间限制等限制
用户名的限制:创建指定用户名的用户时,请注意命名名称是否唯一等限制,而且用户名的长度不可以大于63字节。
用户密码:使用PASSWORD关键字为用户设置密码。
用户的默认角色:用户建立连接后即具有默认角色的所有权限。
1.2 修改用户
ALTER USER 用户名 [ WITH ] option [ ... ]例:ALTER USER username WITH PASSWORD 'new_password';
ALTER USER username WITH CREATEDB CREATEROLE;
ALTER USER username RENAME TO new_username;
可选参数 | 解释 |
---|---|
SUPERUSER | 超级用户 |
CREATEDB | 允许创建数据库 |
CREATEROLE | 允许创建角色 |
LONGIN | 允许登录 |
PASSWORD | 指定密码 |
一般情况下,系统管理员可以修改所有普通用户密码。普通用户可以修改自己的密码,但不能修改其他用户的密码,除非有CREATEROLE权限。 安全管理员(sso)和审计管理员(sao)的用户密码只能由自己修改。
2.3 删除用户
DROP USER [ IF EXISTS ] 用户名 [...] 例:DROP USER username;
-- 或
DROP ROLE IF EXISTS username;
删除一个数据库管理员角色,必须本身就是一个数据库管理员。
删除一个非数据库管理员角色,必须具有 CREATEROLE特权。
如果一个角色仍然被集簇中任何数据库中引用,它就不能被移除。如果尝试删除将会抛出一个错误,在删除该角色前,必须删除(或者重新授予所有权)它所拥有的所有对象并且收回该已经授予给该角色的在其他对象上的特权。
没有必要删除涉及该角色的角色成员关系。DROP ROLE 会自动收回目标角色在其他角色中的成员关系,以及其他角色在目标角色中的成员关系,其他角色不会被删除也不会被影响。
2、权限分类
金仓数据库的权限主要包括:
数据库权限 | CONNECT、CREATE |
---|---|
Schema权限 | USAGE、CREATE |
表/视图/序列权限 | SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、TRIGGER |
函数权限 | EXECUTE |
自定义权限 | - |
系统权限:
系统权限是执行特定操作的权限,不直接关联具体数据库对象,主要用于数据库管理和维护。 这些权限包括:CREATE DATABASE、CREATE USER、CREATE ROLE 的权限等 在KingbaseES数据库系统中有一系列的系统内置预定义特权,系统用这些特权去控制数据的安全。由于系统特权非常强大,创建用户是默认只拥有LOGIN权限。
只有两种类型的用户可以向其他用户授予系统权限或撤销这些权限:
1、被授予特定系统特权的用户 2、具有超级权限的用户
对象权限:
对象权限是对给定的用户授予在给定对象(例如表)上执行的操作集。这些操作可以指明为INSERT、SELECT 等,具体各类对象具有的权限类型可参见GRANT 和REVOKE 语句的说明。对象分为如下两类:
模式对象:可以理解为一个存储目录,包含视图、索引、数据类型、函数和操作符等。
非模式对象:其他的数据库对象,如数据库、表空间、用户、权限。
列级权限:
列级权限 是对给定的用户授予在给定表或视图上某些列执行操作集。 此动作只能为INSERT、UPDATE和REFERENCES。
3、权限管理SQL
3.1 授予权限:
系统特权不能进行转授,只有满足以下条件的用户可以向其他用户授予系统权限:
- 授予特定系统特权的用户
- 有超级权限的用户
系统特权可以在创建用户时授予,或使用ALTER语句授予。
对象权限每种类型的对象都有相关联的权限,用户可以使用 GRANT 语句向角色和用户授予对象权限,对象权限可以转授。
授权者必须满足下列条件之一:
- 是该对象的拥有者。
- 已被授予超级用户权限或者 any管理特权。
- 在之前被授予对象特权时,指定了WITH GRANT OPTION,拥有转授的权利。
-- 授权数据库访问
GRANT CONNECT ON DATABASE dbname TO username;-- 授权Schema访问
GRANT USAGE ON SCHEMA schemaname TO username;-- 授权表权限
GRANT SELECT, INSERT, UPDATE ON TABLE tablename TO username;-- 授权所有表的权限
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA schemaname TO username;-- 授权执行函数
GRANT EXECUTE ON FUNCTION function_name TO username;-- 授权角色给用户
GRANT role_name TO username;
注:
使用GRANT语句时,可以通过指定不同的关键字,实现不同的授权方式:
授予所有权限
ALL PRIVILEGES表示授予对象类型的所有可用特权。
授予所有角色
使用PUBLIC可以将权限授予所有角色,包括那些可能稍后会被创建的角色。可以将PUBLIC看作是一个隐式定义的组,始终包含所有角色。任何角色的权限都来源于三个途径:直接被授予的权限、从其所属的其他角色中继承的权限,以及从PUBLIC角色中获得的通用权限。
转授权限
当某个角色或用户被授权时指定了WITH ADMIN OPTION,该角色或用户就获得了转授权限的能力。这意味着他们不仅可以将所拥有的角色成员关系或特定权限授予其他用户或角色,也有权利撤回。如果角色或用户被授权时没有被指定WITH ADMIN OPTION管理选项,则不能做这些工作。
一个角色默认不拥有对自身的WITH ADMIN OPTION权限,但是在数据库会话中,如果会话用户匹配该角色,则该角色可以授予或撤回其自身的成员关系。
举例说明:如果角色 g1是表 t1的拥有者,并且u1是 g1的成员,则 u1可以把 t1上的特权授予给 u2。这些特权看起来就像是由 g1直接授予的,角色 g1的其他任何成员都可以稍后撤回它们。
列级授权
用户可以对表中的各个列授予 INSERT 、UPDATE 、REFERENCES 权限。
3.2 撤销权限:
使用 REVOKE 语句和 ALTER USER 语句可以执行特定的权限撤销操作。当用户撤销系统或对象权限时,请注意撤销权限的级联效应。
- 撤销系统特权
ALTER USER 语句可以撤销系统特权。
- 撤销对象特权
用户可以使用 REVOKE 语句撤销多个对象权限、代表对象所有者的对象权限、列选择性对象权限和 REFERENCES 对象权限。
- 撤销权限的连锁效应
与 DDL 操作相关的撤销对象特权没有级联效应,但对象特权撤销有级联效应。
--撤销建库权限ALTER USER test NOCREATEDB; -- 撤销用户 u1 和 u2 对 orders 表的 INSERT 和 UPDATE 权限:REVOKE INSERT,UPDATE ON orders FROM u1, u2;-- 撤销 u1 在 orders 表上的所有权限:REVOKE ALL PRIVILEGES ON orders FROM u1;-- 撤销用户 u1 表 orders 的 ORDERID 和 ORDERDATE 列插入权限:REVOKE INSERT (orderid,orderdate) ON orders FROM u1;
注:
使用REVOKE语句时,可以通过指定不同的关键字,实现不同的撤销权限方式:
撤销多个对象权限
REVOKE 语句支持撤销同一个对象的多个权限。
撤销对象的所有权限
通过指定ALL PRIVILEGES来撤销授予对象的所有可用权限。
撤销所有用户权限
通过REVOKE FROM PUBLIC可以撤销所有用户在某个对象上的权限。但通过PUBLIC撤销并意味着所有角色都会失去在该对象上的权限。那些直接被授权或者通过其他角色被授权的用户,仍将保留这些权限。同样,即使从一个用户撤销某项权限后,如果PUBLIC或者该用户所属其他成员关系角色仍有该权限,该用户还是可以使用该权限。
此外在撤销时如果指定了 GRANT OPTION FOR,只会撤销该权限的转授权限,权限本身不被撤销。否则,权限及其转授权限都会被撤销。
代表对象所有者撤销对象特权
用户只能撤销其直接授予的权限。若用户将某项权限授予其他用户并允许转授(WITH GRANT OPTION),则其他用户持有的该权限被称为依赖特权。当原始用户需要撤销其权限或转授选项时,若存在依赖权限,可以指定CASCADE选项以递归撤销这些依赖特权,否则会导致撤销失败。递归撤销只影响通过原始 REVOKE 命令主体用户链授予的特权。如果该权限经由其他用户授予给受影响用户,受影响用户可能实际上还保留有该权限。
举例1:假设用户A已将某项特权授予用户B并允许其转授,而用户B随后又将此特权授予用户C,则用户A无法直接从C收回该特权。但A可以从B撤销该特权的授予权并使用 CASCADE选项,从而依次从C撤销该特权。
举例2:如果A和B都给C授予了同一特权,A能够撤销自己给C授权,但不能撤销B给C的授权,因此C实际上仍将拥有该特权。
撤销列级权限
用户可以撤销对表中的各个列的 INSERT 、UPDATE 、REFERENCES 权限。
此外,当从一个表上撤销权限时,该表的列权限也会被撤销。但如果一个角色已经被授予表上的特权,那么从个别的列上撤销同一个特权将不会生效。
3.3 查看当前权限:
相关系统视图和字典
视图和字典 | 描述 |
---|---|
sys_user | 所有用户信息 |
sys_roles | 所有角色信息 |
DBA_TAB_PRIVS | 被授权者的所有对象的授权 |
SESSION_USER | 当前会话角色 |
CURRENT_USER | 当前角色 |
sys_sysprivilege | 所有拥有系统ANY权限的用户。 |
user_any_privs | 每个用户只可以查看自己的拥有的ANY权限。 |
-- 查看用户权限
SELECT * FROM pg_user;
-- 查看角色权限
SELECT * FROM pg_roles;
-- 查看表的访问权限
\dp tablename
3.4 角色继承与组管理:
-- 1. 创建角色(组)
CREATE ROLE readonly;
CREATE ROLE readwrite;-- 2. 授予组权限
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO readwrite;-- 3. 把用户加入组
GRANT readonly TO user1;
GRANT readwrite TO user2;