注册
安全加固实践流程(Windows 单机版)
专栏/技术分享/ 文章详情 /

安全加固实践流程(Windows 单机版)

JcRapunzel 2026/09/18 309 0 0
摘要

0. 使用说明(先读)

▶ 占位符:<…> 表示需按实际环境替换的值(如密码、IP、路径、用户名)。
▶ 环境约定:DM_HOME=D:\dmdbms(DM8 Windows 安装目录),数据目录 D:\dmdata;示例端口 5236/5237。
▶ 两条路线:
 路线 A(推荐):新建“国密测试”专用实例,可做全库加密,不破坏现有环境,可随时删除重建;
 路线 B:在已有实例上加固,全库加密在建库时才能指定,改用表空间/列加密。
▶ 执行身份:修改 INI 参数用 SYSDBA;开启审计/加审计规则用 SYSAUDITOR(DBA 权限无法开启审计)。
▶ 涉及 INI 参数的修改,除注明动态外,均为静态参数,需重启服务生效。

1. 环境准备与安装

1.1 安装 DM8(Windows 版)至 D:\dmdbms,完成默认实例初始化。
1.2 确认 OPENSSL 国密算法动态库就绪:检查 D:\dmdbms\bin\dependencies 下存在 libcrypto-3-x64.dll、libssl-3-x64.dll。
1.3 确认国密算法已注册(首次连接后执行):

disql SYSDBA/<密码>@localhost:5236
SELECT * FROM V$EXTERNAL_CIPHERS;
-- 期望结果:OPENSSL_SM4_ECB/CBC/CFB/OFB、OPENSSL_SM4_ECB_NOPAD/CBC_NOPAD/CFB_V1/OFB_V1、OPENSSL_SM3,VALID 均为 Y

1.4 禁止 DM 以管理员权限运行(对应加固说明 2.1;原 Linux 命令 groupadd/useradd 不适用于 Windows):
 · 在 Windows 中为 DM 服务创建专用低权限账户(控制面板→管理工具→服务→DM 服务→登录→此账户),
 · 并设置数据目录(D:\dmdata)NTFS 权限仅授予该账户与管理员,避免以 Administrator 身份运行数据库服务。

2. 建库(路线 A:国密全库加密)

2.1 (可选)为避免与默认实例冲突,测试实例使用独立端口 5237。
2.2 初始化国密加密库(全库加密、日志加密、页分片):

cd D:\dmdbms\bin
dminit PATH=D:\dmdata\DMGM PAGE_SIZE=16 CASE_SENSITIVE=Y CHARSET=1 \
       SYSDBA_PWD=<强口令> SYSAUDITOR_PWD=<强口令> \
       ENCRYPT_NAME=OPENSSL_SM4_CBC RLOG_ENCRYPT_NAME=OPENSSL_SM4_CBC PAGE_ENC_SLICE_SIZE=4096

-- 参数含义:
-- ENCRYPT_NAME:全库加密算法(国密 SM4;已实测 OPENSSL_SM4_CBC 的 EXTEND_SIZE=16,满足全库加密限制,可用)
-- RLOG_ENCRYPT_NAME:联机日志/归档日志加密算法(国密 SM4)
-- PAGE_ENC_SLICE_SIZE:页加密分片大小,可选 0/512/4096 字节;注意:非0 时表空间加密仅支持 CFB_V1/OFB_V1

2.3 注册并启动服务(dminit 初始化成功后可自动注册服务 DmServiceDMGM):

net start DmServiceDMGM

2.4 验证全库加密已生效:

disql SYSDBA/<密码>@localhost:5237
SELECT SF_GET_ENCRYPT_NAME();          -- 期望返回 OPENSSL_SM4_CBC
SELECT SF_GET_PARA_VALUE(2,'RLOG_ENC_ID');  -- 日志加密算法 ID

注意:注:若走路线 B(已有实例),跳过本章,全库加密不可后补,改用第 6 章表空间/列加密。

3. 账号与口令加固

3.1 密码强度策略(PWD_POLICY=31 = 禁止与用户名相同 1 + 长度≥9 的 2 + 大写 4 + 数字 8 + 标点 16):

SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME='PWD_POLICY';  -- 查看
ALTER SYSTEM SET 'PWD_POLICY'=31 BOTH;   -- 修改(只对新用户生效)
-- 等价写法:SP_SET_PARA_VALUE(1,'PWD_POLICY',31);

3.2 密码过期策略(有效期 90 天、宽限期 30 天):

