24、Oracle数据库加固

Oracle数据库加固(等保2.0三级)手册,覆盖 11gR2/12c/19c/21c:默认账户锁定与默认口令核查(DBA_USERS_WITH_DEFPWD)、ORA12C 口令校验函数、FAILED_LOGIN_ATTEMPTS 失败锁定与空闲超时、PUBLIC 收权与管理分权、ADMIN_RESTRICTIONS/SQLNET.ENCRYPTION_SERVER 监听加固与网络加密、统一审计与 DBMS_AUDIT_MGMT 清理、TDE 密钥库、O7_DICTIONARY_ACCESSIBILITY、RMAN 控制文件自动备份、19c 生命周期与补丁节奏。

定位:Oracle 数据库 11gR2 / 12c / 19c / 21c 等保三级安全加固手册:按 00~11 编号分节覆盖官方补丁管理、默认账户治理、口令复杂度与有效期、登录失败处理与超时、权限最小化与三权分立、远程管理与传输加密、审计、数据加密、数据字典保护、备份恢复、剩余信息保护与版本支持,每节附核查命令与测评项对照表。

适用版本:Oracle Database 11gR2 / 12c / 19c / 21c+(多租户 CDB/PDB 与非多租户两种形态均适用;参数作用域、公共用户 C##/C### 与 PDB 本地用户的差异随文标注,11g 现场不存在多租户口径)。 配套测评:01、Oracle数据库测评02-Oracle测评命令单

使用说明:

  • 本文为加固操作手册:文中 ALTER SYSTEMALTER PROFILEALTER USER、审计策略、监听与 sqlnet.ora 修改均属变更类操作,可能中断业务会话、需要重启实例或重载监听。实施前必须完成变更审批、确认维护窗口,备份 spfile/参数文件、listener.orasqlnet.ora 原配置,并用 RMAN 完成一次可恢复的全备,准备可执行的回滚预案
  • 先在测试环境或灰度实例验证,确认无业务影响后再推广;每完成一项立即用「核查方法」命令复核——配置已下发不等于策略已生效(如 audit_trail 为静态参数须重启、resource_limit=TRUE 后 Profile 限制才生效、监听修改后须 lsnrctl reload)。
  • 示例中的账户名、口令、路径、IP 均为演示值(如 PleaseChange#2026192.168.10.10),现场须替换为本单位口令策略与网络规划的真实值,严禁直接沿用示例口令;对外发布或归档时须对内网地址与账户信息脱敏。
  • 命令不存在、视图名或参数与本文不一致时,先用 select * from v$version;show con_name; 确认版本与部署形态,再查阅对应版本官方文档换用等效命令;版本差异不得直接作为「无法整改」的结论,须给出替代措施并评估其实际效果(详见文末核验说明的 11g/12c/19c/21c 差异要点)。
  • 涉及账户锁定、监听限制、加密强制(required)的变更存在锁死自身风险:务必保留一条已验证的恢复通道(本机操作系统组认证登录、另一独立管理账户、监听配置文件备份)后再实施。
  • 加固完成后按「16、安全评估加固记录表3.0」逐项留痕(整改前后回显、操作人、时间、验证结论、回退情况),并纳入复测;测评判定口径以 GB/T 28448-2019 与《高风险判定指引》为准,本文的「加固要点」不构成最终测评结论。

不适用标识说明:

  • 使用 【不适用】 明确标记现场可判定为不适用的控制点,并写明判定依据与承载该能力的上位组件。
  • 依据 GB/T 28448-2019「按测评对象实际承载功能与数据处理范围判定」原则:控制能力由统一认证平台、堡垒机、数据库审计设备、云托管数据库平台或存储层加密承载时,应注明测评单元边界后判定不适用或转由上位组件核查,不得机械按缺失判不符合。
  • 产品版本确实不提供该能力(如标准版无 TDE、已停止支持的版本无补丁源)时,须核查替代措施并按替代措施的实际效果定档,不得直接判不适用;已停止支持的版本应同时提出升级或补偿控制建议。

测评项对照表

控制点(GB/T 22239-2019 安全计算环境-数据库)对应章节
身份鉴别:口令复杂度/有效期01、02、10
身份鉴别:登录失败处理与超时03
身份鉴别:远程管理防窃听05
访问控制:账户最小化、默认账户治理、权限分离01、04、08
安全审计:审计开启、审计记录与留存06
入侵防范:补丁与漏洞管理、端口与服务收敛00、05、11
数据完整性/数据保密性(通信传输与存储)05、07
数据备份恢复09
剩余信息保护10

00 关注官方安全更新公告

对应控制点:GB/T 22239-2019 8.1.4.4 入侵防范 e)(能发现可能存在的已知漏洞,并在经过充分测试评估后及时修补漏洞)

加固要点:建立 Oracle 版本与补丁台账,跟踪 Oracle 每季度发布的 CPU(Critical Patch Update)安全公告并按变更窗口修补:CPU 于每年 1、4、7、10 月的第三个星期二发布,其余月份以月度安全更新(CSPU)形式发布,紧急漏洞走 Security Alerts 单独公告。补丁分两层核查:二进制层用 opatch lsinventory(只读)核对 ORACLE_HOME 已装补丁;数据库层用 DBA_REGISTRY_SQLPATCH 视图核对 datapatch 执行结果(12c 起提供)。已停止 Premier/Extended Support 的版本(11gR2、12c 系列已陆续退出支持)须提出升级或补偿控制建议,并按 11 节口径单独记录。

验证方法v$version 版本回显、opatch lsinventoryDBA_REGISTRY_SQLPATCH 补丁记录、CPU 公告订阅证据与补丁评估变更单、漏洞扫描报告、官方支持状态截图(对照 Oracle Lifetime Support 政策页)。

官方安全公告(CPU/Security Alerts):https://www.oracle.com/security-alerts/

核查方法

select * from v$version;
-- 数据库层补丁记录(12c 起,datapatch 结果)
select patch_id, patch_type, action, status, action_time, description
  from dba_registry_sqlpatch order by action_time;
# 二进制层补丁清单(只读核查)
$ORACLE_HOME/OPatch/opatch lsinventory
示例输出(节选)
$ $ORACLE_HOME/OPatch/opatch lsinventory | head -20
Oracle Interim Patch Installer version 12.2.0.1.42
OPatch version    : 12.2.0.1.42
OUI version       : 12.2.0.1.4
Installed Top-level Products (1):
Oracle Database 19c                                                  19.0.0.0.0
Interim patches (2) :
Patch  35643107     : applied on Tue Jul 18 2023
SQL> select patch_id, patch_type, status, action_time from dba_registry_sqlpatch order by action_time;

  PATCH_ID PATCH_TYP STATUS    ACTION_TIME
---------- --------- --------- -------------------------
  35643107 RU        SUCCESS   18-JUL-23 10.32.11.000000 AM

加固操作(补丁安装属变更类,必须安排维护窗口并回滚预案)

  1. 评估对应季度 CPU 公告中 Oracle Database 部分的 CVSS 评分与所装组件是否受影响,形成变更单;
  2. 测试环境先行安装(opatch apply 后执行 $ORACLE_HOME/OPatch/datapatch),回归业务与备份作业;
  3. 生产窗口安装并核验:
$ORACLE_HOME/OPatch/opatch apply          # 安装二进制补丁(需关闭实例或按补丁说明操作)
$ORACLE_HOME/OPatch/datapatch -verbose    # 应用 SQL 层补丁(RAC 需在全部节点执行)
  1. 复核:opatch lsinventory 出现新补丁号;select patch_id,status from dba_registry_sqlpatch; 状态为 SUCCESS
  • 预期现象:版本在官方支持期内;季度 CPU 补丁按台账更新;dba_registry_sqlpatchWITH ERRORS 记录;补丁评估与变更单齐备。

01 默认账户治理与多余账户清理

对应控制点:GB/T 22239-2019 8.1.4.1 身份鉴别 a)(身份标识唯一)与 8.1.4.2 访问控制 b)c)(重命名/修改默认账户口令、及时删除或停用多余的、过期的账户,避免共享账户)

