文档版本:V1.0
适用产品:达梦数据库 DM8(语法与 DM9 基本兼容)
适用对象:数据库管理员、安全管理员、审计管理员、开发与运维人员
文档目标:以可复现的实验流程,讲解达梦数据库“最小权限、角色管理、权限精确授予、审计、密码策略加固”等安全合规操作,每个步骤均提供 SQL 命令示例与验证方法
bin 目录下存在命令行工具 disql。IP:端口 形式)。App@2026Dm),生产环境请使用符合企业密码策略的强口令并及时更换。FAILED_LOGIN_ATTEMPTS / FAILED_LOGIN_ATTEMPS)和视图字段上可能存在差异,文中已给出兼容说明;若命令报语法错误,请以安装目录 doc 下的《DM8_SQL语言使用手册》为准。-- ============================================
-- 数据准备脚本:为DM用户权限与加固实验准备数据
-- 执行用户:SYSDBA
-- ============================================
-- 删除已存在的表(如果存在)
DROP TABLE IF EXISTS SYSDBA.EMPLOYEES;
DROP TABLE IF EXISTS SYSDBA.DEPARTMENTS;
-- 创建部门表
CREATE TABLE SYSDBA.DEPARTMENTS (
DEPT_ID INT NOT NULL,
DEPT_NAME VARCHAR(100) NOT NULL,
CONSTRAINT PK_DEPT PRIMARY KEY (DEPT_ID)
);
-- 创建员工表(包含薪资敏感字段)
CREATE TABLE SYSDBA.EMPLOYEES (
EMP_ID INT NOT NULL,
EMP_NAME VARCHAR(50) NOT NULL,
DEPT_ID INT,
SALARY DECIMAL(10,2),
CONSTRAINT PK_EMP PRIMARY KEY (EMP_ID)
);
-- 插入部门数据
INSERT INTO SYSDBA.DEPARTMENTS VALUES (10, '研发部');
INSERT INTO SYSDBA.DEPARTMENTS VALUES (20, '市场部');
INSERT INTO SYSDBA.DEPARTMENTS VALUES (30, '财务部');
INSERT INTO SYSDBA.DEPARTMENTS VALUES (40, '人力资源部');
-- 插入员工数据(覆盖多种场景)
INSERT INTO SYSDBA.EMPLOYEES VALUES (1001, '张三', 10, 12000.00);
INSERT INTO SYSDBA.EMPLOYEES VALUES (1002, '李四', 20, 9000.00);
INSERT INTO SYSDBA.EMPLOYEES VALUES (1003, '王五', 10, 15000.00);
INSERT INTO SYSDBA.EMPLOYEES VALUES (1004, '赵六', 30, 8500.00);
INSERT INTO SYSDBA.EMPLOYEES VALUES (1005, '孙七', 20, 11000.00);
INSERT INTO SYSDBA.EMPLOYEES VALUES (1006, '周八', 40, 7800.00);
INSERT INTO SYSDBA.EMPLOYEES VALUES (1007, '吴九', 10, 13500.00);
INSERT INTO SYSDBA.EMPLOYEES VALUES (1008, '郑十', 30, 9200.00);
-- 提交事务
COMMIT;
-- 验证数据
SELECT COUNT(*) AS 部门总数 FROM SYSDBA.DEPARTMENTS;
SELECT COUNT(*) AS 员工总数 FROM SYSDBA.EMPLOYEES;
-- 查看员工数据
SELECT * FROM SYSDBA.EMPLOYEES ORDER BY EMP_ID;
-- ============================================
-- 创建视图和存储过程(文档第四章需要)
-- ============================================
-- 创建视图:隐藏SALARY敏感字段
CREATE OR REPLACE VIEW SYSDBA.V_EMPLOYEE_INFO AS
SELECT EMP_ID, EMP_NAME, DEPT_ID FROM SYSDBA.EMPLOYEES;
-- 创建存储过程:按员工号调整薪资
CREATE OR REPLACE PROCEDURE SYSDBA.P_UPDATE_SALARY(
P_EMP_ID INT,
P_NEW_SALARY DECIMAL(10,2)
)
AS
BEGIN
UPDATE SYSDBA.EMPLOYEES SET SALARY = P_NEW_SALARY WHERE EMP_ID = P_EMP_ID;
COMMIT;
END;
/
-- 验证视图和存储过程
SELECT * FROM SYSDBA.V_EMPLOYEE_INFO ORDER BY EMP_ID;
-- 验证表是否存在
SELECT OWNER, TABLE_NAME FROM SYS.DBA_TABLES
WHERE OWNER = 'SYSDBA' AND TABLE_NAME IN ('EMPLOYEES', 'DEPARTMENTS');
-- 查看数据
SELECT * FROM SYSDBA.DEPARTMENTS;
SELECT * FROM SYSDBA.EMPLOYEES ORDER BY EMP_ID;
SELECT * FROM SYSDBA.V_EMPLOYEE_INFO ORDER BY EMP_ID;
/nolog 方式启动会话。步骤 1:以 /nolog 方式启动 disql(不直接建立连接)
-- 进入达梦安装目录的 bin 目录后执行(Windows 与 Linux 命令一致)
cd /opt/dmdbms/bin
-- 启动 disql,不连接数据库
disql /nolog
启动后进入 disql 交互界面,提示符为 SQL>。
步骤 2:使用 conn 命令连接 DMTEST 实例
-- DMTEST 为客户端配置的实例服务名
conn SYSDBA/SYSDBA@DMTEST
连接成功后会返回服务器版本与状态信息,例如:
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 15.032(ms)
补充说明:如果客户端未配置服务名
DMTEST,可使用IP:端口形式直连,例如conn SYSDBA/SYSDBA@192.168.1.100:5236,如果是本机上,可以用conn SYSDBA/DMdba_123:5236。业务账号口令中包含@等特殊字符时,建议将口令用双引号括起,例如conn app_user/"App@2026Dm"@DMTEST。
步骤 3:确认当前用户与数据库版本
-- 查看当前登录用户
SELECT USER AS 当前用户;
-- 查看数据库版本信息
SELECT * FROM V$VERSION;
步骤 4:退出 disql
exit
| 验证项 | 验证命令 | 预期结果 |
|---|---|---|
| 当前用户 | SELECT USER AS 当前用户; |
返回 SYSDBA |
| 版本信息 | SELECT * FROM V$VERSION; |
显示达梦数据库版本号 |
| 权限自查 | SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE='SYSDBA'; |
显示 SYSDBA 拥有的角色(含 DBA),说明具备 DBA 权限 |