SELECT A.USERNAME, B.LIFE_TIME, B.GRACE_TIME FROM ALL_USERS A, SYSUSERS B WHERE A.USER_ID=B.ID;  -- 查看
ALTER USER <用户名> LIMIT PASSWORD_LIFE_TIME 90, PASSWORD_GRACE_TIME 30;

3.3 创建最小权限业务账号(避免业务直连 SYSDBA):

CREATE USER app_user IDENTIFIED BY "<强口令>";
GRANT CREATE SESSION, CREATE TABLE TO app_user;   -- 按业务最小授权

3.4 修改所有内置管理员默认口令(SYSDBA / SYSSSO / SYSAUDITOR 等),并遵守 PWD_POLICY 策略。

4. 访问控制加固

4.1 登录来源 IP 控制:

SELECT A.USERNAME, B.ALLOW_ADDR FROM ALL_USERS A, SYSUSERS B WHERE A.USER_ID=B.ID;  -- 查看
ALTER USER "<用户名>" ALLOW_IP "<IP地址>";   -- 仅允许指定 IP 登录

4.2 登录失败处理(失败 3 次锁定 1 分钟、空闲 30 分钟断开):

SELECT A.USERNAME, B.FAILED_ATTEMPS, B.LOCK_TIME, B.CONN_IDLE_TIME FROM ALL_USERS A, SYSUSERS B WHERE A.USER_ID=B.ID;  -- 查看
ALTER USER <用户名> LIMIT FAILED_LOGIN_ATTEMPS 3, PASSWORD_LOCK_TIME 1, CONNECT_IDLE_TIME 30;

5. 通信加密(国密)

5.1 应用层消息包加密(推荐首选:无需任何证书即可使用国密 SM4):

-- ① 确认可用算法(分组/流加密且非 NOPAD 模式)
SELECT CYT_NAME FROM V$CIPHERS WHERE (CYT_TYPE=1 OR CYT_TYPE=2) AND (WORK_MODE!='ECB_NOPAD' AND WORK_MODE!='CBC_NOPAD');
-- ② 修改参数(静态参数,需重启生效)
ALTER SYSTEM SET 'COMM_ENCRYPT_NAME'='OPENSSL_SM4_CBC' SPFILE;
-- ③ 重启服务
net stop DmServiceDMGM & net start DmServiceDMGM
-- ④ 验证
SELECT * FROM V$PARAMETER WHERE NAME='COMM_ENCRYPT_NAME';   -- 期望 OPENSSL_SM4_CBC

5.2 SSL / 商密 TLCP 通信加密(可选,需证书;ENABLE_ENCRYPT 为静态参数):

-- ENABLE_ENCRYPT 取值:0 不加密;1 双向认证+加密;2 仅认证;4 仅加密;5 单向认证+加密;6 商密 TLCP 认证加密
SP_SET_PARA_VALUE(2,'ENABLE_ENCRYPT',5);        -- 测试推荐:SSL 单向认证+加密
SP_SET_PARA_VALUE(2,'ENABLE_ENCRYPT',6);        -- 国密场景:商密 TLCP(需 SM2 签名/加密证书对)
SP_SET_PARA_VALUE(2,'MIN_SSL_VERSION',0x0303);  -- 最低 TLSv1.2
-- 证书放置:服务器 D:\dmdbms\bin\server_ssl;客户端 D:\dmdbms\bin\client_ssl\<用户名>
-- TLCP 证书:server-enc.crt/server-enc.key/server-sign.crt/server-sign.key(服务器端)
-- 客户端带证书登录:
disql SYSDBA/<密码>@localhost:5237#"{ssl_path=D:\dmdbms\bin\client_ssl\SYSDBA,ssl_pwd=<证书密码>}"
-- 验证:
SELECT para_name, para_value FROM V$DM_INI WHERE para_name='ENABLE_ENCRYPT';
SELECT SESS_ID, USER_NAME, PORT_TYPE FROM V$SESSIONS;   -- PORT_TYPE=7 表示国密 GmSSL 连接

6. 存储加密(国密)

6.1 表空间透明加密(路线 B 首选;已全库加密的库不能再做表空间加密)。
 ⚠ 重要:默认 PAGE_ENC_SLICE_SIZE=4096 时,表空间加密仅支持“不膨胀的流式算法”(EXTEND_SIZE=0 且非 ECB/CBC 模式),
 实测 OPENSSL_SM4_CBC/ECB/CFB/OFB 的 EXTEND_SIZE=16 均不可用,只能选 OPENSSL_SM4_CFB_V1 或 OPENSSL_SM4_OFB_V1:

CREATE TABLESPACE GMTS DATAFILE 'D:\dmdata\DMGM\GMTS.DBF' SIZE 256 ENCRYPT WITH OPENSSL_SM4_CFB_V1 BY "<加密密码>";
CREATE TABLE T_ORD(ORD_ID INT, AMOUNT DEC(18,2)) TABLESPACE GMTS;   -- 业务表放入加密表空间

6.2 表列透明加密(推荐对敏感列;新表建表时直接指定):

-- 新表列加密(身份证号 SM4 加密 + SM3 完整性校验)
CREATE TABLE T_USER(ID INT, NAME VARCHAR(50), CARD VARCHAR(18) ENCRYPT WITH OPENSSL_SM4_CBC HASH WITH OPENSSL_SM3 SALT);
-- 存量表:空表可直接 MODIFY 增加加密属性
ALTER TABLE T_USER MODIFY NAME VARCHAR(50) ENCRYPT WITH OPENSSL_SM4_CBC;
-- 存量表(已有数据):不能直接修改列加密,需新增加密列或建新加密表迁移
ALTER TABLE T_USER ADD CARD2 VARCHAR(18) ENCRYPT WITH OPENSSL_SM4_CBC;   -- 新增加密列
-- 数据迁移示例:CREATE TABLE T_USER_NEW(...加密列...) AS SELECT ... FROM T_USER;

6.3 半透明加密(密评“多用户密文隔离”检测点;本机已实测验证通过)。
 原理:数据用“用户存储加密密钥”加密,密文后附加用户 UID;仅数据归属用户(或按列加密可见列表内用户)查询返回明文,其他用户查得 NULL。
 实施流程如下(每步给出操作与指令)。
 【步骤①】创建带独立存储密钥的用户(前提;不指定 ENCRYPT BY 则 DM 自动生成默认存储密钥):

CREATE USER USER_A IDENTIFIED BY "User_A1!" ENCRYPT BY "Key_A1!";   -- 创建用户并指定独立存储密钥(存储密钥建议满足口令策略)
GRANT DBA TO USER_A;   -- 授权(生产按最小权限原则授权)
ALTER USER <用户名> ENCRYPT BY "<新存储密钥>";   -- 存量用户补/换存储密钥(本机实测支持)

【步骤②】新建表的半透明加密(密评演示推荐做法;算法要求与列透明加密一致,NOPAD/EXTKEY 不可用):

CREATE TABLE T(C1 INT, C2 VARCHAR(50) ENCRYPT WITH OPENSSL_SM4_CBC MANUAL);   -- 半透明加密列(国密 SM4)
CREATE TABLE T(C1 INT, C2 VARCHAR(50) ENCRYPT WITH OPENSSL_SM4_CBC MANUAL HASH WITH OPENSSL_SM3 SALT);   -- 半透明 + SM3 完整性校验
CREATE TABLE T(C1 INT, C2 VARCHAR(50) ENCRYPT WITH OPENSSL_SM4_CBC MANUAL USER (USER01,USER02));   -- 按列加密:仅可见列表用户可见明文

【步骤③】存量表改造(重要结论:半透明加密不能 MODIFY 把已有普通列改为加密列——本机实测报 [-2704] 不支持的 DDL;只能 ADD COLUMN 新增或建新表迁移):

ALTER TABLE T ADD C2_ENC VARCHAR(50) ENCRYPT WITH OPENSSL_SM4_CBC MANUAL;   -- 方式一:新增半透明加密列(老行该列为 NULL)
CREATE TABLE T_NEW(C1 INT, C2 VARCHAR(50) ENCRYPT WITH OPENSSL_SM4_CBC MANUAL);   -- 方式二:建新加密表迁移
INSERT INTO T_NEW SELECT C1, C2 FROM T;   -- ⚠ 迁移数据归属权跟随执行会话用户:必须由最终数据归属用户执行
-- 迁移完成后按需清理原表;半透明加密列不支持 MODIFY 列定义、不支持 REBUILD COLUMNS

【步骤④】隔离效果验证(双用户,密评现场演示证据):

SELECT * FROM USER_A.T;   -- 归属用户 A 查询:明文可见
SELECT * FROM USER_A.T;   -- 非归属用户 B 查询同一表:加密列返回 NULL(非加密列仍可见)——密文隔离验证
UPDATE USER_A.T SET C2='X' WHERE C1=1; COMMIT;   -- B 更新提交后归属权转移:B 可见、A 变 NULL;回滚则恢复原状

