注册
DM用户权限与加固实验
专栏/技术分享/ 文章详情 /

DM用户权限与加固实验

JcRapunzel 2026/09/18 431 0 0
摘要

DM用户权限与加固

文档版本:V1.0
适用产品:达梦数据库 DM8(语法与 DM9 基本兼容)
适用对象:数据库管理员、安全管理员、审计管理员、开发与运维人员
文档目标:以可复现的实验流程,讲解达梦数据库“最小权限、角色管理、权限精确授予、审计、密码策略加固”等安全合规操作,每个步骤均提供 SQL 命令示例与验证方法


文档说明

环境前提

  • 已安装并启动达梦数据库实例 DMTEST,默认端口 5236。
  • 可用的管理账号:SYSDBA(系统管理员,具备 DBA 权限)、SYSAUDITOR(审计管理员)。
  • 达梦安装目录 bin 目录下存在命令行工具 disql。
  • 客户端已配置服务名 DMTEST(如未配置,连接时可直接使用 IP:端口 形式)。

重要提示

  1. 达梦数据库遵循三权分立安全模型:SYSDBA(系统管理)、SYSSSO(安全保密)、SYSAUDITOR(安全审计)。本指南除审计章节外,默认使用 SYSDBA 执行管理操作;审计策略配置使用 SYSAUDITOR。
  2. 本文所有口令均为演示用途(如 App@2026Dm),生产环境请使用符合企业密码策略的强口令并及时更换。
  3. 涉及 DBA、RESOURCE 等预定义角色的授予仅用于教学演示,生产环境务必遵循最小权限原则谨慎操作。
  4. 不同 DM8 小版本在个别拼写(如 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;


第一章 环境准备与连接

1.1 操作目标

  • 掌握使用 disql 工具以 /nolog 方式启动会话。
  • 掌握使用 conn 命令连接到 DMTEST 实例。
  • 确认当前登录账号具备 DBA 权限,并了解查看版本与当前用户的方法。

1.2 操作步骤

步骤 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

1.3 验证方法

验证项 验证命令 预期结果
当前用户 SELECT USER AS 当前用户; 返回 SYSDBA
版本信息 SELECT * FROM V$VERSION; 显示达梦数据库版本号
权限自查 SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE='SYSDBA'; 显示 SYSDBA 拥有的角色(含 DBA),说明具备 DBA 权限

image-20260807131612773


第二章 最小权限原则实施

2.1 最小权限原则核心思想

最小权限原则(Least Privilege Principle) 是指:任何用户、角色或应用程序,只应被授予完成其工作任务所必需的最少权限,且权限在任务结束后应及时回收。

落地要点:

  • 默认拒绝:不主动授予多余权限,权限按需申请。
  • 权限最小化:只读业务只授 SELECT,写业务才授 INSERT/UPDATE/DELETE。
  • 职责分离:业务操作员、安全管理员、审计管理员分别使用独立账号。
  • 集中管理:通过**角色(Role)**聚合权限,避免逐人逐项授权,便于统一维护与回收。
  • 定期审查:周期性检查授权情况,清理无效账号与过期权限。

2.2 操作目标

  • 掌握创建新用户并设置初始密码的方法。
  • 掌握通过角色机制实现权限的集中管理与分配。

2.3 操作步骤

步骤 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';

image-20260810161318496

2.4 验证方法

  1. 使用 app_user 连接后,尝试查询已授权对象:
conn app_user/"App@2026Dm":5236 SELECT * FROM SYSDBA.EMPLOYEES;
  1. 尝试执行未授权的写操作,应被拒绝(当前阶段 app_user 仅拥有 SELECT):
INSERT INTO SYSDBA.EMPLOYEES VALUES (1003, '王五', 10, 8000.00); -- 预期报错:权限不足 / 无 INSERT 权限

image-20260810161406793


第三章 用户与角色管理实践

3.1 操作目标

  • 创建测试用户 app_user(应用程序用户)与 audit_admin(审计管理员)。
  • 创建业务角色 data_reader_role(只读)、data_writer_role(读写)。
  • 创建管理角色 security_admin_role(安全管理员角色)。
  • 掌握用户管理的常用命令:创建、修改、锁定、解锁、删除。

3.2 创建测试用户

使用 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 后重建。

3.3 创建业务角色

-- 只读角色:只读业务数据的角色 CREATE ROLE IF NOT EXISTS data_reader_role; -- 读写角色:需要写入业务数据的角色 CREATE ROLE IF NOT EXISTS data_writer_role;

业务角色包含的对象权限将在第四章详细授予,此处先完成角色定义。

3.4 创建管理角色

-- 安全管理员角色:负责用户与角色的日常管理 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;

3.5 用户管理命令汇总

(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;

3.6 角色管理命令补充

-- 启用/禁用角色(1 启用,0 禁用;需 ADMIN_ANY_ROLE 权限) SP_SET_ROLE('data_reader_role', 1); -- 删除角色(先回收该角色在用户身上的授予) REVOKE data_reader_role FROM app_user; DROP ROLE data_reader_role;

3.7 验证方法

-- 查看用户是否创建成功及账号状态 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 角色。


第四章 对象权限精确授予

4.1 操作目标

  • 创建测试表、视图、存储过程作为权限授予载体。
  • 使用 GRANT 命令精确授予表权限(SELECT、INSERT、UPDATE、DELETE)。
  • 演示视图权限与存储过程执行权限的授予。
  • 演示 WITH GRANT OPTION 的使用场景与风险。
  • 使用 REVOKE 命令回收权限。

4.2 创建测试对象

使用 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;

4.3 表权限精确授予

-- 只读角色:仅授予 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)),实现更细粒度的最小权限控制。

