安全管理是数据库日常运维中的基础能力。对 DM 数据库来说,安全管理至少要回答四个问题:用户如何创建和认证,权限如何授予和回收,角色如何简化授权,审计如何记录关键操作。
本文围绕用户、授权、角色、审计四条主线展开,并结合常用 SQL 与验证结果说明每个机制在实际操作中的作用。
一、DM 安全管理的整体认识
数据库安全管理要解决两个问题:谁可以登录,以及登录之后能做什么。DM 在这两层上分别提供用户标识与鉴别、访问控制、角色、审计等机制。
用户标识与鉴别负责确认登录者能否对应到某个数据库用户;访问控制负责限制用户对数据库对象的操作范围;审计则用于记录用户行为,给事后追踪和责任定位提供依据。
来源: 《DM8 安全管理》1.2 DM 安全管理、2 用户标识与鉴别、5 审计。
从使用和管理角度看,可以先按下面四条线理解:
| 模块 | 解决的问题 | 常用对象或命令 |
|---|---|---|
| 用户管理 | 账号、认证、锁定、资源限制 | CREATE USER、ALTER USER、DBA_USERS |
| 授权管理 | 用户能执行哪些操作 | GRANT、REVOKE |
| 角色管理 | 批量管理一组权限 | CREATE ROLE、SP_SET_ROLE |
| 审计管理 | 记录和分析关键操作 | SP_SET_ENABLE_AUDIT、SP_AUDIT_STMT、SP_AUDIT_OBJECT、dmaudtool |
二、管理 DM 数据库用户
1. 预定义管理用户
DM 数据库安装后会预设若干管理用户。安全机制不同,管理员职责划分也不同。
三权分立下主要有:
SYSDBA:数据库管理员,负责数据库建设、维护、备份恢复、性能管理等。SYSSSO:数据库安全员,负责安全策略和强制访问控制相关管理。SYSAUDITOR:数据库审计员,负责设置审计策略、查看和分析审计记录。
四权分立在三权分立基础上增加 SYSDBO,即数据库对象操作员。四权分立下,SYSDBA 更偏向系统管理与维护,数据对象的创建和数据操作职责会进一步拆给 SYSDBO。
来源: 《DM8 安全管理》2.1 DM 的管理用户。
审计员预定义用户名为 SYSAUDITOR,安全管理相关脚本中应保持名称一致。
2. 创建、修改、锁定用户
以下示例创建普通用户 testuser001。创建用户和修改密码使用 CREATE USER、ALTER USER:
sql
CREATE USER testuser001 IDENTIFIED BY Welcome_1;
ALTER USER testuser001 IDENTIFIED BY Welcome_2;
创建完成后,可以使用 disql 验证登录。新用户虽然能登录,但如果没有建表权限,直接创建表会报权限不足:
bash
disql testuser001/Welcome_2
sql
SELECT USER();
CREATE TABLE test1(
tid NUMBER,
tname VARCHAR2(20)
);

用户锁定和解锁使用 ALTER USER:
sql
ALTER USER testuser001 ACCOUNT LOCK;
ALTER USER testuser001 ACCOUNT UNLOCK;

用户状态可以从数据字典视图中查询,例如查看用户名、账号状态和概要文件:
sql
SELECT USERNAME, ACCOUNT_STATUS, PROFILE
FROM DBA_USERS
WHERE USERNAME = 'TESTUSER001';

3. 用户身份验证方式
DM 支持多种用户身份验证方式。下面重点说明基于操作系统的本机验证。
官方手册中列出的认证方式包括:
- 数据库身份验证:通过数据库用户口令登录,是最常用的方式。
- 基于操作系统的身份验证:本机验证或远程验证。
LDAP身份验证。SSL双因子身份验证。KERBEROS身份验证。UKEY身份验证。RADIUS身份验证。
来源: 《DM8 安全管理》2.3 用户身份验证模式。
本机操作系统认证的关键点是:数据库参数 ENABLE_LOCAL_OSAUTH 必须开启,操作系统用户还要加入对应用户组。普通同名用户使用 dmusers 组;若要映射为管理员身份,则使用 dmdba、dmsso、dmauditor 等组。
配置步骤如下。
先确认当前操作系统用户:
bash
whoami
再创建用户组并把 dmdba 加入 dmusers:
bash
su -
groupadd dmusers
usermod -G dmusers dmdba
groups dmdba