【步骤⑤】使用限制(易踩坑):HUGE 表不支持;半透明加密列不能建索引/外键/聚集索引、不能修改列定义、不支持 REBUILD COLUMNS;
 物化视图查询不能涉及;ALTER_TABLE_OPT 限制;半透明字符串列默认不支持超长记录存储;按列加密可见列表缺省/为空时该列对所有用户不可见。
 【步骤⑥】本机实测记录(2026-08-30):GM_SEMI_A/B 双用户验证 SM4_CBC+SM3 半透明表——B 查询加密列全 NULL;B 更新提交后 A 变 NULL、B 可见,与手册 UPDATE 规则一致;按列加密 USER 列表外用户查得 NULL;存量用户 ALTER USER ENCRYPT BY 成功;存量表 ADD COLUMN 成功、MODIFY 失败(-2704)——全部符合预期。
 【步骤⑦】判断存量表是否为半透明表(官方系统表 SYSCOLCYT,本机实测验证):

SELECT O.NAME AS TBL, C.CID, C.ENC_ID, C.ENC_TYPE, C.HASH_ID, C.HASH_TYPE FROM SYSCOLCYT C, SYSOBJECTS O WHERE C.TID=O.ID AND O.TYPE$='SCHOBJ' AND C.ENC_TYPE='M';   -- 全库扫描半透明表(ENC_TYPE:'M'=半透明,'A'=透明)
SELECT C.TID, C.CID, C.ENC_ID, C.ENC_TYPE, C.HASH_ID, C.HASH_TYPE FROM SYSCOLCYT C WHERE C.TID=(SELECT ID FROM SYSOBJECTS WHERE NAME='表名');   -- 判断单表列加密信息
SELECT NAME, INFO2 FROM SYSCOLUMNS WHERE ID=(SELECT ID FROM SYSOBJECTS WHERE NAME='表名');   -- INFO2=16384(0x4000) 表示该列已加密(不区分透明/半透明)
-- 功能验证:以非归属用户执行 SELECT * FROM <归属用户>.<表名>; —— 加密列返回 NULL 即半透明加密(透明加密仍可见明文)

6.4 对象定义加密(存储过程/函数/触发器/包等):

CREATE OR REPLACE PROCEDURE proc_arg WITH ENCRYPTION(a IN INT, b INT) AS BEGIN a:=0; b:=a+1; END;

7. 审计加固

7.1 开启审计(必须使用 SYSAUDITOR 登录执行):

SELECT para_name, para_value FROM v$dm_ini WHERE para_name='ENABLE_AUDIT';  -- 查看
SP_SET_ENABLE_AUDIT(1);   -- 0 关闭;1 普通审计;2 普通+实时审计

7.2 添加核心审计规则(SP_AUDIT_STMT,<用户名> 可改为具体用户或 ALL):

SP_AUDIT_STMT('USER', '<用户名>', 'ALL');             -- 用户创建/修改/删除
SP_AUDIT_STMT('CONNECT', '<用户名>', 'ALL');          -- 登录/登出
SP_AUDIT_STMT('GRANT', '<用户名>', 'ALL');            -- 授权
SP_AUDIT_STMT('REVOKE', '<用户名>', 'ALL');           -- 回收权限
SP_AUDIT_STMT('TABLE', '<用户名>', 'ALL');            -- 建/改/删基表
SP_AUDIT_STMT('INDEX', '<用户名>', 'ALL');            -- 索引 DDL
SP_AUDIT_STMT('VIEW', '<用户名>', 'ALL');             -- 视图 DDL
SP_AUDIT_STMT('PROCEDURE', '<用户名>', 'ALL');        -- 存储模块 DDL
SP_AUDIT_STMT('SELECT TABLE', '<用户名>', 'ALL');     -- 查询
SP_AUDIT_STMT('INSERT TABLE', '<用户名>', 'ALL');     -- 插入
SP_AUDIT_STMT('UPDATE TABLE', '<用户名>', 'ALL');     -- 更新
SP_AUDIT_STMT('DELETE TABLE', '<用户名>', 'ALL');     -- 删除
SP_AUDIT_STMT('EXECUTE PROCEDURE', '<用户名>', 'ALL');-- 调用存储过程/函数

7.3 查看审计记录与审计日志路径:

SELECT * FROM "SYSAUDITOR"."V$AUDITRECORDS";   -- 审计记录(需 SYSAUDITOR)
SELECT * FROM V$DM_INI WHERE PARA_NAME LIKE 'AUD_PATH%';  -- 审计日志文件路径(默认实例目录,AUDIT*.log)

7.4 审计日志定期归档(Windows 计划任务,每日 03:00 拷贝):

schtasks /create /tn "DM_AuditArch" /tr "cmd /c xcopy D:\dmdata\DMGM\AUDIT*.log D:\audit_arch\ /y" /sc daily /st 03:00

8. 备份加密与定时备份

8.0 前置条件:开启归档模式(关键!)。联机备份(库/表空间/归档备份)必须运行在归档模式下,否则报错 [-8003] 缺少本地或者远程归档。
 方式一:联机开启(无需停止服务,ALTER DATABASE MOUNT 会短暂断开所有连接,几秒后恢复 OPEN):

ALTER DATABASE MOUNT;
ALTER DATABASE NORMAL;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE ADD ARCHIVELOG 'DEST = <实例目录>\arch, TYPE = local, FILE_SIZE = 1024, SPACE_LIMIT = 2048, HANG_FLAG = 1';
ALTER DATABASE OPEN;
-- 说明:DEST 归档目录由 DM 自动创建;FILE_SIZE 单归档文件大小(MB),SPACE_LIMIT 归档总空间上限(MB),HANG_FLAG=1 写失败时挂起

方式二:手动配置 dmarch.ini(需停止服务,适合建库初始化时配置)。在 dm.ini 所在目录(即 SYSTEM_PATH)创建 dmarch.ini:

[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = <实例目录>\arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 2048
ARCH_HANG_FLAG = 1
-- 然后编辑 dm.ini 设置 ARCH_INI=1,重启数据库实例
-- 验证(两种方式通用):
SELECT ARCH_MODE FROM V$DATABASE;      -- 期望 Y
SELECT * FROM V$DM_ARCH_INI;           -- 期望 ARCHIVE_LOCAL1 且 ARCH_IS_VALID=Y

8.1 手工全量加密备份(国密 SM4 完全加密;【实测验证通过】本机 DAMENG 实例已成功执行):

BACKUP DATABASE BACKUPSET 'D:\backup\gm_full_01' IDENTIFIED BY "<备份密码>" WITH ENCRYPTION 2 ENCRYPT WITH OPENSSL_SM4_CBC;
-- WITH ENCRYPTION:0 不加密;1 简单加密(仅口令,内容明文);2 完全数据加密(密文存储)
-- 备份集生成 .bak 与 .meta 文件;备份密码按 PWD_POLICY 策略设置

8.2 表空间 / 归档加密备份(【实测验证通过】GM_TEST 表空间 OPENSSL_SM4_CBC 加密备份 9 秒完成):

BACKUP TABLESPACE GMTS BACKUPSET 'D:\backup\gm_ts_01' IDENTIFIED BY "<备份密码>" ENCRYPT WITH OPENSSL_SM4_CBC;
BACKUP ARCHIVELOG ALL BACKUPSET 'D:\backup\gm_arch_01' IDENTIFIED BY "<备份密码>" ENCRYPT WITH OPENSSL_SM4_CBC;
8.3 定时全备(Windows 计划任务,每日 02:00):
schtasks /create /tn "DM_FullBackup" /tr "cmd /c D:\dmdbms\bin\disql.exe SYSDBA/<密码>@localhost:5237 -e \"BACKUP DATABASE BACKUPSET 'D:\backup\gm_daily' IDENTIFIED BY '<备份密码>' WITH ENCRYPTION 2 ENCRYPT WITH OPENSSL_SM4_CBC;\"" /sc daily /st 02:00
8.4 注意事项:① 增量备份的加密密码、类型与算法必须与基备份一致;② 归档开启后日志持续增长,建议定期归档备份并清理(SF_ARCHIVELOG_DELETE_BEFORE_TIME / SF_ARCHIVELOG_DELETE_BEFORE_LSN);③ 定期在隔离环境做 RESTORE 还原演练验证备份可用。

9. 登录用户名密码增强加密(可选)

9.1 生成 RSA 公钥/私钥(dmkey 工具,位于 D:\dmdbms\bin):

dmkey PATH=D:\dmdata pubkey=test.pubkey   -- 生成 test.pubkey 与 dm_login.prikey
dmkey PRIKEY=D:\dmdata\dm_login.prikey   -- 查看私钥信息(校验公私钥匹配)

9.2 服务端配置(私钥放入 SYSTEM_PATH 目录,强制证书加密):

-- dm.ini 中设置 FORCE_CERTIFICATE_ENCRYPTION=1,重启服务

9.3 客户端配置(dm_svc.conf 增加):

LOGIN_CERTIFICATE=(D:\dmdata\test.pubkey)

9.4 UKEY 身份鉴别(可选,需厂商 UKEY 动态库):

disql "SYSDBA/<密码>@LOCALHOST#{UKEY_NAME=<加密引擎名>,UKEY_PIN=<PIN>}"

10. 国密合规验证清单(自查表)

检查项 验证指令 期望结果 状态
国密算法注册 SELECT * FROM V$EXTERNAL_CIPHERS; OPENSSL_SM4 系列与 OPENSSL_SM3 的 VALID=Y □ 通过 / □ 未通过
全库加密 SELECT SF_GET_ENCRYPT_NAME(); 返回 OPENSSL_SM4_CBC(未加密为 NULL) □ 通过 / □ 未通过
口令策略 SELECT PARA_NAME,PARA_VALUE FROM V$DM_INI WHERE PARA_NAME='PWD_POLICY'; 31 □ 通过 / □ 未通过
密码过期 SELECT A.USERNAME,B.LIFE_TIME,B.GRACE_TIME FROM ALL_USERS A,SYSUSERS B WHERE A.USER_ID=B.ID; LIFE_TIME=90, GRACE_TIME=30 □ 通过 / □ 未通过
访问地址控制 SELECT A.USERNAME,B.ALLOW_ADDR FROM ALL_USERS A,SYSUSERS B WHERE A.USER_ID=B.ID; 仅允许配置的 IP □ 通过 / □ 未通过
登录失败处理 SELECT A.USERNAME,B.FAILED_ATTEMPS,B.LOCK_TIME,B.CONN_IDLE_TIME FROM ALL_USERS A,SYSUSERS B WHERE A.USER_ID=B.ID; FAILED_ATTEMPS=3, LOCK_TIME=1, IDLE=30 □ 通过 / □ 未通过
应用层通信加密 SELECT * FROM V$PARAMETER WHERE NAME='COMM_ENCRYPT_NAME'; OPENSSL_SM4_CBC □ 通过 / □ 未通过
SSL/TLCP 通信加密 SELECT para_name,para_value FROM V$DM_INI WHERE para_name='ENABLE_ENCRYPT'; 5(SSL)或 6(TLCP) □ 通过 / □ 未通过
会话连接类型 SELECT SESS_ID,USER_NAME,PORT_TYPE FROM V$SESSIONS; 国密 GmSSL 连接 PORT_TYPE=7 □ 通过 / □ 未通过
审计开关 SELECT para_name,para_value FROM v$dm_ini WHERE para_name='ENABLE_AUDIT'; 1 □ 通过 / □ 未通过
审计记录 SELECT COUNT(*) FROM "SYSAUDITOR"."V$AUDITRECORDS"; >0,且含登录/DDL/DML 记录 □ 通过 / □ 未通过
备份加密 BACKUP DATABASE ... WITH ENCRYPTION 2 ENCRYPT WITH OPENSSL_SM4_CBC; 备份成功;还原时需输入备份密码 □ 通过 / □ 未通过

附录 A:Windows 常用操作速查

  • 服务启停:net start DmServiceDMGM / net stop DmServiceDMGM(管理员 CMD)
  • 进入 DIsql:cd D:\dmdbms\bin && disql SYSDBA/&lt;密码>@localhost:5237
  • 查看 DM 服务列表:services.msc(过滤 DmService)
  • 查看实例参数:SELECT * FROM V$PARAMETER WHERE NAME='&lt;参数名>';
  • 确认动态库存在:dir D:\dmdbms\bin\dependencies\libcrypto-3-x64.dll
  • 计划任务管理:schtasks /query /tn "DM_FullBackup"(查看)/ /delete /tn ...(删除)

附录 B:国密测试常用指令速查(全文引用)

引用自《DM8 国密(商用密码)测试常用指令速查》,与正文配套使用。

一、国密算法支持查看

指令 一句话说明
SELECT * FROM V$CIPHERS; 查看 DM 支持的全部内置加密/散列算法,确认国密 SM 系列算法已注册。
SELECT * FROM V$EXTERNAL_CIPHERS; 查看第三方加密算法(OPENSSL_SM4/SM3、渔翁 FM_SM1/SM2/SM3/SM4/SM6 等)及其动态库、有效性(VALID=Y 才可用)。
SELECT NAME FROM V$EXTERNAL_CIPHER_LIBS; 查看已加载的第三方加密引擎名,供 dminit 的 EXTERNAL_CRYPTO_NAME / RANDOM_CRYPTO 引用。
SELECT CYT_NAME FROM V$CIPHERS WHERE CYT_TYPE=4; 列出散列算法(如 OPENSSL_SM3),供列加密 HASH WITH 子句选用。

二、建库初始化(全库/日志/外部加密引擎)

指令 一句话说明
./dminit PATH=... ENCRYPT_NAME=OPENSSL_SM4_CBC 建库时指定全库加密算法为国密 SM4,数据页密文落盘。
./dminit PATH=... RLOG_ENCRYPT_NAME=OPENSSL_SM4_CBC 建库时指定联机/归档日志加密算法为国密 SM4。
./dminit PATH=... PAGE_ENC_SLICE_SIZE=4096 设置数据页加密分片大小(0/512/4096 字节)。
./dminit PATH=... EXTERNAL_CRYPTO_NAME=&lt;引擎名> 指定服务器根密钥加密引擎(外部加密机/加密卡/UKEY)。
./dminit PATH=... RANDOM_CRYPTO=&lt;引擎名> 指定随机数算法所在加密引擎。
./dminit PATH=... EXTERNAL_CIPHER_NAME=OPENSSL_SM4_CBC 设置库默认加密算法(未显式指定算法时采用)。
SELECT SF_GET_ENCRYPT_NAME(); 查询当前库的全库加密算法名(未加密返回 NULL)。
SELECT SF_GET_PARA_VALUE(2,'RLOG_ENC_ID'); 查询日志文件加密算法 ID。

三、表空间与表列存储加密(透明/半透明/非透明)

指令 一句话说明
CREATE TABLESPACE TS1 DATAFILE 'TS1.DBF' SIZE 128 ENCRYPT WITH OPENSSL_SM4_CBC BY "密码"; 创建表空间时指定国密 SM4 透明加密(已全库加密则不能再做)。
CREATE TABLE T(C1 INT, C2 VARCHAR(50) ENCRYPT WITH OPENSSL_SM4_CBC); 建表时对指定列做国密 SM4 透明加密。
CREATE TABLE T(C1 INT, C2 VARCHAR(50) ENCRYPT WITH OPENSSL_SM4_CBC HASH WITH OPENSSL_SM3 SALT); 列加密并附加 SM3 散列做完整性校验。
CREATE TABLE T(C1 INT ENCRYPT MANUAL); 半透明加密列,用户仅见自己插入的数据。
CREATE TABLE T(C1 INT ENCRYPT WITH OPENSSL_SM4_CBC MANUAL USER (USER01,USER02)); 按列半透明加密,仅指定用户可见明文。
CREATE USER U1 IDENTIFIED BY "密码" ENCRYPT BY "存储密钥"; 创建用户时指定存储加密密钥(半透明加密用)。
SP_SET_PARA_VALUE(1,'AUTO_ENCRYPT',1); 打开手动输入列存储密钥开关。
SELECT CFALGORITHMSENCRYPT('明文', &lt;算法ID>, '密钥'); 非透明加密函数。
SELECT CFALGORITHMSDECRYPT(&lt;密文>, &lt;算法ID>, '密钥'); 非透明解密函数。
CREATE PROCEDURE proc WITH ENCRYPTION(...) AS ... END; 存储过程/函数/包等对象定义加密。

四、通信加密(SSL/商密 TLCP/应用层)

指令 一句话说明
SP_SET_PARA_VALUE(2,'ENABLE_ENCRYPT',6); 开启商密 TLCP 认证加密(国密 SM2 证书双向验证+加密)。
SP_SET_PARA_VALUE(2,'ENABLE_ENCRYPT',1); 开启 SSL 双向认证+加密。
SP_SET_PARA_VALUE(2,'MIN_SSL_VERSION',0x0303); 设置最低 TLS 版本为 TLSv1.2。
SELECT * FROM V$PARAMETER WHERE NAME='ENABLE_ENCRYPT'; 查询 ENABLE_ENCRYPT 当前值。
SELECT para_name,para_value FROM V$DM_INI WHERE para_name='ENABLE_ENCRYPT'; 确认 SSL/TLCP 是否开启成功。
disql SYSDBA/密码@host:port#"{ssl_path=...,ssl_pwd=...}" 客户端带 SSL/TLCP 证书连接。
SELECT SESS_ID,USER_NAME,PORT_TYPE FROM V$SESSIONS; 查看会话连接类型(PORT_TYPE=7 为国密 GmSSL)。
SP_SET_PARA_STRING_VALUE(2,'COMM_ENCRYPT_NAME','OPENSSL_SM4_CBC'); 开启应用层消息包加密(国密 SM4)。
SELECT CYT_NAME FROM V$CIPHERS WHERE (CYT_TYPE=1 OR CYT_TYPE=2) AND (WORK_MODE!='ECB_NOPAD' AND WORK_MODE!='CBC_NOPAD'); 列出可用于消息包加密的算法。

五、备份加密

指令 一句话说明
BACKUP DATABASE BACKUPSET '路径' IDENTIFIED BY "密码" WITH ENCRYPTION 2 ENCRYPT WITH OPENSSL_SM4_CBC; 全量备份并做国密 SM4 完全加密。
BACKUP DATABASE BACKUPSET '路径' IDENTIFIED BY "密码" WITH ENCRYPTION 1; 简单加密备份(仅口令,内容明文)。
BACKUP TABLESPACE TS1 BACKUPSET '路径' IDENTIFIED BY "密码" ENCRYPT WITH OPENSSL_SM4_CBC; 表空间备份加密。
(增量备份)加密参数须与基备份一致 增量备份加密一致性要求。

六、登录增强与 UKEY

指令 一句话说明
dmkey PATH=目录 pubkey=公钥名 生成登录加解密公钥/私钥文件。
dmkey PRIKEY=私钥路径 查看私钥信息(校验公私钥匹配)。
FORCE_CERTIFICATE_ENCRYPTION=1(dm.ini) 强制登录用户名密码证书加密。
dm_svc.conf: LOGIN_CERTIFICATE=(公钥路径) 客户端指定登录加密公钥。
disql "SYSDBA/密码@LOCALHOST#{UKEY_NAME=引擎名,UKEY_PIN=PIN}" UKEY 身份鉴别连接。

七、密钥维护(DM 安全版)

指令 一句话说明
SP_UPDATE_SVRKEY(); 更新服务器主密钥 SVR_KEY。
SP_UPDATE_DBKEY(); 更新数据库主密钥 DB_KEY。

附录 C:国密算法适用性对照表(基于实测 V$CIPHERS)

依据现场实测 SELECT CYT_NAME, CYT_TYPE, BLOCK_SIZE, EXTEND_SIZE, WORK_MODE FROM V$CIPHERS 的结果,
按《DM8 安全管理》第 7.1.1 / 7.1.2 / 7.1.3 节及备份、通信加密章节的限制条件判定(PAGE_ENC_SLICE_SIZE=4096 默认分片)。

算法 EXTEND 全库加密 日志加密 表空间加密 列加密 备份加密 通信加密
OPENSSL_SM4_ECB 16 可用 可用 不可用(膨胀>0) 可用 可用 可用
OPENSSL_SM4_CBC 16 可用 可用 不可用(膨胀>0) 可用 可用 可用
OPENSSL_SM4_CFB 16 可用 可用 不可用(膨胀>0) 可用 可用 可用
OPENSSL_SM4_OFB 16 可用 可用 不可用(膨胀>0) 可用 可用 可用
OPENSSL_SM4_CFB_V1 0 可用 可用 可用(推荐) 可用 可用 可用
OPENSSL_SM4_OFB_V1 0 可用 可用 可用(推荐) 可用 可用 可用
OPENSSL_SM4_ECB_NOPAD 0 不建议 不可用 不可用 不可用 不可用 不可用
OPENSSL_SM4_CBC_NOPAD 0 不建议 不可用 不可用 不可用 不可用 不可用
OPENSSL_SM3 - 不适用(散列) 不适用(散列) 不适用(散列) HASH WITH 可用 不适用(散列) 不适用(散列)

判定依据:① 全库加密(分片非0)不支持“EXTEND_SIZE=0 且模式 ECB/CBC”及块大小>16 的算法;
② 表空间加密(分片非0)额外不支持 ECB/CBC 模式、扩展长度>0、密文长度≠明文长度的算法(即仅 CFB/OFB 流式且不膨胀可用);
③ 日志/列/备份/通信加密均排除 NOPAD 模式。若将 PAGE_ENC_SLICE_SIZE 设为 0,则表空间/全库加密也可使用 EXTEND_SIZE≤块大小(16)的 ECB/CBC 算法,但需在建库时指定且不可修改。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服