1、概述
数据库安全管理是指采取各种安全措施对数据库及其相关文件和数据进行保护。数据库 系统的重要指标之一是确保系统安全,以各种防范措施防止非授权使用数据库,主要通过数 据库管理系统进行实现。数据库系统中一般采用用户标识与鉴别、存取控制以及密码存储等 技术进行安全控制。
数据库安全的核心和关键是其数据安全。数据安全指以保护措施确保数据的完整性、保密性、可用性、可控性和可审查性。由于数据库存储着大量的重要信息和机密数据,而且在 数据库系统中大量数据集中存放,供多用户共享,因此,必须加强对数据库访问的控制和数据安全防护。
1.1体系架构
DM 的安全管理就是为保护存储在 DM 数据库中的各类敏感数据的机密性、完整性和可 用性提供必要的技术手段,防止对这些数据的非授权泄露、修改和破坏,并保证被授权用户能按其授权范围访问所需要的数据。
DM 作为安全数据库,提供了包括用户标识与鉴别、自主与强制访问控制、通信与存储加密、审计等丰富的安全功能,且各安全功能都可进行配置,满足各类型用户在安全管理方面不同层次的需求。
1.2功能简介
2、用户标识与鉴别
DM数据库采用三权分立或四权分立的安全机制,将系统中所有的权限按照类型进行划分,为每个管理员分配相应的权限,管理员之间的权限相互制约又相互协助,从而使整个系统具有较高的安全性和较强的灵活性。
可在创建DM数据库时通过建库参数PRIV_FLAG设置使用三权分立或四权分立。0表示三权分立,1表示四权分立。此参数仅在DM安全版本下提供,即仅DM安全版本提供四权分立,缺省采用三权分立。
2.1三权分立
2.1.1数据库管理员 DBA
每个数据库至少需要一个SYSDBA来管理,SYSDBA可能是一个团队,也可能是一个人。在不同的数据库系统中,数据库管理员的职责可能也会有比较大的区别,总体而言,数据库管理员的职责主要包括以下任务:
评估数据库服务器所需的软、硬件运行环境
安装和升级 DM 服务器
数据库结构设计
监控和优化数据库的性能
计划和实施备份与故障恢复
2.1.2数据库安全员SSO
有些应用对于安全性有着很高的要求,传统的由SYSDBA一人拥有所有权限并且承担所有职责的安全机制可能无法满足企业实际需要,此时数据库安全员和数据库审计员两类管理用户就显得异常重要,它们对于限制和监控数据库管理员的所有行为都起着至关重要的作用。
数据库安全员的主要职责是制定并应用安全策略,强化系统安全机制。数据库安全员SYSSSO是 DM 数据库初始化的时候就已经创建好的,可以以该用户登录到DM数据库来创建新的数据库安全员。
SYSSSO或者新的数据库安全员都可以制定自己的安全策略,在安全策略中定义安全级别、范围和组,然后基于定义的安全级别、范围和组来创建安全标记,并将安全标记分别应用到主体(用户)和客体(各种数据库对象,如表、索引等),以便启用强制访问控制功能。
数据库安全员不能对用户数据进行增、删、改、查,也不能执行普通的 DDL 操作如创建表、视图等。他们只负责制定安全机制,将合适的安全标记应用到主体和客体,通过这种方式可以有效的对SYSDBA的权限进行限制,SYSDBA 此后就不能直接访问添加有安全标记的数据,除非安全员给 SYSDBA 也设定了与之匹配的安全标记,SYSDBA 的权限受到了有效的约束。数据库安全员也可以创建和删除新的安全用户,向这些用户授予和回收安全相关的权限。
2.1.3数据库审计员 AUDITOR
传统的 SYSDBA 集所有权利于一身,可以很容易修改工资表,从而导致公司工资账务错乱。为了预防该问题,可以采用前面数据库安全员制定安全策略的方法,避免SYSDBA或者其他数据库用户具有访问该表的权限。为了能够及时找到SYSDBA或者其他用户的非法操作,在DM数据库中还可以在系统建设初期,由数据库审计员(SYSAUDITOR 或者其他由 SYSAUDITOR 创建的审计员)来设置审计策略(包括审计对象和操作),在需要时,数据库审计员可以查看审计记录,及时分析并查找出幕后真凶。在 DM 数据库中,审计员的主要职责就是创建和删除数据库审计员,设置/取消对数据库对象和操作的审计设置,查看和分析审计记录等。
2.2四权分立
四权分立就是在三权分立的基础上增加了:数据库对象操作员DBO。DBO可以创建数据库对象,并对自己拥有的数据库对象(表、视图、存储过程、序列、包、外部链接等)具有所有的对象权限并可以授出与回收,但其无法管理与维护数据库对象。
2.3创建用户
可通过manager图形界面创建用户,根据实际需求选择不同的选项。
2.3.1资源配置
以登录失败次数为例,默认值为3。
[dmdba@lei2 ~]$ disql lei/123
[-2501]:用户名或密码错误.
disql V8
用户名:
密码:
[-2501]:用户名或密码错误.
用户名:
密码:
[-2501]:用户名或密码错误.
在 3 次尝试之后无法连接到服务器, 退出 DISQL
[dmdba@lei2 ~]$
[dmdba@lei2 ~]$ disql lei/123
[-2501]:用户名或密码错误.
disql V8
用户名:
密码:
[-2501]:用户名或密码错误.
用户名:
密码:
[-2501]:用户名或密码错误.
在 3 次尝试之后无法连接到服务器, 退出 DISQL
[dmdba@lei2 ~]$ disql lei/123
[-2501]:用户名或密码错误.
disql V8
用户名:
密码:
[-2501]:用户名或密码错误.
用户名:
密码:
[-2501]:用户名或密码错误.
在 3 次尝试之后无法连接到服务器, 退出 DISQL
[dmdba@lei2 ~]$ disql lei/123
[-2508]:登录失败次数超过限制.
disql V8
用户名:
密码:
[-2501]:用户名或密码错误.
用户名:
密码:[-2501]:用户名或密码错误.
在 3 次尝试之后无法连接到服务器, 退出 DISQL
[dmdba@lei2 ~]$
[dmdba@lei2 ~]$
[dmdba@lei2 ~]$ disql lei/leileilei
[-2508]:登录失败次数超过限制.
disql V8
用户名:SQL> select USERNAME,LOCK_DATE,ACCOUNT_STATUS from dba_users where username='LEI';行号 USERNAME LOCK_DATE ACCOUNT_STATUS
---------- -------- ------------------- --------------
1 LEI 2024-09-09 19:58:20 LOCKED已用时间: 25.221(毫秒). 执行号:3002.
3、自主访问控制
由数据库对象的拥有者自主决定是否将自己拥有的对象的部分或全部访问权限授予其他用户。也就是说,在自主访问控制下,用户可以按照自己的意愿,有选择地与其他用户共享他拥有的数据库对象。
3.1创建lei.t1表
[dmdba@lei2 ~]$ disql lei/leileilei服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 5.085(ms)
disql V8
SQL> create table t1(id int);
操作已执行
已用时间: 4.868(毫秒). 执行号:4001.
SQL> insert into t1 values(1);
影响行数 1已用时间: 0.936(毫秒). 执行号:4002.
SQL> commit;
操作已执行
已用时间: 0.741(毫秒). 执行号:4003.
[dmdba@lei2 ~]$ disql lei/leileilei服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 5.085(ms)
disql V8
SQL> create table t1(id int);
操作已执行
已用时间: 4.868(毫秒). 执行号:4001.
SQL> insert into t1 values(1);
影响行数 1已用时间: 0.936(毫秒). 执行号:4002.
SQL> commit;
操作已执行
已用时间: 0.741(毫秒). 执行号:4003.
3.2创建ray用户并赋create session权限
SQL> conn sysdba/leileilei服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.636(ms)
SQL> create user ray identified by rayrayray;
操作已执行
已用时间: 6.097(毫秒). 执行号:4201.
SQL> grant create session to ray;
操作已执行
已用时间: 1.482(毫秒). 执行号:4202.
3.3ray用户访问lei.t1表
SQL> conn ray/rayrayray 服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.398(ms)
SQL> select * from lei.t1;
select * from lei.t1;
[-5504]:没有[LEI.T1]对象的查询权限.
已用时间: 0.653(毫秒). 执行号:0.
3.4自主访问控制
SQL> conn lei/leileilei服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 5.038(ms)
SQL> grant select on t1 to ray;
操作已执行
已用时间: 3.767(毫秒). 执行号:4601.
SQL> conn ray/rayrayray服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 5.324(ms)
SQL> select * from lei.t1;行号 ID
---------- -----------
1 1已用时间: 1.001(毫秒). 执行号:4801.
3.5限制DBA的ANY权限
缺省情况下,DBA 角色拥有许多的“ANY”权限,如 DROP ANY TABLE、INSERT ANY TABLE 等等。DM 提供了一种限制 DBA 的“ANY”权限的方法:在非 DM 安全版本中,只有 SYSDBA 用户才能限制 DBA 的“ANY”权限;在 DM 安全版本中,只有具有 DB_POLICY_ADMIN 角色的用户才能限制 DBA 的“ANY”权限。通过执行系统过程SP_RESTRICT_DBA(1/0)来实现,1表示限制ANY权限,0表示不限制。系统过程执行完成后需要重启服务器该限制才能生效。
3.5.1创建用户并赋予DBA权限
SQL> create user lei identified by leileilei;
操作已执行
已用时间: 2.665(毫秒). 执行号:5003.
SQL> grant dba to lei;
操作已执行
已用时间: 1.665(毫秒). 执行号:5004.
3.5.2DBA用户访问其他用户表
SQL> select count(*) from dmhr.city;行号 COUNT(*)
---------- --------------------
1 11已用时间: 22.882(毫秒). 执行号:5201.
3.5.3限制ANY权限并重启数据库
SQL> conn sysdba/leileilei服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 15.756(ms)SQL> SP_RESTRICT_DBA(1);
DMSQL 过程已成功完成
已用时间: 9.971(毫秒). 执行号:6101.
SQL> exit
[dmdba@lei2 ~]$ DmServicelei restart
Stopping DmServicelei: [ OK ]
Starting DmServicelei: [ OK ]
3.5.4验证DBA用户ANY权限受限
[dmdba@lei2 ~]$ disql lei/leileilei服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.507(ms)
disql V8
SQL> select count(*) from dmhr.city;
select count(*) from dmhr.city;
[-5504]:没有[DMHR.CITY]对象的查询权限.
已用时间: 1.319(毫秒). 执行号:0.
4、强访问控制
强制访问控制(Mandatory Access Control, MAC)是根据客体的敏感标记和主体的访问标记对客体访问实行限制的一种方法。在强制访问控制中,系统给主体和客体都分配一个特殊的安全标记,主体的安全标记反映了该主体可信的程度,客体的安全标记则与其包含信息的敏感度一致,且主体不能改变他自己及任何其它客体的安全标记,主体是否可以对客体执行特定的操作取决于主体和客体的安全标记之间的支配关系。因此,强制访问控制可以控制系统中信息流动的轨迹,能有效地抵抗特洛伊木马的攻击,这在一些对安全要求很高的数据库应用中是非常必要的。
DM 利用策略和标记来实现 DM 数据库的强制访问控制。执行强制访问控制的用户必须具有 LABEL DATABASE 数据库权限,在新初始化的数据库中,只有 SYSSSO 具有这个权限。
强制访问控制功能仅在 DM 安全版中提供。只有初始化库时指定 ENABLE_MAC=1 或启动 DMSERVER 时指定过 ENABLE_MAC 参数的情况下才支持强制访问控制。DM 共享存储集群 DMDSC、DM 数据守护和读写分离集群都支持强制访问控制,但 DM 大规模并行处理集群 MPP 暂不支持强制访问控制。
4.1策略
一组预定义的标记组件,包括等级、范围和组。只有具有 LABEL_DATABASE 数据库权限的用户才能执行创建修改删除操作
1.创建策略
MAC_CREATE_POLICY(
POLICY_NAME VARCHAR(128)
)
POLICY_NAME 新创建的策略名称。
2.修改策略
MAC_ALTER_POLICY(
POLICY_NAME VARCHAR(128),
NEW_NAME VARCHAR(128)
)
POLICY_NAME 待修改的策略名称
NEW_NAME 策略新名称
3.删除策略
MAC_DROP_POLICY(
POLICY_NAME VARCHAR(128),
DROP_COLUMN INT
)
POLICY_NAME 待删除的策略名称
DROP_COLUMN 对应用此策略的表的标记列的处理方式,取值为 0(默认) 或 1
0:不删除应用此策略的所有表对应的标记列
1:删除应用此策略的所有表对应的标记列
4.2等级
线性有序的名称序列, 用 L=(l1,l2,…,lp)表示. 任意两个名称 li、lj 之间,若 i≤j,则 li≤lj,于是有 l1≤l2≤…≤lp, 其中 l1,l2,…,lp 称为等级分类。一个策略最大可定义 10000 个等级。用户在定义策略中的等级时,需要为 其指定编号,其编号在0-9999之间(编号小的意味着级别较低)。
1.为策略添加等级
MAC_CREATE_LEVEL(
POLICY_NAME VARCHAR(128),
LEVEL_NUM INT,
LEVEL_NAME VARCHAR(128)
)
POLICY_NAME 要添加等级的策略名
LEVEL_NUM 创建的等级编号,在 0-9999 之间的整数
LEVEL_NAME 创建的等级名称,不能包含“:”和“,”
统一个策略中,等级ID和等级名称唯一,每个等级都有一个等级ID,ID越小安全等级越低
2.修改等级
MAC_ALTER_LEVEL(
POLICY_NAME VARCHAR(128),
LEVEL_NAME VARCHAR(128),
NEW_NAME VARCHAR(128)
);
POLICY_NAME 要修改等级名的策略名
LEVEL_NAME 待修改的等级名称
NEW_NAME 要修改成的等级名称
3.删除等级
MAC_DROP_LEVEL(
POLICY_NAME VARCHAR(128),
LEVEL_NAME VARCHAR(128)
)
POLICY_NAME 待删除等级所在策略名
LEVEL_NAME 待删除的等级名称
4.3范围
是集合类型,设集合 C={c1,c2,…,cm}中每一元素都是一名称,c1,c2,…, cm 间彼此独立,无序,则集合 C 及其任意子集称为非等级类别集合,其中 c1,c2,…, cm 称为非等级类别。在 DM 中,最大可定义 10000 个范围,需要用户设置编号,且编号在一个策略里面须是唯一的,编号之间没有级别高低之分。
1.添加范围
MAC_CREATE_COMPARTMENT(
POLICY_NAME VARCHAR(128),
COMPART_NUM INT,
COMPART_NAME VARCHAR(128)
)
POLICY_NAME 要添加范围的策略名
COMPART_NUM 创建的范围编号,在 0-9999 之间的整数
COMPART_NAME 创建的范围名称
同一个策略中,范围 ID 和范围名称唯一,范围独立无序,范围之间是平等关系,没有等级高低之分,范围之间的比较运算采用集合间的包含关系
2.修改范围
MAC_ALTER_COMPARTMENT(
POLICY_NAME VARCHAR(128),
COMPART_NAME VARCHAR(128),
NEW_NAME VARCHAR(128)
)
POLICY_NAME 要修改范围名的策略名
COMPART_NAME 待修改的范围名称
NEW_NAME 要修改成的范围名称
3.删除范围
MAC_DROP_COMPARTMENT(
POLICY_NAME VARCHAR(128),
COMPART_NAME VARCHAR(128)
);
POLICY_NAME 待删除范围所在策略名
COMPART_NAME 待删除的范围名称
4.4组
树形结构,有父子之分,用来描述组织结构。设树 G={g1,g2,…,gm},其中每一元素都是一名称,g1,g2,…,gm 间有父子之 分,则 g1,g2,…,gm 称为组。在 DM 中,最多能定义 10000 个组,也就是说组织结构的层次最多为 10000。组中只 能有一个根组,除根组外,每个组有且仅有一个父组。
为策略添加组
1.添加组
MAC_CREATE_GROUP( POLICY_NAME
VARCHAR(128), GROUP_NUM INT,
GROUP_NAME VARCHAR(128),
PARENT_NAME VARCHAR(128)
)
POLICY_NAME 要添加组的策略名
GROUP_NUM 创建的组编号,在 0-9999 之间的整数
GROUP_NAME 创建的组名称 PARENT_NAME 新创建组的父组的名称
同一个策略中,组 ID 和组名称唯一,同一个策略中,只能有一个根组,如果 PARENT_NAME 为 NULL,则创建组,组之间的比较运算采用树形结构间的从属关系
2.修改组
MAC_ALTER_GROUP(
POLICY_NAME VARCHAR(128),
GROUP_NAME VARCHAR(128),
NEW_NAME VARCHAR(128)
)
POLICY_NAME 要修改组名的策略名
GROUP_NAME 待修改的组名称
NEW_NAME 要修改成的组名称
更新父组
MAC_ALTER_GROUP_PARENT(
POLICY_NAME VARCHAR(128),
GROUP_NAME VARCHAR(128),
PARENT_NAME VARCHAR(128)
)
POLICY_NAME 要更新父组的组所在的策略名
GROUP_NAME 待更新父组的组名称
PARENT_NAME 待修改成的父组名称
待修改组和待修改成的父组必须存在;父组不能是自身,同时不能是自己的子节点
3.删除组
MAC_DROP_GROUP (
POLICY_NAME VARCHAR(128),
GROUP_NAME VARCHAR(128),
)
POLICY_NAME 待删除组所在策略名
GROUP_NAME 待删除的组名称
待删除的组不能有子节点存在,否则删除失败
5、审计
达梦数据库非安全版除了数据库管理员SYSDBA之外,还设有数据库审计员SYSAUDITOR,数据库审计员可以设置要审计的对象和操作、定义新的数据库审计员、查看和分析审计记录,通过设置审计,几乎可以跟踪任何人在系统内执行的任何操作,为事后追查提供便利。
5.1开启审计
使用sysauditor用户进入数据库。
SP_SET_ENABLE_AUDIT (1);
5.2设置审计
日志开启之后,要为需要进行审计的用户设置审计。
5.3查看审计记录
通过analyzer工具查看审计记录。
[dmdba@lei2 ~]$ export DISPLAY=192.168.0.200:0.0
[dmdba@lei2 ~]$ analyzer
[dmdba@lei2 ~]$ disql lei/leileilei服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.772(ms)
disql V8
SQL> select * from t1;行号 ID
---------- -----------
1 0
2 1已用时间: 0.787(毫秒). 执行号:2401.
SQL> delete from t1 where id=0;
影响行数 1已用时间: 5.537(毫秒). 执行号:2402.
SQL> commit;
操作已执行
已用时间: 0.731(毫秒). 执行号:2403.
SQL> select * from t1;行号 ID
---------- -----------
1 1已用时间: 0.334(毫秒). 执行号:2404.
也可通过V$AUDITRECORDS查看审计记录
更多内容请参考:https://eco.dameng.com