4.4 视图权限的授予

-- 授予视图查询权限(视图本身已隐藏 SALARY 等敏感列) GRANT SELECT ON SYSDBA.V_EMPLOYEE_INFO TO data_reader_role; GRANT SELECT ON SYSDBA.V_EMPLOYEE_INFO TO app_user;

说明:通过视图授权可以做到“底层表不直接暴露、敏感列不出现”,是对敏感数据访问控制的重要手段。视图权限授予后,用户在查询时无需对底层表拥有权限。

4.5 存储过程执行权限的授予

-- 授予存储过程执行权限(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 前必须审查过程体逻辑,避免“借道提权”。

4.6 WITH GRANT OPTION 的使用场景与风险提示

适用场景:需要由某用户/角色代为向下属账号转发权限的受控场景(如业务模块负责人统一分配只读权限)。

-- 授予 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 操作,及时发现异常转授。

4.7 使用 REVOKE 回收权限

-- 回收直接授予用户的表权限(级联回收其转授权限) 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;

4.8 验证方法

-- 查看对象的授权情况(含被授权者、权限类型、是否可转授) 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, '财务部'); -- 失败:读写角色已被回收

第五章 系统权限管理

5.1 操作目标

  • 演示常用系统权限的授予:CREATE TABLE、CREATE VIEW、CREATE PROCEDURE、CREATE SESSION。
  • 演示预定义角色 DBA、RESOURCE、CONNECT 的授予。
  • 演示系统权限的回收。

5.2 常用系统权限授予

-- 授予 app_user 创建表、视图、存储过程以及登录会话的权限 GRANT CREATE TABLE, CREATE VIEW, CREATE PROCEDURE, CREATE SESSION TO app_user; -- 按角色集中授予系统权限(如将建表能力授予写角色) GRANT CREATE TABLE TO data_writer_role;

说明:CREATE SESSION 是允许用户登录数据库的会话权限;若回收该权限,用户将无法建立连接。业务用户应按需获得 DDL 权限,生产环境建议默认不授予。

5.3 预定义角色授予

-- 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 权限,均与最小权限原则相悖,本小节仅作语法演示,实际生产应逐项精确授权。

5.4 系统权限的回收

-- 回收单个系统权限 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;

5.5 验证方法

-- 查看用户拥有的系统权限 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 后预期报错:权限不足

