达梦数据库角色与权限最佳实践

达梦数据库作为国产数据库的领军产品,其安全机制和权限管理体系达到了B1级安全标准,采用"三权分立"或"四权分立"的安全模型,通过精细化的权限划分和严格的访问控制,将系统权限分散,避免权力过度集中,确保数据库系统的安全性和合规性。

“三权分立”安全机制

达梦数据库采用了一种重要的安全设计——“三权分立”(安全版本还有“四权分立”),将数据库管理权限划分为系统管理员、安全管理员和审计管理员三个相互独立又相互制约的角色。这种设计符合国家信息安全等级保护要求,特别适用于政府、金融等对数据安全要求严格的场景。

  • SYSDBA (数据库管理员):负责数据库的创建、备份、还原、性能优化等日常运维工作

  • SYSSSO (数据库安全员):负责制定安全策略、管理用户和权限(在非三权分立模式下SYSDBA也负责)、进行强制访问控制等

  • SYSAUDITOR (数据库审计员):负责设置审计规则、查看和分析审计记录,监督所有操作

“四权分立“扩展

在安全版DM8中,可扩展为四权分立,新增数据库对象操作员(SYSDBO)角色,进一步分离对象管理权限 。四权分立下各角色权限变化:

  • SYSDBA 权限缩减:仅保留数据库创建、备份、还原等核心管理权限,去除数据操作权限。

  • SYSSSO 新增:负责数据库对象(表、视图等)的创建与管理,但无数据库维护权限。

  • SYSSSO与SYSAUDITOR :权限范围与三权分立保持一致。

达梦数据库角色与权限最佳实践

角色与权限管理体系

角色(Role)是将具有相同权限的用户组织在一起的权限集合。达梦通过角色实现权限的批量管理和分配,主要优势包括:

  • SYSDBA 权限聚合:将多个权限打包为一个角色。

  • 用户分组:相同职能的用户分配相同角色。

  • 动态生效:角色可临时启用/禁用。

这很像给用户分配不同的“职务”和“工作证”。下面这个表格汇总了核心的内置角色,可以快速了解其权限分工。

角色名核心权限/定位主要应用场景与说明
DBA系统管理员角色,拥有除审计和强制访问控制之外的几乎所有权限数据库的超级管理员,负责全面的管理和维护工作
RESOURCE拥有 CREATE TABLECREATE VIEW 等创建数据库对象的权限适用于开发人员或需要创建数据库对象的普通用户
PUBLIC所有用户自动拥有的公共角色,其具体权限取决于管理员授予了PUBLIC角色哪些权限谨慎授权,因为对其授予的权限会对所有用户生效
SOI具有查询系统表(SYS开头的表)的权限用于需要查询数据字典等系统底层信息的场景。
VTI具有查询动态视图(V$开头的视图)的权限用于数据库性能监控和运行状态诊断。
SYSAUDITOR系统审计员角色,负责审计相关功能在"三权分立"或"四权分立"的安全机制下,负责审计工作
SYSSSO系统安全员角色,负责制定安全策略、进行强制访问控制等在安全版本中存在,负责系统安全。

详见达梦数据库预设角色权限列表:

达梦数据库采用 权限 - 角色 - 用户 三级授权模型,权限验证流程如下:

权限检查顺序:

  1. 直接授予用户的权限

  2. 用户所属角色的权限(需角色处于启用状态)

  3. PUBLIC角色的公共权限

权限冲突解决:

  • 显式拒绝优先于允许

  • 更细粒度的权限设置优先

角色与权限管理实战

了解角色后,关键在于如何将它们赋予用户。这主要通过 GRANT 和 REVOKE 语句实现。

授予角色与权限

  • 将角色授予用户

GRANT RESOURCE TO user_developer;

如果需要该用户能将此角色转授他人,可以加上 WITH ADMIN OPTION

GRANT RESOURCE TO user_developer WITH ADMIN OPTION;
  • 直接授予系统权限

如果角色权限不完全匹配需求,可以直接授予精确的系统权限。

GRANT CREATE TABLE, CREATE VIEW TO user_developer;
  • 授予对象权限

对于某个特定表(例如 dmhr.employee)的增删改查权限,需要单独授予。

GRANT SELECT, INSERT, UPDATE, DELETE ON dmhr.employee TO user_developer;

同样,可以使用 WITH GRANT OPTION 允许该用户转授此对象权限

回收权限

当需要撤销权限时,使用 REVOKE 语句。

  • 回收角色

REVOKE RESOURCE FROM user_developer;
  • 回收系统权限

REVOKE CREATE VIEW FROM user_developer;
  • 回收对象权限

回收对象权限时,如果当初授权时使用了 WITH GRANT OPTION,回收时通常需要加上 CASCADE 关键字进行级联回收

REVOKE SELECT ON dmhr.employee FROM user_developer CASCADE;

角色管理示例

1、角色创建与授权

-- 创建语法:
CREATE ROLE role_name [WITH IDENTIFIED BY password];

-- 授权示例:

-- 创建角色
CREATE ROLE finance_role;

-- 为角色授权
GRANT SELECT ON finance.accounts TO finance_role;
GRANT INSERT, UPDATE ON finance.transactions TO finance_role;
GRANT CREATE VIEW TO finance_role;

-- 将角色授予用户
GRANT finance_role TO fin_user1, fin_user2;

2、角色启动与禁用

达梦支持动态启用/禁用角色,实现权限的临时调整:

-- 禁用角色(即时生效)
SP_SET_ROLE('finance_role', 0);

-- 启用角色
SP_SET_ROLE('finance_role', 1);

-- 验证角色状态
SELECT * FROM SESSION_ROLES;

3、角色与权限冲突解决

当用户权限来源多样时,达梦按以下规则处理冲突:

  • 显式拒绝优先:明确的REVOKE优先于GRANT

  • 直接权限优先:直接授予用户的权限优先于角色权限

  • 角色启用状态:仅启用状态的角色权限有效

冲突解决示例:

-- 场景设置
GRANT SELECT ON sales.orders TO user1;
GRANT sales_role TO user1; -- 该角色有REVOKE SELECT ON sales.orders

-- 权限检查结果:user1无SELECT权限(角色中的REVOKE优先)

4、查看角色和权限

-- 查看角色 --

-- 查看角色权限
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE='RESOURCE';
-- 查看用户拥有的角色
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE='TEST_USER';


-- 查看权限 --

-- 查看用户拥有的系统权限
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'USER_NAME';
-- 查看用户拥有的角色
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'USER_NAME';
-- 查看用户拥有的对象权限
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'USER_NAME';
-- 查看当前用户拥有的权限信息
SELECT * FROM SESSION_PRIVS;

权限分层模型

企业级应用建议采用三层权限模型:

  • 基础权限层:通过预定义角色分配基本权限

  • 业务权限层:按业务功能创建自定义角色

  • 特殊权限层:直接为用户分配特定权限

达梦数据库角色与权限最佳实践

最佳实践建议

  • 最小权限原则:只授予用户完成其任务所必需的最小权限。

  • 使用角色:尽量将权限打包成角色,然后赋予用户,而非直接授予用户权限。

  • 定期审计:定期检查角色和用户的权限分配情况,及时清理不必要的权限。

  • 流程指挥:敏感操作,关键权限需流程审批。

在实际应用中注意项:

  • 权限规划先行:设计阶段明确权限分层模型。

  • 持续审计监控:建立权限变更审计机制。

  • 安全增强配置:结合国密算法等安全特性。

  • 定期合规检查:确保符合等保要求。


参考:

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/6541.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注