最小权限原则(Least Privilege Principle) 是指:任何用户、角色或应用程序,只应被授予完成其工作任务所必需的最少权限,且权限在任务结束后应及时回收。
落地要点:
SELECT,写业务才授 INSERT/UPDATE/DELETE。步骤 1:设计权限矩阵(最小权限规划)
| 用户/角色 | 职责 | 需要的权限 | 说明 |
|---|---|---|---|
| app_user | 应用程序用户 | 只读访问业务数据 | 仅授予 SELECT,不授予任何 DDL |
| audit_admin | 审计管理员 | 查询审计记录 | 授予审计相关角色,不授予业务对象权限 |
| data_reader_role | 只读业务角色 | 对业务表的 SELECT | 集中管理只读权限 |
| data_writer_role | 读写业务角色 | 对业务表的增删改 | 与只读角色分开 |
| security_admin_role | 安全管理员角色 | 用户/角色管理权限 | 供安全管理账号使用 |
步骤 2:创建用户并设置初始密码
使用 SYSDBA 连接后执行:
-- 创建应用程序用户 app_user,设置初始密码,并启用账号
CREATE USER app_user IDENTIFIED BY "App@2026Dm" PASSWORD_POLICY 31 ACCOUNT UNLOCK;
-- 创建审计管理员用户 audit_admin
CREATE USER audit_admin IDENTIFIED BY "Audit@2026Dm" PASSWORD_POLICY 31;
说明:
PASSWORD_POLICY 31表示启用全部口令复杂度策略(密码相关在第七章);口令用双引号括起可支持特殊字符。
步骤 3:通过角色实现权限集中管理
-- 创建业务角色
CREATE ROLE data_reader_role; -- 只读角色
CREATE ROLE data_writer_role; -- 读写角色
-- 将权限集中授予角色(对象权限在第四章完成,此处先演示机制)
GRANT SELECT ON SYSDBA.EMPLOYEES TO data_reader_role;
-- 将角色授予用户,用户即获得角色所包含的全部权限
GRANT data_reader_role TO app_user;
步骤 4:验证权限继承关系
-- 查询用户拥有的角色
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'APP_USER';
-- 查询角色拥有的对象权限
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'DATA_READER_ROLE';

conn app_user/"App@2026Dm":5236
SELECT * FROM SYSDBA.EMPLOYEES;
INSERT INTO SYSDBA.EMPLOYEES VALUES (1003, '王五', 10, 8000.00);
-- 预期报错:权限不足 / 无 INSERT 权限