加固要点:11g 起新建库的大多数默认账户在创建时即处于锁定(LOCKED)且口令过期(EXPIRED)状态(官方安全指南口径),但从早期版本升级、手工 CREATE DATABASE 建库或运维过程中临时解锁过的账户不在其列,须逐一核查:改默认口令、停用多余账户、删除过期账户;多租户环境注意公共用户(C##/C###)在 CDB 根处置、PDB 本地用户在各 PDB 内核查(DBA_USERS_WITH_DEFPWD 从 PDB 查询只显示本地用户,公共用户须回到 CDB 根查询)。XS$NULL 为 Real Application Security 内部账户(不能认证登录、不拥有任何对象),不对其实施删除、解锁、改名等处置。19c 起可用 INACTIVE_ACCOUNT_TIME Profile 参数自动锁定长期未登录账户。

验证方法DBA_USERS.ACCOUNT_STATUS 清单(OPEN/EXPIRED/LOCKED/EXPIRED & LOCKED)、DBA_USERS_WITH_DEFPWD 查询结果(有返回即存在默认口令账户)、V$PWFILE_USERS 口令文件账户清单、账户台账与审批记录、锁定与改口令的变更单。

核查方法

select username, account_status, profile, created from dba_users order by created;
select username from dba_users_with_defpwd;        -- 有返回即默认口令账户(19c RU 19.32+ 另有 PRODUCT 列)
select username, sysdba, sysoper from v$pwfile_users;
show parameter inactive_account_time               -- 19c 新增,11g/12c 无此参数属正常
示例输出(节选)
SQL> select username, account_status, profile from dba_users order by username;

USERNAME          ACCOUNT_STATUS     PROFILE
----------------  -----------------  ----------
APPUSER           OPEN               SEC_PROFILE
AUDIT_ADMIN       OPEN               SEC_PROFILE
XS$NULL           EXPIRED & LOCKED   DEFAULT
SCOTT             OPEN               DEFAULT      -- 须处置

SQL> select username from dba_users_with_defpwd;

USERNAME
----------
SCOTT

加固操作(均为变更类)

-- 改默认/弱口令(新口令须满足 02 节复杂度策略)
alter user scott identified by "PleaseChange#2026";

-- 锁定(停用)多余或过期账户;锁定同时强制口令过期
alter user scott account lock;
alter user old_app account lock password expire;

-- 重设口令并解锁(仅对确需保留的账户)
alter user appuser identified by "PleaseChange#2026" account unlock;
-- 19c:自动锁定 120 天未登录的账户(最小值 15,UNLIMITED 为不启用)
alter profile sec_profile limit inactive_account_time 120;
  • 注意:显式 ACCOUNT LOCK 的账户只能由安全管理员解锁(alter user xx account unlock;),锁定前须确认无作业/中间件仍在使用该账户;

  • XS$NULL 等内部账户保持锁定状态即可,不做任何处置;

  • 多租户:alter session set container=CDB$ROOT; 后处置公共用户,进入各 PDB 处置本地用户。

  • 预期现象:无默认口令账户(dba_users_with_defpwd 查询为空);非必要账户全部 EXPIRED & LOCKED 或已删除;v$pwfile_users 仅保留必要管理账户;台账与实际账户一致。

02 口令复杂度与有效期(Profile 与校验函数)

对应控制点:GB/T 22239-2019 8.1.4.1 身份鉴别 a)(身份鉴别信息具有复杂度要求并定期更换)

加固要点:11g 起 DEFAULT Profile 的出厂口令参数为:FAILED_LOGIN_ATTEMPTS 10PASSWORD_LIFE_TIME 180PASSWORD_GRACE_TIME 7PASSWORD_LOCK_TIME 1PASSWORD_REUSE_TIME/MAX UNLIMITEDPASSWORD_VERIFY_FUNCTION NULL——即默认不启用复杂度校验,必须显式配置。Oracle 自带口令校验函数由 $ORACLE_HOME/rdbms/admin/catpvf.sql 安装到 SYS 模式:VERIFY_FUNCTION_11G(已弃用,弱规则)、ORA12C_VERIFY_FUNCTION(≥8 位,字母+数字+特殊字符,不得含用户名/库名/oracle,与旧口令差≥3 字符)、ORA12C_STRONG_VERIFY_FUNCTION(≥9 位,2 大写+2 小写+2 数字+2 特殊)、ORA12C_STIG_VERIFY_FUNCTION(≥15 位,STIG 规则,ORA_STIG_PROFILE 的默认函数)。注意:官方校验函数不作用于 SYS 账户,最高权限账户须以制度约束并以 DBA_USERS_WITH_DEFPWD、改口令记录兜底。口令有效期建议不超过 90 天、历史防重复不少于 5 次(见 10 节)。11g/12c 环境另需关注口令版本:SQLNET.ALLOWED_LOGON_VERSION_SERVER 默认 12(11g 口令版本将逐步被弃用,旧客户端兼容方案见官方文档)。