然后在数据库中创建同名用户,并开启本机操作系统认证参数:
sql
CREATE USER dmdba IDENTIFIED BY Welcome_1;
SP_SET_PARA_VALUE(2, 'ENABLE_LOCAL_OSAUTH', 1);
COMMIT;
SP_SET_PARA_VALUE 的第一个参数表示修改范围:
0:只修改当前数据库实例内存。1:同时修改实例内存和配置文件。2:只修改配置文件。
ENABLE_LOCAL_OSAUTH 是静态参数,修改配置文件后需要重启实例才能生效:
bash
bin/DmServiceDMSERVER restart
重启后使用操作系统认证登录:
bash
disql /@localhost:5236 AS USERS

验证结果中显示的数据库用户为 DMDBA。该流程的关键不在用户名本身,而在"操作系统用户组 + 数据库同名用户 + 静态参数重启"这条链路。
4. PROFILE 与资源限制
PROFILE 可以理解为用户资源和口令策略的集中配置。用户关联到某个 PROFILE 后,登录失败次数、锁定时间、口令有效期、口令重用规则、会话资源等限制可以统一管理。
来源: 《DM8 安全管理》9 资源限制。
下面示例限制用户密码错误次数:连续失败 3 次后锁定用户。
sql
CREATE PROFILE profile1 LIMIT FAILED_LOGIN_ATTEMPTS 3;
CREATE USER testuser002 IDENTIFIED BY Welcome_1 PROFILE profile1;
当连续使用错误密码登录时,前几次会提示用户名或密码错误,超过限制后会提示登录失败次数超过限制:

官方手册里资源限制有两种管理方式:
- 用户关联到已有
PROFILE,资源限制由PROFILE统一管理。 - 用户未关联
PROFILE,直接通过LIMIT <资源设置>管理。
常见资源限制项包括:
FAILED_LOGIN_ATTEMPTS:连续登录失败多少次后锁定。PASSWORD_LOCK_TIME:用户被锁定的时间。PASSWORD_LIFE_TIME:口令有效期。PASSWORD_REUSE_TIME、PASSWORD_REUSE_MAX:控制旧口令何时可重用。SESSION_PER_USER、CONNECT_TIME、CONNECT_IDLE_TIME:控制会话数量和连接时间。
三、管理用户授权
1. 数据库权限与对象权限
DM 的权限主要分为数据库权限和对象权限。
数据库权限偏向"能不能做某类数据库级操作",例如创建表、创建用户、修改数据库、查询系统视图等。对象权限偏向"能不能操作某个具体对象中的数据",例如查询 SCOTT.EMP、向某张表插入数据、执行某个存储过程。
来源: 《DM8 安全管理》3.1 权限管理。
可以这样区分:
| 权限类型 | 作用范围 | 示例 |
|---|---|---|
| 数据库权限 | 某类数据库操作 | CREATE TABLE、CREATE USER、ALTER DATABASE |
| 对象权限 | 某个对象或对象列 | SELECT ON SCOTT.EMP、INSERT ON T1、EXECUTE ON PROCEDURE P1 |
例如,普通用户没有 CREATE TABLE 权限时,创建表会失败;没有 SCOTT.EMP 的 SELECT 对象权限时,查询也会失败。

2. 使用 GRANT 授权
给用户授予建表权限和查询 SCOTT.EMP 的权限:
sql
GRANT CREATE TABLE TO testuser001;
GRANT SELECT ON SCOTT.EMP TO testuser001;
授权后再登录 testuser001,即可创建表、插入数据并查询:
sql
CREATE TABLE testtable1(
tid NUMBER,
tname VARCHAR2(10)
);
INSERT INTO testtable1 VALUES(1, 'Tom');
SELECT * FROM testtable1;