使用 SYSDBA 连接 DMTEST 实例:
-- 创建应用程序用户(若已存在可先删除或使用 ALTER USER 调整)
CREATE USER IF NOT EXISTS app_user IDENTIFIED BY "App@2026Dm"
PASSWORD_POLICY 31
ACCOUNT UNLOCK
LIMIT FAILED_LOGIN_ATTEMPTS 5, PASSWORD_LOCK_TIME 10;
-- 创建审计管理员用户
CREATE USER IF NOT EXISTS audit_admin IDENTIFIED BY "Audit@2026Dm"
PASSWORD_POLICY 31
ACCOUNT UNLOCK;
说明:
CREATE USER IF NOT EXISTS在用户已存在时不报错;如需强制重置请使用DROP USER ... CASCADE后重建。
-- 只读角色:只读业务数据的角色
CREATE ROLE IF NOT EXISTS data_reader_role;
-- 读写角色:需要写入业务数据的角色
CREATE ROLE IF NOT EXISTS data_writer_role;
业务角色包含的对象权限将在第四章详细授予,此处先完成角色定义。
-- 安全管理员角色:负责用户与角色的日常管理
CREATE ROLE IF NOT EXISTS security_admin_role;
-- 为该角色授予用户/角色管理所需的系统权限(按最小权限原则,不授予 DBA)
GRANT CREATE USER, ALTER USER, DROP USER, CREATE ROLE, DROP ROLE
TO security_admin_role;
-- 将管理角色授予审计管理员用户(演示职责分离)
GRANT security_admin_role TO audit_admin;
(1)创建用户
CREATE USER app_user IDENTIFIED BY "App@2026Dm"
PASSWORD_POLICY 31
ACCOUNT UNLOCK;
(2)修改用户口令
ALTER USER app_user IDENTIFIED BY "App@Renew2026";
修改口令同样受
PWD_POLICY口令复杂度策略约束。
(3)锁定用户
ALTER USER app_user ACCOUNT LOCK;
(4)解锁用户
ALTER USER app_user ACCOUNT UNLOCK;
(5)口令立即过期(强制下次登录修改口令)
ALTER USER app_user PASSWORD EXPIRE;
(6)删除用户
-- 用户无依赖对象时直接删除
DROP USER app_user;
-- 用户拥有对象时使用 CASCADE 级联删除其对象
DROP USER app_user CASCADE;
-- 启用/禁用角色(1 启用,0 禁用;需 ADMIN_ANY_ROLE 权限)
SP_SET_ROLE('data_reader_role', 1);
-- 删除角色(先回收该角色在用户身上的授予)
REVOKE data_reader_role FROM app_user;
DROP ROLE data_reader_role;
-- 查看用户是否创建成功及账号状态
SELECT USERNAME, ACCOUNT_STATUS, CREATED FROM DBA_USERS
WHERE USERNAME IN ('APP_USER', 'AUDIT_ADMIN');
-- 查看角色是否创建成功
SELECT ROLE FROM DBA_ROLES
WHERE ROLE IN ('DATA_READER_ROLE', 'DATA_WRITER_ROLE', 'SECURITY_ADMIN_ROLE');
-- 查看用户-角色授权关系
SELECT GRANTEE, GRANTED_ROLE, ADMIN_OPTION
FROM DBA_ROLE_PRIVS
WHERE GRANTEE IN ('APP_USER', 'AUDIT_ADMIN');
预期结果:两个用户、三个角色均存在;AUDIT_ADMIN 拥有 SECURITY_ADMIN_ROLE 角色。
使用 SYSDBA 连接后,在 SYSDBA 模式下创建测试对象:
-- 创建部门表
CREATE TABLE SYSDBA.DEPARTMENTS (
DEPT_ID INT NOT NULL,
DEPT_NAME VARCHAR(100) NOT NULL,
CONSTRAINT PK_DEPT PRIMARY KEY (DEPT_ID)
);
-- 创建员工表(模拟敏感业务表,包含薪资字段)
CREATE TABLE SYSDBA.EMPLOYEES (
EMP_ID INT NOT NULL,
EMP_NAME VARCHAR(50) NOT NULL,
DEPT_ID INT,
SALARY DECIMAL(10,2),
CONSTRAINT PK_EMP PRIMARY KEY (EMP_ID)
);
-- 插入测试数据
INSERT INTO SYSDBA.DEPARTMENTS VALUES (10, '研发部');
INSERT INTO SYSDBA.DEPARTMENTS VALUES (20, '市场部');
INSERT INTO SYSDBA.EMPLOYEES VALUES (1001, '张三', 10, 12000.00);
INSERT INTO SYSDBA.EMPLOYEES VALUES (1002, '李四', 20, 9000.00);
COMMIT;
-- 创建视图:仅暴露员工基本信息,隐藏 SALARY 敏感字段
CREATE OR REPLACE VIEW SYSDBA.V_EMPLOYEE_INFO AS
SELECT EMP_ID, EMP_NAME, DEPT_ID FROM SYSDBA.EMPLOYEES;
-- 创建存储过程:按员工号调整薪资
CREATE OR REPLACE PROCEDURE SYSDBA.P_UPDATE_SALARY(
IN P_EMP_ID INT,
IN P_NEW_SALARY DECIMAL(10,2)
)
AS
BEGIN
UPDATE SYSDBA.EMPLOYEES SET SALARY = P_NEW_SALARY WHERE EMP_ID = P_EMP_ID;
COMMIT;
END;
-- 只读角色:仅授予 SELECT
GRANT SELECT ON SYSDBA.EMPLOYEES TO data_reader_role;
GRANT SELECT ON SYSDBA.DEPARTMENTS TO data_reader_role;
-- 读写角色:授予增删改权限
GRANT INSERT, UPDATE, DELETE ON SYSDBA.EMPLOYEES TO data_writer_role;
GRANT INSERT, UPDATE, DELETE ON SYSDBA.DEPARTMENTS TO data_writer_role;
-- 直接向用户授权(按需精确到列,此处仅允许查看员工编号与姓名)
GRANT SELECT (EMP_ID, EMP_NAME) ON SYSDBA.EMPLOYEES TO audit_admin;
说明:达梦支持将权限精确到列级(如
SELECT (EMP_ID, EMP_NAME)),实现更细粒度的最小权限控制。
-- 授予视图查询权限(视图本身已隐藏 SALARY 等敏感列)
GRANT SELECT ON SYSDBA.V_EMPLOYEE_INFO TO data_reader_role;
GRANT SELECT ON SYSDBA.V_EMPLOYEE_INFO TO app_user;
说明:通过视图授权可以做到“底层表不直接暴露、敏感列不出现”,是对敏感数据访问控制的重要手段。视图权限授予后,用户在查询时无需对底层表拥有权限。
-- 授予存储过程执行权限(EXECUTE)
GRANT EXECUTE ON SYSDBA.P_UPDATE_SALARY TO data_writer_role;
GRANT EXECUTE ON SYSDBA.P_UPDATE_SALARY TO app_user;
-- 将角色授予用户,使用户获得角色内的全部权限
GRANT data_reader_role TO app_user;
GRANT data_writer_role TO app_user;
风险提示:存储过程内部通常以定义者权限执行,被授权用户可能间接获得过程内对象操作的执行能力。授予
EXECUTE前必须审查过程体逻辑,避免“借道提权”。
适用场景:需要由某用户/角色代为向下属账号转发权限的受控场景(如业务模块负责人统一分配只读权限)。
-- 授予 app_user 对 EMPLOYEES 表的查询权限,并允许其继续转授
GRANT SELECT ON SYSDBA.EMPLOYEES TO app_user WITH GRANT OPTION;
-- app_user 获得转授权限后,可以将该权限授予其他用户
-- (以下命令使用 app_user 登录后执行)
conn app_user/"App@2026Dm"@DMTEST
GRANT SELECT ON SYSDBA.EMPLOYEES TO temp_user;
风险提示:
WITH GRANT OPTION,业务用户原则上不应持有。GRANT 操作,及时发现异常转授。-- 回收直接授予用户的表权限(级联回收其转授权限)
REVOKE SELECT ON SYSDBA.EMPLOYEES FROM app_user;
-- 回收角色的对象权限
REVOKE INSERT, UPDATE, DELETE ON SYSDBA.EMPLOYEES FROM data_writer_role;
REVOKE SELECT ON SYSDBA.DEPARTMENTS FROM data_reader_role;
-- 回收视图权限与存储过程执行权限
REVOKE SELECT ON SYSDBA.V_EMPLOYEE_INFO FROM app_user;
REVOKE EXECUTE ON SYSDBA.P_UPDATE_SALARY FROM data_writer_role;
-- 回收用户-角色关系
REVOKE data_writer_role FROM app_user;
-- 查看对象的授权情况(含被授权者、权限类型、是否可转授)
SELECT GRANTEE, TABLE_NAME, PRIVILEGE, GRANTABLE
FROM DBA_TAB_PRIVS
WHERE OWNER = 'SYSDBA' AND TABLE_NAME IN ('EMPLOYEES', 'DEPARTMENTS', 'V_EMPLOYEE_INFO');
-- 查看 app_user 当前拥有的对象权限
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'APP_USER';
使用 app_user 连接后逐项验证:
SELECT * FROM SYSDBA.EMPLOYEES; -- 成功:拥有 SELECT
SELECT * FROM SYSDBA.V_EMPLOYEE_INFO;-- 成功:拥有视图查询权限
CALL SYSDBA.P_UPDATE_SALARY(1001, 13000.00); -- 成功:拥有 EXECUTE 权限
INSERT INTO SYSDBA.DEPARTMENTS VALUES (30, '财务部'); -- 失败:读写角色已被回收
-- 授予 app_user 创建表、视图、存储过程以及登录会话的权限
GRANT CREATE TABLE, CREATE VIEW, CREATE PROCEDURE, CREATE SESSION TO app_user;
-- 按角色集中授予系统权限(如将建表能力授予写角色)
GRANT CREATE TABLE TO data_writer_role;
说明:CREATE SESSION 是允许用户登录数据库的会话权限;若回收该权限,用户将无法建立连接。业务用户应按需获得 DDL 权限,生产环境建议默认不授予。
-- CONNECT:基本连接角色,包含 CREATE SESSION(允许登录)
GRANT CONNECT TO app_user;
-- RESOURCE:资源创建角色,包含 CREATE TABLE / CREATE VIEW / CREATE PROCEDURE / CREATE SEQUENCE 等
GRANT RESOURCE TO app_user;
-- DBA:数据库管理员角色,包含绝大多数系统权限(仅用于演示,生产环境严禁随意授予)
GRANT DBA TO app_user;
风险提示:DBA 角色权限极大,授予后等同于拥有数据库全部管理能力;RESOURCE 角色包含建表等 DDL 权限,均与最小权限原则相悖,本小节仅作语法演示,实际生产应逐项精确授权。
-- 回收单个系统权限
REVOKE CREATE TABLE FROM app_user;
REVOKE CREATE VIEW, CREATE PROCEDURE FROM app_user;
REVOKE CREATE SESSION FROM app_user;
-- 回收预定义角色
REVOKE DBA FROM app_user;
REVOKE RESOURCE FROM app_user;
REVOKE CONNECT FROM app_user;
-- 查看用户拥有的系统权限
SELECT GRANTEE, PRIVILEGE
FROM DBA_SYS_PRIVS
WHERE GRANTEE = 'APP_USER';
-- 查看用户拥有的角色
SELECT GRANTEE, GRANTED_ROLE
FROM DBA_ROLE_PRIVS
WHERE GRANTEE = 'APP_USER';
使用 app_user 连接后验证:
CREATE TABLE T_TEST (ID INT); -- 回收 CREATE TABLE 后预期报错:权限不足
重要说明:达梦遵循三权分立,审计策略的配置与审计记录查询应使用审计管理员 SYSAUDITOR(或拥有
AUDIT DATABASE权限的用户)登录执行;SYSDBA 不负责审计配置。
使用 SYSAUDITOR 连接:
conn SYSAUDITOR/SYSAUDITOR@DMTEST
-- 查看审计开关当前状态
SELECT * FROM V$DM_INI WHERE PARA_NAME = 'ENABLE_AUDIT';
-- 开启审计:0 关闭;1 开启普通审计;2 开启普通审计+实时审计
SP_SET_ENABLE_AUDIT(1);
-- 再次确认已开启
SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME = 'ENABLE_AUDIT';
预期结果:ENABLE_AUDIT 参数值变为 1;数据库数据目录下开始生成以 AUDIT_ 开头的审计日志文件。
-- 对 app_user 在任意表上的增删改查操作进行审计(成功与失败均记录)
SP_AUDIT_STMT('SELECT TABLE', 'APP_USER', 'ALL');
SP_AUDIT_STMT('INSERT TABLE', 'APP_USER', 'ALL');
SP_AUDIT_STMT('UPDATE TABLE', 'APP_USER', 'ALL');
SP_AUDIT_STMT('DELETE TABLE', 'APP_USER', 'ALL');
-- 对所有用户('NULL' 表示不限制用户名)访问 SYSDBA.EMPLOYEES 表进行对象级审计
SP_AUDIT_OBJECT('SELECT', 'NULL', 'SYSDBA', 'EMPLOYEES', 'ALL');
SP_AUDIT_OBJECT('INSERT', 'NULL', 'SYSDBA', 'EMPLOYEES', 'ALL');
SP_AUDIT_OBJECT('UPDATE', 'NULL', 'SYSDBA', 'EMPLOYEES', 'ALL');
SP_AUDIT_OBJECT('DELETE', 'NULL', 'SYSDBA', 'EMPLOYEES', 'ALL');
-- 更细粒度:仅审计对 SALARY 列的 UPDATE(含列名参数的重载形式)
SP_AUDIT_OBJECT('UPDATE', 'NULL', 'SYSDBA', 'EMPLOYEES', 'SALARY', 'ALL');
说明:对象级审计的
WHENEVER参数可取ALL(全部)、SUCCESSFUL(仅成功)、FAIL(仅失败);USERNAME传'NULL'表示对所有用户生效。
-- 审计创建/修改/删除用户(USER 类语句)
SP_AUDIT_STMT('USER', 'NULL', 'ALL');
-- 审计创建/删除角色
SP_AUDIT_STMT('ROLE', 'NULL', 'ALL');
-- 审计授权与回收权限
SP_AUDIT_STMT('GRANT', 'NULL', 'ALL');
SP_AUDIT_STMT('REVOKE', 'NULL', 'ALL');
-- 审计用户登录/登出(安全合规检查常用)
SP_AUDIT_STMT('CONNECT', 'NULL', 'ALL');
-- 查看已配置的审计规则
SELECT * FROM SYSAUDITOR.SYSAUDIT;
-- 查看全部审计记录
SELECT * FROM V$AUDITRECORDS;
-- 查看 app_user 的审计记录
SELECT USERNAME, IP, OPERATION, OBJNAME, SUCC_FLAG, SQL_TEXT, OPTIME
FROM V$AUDITRECORDS
WHERE USERNAME = 'APP_USER'
ORDER BY OPTIME DESC;
-- 查看敏感表 EMPLOYEES 相关的审计记录
SELECT USERNAME, IP, OPERATION, OBJNAME, SUCC_FLAG, SQL_TEXT, OPTIME
FROM V$AUDITRECORDS
WHERE OBJNAME = 'EMPLOYEES'
ORDER BY OPTIME DESC;
-- 查看用户管理类操作(按关键字过滤)
SELECT USERNAME, OPERATION, OBJNAME, SUCC_FLAG, SQL_TEXT, OPTIME
FROM V$AUDITRECORDS
WHERE SQL_TEXT LIKE '%CREATE USER%'
OR SQL_TEXT LIKE '%ALTER USER%'
OR SQL_TEXT LIKE '%DROP USER%'
OR SQL_TEXT LIKE '%GRANT%'
ORDER BY OPTIME DESC;
版本说明:DM8 审计结果动态视图为 **VAUDITRECORDS**(部分资料中也写作 VAUDIT),字段名在不同小版本可能有差异;审计规则存放在 SYSAUDITOR.SYSAUDIT 表中。执行
SELECT * FROM V$AUDITRECORDS可查看全部字段。
-- 取消语句级审计(必须与设置时完全匹配)
SP_NOAUDIT_STMT('SELECT TABLE', 'APP_USER', 'ALL');
SP_NOAUDIT_STMT('USER', 'NULL', 'ALL');
-- 取消对象级审计
SP_NOAUDIT_OBJECT('UPDATE', 'NULL', 'SYSDBA', 'EMPLOYEES', 'ALL');
-- 关闭审计开关
SP_SET_ENABLE_AUDIT(0);
-- 删除指定时间之前的审计文件(0 表示普通审计文件)
SP_DROP_AUDIT_FILE('2026-01-01 00:00:00', 0);
ENABLE_AUDIT=1:SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME = 'ENABLE_AUDIT';
SYSDBA.EMPLOYEES),随后查询审计记录,确认对应记录已生成。FAIL/ALL 策略记录。查看当前密码策略:
SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME = 'PWD_POLICY';
PWD_POLICY 取值说明(可组合,取值为各项之和):
| 取值 | 含义 |
|---|---|
| 0 | 无策略 |
| 1 | 禁止口令与用户名相同 |
| 2 | 口令长度不小于 PWD_MIN_LEN(默认 9) |
| 4 | 至少包含一个大写字母(A-Z) |
| 8 | 至少包含一个数字(0-9) |
| 16 | 至少包含一个标点符号(英文输入法下除 " 和空格外的符号) |
| 31 | 以上全部启用(1+2+4+8+16),推荐值 |
设置系统默认口令策略:
-- 方式一:系统过程(动态参数,立即生效,对新用户/新口令生效)
SP_SET_PARA_VALUE(1, 'PWD_POLICY', 31);
-- 方式二:ALTER SYSTEM 语句
ALTER SYSTEM SET 'PWD_POLICY' = 31 BOTH;
说明:PWD_POLICY 为动态参数,修改后立即生效,但只对新创建的用户或新修改的口令生效;已存在的不合规口令需通过
ALTER USER ... IDENTIFIED BY主动整改。当兼容模式COMPATIBLE_MODE=1时,PWD_POLICY 实际值按 0 处理。
按用户单独指定口令策略:
-- 创建用户时指定
CREATE USER strong_user IDENTIFIED BY "Strong@2026Dm" PASSWORD_POLICY 31;
-- 修改已有用户的口令策略
ALTER USER app_user PASSWORD_POLICY 31;
-- 修改用户口令(同样受复杂度策略约束)
ALTER USER app_user IDENTIFIED BY "App@Renew2026";
-- 设置 app_user 口令有效期 90 天,宽限期 7 天
ALTER USER app_user LIMIT PASSWORD_LIFE_TIME 90, PASSWORD_GRACE_TIME 7;
-- 强制口令立即过期,下次登录必须修改口令
ALTER USER app_user PASSWORD EXPIRE;
-- 查看用户口令策略
SELECT A.USERNAME, B.LIFE_TIME AS 密码有效期_天, B.GRACE_TIME AS 宽限期_天
FROM ALL_USERS A, SYSUSERS B
WHERE A.USER_ID = B.ID AND A.USERNAME = 'APP_USER';
说明:
PASSWORD_LIFE_TIME单位为天;PASSWORD_GRACE_TIME为口令过期后的宽限期(天),宽限期内仍可登录但会被提示改密。
-- 连续登录失败 5 次后锁定账号 10 分钟;同时设置会话空闲超时 30 分钟
ALTER USER app_user LIMIT
FAILED_LOGIN_ATTEMPTS 5,
PASSWORD_LOCK_TIME 10,
CONNECT_IDLE_TIME 30;
-- 查看用户资源限制
SELECT A.USERNAME, B.LOCK_TIME AS 锁定分钟数, B.FAILED_ATTEMPS AS 失败次数,
B.CONN_IDLE_TIME AS 空闲分钟数
FROM ALL_USERS A, SYSUSERS B
WHERE A.USER_ID = B.ID AND A.USERNAME = 'APP_USER';
-- 账号被锁定后由管理员解锁
ALTER USER app_user ACCOUNT UNLOCK;
拼写说明:官方 SQL 手册中资源限制项写作
FAILED_LOGIN_ATTEMPTS,部分 DM8 版本兼容简写FAILED_LOGIN_ATTEMPS(对应 SYSUSERS 列FAILED_ATTEMPS);若命令报语法错误可尝试另一拼写。PASSWORD_LOCK_TIME单位为分钟。
当多个用户需要相同安全策略时,可通过 PROFILE 统一管理,避免逐用户重复设置。
-- 创建统一安全策略文件
CREATE PROFILE SECURE_PROFILE LIMIT
FAILED_LOGIN_ATTEMPTS 5,
PASSWORD_LOCK_TIME 10,
PASSWORD_LIFE_TIME 90,
PASSWORD_GRACE_TIME 7,
CONNECT_IDLE_TIME 30;
-- 将 PROFILE 关联到用户
ALTER USER app_user PROFILE SECURE_PROFILE;
ALTER USER audit_admin PROFILE SECURE_PROFILE;
-- 修改 PROFILE 中的策略(语法与 CREATE PROFILE 一致)
ALTER PROFILE SECURE_PROFILE LIMIT
PASSWORD_LIFE_TIME 120,
FAILED_LOGIN_ATTEMPTS 6;
-- 解除用户与 PROFILE 的关联
ALTER USER app_user DROP PROFILE;
-- 删除 PROFILE(需先解除所有用户的关联)
DROP PROFILE SECURE_PROFILE;
版本说明:PROFILE 功能自 DM8 起提供;若当前版本不支持
ALTER PROFILE,可通过CREATE PROFILE重建,或使用ALTER USER ... LIMIT逐项设置。
验证 1:弱口令无法创建用户
-- 预期报错:口令不符合复杂度策略(长度、大小写、数字、特殊字符等要求)
CREATE USER weak_user IDENTIFIED BY "123456";
验证 2:符合策略的口令创建成功
CREATE USER strong_user IDENTIFIED BY "Strong@2026Dm";
-- 预期:执行成功
验证 3:连续输错口令触发账号锁定
-- 使用错误口令连续连接 5 次
conn app_user/WrongPass1@DMTEST
预期结果:第 5 次失败后提示账号被锁定(如 ORA-28000: the account is locked 或达梦等价错误信息)。
验证 4:管理员解锁并恢复正常登录
ALTER USER app_user ACCOUNT UNLOCK;
conn app_user/"App@2026Dm"@DMTEST
-- 预期:登录成功
验证 5:口令过期后强制改密
ALTER USER app_user PASSWORD EXPIRE;
conn app_user/"App@2026Dm"@DMTEST
-- 预期:登录后提示口令已过期,必须修改口令
ALTER USER app_user IDENTIFIED BY "App@Renew2026";
| 编号 | 测试用户 | 测试操作 | 预期结果 |
|---|---|---|---|
| T01 | app_user | SELECT * FROM SYSDBA.EMPLOYEES; |
成功 |
| T02 | app_user | INSERT INTO SYSDBA.EMPLOYEES ... |
失败(仅只读) |
| T03 | app_user | UPDATE SYSDBA.EMPLOYEES ... |
失败(仅只读) |
| T04 | app_user | SELECT * FROM SYSDBA.V_EMPLOYEE_INFO; |
成功,且不含 SALARY 列 |
| T05 | app_user | CALL SYSDBA.P_UPDATE_SALARY(1001, 13000.00); |
失败(EXECUTE 已回收) |
| T06 | app_user | CREATE TABLE T1(ID INT); |
失败(无 CREATE TABLE) |
| T07 | audit_admin | SELECT * FROM V$AUDITRECORDS; |
成功(审计角色) |
| T08 | audit_admin | SELECT * FROM SYSDBA.EMPLOYEES; |
失败(无业务对象权限) |
| T09 | app_user | 对 EMPLOYEES 执行越权 UPDATE | 失败,且被审计记录 |
(1)以 app_user 登录,验证只读权限
conn app_user/"App@2026Dm"@DMTEST
-- T01:只读查询成功
SELECT * FROM SYSDBA.EMPLOYEES;
-- T02/T03:写操作被拒绝
INSERT INTO SYSDBA.EMPLOYEES VALUES (1003, '王五', 10, 8000.00);
UPDATE SYSDBA.EMPLOYEES SET SALARY = 20000.00 WHERE EMP_ID = 1001;
-- T04:通过视图查询成功,且视图不暴露 SALARY 字段
SELECT * FROM SYSDBA.V_EMPLOYEE_INFO;
-- T05:执行存储过程被拒绝(EXECUTE 已回收)
CALL SYSDBA.P_UPDATE_SALARY(1001, 13000.00);
-- T06:无系统权限,创建表被拒绝
CREATE TABLE T1 (ID INT);
(2)以 audit_admin 登录,验证职责分离
conn audit_admin/"Audit@2026Dm"@DMTEST
-- T07:审计管理员可以查看审计记录
SELECT USERNAME, OPERATION, SUCC_FLAG, SQL_TEXT, OPTIME
FROM V$AUDITRECORDS
ORDER BY OPTIME DESC;
-- T08:审计管理员无业务对象权限
SELECT * FROM SYSDBA.EMPLOYEES; -- 预期:权限不足
-- 使用 app_user 尝试越权:删除数据、查询审计规则、查询其他用户对象
DELETE FROM SYSDBA.EMPLOYEES WHERE EMP_ID = 1001; -- 预期:权限不足
SELECT * FROM SYSAUDITOR.SYSAUDIT; -- 预期:权限不足
SELECT * FROM DBA_USERS; -- 预期:权限不足
结论:app_user 仅能访问被明确授权的对象,所有越权尝试均被数据库权限机制拒绝,权限控制生效。
使用 SYSAUDITOR 登录并查询审计记录:
conn SYSAUDITOR/SYSAUDITOR@DMTEST
-- 查看 app_user 相关操作(成功与被拒绝的操作均应有记录)
SELECT USERNAME, IP, OPERATION, OBJNAME, SUCC_FLAG, SQL_TEXT, OPTIME
FROM V$AUDITRECORDS
WHERE USERNAME = 'APP_USER'
ORDER BY OPTIME DESC;
-- 查看敏感表相关操作
SELECT USERNAME, OPERATION, OBJNAME, SUCC_FLAG, SQL_TEXT, OPTIME
FROM V$AUDITRECORDS
WHERE OBJNAME = 'EMPLOYEES'
ORDER BY OPTIME DESC;
-- 查看用户管理类操作
SELECT USERNAME, OPERATION, SUCC_FLAG, SQL_TEXT, OPTIME
FROM V$AUDITRECORDS
WHERE SQL_TEXT LIKE '%CREATE USER%'
OR SQL_TEXT LIKE '%GRANT%'
OR SQL_TEXT LIKE '%REVOKE%'
ORDER BY OPTIME DESC;
预期结果:T01-T09 对应的成功与失败操作均生成审计记录,SUCC_FLAG 字段可区分成功/失败;说明审计策略(ALL 时机)覆盖了正常访问与越权尝试。
| 检查项 | 检查命令 | 期望结果 | 状态 |
|---|---|---|---|
| 管理账号连接 | SELECT USER AS 当前用户; |
SYSDBA/SYSAUDITOR 按职责分离登录 | ☐ |
| 用户清单 | SELECT USERNAME, ACCOUNT_STATUS FROM DBA_USERS; |
仅有需要的用户,无多余账号 | ☐ |
| 角色清单 | SELECT ROLE FROM DBA_ROLES; |
业务角色与管理角色分工明确 | ☐ |
| 用户-角色关系 | SELECT * FROM DBA_ROLE_PRIVS; |
无用户被授予多余角色 | ☐ |
| 系统权限 | SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE='APP_USER'; |
无 DBA/CREATE TABLE 等多余权限 | ☐ |
| 对象权限 | SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE IN ('APP_USER','DATA_READER_ROLE'); |
权限与角色职责匹配 | ☐ |
| 密码复杂度 | SELECT PARA_VALUE FROM V$DM_INI WHERE PARA_NAME='PWD_POLICY'; |
31(或企业要求值) | ☐ |
| 密码有效期 | SELECT A.USERNAME,B.LIFE_TIME FROM ALL_USERS A,SYSUSERS B WHERE A.USER_ID=B.ID; |
有效期符合企业规定(如 90 天) | ☐ |
| 登录失败锁定 | SELECT A.USERNAME,B.LOCK_TIME,B.FAILED_ATTEMPS FROM ALL_USERS A,SYSUSERS B WHERE A.USER_ID=B.ID; |
失败 5 次锁定 10 分钟(按企业要求) | ☐ |
| 审计开关 | SELECT PARA_VALUE FROM V$DM_INI WHERE PARA_NAME='ENABLE_AUDIT'; |
1 | ☐ |
| 审计策略 | SELECT * FROM SYSAUDITOR.SYSAUDIT; |
覆盖表访问、敏感表、用户管理操作 | ☐ |
| 审计记录 | SELECT COUNT(*) FROM V$AUDITRECORDS; |
有对应操作记录,可追溯 | ☐ |
| PROFILE 管理 | SELECT USERNAME, PROFILE FROM DBA_USERS; |
相关用户已关联安全策略文件 | ☐ |
以下脚本按章节顺序整合,可整体保存为
security_practice.sql,通过disql执行(start security_practice.sql)。
-- ============================================
-- 达梦数据库安全合规实践完整脚本
-- 适用:DM8,使用 SYSDBA 连接 DMTEST 实例
-- ============================================
-- ========== 第一章 环境准备 ==========
-- disql /nolog
-- conn SYSDBA/SYSDBA@DMTEST
SELECT USER AS 当前用户;
SELECT * FROM V$VERSION;
-- ========== 第二、三章 用户与角色 ==========
CREATE USER IF NOT EXISTS app_user IDENTIFIED BY "App@2026Dm"
PASSWORD_POLICY 31 ACCOUNT UNLOCK
LIMIT FAILED_LOGIN_ATTEMPTS 5, PASSWORD_LOCK_TIME 10;
CREATE USER IF NOT EXISTS audit_admin IDENTIFIED BY "Audit@2026Dm"
PASSWORD_POLICY 31 ACCOUNT UNLOCK;
CREATE ROLE IF NOT EXISTS data_reader_role;
CREATE ROLE IF NOT EXISTS data_writer_role;
CREATE ROLE IF NOT EXISTS security_admin_role;
GRANT CREATE USER, ALTER USER, DROP USER, CREATE ROLE, DROP ROLE
TO security_admin_role;
GRANT security_admin_role TO audit_admin;
-- ========== 第四章 测试对象与对象权限 ==========
CREATE TABLE SYSDBA.DEPARTMENTS (
DEPT_ID INT NOT NULL,
DEPT_NAME VARCHAR(100) NOT NULL,
CONSTRAINT PK_DEPT PRIMARY KEY (DEPT_ID)
);
CREATE TABLE SYSDBA.EMPLOYEES (
EMP_ID INT NOT NULL,
EMP_NAME VARCHAR(50) NOT NULL,
DEPT_ID INT,
SALARY DECIMAL(10,2),
CONSTRAINT PK_EMP PRIMARY KEY (EMP_ID)
);
INSERT INTO SYSDBA.DEPARTMENTS VALUES (10, '研发部');
INSERT INTO SYSDBA.DEPARTMENTS VALUES (20, '市场部');
INSERT INTO SYSDBA.EMPLOYEES VALUES (1001, '张三', 10, 12000.00);
INSERT INTO SYSDBA.EMPLOYEES VALUES (1002, '李四', 20, 9000.00);
COMMIT;
CREATE OR REPLACE VIEW SYSDBA.V_EMPLOYEE_INFO AS
SELECT EMP_ID, EMP_NAME, DEPT_ID FROM SYSDBA.EMPLOYEES;
CREATE OR REPLACE PROCEDURE SYSDBA.P_UPDATE_SALARY(
IN P_EMP_ID INT,
IN P_NEW_SALARY DECIMAL(10,2)
)
AS
BEGIN
UPDATE SYSDBA.EMPLOYEES SET SALARY = P_NEW_SALARY WHERE EMP_ID = P_EMP_ID;
COMMIT;
END;
GRANT SELECT ON SYSDBA.EMPLOYEES TO data_reader_role;
GRANT SELECT ON SYSDBA.DEPARTMENTS TO data_reader_role;
GRANT INSERT, UPDATE, DELETE ON SYSDBA.EMPLOYEES TO data_writer_role;
GRANT INSERT, UPDATE, DELETE ON SYSDBA.DEPARTMENTS TO data_writer_role;
GRANT SELECT ON SYSDBA.V_EMPLOYEE_INFO TO data_reader_role;
GRANT SELECT ON SYSDBA.V_EMPLOYEE_INFO TO app_user;
GRANT EXECUTE ON SYSDBA.P_UPDATE_SALARY TO data_writer_role;
GRANT SELECT (EMP_ID, EMP_NAME) ON SYSDBA.EMPLOYEES TO audit_admin;
GRANT data_reader_role TO app_user;
GRANT data_writer_role TO app_user;
-- WITH GRANT OPTION 演示与回收
GRANT SELECT ON SYSDBA.EMPLOYEES TO app_user WITH GRANT OPTION;
REVOKE SELECT ON SYSDBA.EMPLOYEES FROM app_user;
REVOKE data_writer_role FROM app_user;
-- ========== 第五章 系统权限 ==========
GRANT CREATE TABLE, CREATE VIEW, CREATE PROCEDURE, CREATE SESSION TO app_user;
GRANT CONNECT TO app_user;
GRANT RESOURCE TO app_user;
-- GRANT DBA TO app_user; -- 仅演示用,生产严禁
REVOKE CREATE TABLE FROM app_user;
REVOKE CREATE VIEW, CREATE PROCEDURE FROM app_user;
REVOKE CREATE SESSION FROM app_user;
REVOKE RESOURCE FROM app_user;
REVOKE CONNECT FROM app_user;
-- ========== 第六章 审计(使用 SYSAUDITOR 执行) ==========
-- conn SYSAUDITOR/SYSAUDITOR@DMTEST
SP_SET_ENABLE_AUDIT(1);
SP_AUDIT_STMT('SELECT TABLE', 'APP_USER', 'ALL');
SP_AUDIT_STMT('INSERT TABLE', 'APP_USER', 'ALL');
SP_AUDIT_STMT('UPDATE TABLE', 'APP_USER', 'ALL');
SP_AUDIT_STMT('DELETE TABLE', 'APP_USER', 'ALL');
SP_AUDIT_OBJECT('SELECT', 'NULL', 'SYSDBA', 'EMPLOYEES', 'ALL');
SP_AUDIT_OBJECT('INSERT', 'NULL', 'SYSDBA', 'EMPLOYEES', 'ALL');
SP_AUDIT_OBJECT('UPDATE', 'NULL', 'SYSDBA', 'EMPLOYEES', 'ALL');
SP_AUDIT_OBJECT('DELETE', 'NULL', 'SYSDBA', 'EMPLOYEES', 'ALL');
SP_AUDIT_STMT('USER', 'NULL', 'ALL');
SP_AUDIT_STMT('ROLE', 'NULL', 'ALL');
SP_AUDIT_STMT('GRANT', 'NULL', 'ALL');
SP_AUDIT_STMT('REVOKE', 'NULL', 'ALL');
SP_AUDIT_STMT('CONNECT', 'NULL', 'ALL');
SELECT * FROM SYSAUDITOR.SYSAUDIT;
SELECT * FROM V$AUDITRECORDS;
-- ========== 第七章 密码策略加固(SYSDBA 执行) ==========
SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME = 'PWD_POLICY';
SP_SET_PARA_VALUE(1, 'PWD_POLICY', 31);
ALTER USER app_user LIMIT PASSWORD_LIFE_TIME 90, PASSWORD_GRACE_TIME 7;
ALTER USER app_user LIMIT FAILED_LOGIN_ATTEMPTS 5, PASSWORD_LOCK_TIME 10;
CREATE PROFILE SECURE_PROFILE LIMIT
FAILED_LOGIN_ATTEMPTS 5,
PASSWORD_LOCK_TIME 10,
PASSWORD_LIFE_TIME 90,
PASSWORD_GRACE_TIME 7,
CONNECT_IDLE_TIME 30;
ALTER USER app_user PROFILE SECURE_PROFILE;
ALTER USER audit_admin PROFILE SECURE_PROFILE;
-- ========== 第八章 综合验证 ==========
-- conn app_user/"App@2026Dm"@DMTEST
SELECT * FROM SYSDBA.EMPLOYEES;
SELECT * FROM SYSDBA.V_EMPLOYEE_INFO;
-- 以下均预期失败(越权测试)
-- INSERT INTO SYSDBA.EMPLOYEES VALUES (1003, '王五', 10, 8000.00);
-- UPDATE SYSDBA.EMPLOYEES SET SALARY = 20000.00 WHERE EMP_ID = 1001;
-- DELETE FROM SYSDBA.EMPLOYEES WHERE EMP_ID = 1001;
-- CREATE TABLE T1 (ID INT);
-- conn SYSAUDITOR/SYSAUDITOR@DMTEST
SELECT USERNAME, IP, OPERATION, OBJNAME, SUCC_FLAG, SQL_TEXT, OPTIME
FROM V$AUDITRECORDS
WHERE USERNAME = 'APP_USER'
ORDER BY OPTIME DESC;
清理脚本(实验结束后可选执行):
-- 关闭审计并清理审计策略(SYSAUDITOR)
SP_SET_ENABLE_AUDIT(0);
SP_NOAUDIT_STMT('SELECT TABLE', 'APP_USER', 'ALL');
SP_NOAUDIT_STMT('INSERT TABLE', 'APP_USER', 'ALL');
SP_NOAUDIT_STMT('UPDATE TABLE', 'APP_USER', 'ALL');
SP_NOAUDIT_STMT('DELETE TABLE', 'APP_USER', 'ALL');
SP_NOAUDIT_STMT('USER', 'NULL', 'ALL');
SP_NOAUDIT_STMT('ROLE', 'NULL', 'ALL');
SP_NOAUDIT_STMT('GRANT', 'NULL', 'ALL');
SP_NOAUDIT_STMT('REVOKE', 'NULL', 'ALL');
SP_NOAUDIT_STMT('CONNECT', 'NULL', 'ALL');
SP_NOAUDIT_OBJECT('SELECT', 'NULL', 'SYSDBA', 'EMPLOYEES', 'ALL');
SP_NOAUDIT_OBJECT('INSERT', 'NULL', 'SYSDBA', 'EMPLOYEES', 'ALL');
SP_NOAUDIT_OBJECT('UPDATE', 'NULL', 'SYSDBA', 'EMPLOYEES', 'ALL');
SP_NOAUDIT_OBJECT('DELETE', 'NULL', 'SYSDBA', 'EMPLOYEES', 'ALL');
-- 删除测试对象与账号(SYSDBA,注意先回收权限)
DROP PROCEDURE SYSDBA.P_UPDATE_SALARY;
DROP VIEW SYSDBA.V_EMPLOYEE_INFO;
DROP TABLE SYSDBA.EMPLOYEES;
DROP TABLE SYSDBA.DEPARTMENTS;
REVOKE security_admin_role FROM audit_admin;
DROP USER audit_admin;
DROP USER app_user;
DROP ROLE security_admin_role;
DROP ROLE data_writer_role;
DROP ROLE data_reader_role;
B.1 用户与角色
-- 所有用户及其状态
SELECT USERNAME, ACCOUNT_STATUS, CREATED FROM DBA_USERS;
-- 所有角色
SELECT ROLE FROM DBA_ROLES;
-- 用户与角色关系
SELECT * FROM DBA_ROLE_PRIVS;
B.2 权限视图
-- 用户/角色拥有的系统权限
SELECT * FROM DBA_SYS_PRIVS;
-- 用户/角色拥有的对象权限(可查看是否含 GRANT OPTION)
SELECT GRANTEE, OWNER, TABLE_NAME, PRIVILEGE, GRANTABLE
FROM DBA_TAB_PRIVS;
-- 指定用户的全部权限汇总
SELECT 'SYS' AS PRIV_TYPE, PRIVILEGE AS PRIV_NAME
FROM DBA_SYS_PRIVS WHERE GRANTEE = 'APP_USER'
UNION ALL
SELECT 'OBJ', OWNER || '.' || TABLE_NAME || ':' || PRIVILEGE
FROM DBA_TAB_PRIVS WHERE GRANTEE = 'APP_USER'
UNION ALL
SELECT 'ROLE', GRANTED_ROLE
FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'APP_USER';
B.3 安全相关参数
-- 密码策略与审计开关
SELECT PARA_NAME, PARA_VALUE
FROM V$DM_INI
WHERE PARA_NAME IN ('PWD_POLICY', 'ENABLE_AUDIT', 'AUDIT_MAX_FILE_SIZE');
-- 全部含 PWD/AUDIT/LOCK 的关键参数
SELECT * FROM V$PARAMETER
WHERE NAME LIKE '%PWD%' OR NAME LIKE '%AUDIT%' OR NAME LIKE '%LOCK%';
B.4 审计信息
-- 已配置的审计规则
SELECT * FROM SYSAUDITOR.SYSAUDIT;
-- 审计记录(按时间倒序)
SELECT * FROM V$AUDITRECORDS ORDER BY OPTIME DESC;
-- 审计记录数量统计(按用户)
SELECT USERNAME, COUNT(*) AS 审计记录数
FROM V$AUDITRECORDS
GROUP BY USERNAME
ORDER BY 审计记录数 DESC;
B.5 用户资源限制与口令策略
-- 口令有效期、宽限期、锁定时间、失败次数、空闲超时
SELECT A.USERNAME,
B.LIFE_TIME AS 密码有效期_天,
B.GRACE_TIME AS 宽限期_天,
B.LOCK_TIME AS 锁定时间_分钟,
B.FAILED_ATTEMPS AS 失败次数,
B.CONN_IDLE_TIME AS 空闲超时_分钟
FROM ALL_USERS A, SYSUSERS B
WHERE A.USER_ID = B.ID;
-- 用户口令策略值
SELECT USERNAME, PWD_POLICY FROM SYSUSERS;
注:
SYSUSERS部分字段名在不同 DM8 小版本中略有差异(如FAILED_ATTEMPS/FAILED_NUM),查询时可先执行DESC SYSUSERS;确认实际字段。
文章
阅读量
获赞