验证方法DBA_PROFILES 口令类参数回显(PASSWORD_VERIFY_FUNCTION 非空、PASSWORD_LIFE_TIME ≤90)、弱口令设置被拒的实测记录、catpvf.sql 执行记录、口令策略管理制度、最高权限账户改口令记录。

核查方法

select profile, resource_name, limit from dba_profiles
 where resource_name in ('PASSWORD_LIFE_TIME','PASSWORD_GRACE_TIME','PASSWORD_REUSE_TIME',
                         'PASSWORD_REUSE_MAX','PASSWORD_VERIFY_FUNCTION')
 order by profile, resource_name;
示例输出(节选)
SQL> select profile, resource_name, limit from dba_profiles
  2   where resource_name in ('PASSWORD_LIFE_TIME','PASSWORD_VERIFY_FUNCTION');

PROFILE    RESOURCE_NAME                LIMIT
---------- ----------------------------  --------
DEFAULT    PASSWORD_LIFE_TIME           180
DEFAULT    PASSWORD_VERIFY_FUNCTION     NULL
SEC_PROFILE PASSWORD_LIFE_TIME          90
SEC_PROFILE PASSWORD_VERIFY_FUNCTION    ORA12C_VERIFY_FUNCTION

加固操作(属变更类;先测试环境验证,避免应用账户批量过期)

-- 1. 安装官方口令校验函数(11g 起随数据库软件提供;以 SYS 执行)
@$ORACLE_HOME/rdbms/admin/catpvf.sql

-- 2. 为需引用函数的用户授予 EXECUTE(不授予则该用户无法在 Profile 中引用)
grant execute on sys.ora12c_verify_function to sec_admin;

-- 3. 加固 DEFAULT 或专用 Profile(12c+ 建议用 ORA12C 系列;11g 环境可暂用 VERIFY_FUNCTION_11G 并列入升级计划)
alter profile default limit
  password_life_time 90
  password_grace_time 7
  password_verify_function ora12c_verify_function;

-- 4. 高安全要求场景:管理账户专用 Profile(STIG 规则)
create profile sec_profile limit
  failed_login_attempts 5
  password_life_time 90
  password_verify_function ora12c_strong_verify_function;
alter user sys identified by "PleaseChange#2026";   -- SYS 不受校验函数约束,须手工设置强口令
alter system set sec_case_sensitive_logon = true scope = both;   -- 口令大小写敏感:11g 默认 TRUE(12.1 起该参数弃用,保持默认即可,禁止改 FALSE)
  • 说明:sec_case_sensitive_logon=FALSE 会使口令比较不区分大小写、显著降低强度,禁止关闭;PASSWORD_VERIFY_FUNCTION 设回 NULL 即关闭校验,禁止在生产环境使用。

  • 预期现象:DBA_PROFILESPASSWORD_VERIFY_FUNCTION 非空、PASSWORD_LIFE_TIME ≤90;用弱口令建用户或改口令被口令校验函数拒绝;账户口令到期前后出现 ORA-28001/ORA-28002 提示并强制改口令。

03 登录失败处理与会话超时

对应控制点:GB/T 22239-2019 8.1.4.1 身份鉴别 b)(具有登录失败处理功能,配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等措施)

加固要点:三层落地——① Profile 层:FAILED_LOGIN_ATTEMPTS(建议 3~5 次)+ PASSWORD_LOCK_TIME(锁定时长,按天计)实现失败锁定,Oracle 还会对连续失败登录指数级增加响应延迟以对抗口令猜测(官方安全指南口径);② 会话层:Profile 的 IDLE_TIME 实现空闲会话超时退出,其生效前提是 RESOURCE_LIMIT=TRUEALTER SYSTEM SET resource_limit=TRUE,动态参数,19c 默认 TRUE,低版本环境须核查确认);③ 网络层:sqlnet.oraSQLNET.EXPIRE_TIME(分钟级心跳,清理异常中断的死连接),与 IDLE_TIME 配合实现超时退出。锁定策略须覆盖最高权限账户,并保留一条已验证的恢复通道(本机操作系统组认证登录,见 04 节),避免锁定即失联。

验证方法:Profile 参数回显(FAILED_LOGIN_ATTEMPTS/PASSWORD_LOCK_TIME/IDLE_TIME)、resource_limit 参数回显、sqlnet.oraSQLNET.EXPIRE_TIME 配置、一次真实失败登录实测:连续输错至阈值后 DBA_USERS.ACCOUNT_STATUS 变为 LOCKED(TIMED),锁定到期自动解锁或手工解锁后登录成功;空闲超过 IDLE_TIME 的会话被断开(客户端报 ORA-02396: exceeded maximum idle time)。

核查方法

select profile, resource_name, limit from dba_profiles
 where resource_name in ('FAILED_LOGIN_ATTEMPTS','PASSWORD_LOCK_TIME','IDLE_TIME')
 order by profile, resource_name;
show parameter resource_limit
select username, account_status, lock_date from dba_users where account_status like 'LOCKED%';

加固操作ALTER SYSTEM/ALTER PROFILE 属变更类,建议维护窗口执行)

