达梦数据库安全管理与访问控制

安全管理是数据库日常运维中的基础能力。对 DM 数据库来说,安全管理至少要回答四个问题:用户如何创建和认证,权限如何授予和回收,角色如何简化授权,审计如何记录关键操作。

本文围绕用户、授权、角色、审计四条主线展开,并结合常用 SQL 与验证结果说明每个机制在实际操作中的作用。

一、DM 安全管理的整体认识

数据库安全管理要解决两个问题:谁可以登录,以及登录之后能做什么。DM 在这两层上分别提供用户标识与鉴别、访问控制、角色、审计等机制。

用户标识与鉴别负责确认登录者能否对应到某个数据库用户;访问控制负责限制用户对数据库对象的操作范围;审计则用于记录用户行为,给事后追踪和责任定位提供依据。

来源: 《DM8 安全管理》1.2 DM 安全管理、2 用户标识与鉴别、5 审计。

从使用和管理角度看,可以先按下面四条线理解:

模块 解决的问题 常用对象或命令
用户管理 账号、认证、锁定、资源限制 CREATE USERALTER USERDBA_USERS
授权管理 用户能执行哪些操作 GRANTREVOKE
角色管理 批量管理一组权限 CREATE ROLESP_SET_ROLE
审计管理 记录和分析关键操作 SP_SET_ENABLE_AUDITSP_AUDIT_STMTSP_AUDIT_OBJECTdmaudtool

二、管理 DM 数据库用户

1. 预定义管理用户

DM 数据库安装后会预设若干管理用户。安全机制不同,管理员职责划分也不同。

三权分立下主要有:

  • SYSDBA:数据库管理员,负责数据库建设、维护、备份恢复、性能管理等。
  • SYSSSO:数据库安全员,负责安全策略和强制访问控制相关管理。
  • SYSAUDITOR:数据库审计员,负责设置审计策略、查看和分析审计记录。

四权分立在三权分立基础上增加 SYSDBO,即数据库对象操作员。四权分立下,SYSDBA 更偏向系统管理与维护,数据对象的创建和数据操作职责会进一步拆给 SYSDBO

来源: 《DM8 安全管理》2.1 DM 的管理用户。

审计员预定义用户名为 SYSAUDITOR,安全管理相关脚本中应保持名称一致。

2. 创建、修改、锁定用户

以下示例创建普通用户 testuser001。创建用户和修改密码使用 CREATE USERALTER 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 组;若要映射为管理员身份,则使用 dmdbadmssodmauditor 等组。

配置步骤如下。

先确认当前操作系统用户:

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_TIMEPASSWORD_REUSE_MAX:控制旧口令何时可重用。
  • SESSION_PER_USERCONNECT_TIMECONNECT_IDLE_TIME:控制会话数量和连接时间。

三、管理用户授权

1. 数据库权限与对象权限

DM 的权限主要分为数据库权限和对象权限。

数据库权限偏向"能不能做某类数据库级操作",例如创建表、创建用户、修改数据库、查询系统视图等。对象权限偏向"能不能操作某个具体对象中的数据",例如查询 SCOTT.EMP、向某张表插入数据、执行某个存储过程。

来源: 《DM8 安全管理》3.1 权限管理。

可以这样区分:

权限类型 作用范围 示例
数据库权限 某类数据库操作 CREATE TABLECREATE USERALTER DATABASE
对象权限 某个对象或对象列 SELECT ON SCOTT.EMPINSERT ON T1EXECUTE ON PROCEDURE P1

例如,普通用户没有 CREATE TABLE 权限时,创建表会失败;没有 SCOTT.EMPSELECT 对象权限时,查询也会失败。

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;

如果回收的是对象权限,并且该权限曾经被继续转授,需要关注 RESTRICTCASCADE。官方手册说明:对象权限回收时,如果使用 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:普通公共角色,一般不建议随意回收。
  • VTISOISVI:和系统视图、系统表查询相关。
  • DB_AUDIT_ADMINDB_AUDIT_OPER:审计相关管理角色。
  • DB_POLICY_ADMINDB_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 权限的用户才能启用和禁用角色;系统预设角色如 DBAPUBLICRESOURCE 不能这样设置。

来源: 《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:语句级审计选项,例如 TABLEUSERGRANTREVOKE 等。
  • USERNAME:用户名;NULL 表示不限制用户。
  • WHENEVER:审计成功、失败或全部操作,常见取值为 SUCCESSFULFAILALL

下面设置对表相关语句的审计:

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_FROMTIME_TO:按时间范围筛选。
  • R_SEPC_SEP:指定输出文件的行分隔符和列分隔符。

六、总结

DM 安全管理可以按"账号、权限、角色、审计"四层理解。

账号层面,CREATE USER 解决身份入口,认证方式决定用户如何登录;PROFILE 和资源限制决定用户登录和使用资源的边界。权限层面,数据库权限控制某类操作能力,对象权限控制具体对象访问能力。角色层面,把多项权限打包成岗位或职责,降低授权复杂度。审计层面,先开审计开关,再设置语句级或对象级审计,最后通过视图或 dmaudtool 追踪记录。

实际工作中不要只记命令,还要看命令改变的是哪一层:是账号状态、认证方式、权限边界、角色继承,还是审计记录。这样排查"用户不能登录""能登录但不能建表""能建表但不能查别人的表""操作没有审计记录"这类问题时,方向会清晰很多。

相关推荐
潇湘秦18 小时前
OEM 13c Release 5 补丁升级记录
数据库·oracle
图特摩斯科技18 小时前
原生本体数据库AbutionGraph,世界模型/本体智能应用 底座
数据库·人工智能·知识图谱·本体论·palantir·ontology
潇湘秦18 小时前
Oracle 数据库SQL优化指南
数据库·sql·oracle
j7~18 小时前
【MYSQL】 内置函数--详解
数据库·mysql·字符串函数·内置函数·日期函数·数学函数
whn197718 小时前
ORACLE异常sql解析的案例
数据库·sql·oracle
夏贰四18 小时前
用好数据建模工具能解决哪些问题?如何正确选用建模工具?
大数据·数据库·数学建模·数据建模工具
小欣加油19 小时前
Hadoop开发环境搭建
大数据·数据库·hadoop
我是一颗柠檬19 小时前
【MySQL全面教学】MySQL存储过程与函数Day11(2026年)
数据库·后端·mysql
霸道流氓气质19 小时前
外部系统回调的异步处理架构:接收、落库、MQ消费、推送的完整设计
数据库·架构