3. 使用 REVOKE 回收权限
权限回收使用 REVOKE:
sql
REVOKE SELECT ON SCOTT.EMP FROM testuser001;
REVOKE CREATE TABLE FROM testuser001;
如果回收的是对象权限,并且该权限曾经被继续转授,需要关注 RESTRICT 与 CASCADE。官方手册说明:对象权限回收时,如果使用 CASCADE,可回收带或不带 WITH GRANT OPTION 的权限;若被回收权限曾经被转授,还会引起级联回收。
来源: 《DM8 安全管理》3.3.2.2 对象权限的回收。
4. ADMIN OPTION 与 GRANT OPTION
WITH ADMIN OPTION 用于数据库权限或角色授权,表示被授权者可以继续转授该数据库权限或角色。
sql
GRANT CREATE TABLE TO joe WITH ADMIN OPTION;
WITH GRANT OPTION 用于对象权限,表示被授权者可以继续转授该对象权限。
sql
GRANT SELECT ON SCOTT.EMP TO joe WITH GRANT OPTION;
两者差异要放在"回收是否级联"上看:
- 数据库权限或角色通过
WITH ADMIN OPTION转授后,回收原用户权限时通常不会级联回收下游用户已获得的权限或角色。 - 对象权限通过
WITH GRANT OPTION转授后,回收时如果使用CASCADE,会触发级联回收。
来源: 《DM8 安全管理》3.3.1 数据库权限的分配与回收、3.3.2 对象权限的分配与回收、3.3.3 角色权限的分配与回收。
授权链路如下:
sql
CREATE USER joe IDENTIFIED BY Welcome_1;
CREATE USER emily IDENTIFIED BY Welcome_1;
GRANT CREATE TABLE TO joe WITH ADMIN OPTION;
CONN joe/Welcome_1
GRANT CREATE TABLE TO emily;
CONN sysdba/Welcome_1
REVOKE CREATE TABLE FROM joe;
CONN emily/Welcome_1
CREATE TABLE test2(
tid NUMBER,
tname VARCHAR2(10)
);
结果是 joe 被回收建表权限后,emily 仍可建表,这体现了数据库权限 ADMIN OPTION 的非级联特点。

四、管理用户角色
1. 角色的作用
角色是一组权限的集合。它的价值在于把多个权限先归并成一个可复用的授权单元,再把这个单元授给用户。用户多、权限多时,角色能明显减少授权和回收的复杂度。
来源: 《DM8 安全管理》3.2 角色管理。
角色的基本使用顺序是:
sql
CREATE ROLE hrmgr;
CREATE ROLE hrclerk;
GRANT SELECT ON SCOTT.EMP TO hrclerk;
GRANT SELECT ON SCOTT.DEPT TO hrclerk;
GRANT CREATE TABLE TO hrmgr;
GRANT hrclerk TO hrmgr;
GRANT hrmgr TO jenny;
GRANT hrclerk TO david;
GRANT hrclerk TO rachel;
这里 hrclerk 代表普通人事查询角色,hrmgr 代表人事经理角色。hrmgr 继承 hrclerk 后,经理既拥有普通查询权限,也拥有额外的建表权限。
2. 预定义角色与自定义角色
DM 中既有预定义角色,也可以创建自定义角色。常见预定义角色包括:
DBA:数据库管理相关的最高权限集合。RESOURCE:可创建数据库对象,对有权限的对象进行数据操作。PUBLIC:普通公共角色,一般不建议随意回收。VTI、SOI、SVI:和系统视图、系统表查询相关。DB_AUDIT_ADMIN、DB_AUDIT_OPER:审计相关管理角色。DB_POLICY_ADMIN、DB_POLICY_OPER:强制访问控制策略相关角色。
来源: 《DM8 安全管理》3.2.1.1 DM 预定义角色。
自定义角色适合业务授权。例如把"人事查询""人事管理""财务查询"等权限分别封装成角色,再授给对应人员或岗位。
3. 角色启用与禁用
如果暂时不想删除角色,但希望角色失效,可以使用 SP_SET_ROLE:
sql
-- 禁用角色
SP_SET_ROLE('HRMGR', 0);
-- 启用角色
SP_SET_ROLE('HRMGR', 1);
官方手册说明,只有拥有 ADMIN_ANY_ROLE 权限的用户才能启用和禁用角色;系统预设角色如 DBA、PUBLIC、RESOURCE 不能这样设置。
来源: 《DM8 安全管理》3.2.2 角色的启用与禁用。
五、数据库审计
1. 审计开关
审计是 DM 安全管理的重要组成部分。它记录系统级事件、用户行为和数据库对象访问,便于事后分析。
来源: 《DM8 安全管理》5 审计。
审计开关由 SP_SET_ENABLE_AUDIT 控制:
0:关闭审计。1:打开普通审计。2:打开普通审计和实时审计。
查询当前审计开关:
sql
SELECT PARA_NAME, PARA_VALUE
FROM V$DM_INI
WHERE PARA_NAME = 'ENABLE_AUDIT';