alter system set resource_limit = true scope = both;     -- 使 Profile 资源限制(含 IDLE_TIME)生效
alter profile default limit failed_login_attempts 5 password_lock_time 1;
alter profile default limit idle_time 30;                -- 空闲 30 分钟自动断开会话
# $ORACLE_HOME/network/admin/sqlnet.ora(服务端)
SQLNET.EXPIRE_TIME = 10      # 每 10 分钟探测客户端,清理异常中断的死连接(变更后重启监听/实例生效)
  • 说明:ACCOUNT_STATUSLOCKED(TIMED) 表示按 PASSWORD_LOCK_TIME 自动锁定、到期自动解锁;LOCKED 为显式锁定,只能由安全管理员 alter user xx account unlock; 解锁。锁定期间该账户全部连接(含应用连接池)被拒,须与应用侧确认重试策略。

  • 预期现象:失败 5 次后账户进入锁定状态且登录被拒(ORA-28000);空闲会话 30 分钟被断开;show parameter resource_limitTRUEsqlnet.oraSQLNET.EXPIRE_TIME 配置。

04 权限最小化与三权分立(含 PUBLIC 收权)

对应控制点:GB/T 22239-2019 8.1.4.2 访问控制 a)d)f)(账户与权限分配、授予账户所需的最小权限并实现权限分离、授权粒度到表/列级)

加固要点:Oracle 无内置三权分立角色,须按「系统管理员(业务运维)/ 安全管理员(用户与权限管理)/ 审计管理员(审计策略与审计记录查询)」分别建独立管理账户分权,避免一人全权。管理权限与操作系统组绑定:OSDBA 组(Linux 惯例 dba)成员获 SYSDBA、OSOPER 组(oper)获 SYSOPER、OSBACKUPDBA(backupdba)/OSDGDBA(dgdba)/OSKMDBA(kmdba)分别对应 SYSBACKUP/SYSDG/SYSKM(12c 起为备份、Data Guard、密钥管理提供的分权管理权限,官方建议替代「一把梭」的 SYSDBA;Windows 侧为 ORA_DBA/ORA_OPER 本地组)——主机侧须核查这些组的成员清单最小化。数据库内:12c 起 CREATE USER 创建的用户权限域为空,登录须单独授予 CREATE SESSIONCONNECT 角色自 12c 起精简为仅含 CREATE SESSION;按岗位最小授权(一应用一账户、对象权限优先于 ANY 系统权限)。PUBLIC 是所有用户的公共角色,对 PUBLIC 授予EXECUTE 的 PL/SQL 包(UTL_FILEUTL_HTTPUTL_TCPDBMS_JAVA 等)是 SQL 注入提权的常见跳板,须按行业基线(CIS 检查项口径)核查并收口;注意官方文档提示:从 PUBLIC 撤销与 DML 相关的权限会触发全库存储对象重授权,收权前必须在测试环境回归。

验证方法DBA_SYS_PRIVS/DBA_ROLE_PRIVS/DBA_TAB_PRIVS/DBA_COL_PRIVS 权限矩阵、V$PWFILE_USERS 管理权限清单、操作系统组(dba/oper/backupdba 等)成员清单、PUBLIC 执行权限查询结果、三权分立的分权实测(审计管理员执行 DDL 应被拒)、权限审批记录。

核查方法

select grantee, privilege, admin_option from dba_sys_privs where admin_option = 'YES' order by grantee;
select grantee, granted_role, admin_option from dba_role_privs order by grantee;
select grantee, owner, table_name, privilege from dba_tab_privs
 where grantee = 'PUBLIC' and privilege = 'EXECUTE' order by table_name;   -- PUBLIC 可执行的危险包
select * from v$pwfile_users;
示例输出(节选)
SQL> select grantee, privilege from dba_sys_privs where grantee='APPUSER';

GRANTEE    PRIVILEGE
---------- -------------------------
APPUSER    CREATE SESSION

SQL> select grantee, granted_role from dba_role_privs where grantee='APPUSER';

GRANTEE    GRANTED_ROLE
---------- --------------------
APPUSER    CONNECT              -- 12c+ 该角色仅含 CREATE SESSION,符合最小化

加固操作(均为变更类;PUBLIC 收权前必须完成应用回归测试)

-- 1. 三权分立:独立管理账户(CREATE USER 权限域为空,须显式授予 CREATE SESSION)
create user ops_admin  identified by "PleaseChange#2026";   -- 系统管理员:业务运维
create user sec_admin  identified by "PleaseChange#2026";   -- 安全管理员:用户与权限
create user audit_admin identified by "PleaseChange#2026";  -- 审计管理员:审计策略与记录
grant create session, create table, create view to ops_admin;
grant create session, alter user, create user, drop user, create profile, alter profile to sec_admin;
grant create session, select any dictionary to audit_admin; -- 审计记录查询(或授予 SELECT_CATALOG_ROLE)

-- 2. 12c+ 管理权限分离(替代用 SYSDBA 做备份/容灾/密钥管理)
grant sysbackup to backup_admin;
grant syskm to key_admin;

-- 3. 应用账户最小授权:对象权限优先,禁止 GRANT ANY/DROP ANY 类权限
grant create session to appuser;
grant select, insert, update on appowner.t_order to appuser;

-- 4. PUBLIC 收口(高影响变更:先测试环境回归依赖对象,再生产窗口执行)
revoke execute on sys.utl_file from public;
revoke execute on sys.utl_http from public;
grant execute on sys.utl_file to etl_owner;   -- 仅授予确需的账户
  • 说明:从 PUBLIC 收回 EXECUTE 后,依赖这些包的存储过程/函数须重新授权才可执行,官方文档明确提示撤销 PUBLIC 相关权限存在级联影响;主机侧同时核查 dbaoperbackupdbadgdbakmdba 组成员清单并最小化(groups <user>)。

  • 预期现象:权限矩阵与岗位一致,应用账户无 ANY 类权限与 DBA 角色;PUBLIC 执行权限清单不含危险包或已按基线收口;审计管理员执行 create user 被拒;OS 组成员最小化并有台账。

05 远程管理与传输加密(监听与网络加密)

对应控制点:GB/T 22239-2019 8.1.4.1 身份鉴别 c)(远程管理时防止鉴别信息在传输过程中被窃听)、8.1.2.2 通信传输 a)b)、8.1.4.4 入侵防范 c)(管理终端限制)