第六章 审计功能配置

6.1 操作目标

  • 启用达梦数据库审计功能(ENABLE_AUDIT=1)。
  • 创建三类审计策略:app_user 表访问审计、敏感表 employees 访问审计、用户管理操作审计。
  • 查询审计结果(V$AUDITRECORDS 动态视图与 SYSAUDITOR.SYSAUDIT 审计规则表)。

重要说明:达梦遵循三权分立,审计策略的配置与审计记录查询应使用审计管理员 SYSAUDITOR(或拥有 AUDIT DATABASE 权限的用户)登录执行;SYSDBA 不负责审计配置。

6.2 启用审计功能

使用 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_ 开头的审计日志文件。

6.3 策略一:对 app_user 用户的表访问进行审计

-- 对 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');

6.4 策略二:对敏感表 employees 的访问进行审计

-- 对所有用户('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' 表示对所有用户生效。

6.5 策略三:对用户管理操作进行审计

-- 审计创建/修改/删除用户(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');

6.6 查询审计结果

-- 查看已配置的审计规则 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 可查看全部字段。

6.7 取消审计与审计文件管理

-- 取消语句级审计(必须与设置时完全匹配) 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);

6.8 验证方法

  1. 确认 ENABLE_AUDIT=1:
SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME = 'ENABLE_AUDIT';
  1. 执行一次被审计的操作(如 app_user 查询 SYSDBA.EMPLOYEES),随后查询审计记录,确认对应记录已生成。
  2. 故意执行一次越权操作(如 app_user 对 EMPLOYEES 执行 UPDATE),确认失败操作同样被 FAIL/ALL 策略记录。

第七章 密码策略安全加固

7.1 操作目标

  • 设置密码复杂度策略:PWD_POLICY 参数配置。
  • 设置密码有效期:PWD_LIFE_TIME。
  • 设置登录失败锁定策略:FAILED_LOGIN_ATTEMPTS 与 PASSWORD_LOCK_TIME。
  • 演示 ALTER PROFILE 命令统一管理用户安全策略。
  • 验证密码策略生效。

7.2 密码复杂度策略:PWD_POLICY

查看当前密码策略:

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";

7.3 密码有效期:PWD_LIFE_TIME

-- 设置 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 为口令过期后的宽限期(天),宽限期内仍可登录但会被提示改密。

7.4 登录失败锁定:FAILED_LOGIN_ATTEMPTS 与 PASSWORD_LOCK_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 单位为分钟。

7.5 使用 ALTER PROFILE 统一管理用户安全策略

当多个用户需要相同安全策略时,可通过 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 逐项设置。

7.6 验证密码策略生效

验证 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";

第八章 综合验证与测试

8.1 操作目标

  • 切换不同用户,验证权限隔离效果。
  • 执行越权操作,验证权限控制是否生效。
  • 查看审计日志,确认审计记录正常生成。
  • 输出最终安全配置检查清单。

8.2 测试用例总览

编号 测试用户 测试操作 预期结果
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 失败,且被审计记录

8.3 权限隔离验证

(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; -- 预期:权限不足

8.4 越权操作测试

-- 使用 app_user 尝试越权:删除数据、查询审计规则、查询其他用户对象 DELETE FROM SYSDBA.EMPLOYEES WHERE EMP_ID = 1001; -- 预期:权限不足 SELECT * FROM SYSAUDITOR.SYSAUDIT; -- 预期:权限不足 SELECT * FROM DBA_USERS; -- 预期:权限不足

结论:app_user 仅能访问被明确授权的对象,所有越权尝试均被数据库权限机制拒绝,权限控制生效。

8.5 审计日志核验

使用 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 时机)覆盖了正常访问与越权尝试。

8.6 最终安全配置检查清单

检查项 检查命令 期望结果 状态
管理账号连接 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; 相关用户已关联安全策略文件 ☐

附录 A 完整 SQL 脚本汇总

以下脚本按章节顺序整合,可整体保存为 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 常用安全配置查询 SQL

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; 确认实际字段。


评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服