开启普通审计需要使用审计员用户:
sql
CONN SYSAUDITOR/Welcome_1
SP_SET_ENABLE_AUDIT(1);
2. 语句级审计
DM 审计分为系统级、语句级、对象级等层次。系统级审计在审计开关打开后自动生成;语句级审计针对某类 SQL 或语句组;对象级审计针对具体对象上的操作。
来源: 《DM8 安全管理》5.2 审计的设置与取消。
语句级审计使用 SP_AUDIT_STMT 设置,使用 SP_NOAUDIT_STMT 取消:
sql
SP_AUDIT_STMT(
TYPE VARCHAR(30),
USERNAME VARCHAR(128),
WHENEVER VARCHAR(20)
);
SP_NOAUDIT_STMT(
TYPE VARCHAR(30),
USERNAME VARCHAR(128),
WHENEVER VARCHAR(20)
);
参数含义:
TYPE:语句级审计选项,例如TABLE、USER、GRANT、REVOKE等。USERNAME:用户名;NULL表示不限制用户。WHENEVER:审计成功、失败或全部操作,常见取值为SUCCESSFUL、FAIL、ALL。
下面设置对表相关语句的审计:
sql
SP_AUDIT_STMT('TABLE', 'NULL', 'ALL');
随后执行建表和删表:
sql
CREATE TABLE emp1 AS SELECT * FROM emp WHERE deptno = 10;
DROP TABLE emp1;

再查询审计记录:
sql
SELECT *
FROM V$AUDITRECORDS;


3. 对象级审计
对象级审计发生在具体对象上,需要指定模式名和对象名。下面对 SYSDBA 用户在 SCOTT.EMP 表上的插入操作进行审计:
sql
SP_AUDIT_OBJECT(
'INSERT',
'SYSDBA',
'SCOTT',
'EMP',
'SUCCESSFUL'
);
然后执行插入并提交:
sql
INSERT INTO SCOTT.EMP(empno, ename, sal, deptno)
VALUES(1, 'Tom', 1000, 10);
COMMIT;

查看审计记录时,可以只关注操作类型和 SQL 文本:
sql
SELECT OPERATION, SQL_TEXT
FROM V$AUDITRECORDS
WHERE USERNAME = 'SYSDBA';

4. 审计文件管理
审计信息最终会写入审计文件。官方手册说明,默认审计文件位于数据库 SYSTEM_PATH 指定路径,也可以在 dm.ini 中通过 AUD_PATH 指定审计文件存放路径。
单个审计文件大小由 AUDIT_MAX_FILE_SIZE 控制;审计文件空间满时的处理策略由 AUDIT_FILE_FULL_MODE 控制;审计文件保留天数与清理行为还会受到 AUDIT_KEEP_DAYS 影响。
来源: 《DM8 安全管理》5.3 审计文件管理。
常见配置思路如下:
ini
SYSTEM_PATH = /home/dmdba/dmdbms/data/DAMENG
AUD_PATH = /home/dmdba/dmdbms/data/DAMENG/aud
如果需要调整单个审计文件大小,可以通过系统过程修改动态系统级参数:
sql
SP_SET_PARA_VALUE(1, 'AUDIT_MAX_FILE_SIZE', 100);
5. 审计分析工具 dmaudtool
审计文件内容不是直接可读文本,通常要借助 dmaudtool 解析。该工具位于 DM 安装目录的 bin 目录下。
来源: 《DM8 安全管理》5.6.2 审计分析工具 dmaudtool。
基本格式为:
bash
dmaudtool USERID=<userid> AFIL_PATH=<afil_path> OUT_PATH=<out_path> [PARAMETER=<value>]
示例如下:
bash
bin/dmaudtool USERID=SYSAUDITOR/Welcome_1 \
AFIL_PATH=/home/dmdba/dmdbms/data/DAMENG \
OUT_PATH=/home/dmdba/audit.txt
cat /home/dmdba/audit.txt

常用参数:
USERID:数据库连接信息,必选。AFIL_PATH:审计文件所在路径,必选。OUT_PATH:分析结果输出路径,必选。USERNAME:只筛选某个用户的审计记录。TIME_FROM、TIME_TO:按时间范围筛选。R_SEP、C_SEP:指定输出文件的行分隔符和列分隔符。
六、总结
DM 安全管理可以按"账号、权限、角色、审计"四层理解。
账号层面,CREATE USER 解决身份入口,认证方式决定用户如何登录;PROFILE 和资源限制决定用户登录和使用资源的边界。权限层面,数据库权限控制某类操作能力,对象权限控制具体对象访问能力。角色层面,把多项权限打包成岗位或职责,降低授权复杂度。审计层面,先开审计开关,再设置语句级或对象级审计,最后通过视图或 dmaudtool 追踪记录。
实际工作中不要只记命令,还要看命令改变的是哪一层:是账号状态、认证方式、权限边界、角色继承,还是审计记录。这样排查"用户不能登录""能登录但不能建表""能建表但不能查别人的表""操作没有审计记录"这类问题时,方向会清晰很多。