加固要点:Oracle 侧传输加密与来源限制分三层:① 监听运行期加固:listener.ora 中设置 ADMIN_RESTRICTIONS_<监听名>=ON,禁止通过 lsnrctl SET ... 在运行期修改监听参数(修改该参数后须 lsnrctl reload 生效);② 来源白名单:监听所在 Oracle Home 的 sqlnet.ora 配置 TCP.VALIDNODE_CHECKING=YES + TCP.INVITED_NODES(合法节点清单,IPv4 支持通配符、IPv6 支持 CIDR;TCP.EXCLUDED_NODES 的优先级低于 INVITED_NODES),RAC 环境须在 Grid Home 的 sqlnet.ora 配置;③ 传输加密:启用原生网络加密(Native Network Encryption)或 TCPS(TLS)监听端点任一——SQLNET.ENCRYPTION_SERVER/SQLNET.CRYPTO_CHECKSUM_SERVER 默认值为 accepted(即不强制),须改为 required 并显式限定算法(19c 中 AES256/AES192/AES128 为现行算法,3DES/DES/RC4 与 MD5 已弃用;校验和建议 SHA256/384/512)。SQLNET.* 参数写在 sqlnet.ora不在 v$parameter 中、show parameter 查询不到,取证以配置文件与 lsnrctl status 输出为准。远程管理一律经堡垒机;管理终端地址与白名单清单须一致。

验证方法listener.ora/sqlnet.ora 配置截图、lsnrctl status(含 TCPS 端点 (PROTOCOL=tcps) 或监听状态正常)、从非授权地址连接被拒的实测记录、客户端与服务端加密协商实测(V$SESSION_CONNECT_INFO.NETWORK_SERVICE_BANNER 显示加密套件)、堡垒机纳管清单。

核查方法

# SQLNET.* 参数不在 v$parameter 中,须直接取证配置文件与监听
cat $ORACLE_HOME/network/admin/sqlnet.ora
cat $ORACLE_HOME/network/admin/listener.ora
lsnrctl status
lsnrctl status | grep -i tcps        # TCPS 端点为加密直接证据
示例输出(节选)
$ cat $ORACLE_HOME/network/admin/listener.ora
ADMIN_RESTRICTIONS_LISTENER = ON
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db01)(PORT = 1521))))

$ cat $ORACLE_HOME/network/admin/sqlnet.ora
SQLNET.ENCRYPTION_SERVER = required
SQLNET.CRYPTO_CHECKSUM_SERVER = required
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128)
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256, SHA384, SHA512)
TCP.VALIDNODE_CHECKING = YES
TCP.INVITED_NODES = (192.168.10.10, 192.168.10.11)

加固操作(均为变更类:改 sqlnet.ora/listener.ora 后须 lsnrctl reloadrequired 生效前须确认全部客户端支持加密,否则业务立即中断,建议先灰度部分客户端)

# $ORACLE_HOME/network/admin/listener.ora
ADMIN_RESTRICTIONS_LISTENER = ON          # 禁止运行期 SET 修改监听参数
# $ORACLE_HOME/network/admin/sqlnet.ora(服务端)
SQLNET.ENCRYPTION_SERVER = required
SQLNET.CRYPTO_CHECKSUM_SERVER = required
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128)
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256, SHA384, SHA512)
SQLNET.ALLOWED_LOGON_VERSION_SERVER = 12  # 最低口令版本,阻断老旧弱认证协议
TCP.VALIDNODE_CHECKING = YES
TCP.INVITED_NODES = (192.168.10.10, 192.168.10.11, 192.168.20.0/24)
lsnrctl reload     # 重新加载监听配置(白名单与 ADMIN_RESTRICTIONS 生效)
  • 说明:TCPS 方案须为监听配置 PKCS12 钱包并在 listener.ora 增加 (PROTOCOL=tcps) 端点,适合客户端固定且能分发证书的环境;原生网络加密无需证书、配置面小,两者任一满足即可(与配套测评口径一致)。

  • 预期现象:lsnrctl status 正常且(如部署 TCPS)含 tcps 端点;从白名单外地址发起的连接被监听直接拒绝;客户端会话的 NETWORK_SERVICE_BANNER 显示 AES 加密与 SHA 校验已启用;lsnrctl set log_status off 等运行期修改被拒绝。

06 审计(传统审计与统一审计)

对应控制点:GB/T 22239-2019 8.1.4.3 安全审计 a)~d)(启用安全审计、覆盖每个用户和重要用户行为及重要安全事件、审计记录保护与留存、审计进程保护)

加固要点:先判定审计形态再加固:select value from v$option where parameter='Unified Auditing'; 为 TRUE 表示已启用纯统一审计——此时 audit_trail 参数与 DBA_STMT_AUDIT_OPTS 等传统审计视图均不再生效,取证改查 UNIFIED_AUDIT_TRAIL(记录落在 AUDSYS 模式专表,仅允许插入)。12c~19c 默认为混合模式,传统审计与统一审计并存:传统审计用 AUDIT 语句+audit_trail 参数(静态参数,取值 none/os/db/db,extended/xml/xml,extended;默认 none,DBCA 建库为 db,修改需重启);统一审计用 CREATE AUDIT POLICY/AUDIT POLICY。官方预定义策略:ORA_SECURECONFIG(覆盖 CREATE/ALTER/DROP USER、ALTER SYSTEM、GRANT ANY、CREATE DIRECTORY 等安全配置类操作)与 ORA_LOGON_FAILURES(失败登录)在新建库中默认启用,升级库不自动启用,升级环境须显式 AUDIT POLICY 启用。特权操作兜底:AUDIT_SYS_OPERATIONS 记录 SYSDBA/SYSOPER 等管理会话的顶层语句(11g 默认 FALSE、12c 起默认 TRUE,静态参数;纯统一审计下该参数失效、管理用户活动被强制记录于 UNIFIED_AUDIT_TRAIL)。审计留存不少于 6 个月、定期备份;审计清理用 DBMS_AUDIT_MANAGEMENTINIT_CLEANUPSET_LAST_ARCHIVE_TIMESTAMPCLEAN_AUDIT_TRAIL/CREATE_PURGE_JOB),禁止直接 truncate 审计表。21c 起传统审计语句(AUDIT 传统语法)官方已标记弃用,新项目直接建统一审计策略。

验证方法audit_trail/audit_sys_operations 参数回显、v$option 统一审计状态、审计策略清单(AUDIT_UNIFIED_ENABLED_POLICIESDBA_STMT_AUDIT_OPTS/DBA_PRIV_AUDIT_OPTS)、审计记录样例(含时间、用户、操作、结果、来源)、留存周期与备份记录、用系统管理员账户尝试删除审计记录被拒的说明。

核查方法

show parameter audit_trail
show parameter audit_sys_operations
select value from v$option where parameter = 'Unified Auditing';
select policy_name, enabled_option, entity_name, success, failure from audit_unified_enabled_policies;  -- 统一审计已启用策略
select * from dba_stmt_audit_opts;     -- 传统审计语句审计项(统一审计环境下为空属正常)
select * from dba_priv_audit_opts;
select dbusername, action_name, event_timestamp from unified_audit_trail where rownum <= 5;
select * from sys.aud$ where rownum <= 3;   -- 传统审计 audit_trail=db 的落表
show parameter audit_file_dest
示例输出(节选)
SQL> show parameter audit_trail

NAME              TYPE    VALUE
----------------- ------- -------
audit_trail       string  DB

SQL> select value from v$option where parameter = 'Unified Auditing';

VALUE
---------
FALSE

加固操作(均为变更类;audit_trail/audit_sys_operations 为静态参数,须重启实例,严格安排维护窗口)

-- 传统审计(11g/未启用统一审计的环境)
alter system set audit_trail = db, extended scope = spfile;      -- 记录 SQL 文本与绑定变量,重启生效
alter system set audit_sys_operations = true scope = spfile;     -- SYSDBA/SYSOPER 顶层语句审计(11g 须显式开启)
audit session whenever not successful;                            -- 失败登录
audit create user, alter user, drop user by access;
audit alter system by access;
audit create profile, alter profile, drop profile by access;
-- 统一审计(12c+;升级库须显式启用官方预定义策略,新建库已默认启用)
audit policy ora_secureconfig;
audit policy ora_logon_failures whenever not successful;

-- 自定义策略:对敏感表的 DML 全量审计(语法与官方预定义策略一致)
create audit policy sec_app_dml
  actions select on appowner.t_order,
          update on appowner.t_customer;
audit policy sec_app_dml;
# 启用纯统一审计(12c~19c:重新链接二进制,属重大变更,须维护窗口+回滚预案;21c 起默认启用无需本步)
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk uniaud_on ioracle ORACLE_HOME=$ORACLE_HOME
-- 审计留存与清理(DBMS_AUDIT_MANAGEMENT;统一审计类型下 INIT_CLEANUP 会报 ORA-46250 属正常)
begin
  dbms_audit_mgmt.set_last_archive_timestamp(
    audit_trail_type  => dbms_audit_mgmt.audit_trail_aud_std,
    last_archive_time => systimestamp - interval '180' day);
end;
/
begin
  dbms_audit_mgmt.clean_audit_trail(
    audit_trail_type        => dbms_audit_mgmt.audit_trail_aud_std,
    use_last_arch_timestamp => true);
end;
/
  • 说明:审计清理前先将过期记录导出归档(留存 ≥6 个月的口径);audit_trail=os/xml 模式下记录落在 audit_file_dest 目录,须核查目录权限并纳入日志平台集中采集;统一审计下清理常量改用 dbms_audit_mgmt.audit_trail_unified

  • 预期现象:审计开启且有真实记录样例;失败登录、账户/权限变更、敏感表 DML 均可查到审计记录;清理作业仅删除超过留存期的记录;审计目录/表权限仅审计管理员可管理。

07 数据加密(TDE 与应用层加密)

对应控制点:GB/T 22239-2019 8.1.4.8 数据保密性 b)(重要业务数据和鉴别信息采用密码技术保证存储过程的保密性)、8.1.4.7 数据完整性 b)

加固要点:静态数据加密首选 TDE(Transparent Data Encryption,透明数据加密):对表空间或敏感列加密,落盘数据文件、redo 中的数据均被加密(官方口径),并能加密备份文件。TDE 属 Oracle 企业版 + Advanced Security 选件能力,标准版不可用——未采购选件的现场按磁盘加密(存储层/主机层 LUKS 等)或应用层加密作为替代措施如实认定。TDE 密钥保存在数据库外部的密钥库(Keystore/TDE Wallet,口令保护/自动登录/本地自动登录三种类型),18c 起推荐用 WALLET_ROOT + TDE_CONFIGURATION 参数定位密钥库(替代 12c 的 SQLNET.ENCRYPTION_WALLET_LOCATION,后者已在 18c 弃用),密钥管理用 ADMINISTER KEY MANAGEMENT 语句(需 ADMINISTER KEY MANAGEMENT 系统权限或 SYSKM 管理权限);表空间加密默认算法 AES128、列加密默认 AES192,可显式指定 AES256。应用层加密可用 DBMS_CRYPTO 包实现字段级加密。传输侧加密见 05 节。

验证方法DBA_TABLESPACES.ENCRYPTEDV$ENCRYPTED_TABLESPACES 加密算法回显、WALLET_ROOT/TDE_CONFIGURATION 参数回显、密钥库文件及其备份位置与权限、许可证明(EE + Advanced Security 选件)或磁盘加密/应用层加密的替代措施证据、密钥口令的保管制度(口令与密钥库分离存放)。

核查方法

select tablespace_name, status, encrypted from dba_tablespaces order by tablespace_name;
select t.name, e.encryptionalg, e.encryptedts
  from v$encrypted_tablespaces e, v$tablespace t
 where t.ts# = e.ts#;
show parameter wallet_root          -- 18c+(无值表示未采用新密钥库框架)
show parameter tde_configuration

加固操作(属变更类,且依赖 EE+Advanced Security 选件;先测试环境验证再生产窗口执行,示例为 19c 口径)

-- 1. 指定密钥库根目录(静态参数,需重启;密钥库目录应与数据文件分盘并限制 OS 权限)
alter system set wallet_root = '/u01/app/oracle/wallet' scope = spfile;
alter system set tde_configuration = "keystore_configuration=file" scope = both;

-- 2. 创建并打开口令保护密钥库,生成主加密密钥(WITH BACKUP 为强制子句,变更前自动备份密钥库)
administer key management create keystore identified by "Keystore#2026";
administer key management set keystore open identified by "Keystore#2026";
administer key management set key identified by "Keystore#2026" with backup;

-- 3. 创建自动登录密钥库(重启后无需人工开库;更严格的场景用 LOCAL AUTO_LOGIN)
administer key management create auto_login keystore from keystore identified by "Keystore#2026";

-- 4. 加密表空间(新建敏感数据表空间,显式指定 AES256)
create tablespace enc_ts datafile '/u01/app/oracle/oradata/orcl/enc_ts01.dbf' size 1g
  encryption using 'aes256' default storage(encrypt);
  • 说明:列级加密用 alter table t modify (credit_card encrypt);(示例,参数与 NO SALT/SALT 选项详见对应版本 Advanced Security Guide);已有明文表空间的在线转换须评估停机与空间开销;DBMS_CRYPTO 包的 EXECUTE 权限按需授予业务账户并纳入权限矩阵(见 04 节)。

  • 预期现象:dba_tablespaces.encrypted 为 YES、v$encrypted_tablespaces 显示 AES256 等算法;密钥库文件(ewallet.p12cwallet.sso)存在且已备份;OS 层直接读取数据文件看不到明文;密钥口令与密钥库分人保管并留痕。

08 数据字典保护与高危参数核查

对应控制点:GB/T 22239-2019 8.1.4.2 访问控制 e)(重要主体设置安全标记等数据字典/元数据保护口径,结合系统权限最小化判定)

加固要点:数据字典保护核查四项:① O7_DICTIONARY_ACCESSIBILITY 保持 FALSE(默认值)——为 TRUE 时 SELECT ANY TABLEANY 系统权限可访问 SYS 模式数据字典,属高危配置;该参数 12.2 起官方弃用、19c 起 desupport(19c 库 show parameter 查询无结果属正常,无此风险面),现行版本字典保护改由 SELECT ANY DICTIONARY 系统权限(不随 GRANT ALL PRIVILEGES 传播)与 SELECT_CATALOG_ROLE/EXECUTE_CATALOG_ROLE 角色精细管控;② REMOTE_LOGIN_PASSWORDFILE 核查为 EXCLUSIVE(默认值;NONE 禁用口令文件远程管理、SHARED 多库共用,均为静态参数),V$PWFILE_USERS 中持有 SYSDBA/SYSOPER 的账户最小化;③ 文件读写口径:UTL_FILE_DIR 参数 12.2 起官方弃用,一律使用 DIRECTORY 对象并按账户授予 READ/WRITECREATE DIRECTORY/DROP DIRECTORY 已纳入 ORA_SECURECONFIG 审计策略,见 06 节),清理无需的目录对象授权;④ 隐含参数(_ 前缀)无公开官方文档支撑,不作为常规加固对象、不纳入测评要求,改动须有 Oracle 官方依据并记录。

验证方法show parameter o7_dictionary_accessibility 回显(≤12.2 环境)或版本说明(19c+)、REMOTE_LOGIN_PASSWORDFILEV$PWFILE_USERS 回显、DBA_DIRECTORIES 与目录授权清单、SELECT ANY DICTIONARY 授予人清单。

核查方法

show parameter o7_dictionary_accessibility    -- ≤12.2 环境核查;19c 无该参数
show parameter remote_login_passwordfile
select * from v$pwfile_users;
select * from dba_directories;
select grantee, privilege, owner, table_name
  from dba_tab_privs
 where table_name in (select directory_name from dba_directories) order by grantee;
select grantee from dba_sys_privs where privilege = 'SELECT ANY DICTIONARY';
示例输出(节选)
SQL> show parameter remote_login_passwordfile

NAME                       TYPE    VALUE
-------------------------- ------- ---------
remote_login_passwordfile  string  EXCLUSIVE

SQL> select username, sysdba, sysoper from v$pwfile_users;

USERNAME   SYSDB SYSOP
---------- ----- -----
SYS        TRUE  TRUE

加固操作(参数均为静态,修改须重启实例,属变更类)

-- ① 发现 O7_DICTIONARY_ACCESSIBILITY=TRUE 时(≤12.2 环境才存在此配置面)
alter system set o7_dictionary_accessibility = false scope = spfile;   -- 重启生效

-- ② 无远程口令文件管理需求时关闭远程 SYSDBA 口令登录(保留 OS 组本机认证通道,见 03 节恢复通道说明)
alter system set remote_login_passwordfile = none scope = spfile;      -- 重启生效;改回需同步口令文件

-- ③ 目录对象收敛:清理无需的授权与目录对象
revoke read, write on directory data_pump_dir from appuser;
drop directory old_export_dir;   -- 确认无作业引用后执行
  • 说明:关闭 remote_login_passwordfile 前必须确认本机操作系统组认证可用,否则管理通道中断;SELECT ANY DICTIONARY 仅授予审计管理员等确需账户(见 04 节)。

  • 预期现象:≤12.2 环境 o7_dictionary_accessibility 为 FALSE;remote_login_passwordfile 与口令文件用途一致、v$pwfile_users 账户最小化;目录对象清单与授权有台账、无全员可读写目录。

09 备份恢复(RMAN)

对应控制点:GB/T 22239-2019 8.1.4.9 数据备份恢复 a)~c)(本地备份恢复、异地实时备份、热冗余)

加固要点:建立并实际执行备份策略:生产库运行于归档模式(v$database.LOG_MODE=ARCHIVELOG),RMAN 定时全量+增量+归档日志备份,备份文件与主数据分盘分机并异地留存;控制文件自动备份开启(CONFIGURE CONTROLFILE AUTOBACKUP ON——COMPATIBLE≥12.2 的 CDB/单实例库默认 ON,旧环境须显式配置并用 SHOW ALL 核验);三级系统异地实时备份或热冗余用 Data Guard(备库日志应用状态)或同等手段,并每半年至少一次恢复演练。仅有备份脚本而无恢复验证不判符合;备份文件同样要限制访问权限。

验证方法v$database.LOG_MODE 回显、v$archive_dest 归档目的地、RMAN SHOW ALL 配置、v$rman_backup_job_details 最近备份作业状态(COMPLETED)、备份产物清单与异地存放证据、Data Guard 状态或异地备份链路说明、恢复演练记录(时间、耗时、一致性校验)。

核查方法

rman target /
RMAN> SHOW ALL;    -- 核查 CONFIGURE CONTROLFILE AUTOBACKUP 等关键配置(只读)
select name, log_mode from v$database;
select dest_id, status, destination from v$archive_dest where status = 'VALID';
select * from (select session_key, start_time, status, input_type
                 from v$rman_backup_job_details order by start_time desc) where rownum <= 5;
示例输出(节选)
RMAN> SHOW ALL
使用目标数据库控制文件替代恢复目录
RMAN 配置参数为:
CONFIGURE CONTROLFILE AUTOBACKUP ON;    -- 期望 ON
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;

加固操作(RMAN 配置与备份执行属配置变更,建议维护窗口)

rman target /
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
RMAN> BACKUP DATABASE PLUS ARCHIVELOG DELETE INPUT;   -- 首次验证性全备
  • 说明:归档模式未开启的库须按官方流程重启到 mount 状态开启 ARCHIVELOG(重大变更,评估空间与窗口);异地实时备份用 Data Guard(备库与主库日志同步状态须有监控与巡检记录);恢复演练记录须包含恢复耗时与数据一致性校验结果。

  • 预期现象:LOG_MODE=ARCHIVELOGSHOW ALL 中 CONTROLFILE AUTOBACKUP 为 ON;最近备份作业状态 COMPLETED 且产物异地留存;近半年内有恢复演练记录。

10 剩余信息保护(口令历史、回收站与精细审计)

对应控制点:GB/T 22239-2019 8.1.4.10 剩余信息保护 a)b)(鉴别信息与敏感数据所在存储空间释放或重新分配前得到完全清除)

加固要点:数据库侧三件事:① 口令历史防重用:PASSWORD_REUSE_MAX(次数)与 PASSWORD_REUSE_TIME(天数)两者均设置时须同时满足、均为 UNLIMITED 时视为允许重用(官方规则)——至少配置其一(建议 PASSWORD_REUSE_MAX 5PASSWORD_REUSE_TIME 365),确保旧口令在约束期内不可复用;② 回收站清理:被 DROP 的敏感表仍以回收站对象形式占存数据,介质/空间再分配前对敏感对象执行 PURGEPURGE RECYCLEBIN 清当前用户回收站,PURGE DBA_RECYCLEBIN 需 SYSDBA 或 PURGE DBA_RECYCLEBIN 系统权限,操作不可恢复须先确认);③ 精细审计(可选增强):对敏感列用 DBMS_FGA 建立条件触发审计,留存敏感数据访问痕迹辅助溯源。表空间删除、数据文件下线等存储空间释放动作与介质销毁制度衔接(涉密介质按介质管理制度销毁并留痕)。

验证方法DBA_PROFILESPASSWORD_REUSE_* 配置与旧口令重用被拒实测(ORA-28007: the password cannot be reused)、回收站对象清单与清理记录、FGA 审计记录样例(可选)、介质销毁/表空间下线的管理制度与记录。

核查方法

select profile, resource_name, limit from dba_profiles
 where resource_name in ('PASSWORD_REUSE_TIME','PASSWORD_REUSE_MAX');
select owner, object_name, original_name, type, droptime
  from dba_recyclebin order by droptime;   -- 敏感表是否滞留回收站

加固操作ALTER PROFILE 属变更类;PURGE 不可恢复,执行前必须确认)

alter profile default limit password_reuse_max 5 password_reuse_time unlimited;
-- 或同时设置:password_reuse_time 365 password_reuse_max 5(两者须同时满足,约束更严)

purge dba_recyclebin;    -- 清理全库回收站(SYSDBA 或 PURGE DBA_RECYCLEBIN 权限);单对象用 purge table <原表名>;
-- 可选:FGA 对敏感列的访问审计(与 06 节审计互补)
begin
  dbms_fga.add_policy(
    object_schema   => 'APPOWNER',
    object_name     => 'T_ORDER',
    policy_name     => 'FGA_AMOUNT',
    audit_column    => 'AMOUNT',
    statement_types => 'SELECT,UPDATE');
end;
/
  • 预期现象:口令历史约束生效(旧口令重用被拒);敏感表删除后回收站及时清理、空间可再分配;FGA 策略按需部署并有审计记录。

11 版本支持与生命周期

对应控制点:GB/T 22239-2019 8.1.4.4 入侵防范 e)(漏洞修补能力依赖厂商补丁源,与 00 节联动)

加固要点:核对现场版本在 Oracle 官方 Lifetime Support 政策中的支持状态并纳入台账:按 Oracle 2024 年 11 月更新的支持政策,Oracle Database 19c(长期支持版本)Premier Support 至 2029 年 12 月 31 日、Extended Support 至 2032 年 12 月 31 日(最新日期以官方 Lifetime Support 政策页为准);11gR2、12c 系列均已退出 Premier/Extended Support,仍在运行的须提出升级(优先 19c 长期支持版)与补偿控制建议。停止支持版本拿不到季度 CPU 补丁(00 节),入侵防范 e) 项按不符合处理并跟踪整改计划;多租户、统一审计等新特性仅在 12c+/19c+/21c+ 提供,版本升级计划与 02/06/08 节的版本差异整改联动。

验证方法v$version 与补丁台账、Oracle Lifetime Support 政策页对照记录、升级立项/整改计划、补偿控制措施说明。

核查方法

select * from v$version;

对照 Oracle 官方 Lifetime Support 政策页(https://www.oracle.com/support/lifetime-support/ )确认支持期,截图留痕。

加固操作:无直接配置项;输出《版本支持状态与升级计划》台账,对已停止支持版本明确升级窗口、过渡期补偿控制(收紧白名单、加强审计与监控、季度漏洞扫描)。

  • 预期现象:版本在支持期内或有已批准的升级/补偿计划;台账与官方政策页对照留痕。

参考依据

关联文章