本文永久地址:https://www.askmaclean.com/archives/oracle-12c-security.html
Oracle Advanced Security新功能 =>Oracle Data Redaction
Oracle Data Redaction
对应用户权限的实时访问控制
- 根据用户的权限以及客户端信息,Redaction实时数据
- 修正应用代码代表在不必要的数据库中完成列访问的控制
- 根据客服中心以及技术支持的职责不同,对访问客户信息进行控制,以及控制表示对应PCIDSS的信用卡编号、控制应用开发者的直接访问等
受支持的Redaction的种类
根据用途定义数据的参考范围
Oracle Database的访问控制的特徴
|
Data Redaction |
Virtual Private Database |
Database Vault |
| 功能概要 |
列的访问控制 &Redaction |
行・列的访问控制 |
表的访问控制
特权用户管理 |
| 必要许可证 |
Advanced Security Option |
Enterprise Edition |
Database Vault Option |
| 版本 |
12c~ |
8i~(列在10gR1) |
10gR2~ |
| 对象访问 |
列(SELECT) |
列・行(DML) |
对象・SQL命令 |
| 説明 |
根据表中定义的Redaction对策的条件,不在列中展示,或者Redaction到任意值 |
根据表中定义的VPD对策的条件,自动追加WHERE语句,不表示出行。
这时还可以将特定的列表示为NULL |
使用Realm、规则、命令规则等各种要素,访问对象(表、视图以及PL/SQL等),可以控制,并强制访问AQL命令自身的执行 |
| 特权用户 |
对策不适用 |
对策不适用 |
对任何用户都适用对策 |
| 设定 |
DBMS_REDACTpackage
或者、Oracle Enterprise Manager |
DBMS_RLSpackage
或者、Oracle Enterprise Manager |
DVSYS.DBMS_MACADMpackage
或者、Oracle Enterprise Manager |
与Oracle Data Masking 的差异
|
Oracle Data Masking |
Oracle Data Redaction |
| 安装方法 |
Oracle Enterprise Manager |
DBMS_REDACTpackage
或者、Oracle Enterprise Manager |
| 目的 |
直接对表masking,正式制成相近的测试数据 |
根据用户权限不同Redaction表以及视图的访问控制 |
| 执行时机 |
online
制成表、数据库的拷贝后,执行masking |
online
实时理解查询结果
执行mask处理 |
| 存储数据的影响 |
永久变更数据 |
没有影响 |
Oracle Data Redaction的架构
- 对于表以及视图的Redaction对策,通过DBMS_REDACT procedure进行定义
- 对象中可以做到的列为CHAR/VARCHAR2、 NUMBER、 DATE、 BLOB/CLOB型
- 根据Redaction对策的条件将列Redaction到任意值
Redaction对策的制成
DBMS_REDACT.ADD_POLICY procedure
| DBMS_REDACT.ADD_POLICY |
|
| object_schema |
应用Redaction对策的schema名 |
| object_name |
应用Redaction对策的表或者视图名 |
| policy_name |
想制成的Redaction对策名 |
| column_name |
应用Redaction对策的列名
※想指定多个的话,请另外追加DBMS_REDACT.ADD_POLICY |
| function_type |
DBMS_REDACT.FULL
DBMS_REDACT.RANDOMDBMS_REDACT.PARTIAL
DBMS_REDACT.REGEXP |
| expression |
基于SYS_CONTEXT的值,定义Boolean型的条件式。
仅限条件的结果值为“True”时可以执行Redaction |
| function_parameters |
使用DBMS_REDACT.PARTIAL时数据的IN与OUT的定义 |
| regexp……. |
function_type为DBMS_REDACT.REGEXP时的选项群 |
Expression(条件式)的制成方法
SYS_CONTEXT('USERENV’,’SESSION_USER’) = ‘SCOTT’
SYS_CONTEXT(’SERENV’,’IP_ADRESS’) IS NULL
SYS_CONTEXT(’USERENV’, CLIENT_IDENTIFIER’) not like ‘MGR%’
SYS_CONTEXT(‘SYS_SESSION_ROLES’,’MGR’) = FALSE
本文永久地址:https://www.askmaclean.com/archives/oracle-12c-security.html
Full Redaction (full・Redaction)
- 除HR用户之外在访问EMPLOYEES表的SALARY列时执行Redaction
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => ‘HR',
object_name => ‘EMPLOYEES',
policy_name => ‘EMPLOYEE _POLICY_SAL’,
expression => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') != ‘’HR''',
column_name => ‘SALARY',
function_type => DBMS_REDACT.FULL);
END;
执行结果
SELECT SALARY FROM EMPOYEES;
SALARY
--------------
0
根据数据型,用固定值来执行Redaction以下为初始值。可以变更为任意值
文字列: 单一空间
数值: 零(0)
日期: 01-JAN-01
LOB: [redacted]
Random Redaction (随机・Redaction)
- 除HR用户之外在访问EMPLOYEES表的SALARY列时执行Redaction
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => ‘HR',
object_name => ‘EMPLOYEES',
policy_name => ‘EMPLOYEE _ POLICY_EMPID’,
expression => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') != ‘’HR''',
column_name => ‘EMPLOYEE_ID ',
function_type => DBMS_REDACT.RANDOM);
END;
执行结果
SELECT EMPLOYEE_ID FROM EMPOYEES;
EMPLOYEE_ID
-----------------------
167
根据不同数据型,根据各自的形式来Redaction
文字列: 随机文字
数值: 随机数值
日期: 随机日期
LOB: 无法使用
Partial Redaction (部分Redaction)
- 通过SQL*PLUS访问EMPLOYEES表的PHONE_NUMBER列时使其Redaction
BEGIN
DBMS_REDACT.ADD_POLICY (
object_schema => ‘HR',
object_name => ‘EMPLOYEE ',
policy_name => ‘EMPLOYEE _ POLICY_PHONE',
expression => 'UPPER(SYS_CONTEXT(''USERENV'',''MODULE'')) like ''%SQL*PLUS%''',
column_name => ' PHONE_NUMBER ',
function_type => DBMS_REDACT.PARTIAL,
function_parameters => ‘VVVFVVVFVVVV,VVV-VVV-VVVV,*,1,6 ');
END;
执行结果
SELECT PHONE_NUMBER FROM EMPOYEES;
PHONE_NUMBER
----------------------------
***-***-8080
根据数据型以及各自的不同形式来Redaction
文字列: Redaction为一部分任意字符串
数值: 将一部分Redaction为任意值
日期: 将一份Redaction为任意日期
LOB : 无法使用
Function_parameters的设定方法
3528 3589 1231 0001=》****-****-****-0001
部分Redaction字符串的情况
function_parameters => 'VVVVFVVVVFVVVVFVVVV,VVVV-VVVV-VVVV-VVVV,*,1,12',
- Input format --> 定义现在的格式。V是Redaction可能、F为固定格式
- Output format --> Redaction后的格式定义。 V为可以Redaction hyphen等固定化的字符
-Mask Character --> 表示Redaction结果的字符
-- Starting digit position --> Redaction的开始位置
- Ending digit position --> Redaction终止位置。Input中包含F的话无法计数
部分Redaction数字的情况
0123456789 =》9999456789
function_parameters => ‘9,1,4’
-Mask Character --> 表示Redaction结果的字符
-- Starting digit position --> Redaction的开始位置
- Ending digit position --> Redaction终止位置。
Input中包含F的话无法计数
Regular Expression-based Redaction(正式表现 Redaction)
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => ‘HR',
object_name => ‘'EMPLOYEES',
policy_name => ‘'EMPLOYEE _POLICY_REG',
expression => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ‘HR''',
column_name => ‘'PHONE_NUMBER',
function_type => DBMS_REDACT.REGEXP,
regexp_pattern => '([0-3][0-3][0-3])',
regexp_replace_string => ‘***',
regexp_position => 1,
regexp_occurrence => DBMS_REDACT.RE_ALL,
regexp_match_parameter => 'i');
END;
执行结果
SELECT PHONE_NUMBER FROM EMPOYEES
PHONE_NUMBER
------------------------
650.###.5234
650.124.###4
EMPLOYEES表的PHONE_NUMBER列的值中如果存在0-3,3行连续数字的话,就会对那个值进行Redaction
正则表现的指定方法
603.123.6666=》603.###.6666
- regexp_pattern => '([0-3][0-3][0-3])'
定义合适数据的搜索模式。意味着0-3的数字是连续排列的
- regexp_replace_string => '#'
定义适合情况的Redaction字符
- regexp_position => 1
指定搜索开始位置
- regexp_occurrence => 0
Redaction次数。如果是0的话就将适合的部分全部转换
- regexp_match_parameter => 'i‘
指定合适的方法。比如
i可以识别大小写
Redaction对策的列追加
DBMS_REDACT.ALTER_POLICY procedure
| DBMS_REDACT.ADD_POLICY |
|
| object_schema |
Redaction对策中追加的schema名 |
| object_name |
追加Redaction对策的表或者视图名 |
| policy_name |
追加的Redaction对策名 |
| action |
DBMS_REDACT.ADD_COLUMN |
| column_name |
追加Redaction对策的列名 |
| function_type |
DBMS_REDACT.FULL
DBMS_REDACT.RANDOMDBMS_REDACT.PARTIAL
DBMS_REDACT.REGEXP |
| function_parameters |
所有DBMS_REDACT.PARTIAL时,数据的IN与OUT的定义 |
| regexp……. |
function_type DBMS_REDACT.REGEXP的情况的选项群 |
※条件为使用通过DBMS_REDACT.ADD_POLICY制成的项目
追加Redaction对策列
在EMPLOYEES表的EMPLOYEE_ID列中制成Redaction对策
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema =>'HR ',
object_name =>'EMPLOYEES',
policy_name =>'EMPLOYEE _POLICY_EMPID',
expression =>'SYS_CONTEXT(''USERENV'',''SESSION_USER'') !=''HR''',
column_name => 'EMPLOYEE_ID',
function_type => DBMS_REDACT.RANDOM);
END;
PL/SQL procedure正常完成。
追加PHONE_NUMBER列
BEGIN
DBMS_REDACT.ALTER_POLICY (
object_schema =>'HR ',
object_name =>'EMPLOYEES',
policy_name =>'EMPLOYEE _POLICY_EMPID',
action => DBMS_REDACT.ADD_COLUMN,
column_name => 'PHONE_NUMBER',
function_type => DBMS_REDACT.PARTIAL,
function_parameters => 'VVVFVVVFVVVV,VVV-VVV-VVVV,*,1,6');
END;
PL/SQL procedure正常完成。
删除Redaction对策
DBMS_REDACT.DROP_POLICY procedure
| DBMS_REDACT.DROP_POLICY |
|
| object_schema |
删除Redaction对策的schema名 |
| object_name |
删除Redaction对策的表、或者视图名 |
| policy_name |
想删除的Redaction对策名 |
BEGIN
DBMS_REDACT.DROP_POLICY (
object_schema => 'HR',
object_name => 'EMPLOYEES',
policy_name => 'EMPLOYEE _POLICY_SAL');
END;
PL/SQL procedure正常完成。
Oracle Data Redaction的限制
- 仅限表中可以定义的一个Redaction对策
- 表中设定了Redaction对策的话,就会对那个表派生的视图进行Redaction
- 对以下的数据库的操作不执行Redaction
- Backup, Restore
- Export, Import
- Upgrade, Patch
- Dataguard, Replication
- 拥有SYSDBA权限的用户不会被Redaction
- 拥有系统权限 EXEMPT REDACTION POLICY的用户不会被Redaction
- 制成物化视图,刷新时不会被Redaction
前提是适当管理数据库的权限
想控制SYSDBA的强制访问的话需要通过同时使用Oracle Database Vault来实现
Oracle Data Redaction的负载
验证环境
- 纯粹作为数据库的过载的处理时间=> Elapsed Time
- 作为应用的总计过载所花费的处理时间=>响应时间

Redaction的种类差异

Redaction的对象列数造成的差异
实际应用情况
- 通过连接的用户所拥有的角色来控制,不需要对应用进行修改,通过
expression => ‘SYS_CONTEXT(’‘SYS_SESSION_ROLES’‘,’‘MGR’‘) = ’‘FALSE’‘‘来控制
数据库审计新功能 Unified Auditing
传统的数据库审计功能的课题 audit_trail架构
- 需要通过Audit命令来进行细致设置
- 无法获得指定的会话信息中限制的日志
- 担心由于Audit对性能造成的影响
- 由于数据库的功能以及utility输出地址也不同
不仅是传统的AUDIT功能扩展,还需要
“使用便利性”&”高速” 新架构
Unified Auditing 简答&高速, 新设计的数据库审计功能

与传统的审计功能的比较
|
传统 |
Unified Auditing(12c) |
| 1. 审计的定义 |
用每个审计对象进行定义 |
用对策定义
可以使用一个对策中审计DB中的所有内容 |
| 2. 审计条件 |
无法指定 |
可以指定条件与以及审计频率 |
| 3. 审计用户的指定 |
可以通过BY指定审计用户 |
可以通过BY指定审计用户
可以通过EXCEPT排除审计用户 |
| 4.初始化参数 |
必须设定 |
不需要设定 |
| 5.审计记录 |
・SYS.AUD$与SYS.FGA_LOG$
・OS审计记录文件
・DB审计记录文件
・XML形式的OS审计记录文件 |
・作为AUDSYS schema,在SYSAUX表区域中存储
在审计记录文件中存储、可以输入到UNIFIED_AUDIT_TRAIL中 |
Unified Auditing的新架构 2个的SGA队列造成的并列处理非同步写入
无法刷新时的架构
防止遗漏日志
- 无法刷新SYSAUX时,就会作为二进制文件写入到$ORACLE_BASE/audit /$ORACLE_SID中
- 被输出的审计文件可以通过UNIFIED_AUDIT_TRAILDBMS_AUDIT_MGMT.
LOAD_UNIFIED_AUDIT_FILES输入
- 输入完成后,删除审计文件
审计日志的写入方法
同步・非同步模式
| 写入方法 |
特性 |
| Queued-write mode
队列写入 |
•通过SGA队列的非同步写入方法
•默认
•通过UNIFIED_AUDIT_SGA_QUEUE_SIZE参数,可以将SGA队列的尺寸从1MB扩展到30MB。默认值为1MB
•实例故障以及SHUTDOWN ABORT等等
数据库没有正常关闭时,SGA队列中可能失去审计日志 |
| Immediate-write mode
即时写入 |
•传统的同步写入方法
•可以获得所有日志,但可能对性能造成影响 |
审计日志的写入方法的设定
DBMS_AUDIT_MGMTpackage
BEGIN
DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_PROPERTY( DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, DBMS_AUDIT_MGMT.AUDIT_TRAIL_WRITE_MODE, DBMS_AUDIT_MGMT.AUDIT_TRAIL_IMMEDIATE_WRITE);
END;
BEGIN
DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_PROPERTY( DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, DBMS_AUDIT_MGMT.AUDIT_TRAIL_WRITE_MODE, DBMS_AUDIT_MGMT.AUDIT_TRAIL_QUEUED_WRITE);
END;
审计对策的制成~有效化
| CREATE AUDIT POLICY 对策名 |
| ROLES 角色名,・・ |
| PRIVILEGES 系统权限,・・ |
| ACTIONS 对象权限 ON 对象名,・・ |
| ACTIONS COMPONENT = DATAPUMP, DV, DIRECT_LOAD, OLS |
| WHEN 执行审计的条件 |
| EVALUATE PER [STATEMENT, SESSION, INSTANCE] |
| CONTAINER = [CURRENT, ALL] |
AUDIT POLICY 对策名 [ BY,EXCEPT ] 用户名
条件式的制成例 通过WHEN句指定审计条件
- 以前只能通过Fine-grained审计指定的审计条件,现在可以也通过Unified Auditing完成
| 审计条件 |
|
| 仅限本地连接 |
SYS_CONTEXT('USERENV',’IP_ADDRESS') IS NULL |
| 应用为SQL*Plus |
SYS_CONTEXT('USERENV','MODULE') =‘SQL*Plus’ |
| 连接客户端在Client001之外 |
SYS_CONTEXT(‘’USERENV’,HOST’) <> ‘Client001’ |
| OS用户在Oracle之外 |
SYS_CONTEXT(‘’USERENV’,OS_USER’) <> ‘oracle’ |
| 客户端识别码格式为ID_XXXX |
SYS_CONTEXT(’USERENV’, CLIENT_IDENTIFIER’)
like ‘ID_%’ |
| 没有ADMIN的角色 |
SYS_CONTEXT(‘SYS_SESSION_ROLES’,’ADMIN’) =FALSE |
※ 列単位中的审计条件、执行审计后的操作仅限(例发送邮件等) Fine-grained审计
审计对策制成例
CREATE AUDIT POLICY all_actions ACTIONS ALL;
AUDIT POLICY all_actions ;
- 以对HR用户的EMPPLOYEES表的所有的操作为对象
CREATE AUDIT POLICY all_actions_emp ACTIONS ALL ON HR.EMPLOYEES;
AUDIT POLICY all_actions_emp;
- (条件)本地连接的情况中以特定的系统权限、以表的访问为对象
CREATE AUDIT POLICY custom_audit
PRIVILEGES SELECT ANY TABLE, UPDATE ANY TABLE, DELETE ANY TABLE
ACTIONS ALL ON SCOTT.EMP, ALL ON SCOTT.DEPT
WHEN 'SYS_CONTEXT(''USERENV'',''IP_ADDRESS'') IS NULL’
EVALUATE PER STATEMENT;
AUDIT POLICY custom_audit;
通过一个视图访问所有的审计日志
UNIFIED_AUDIT_TRAIL
UNIFIED_AUDIT_TRAIL 的主要項目
|
说明 |
例 |
| AUDIT_TYPE |
审计类型 |
Standard,
Fine Grained Audit
Database Vault
RMAN AUDIT
Data Pump |
| SESSIONID |
审计会话中被分配的识别ID |
650971863 |
| OS_USERNAME |
OS用户名 (连接客户端) |
oracle |
| USERHOST |
主机名 (连接客户端) |
client001.jp.oracle.com |
| TERMINAL |
端末的识别码 (连接客户端) |
pts/1 |
| INSTANCE_ID |
实例编号 |
1 |
| DBID |
Database的识别ID |
1417811312 |
| AUTHENTICATION_TYPE |
会话用户的认证类型 |
(TYPE=(DATABASE));(CLIENT ADDRESS=((ADDRESS=(PROTOCOL=tcp)(HOST=10.185.146.20)(PORT=50713)))); |
| DBUSERNAME |
数据库用户名 |
SCOTT |
|
説明 |
例 |
| CLIENT_PROGRAM_NAME |
客户端程序名 |
sqlplus@secvm3.jp.oracle.com (TNS V1-V3) |
| DBLINK_INFO |
数据库链接信息 |
SOURCE_GLOBAL_NAME=dblink_src_global_name….. |
| EVENT_TIMESTAMP |
event时间(UTC) |
13-04-25 15:16:45.513780000 |
| ACTION_NAME |
action名 |
SELECT,INSERT, UPDATE,EXECUTE….
CREATE USER, LOGOFF,LOGON….. |
| RETURN_CODE |
错误编号 (ORA-XXXXX) |
1031 |
| OS_PROCESS |
OS的进程编号 |
30422 |
| SCN |
System Change Number |
5742707 |
| OBJECT_SCHEMA |
受到action影响的schema名 |
HR |
| OBJECT_NAME |
受到action影响的对象名 |
EMPLOYEES |
| SQL_TEXT |
被执行的SQL |
select count(*) from emp where empno=:v1 |
| SQL_BINDS |
SQL_TEXT中包含的bind变量的值 |
#1(7):1001 |
| APPLICATION_CONTEXTS |
应用context值 |
custno_ctx |
| CLIENT_IDENTIFIER |
会话中被设定的客户端识别码 |
app001 |
|
説明 |
例 |
| UNIFIED_AUDIT_POLICIES |
审计日志的出力对策名 |
ORA_SECURECONFIG |
| FGA_POLICY_NAME |
审计日志的出力FGA名 |
FGA_EMP_POLICY |
| DV_XXXXX (略) |
Database Vault相关的日志信息 |
| RMAN_XXXX (略) |
Recovery Manager相关的日志信息 |
| DP_XXXX (略) |
Data Pump相关的日志信息 |
| DIRECT_PATH_NUM_COLUMNS_LOADED |
SQL*Loader Direct Path Load 相关的日志信息 |
| OLS_XXXX (略) |
Oracle Lable Security相关的日志信息 |
| XS_XXXX (略) |
Oracle Real Application Security相关的日志信息 |
审计对策的无效化~删除
NOAUDIT POLICY 对策名
DROP AUDIT POLICY 对策名
NOAUDIT POLICY all_actions_emp;
审计取消成功。
drop audit policy all_actions_emp;
审计对策已删除。
完成定义的默认对策
ORA_SECURECONFIG
| PRIVILEGES |
ALTER ANY TABLE
CREATE ANY TABLE
DROP ANY TABLE |
CREATE ANY PROCEDURE
DROP ANY PROCEDURE
ALTER ANY PROCEDURE, |
GRANT ANY PRIVILEGE
GRANT ANY OBJECT PRIVILEGEGRANT ANY ROLE |
| AUDIT SYSTEM |
CREATE EXTERNAL JOB
CREATE ANY JOB |
CREATE ANY LIBRARY |
| EXEMPT ACCESS POLICY |
CREATE USER
DROP USER |
ALTER DATABASE
ALTER SYSTEM |
| CREATE PUBLIC SYNONYM
DROP PUBLIC SYNONYM |
CREATE ANY SQL TRANSLATION PROFILE
ALTER ANY SQL TRANSLATION PROFILE
DROP ANY SQL TRANSLATION PROFILE |
TRANSLATE ANY SQL |
| EXEMPT REDACTION POLICY
ADMINISTER KEY MANAGEMENT |
PURGE DBA_RECYCLEBIN |
LOGMINING |
| ACTIONS |
ALTER USER |
CREATE ROLE
ALTER ROLE
DROP ROLE
SET ROLE |
CREATE PROFILE
ALTER PROFILE
DROP PROFILE |
| CREATE DATABASE LINK
ALTER DATABASE LINK
DROP DATABASE LINK |
LOGON
LOGOFF |
CREATE DIRECTORY
DROP DIRECTORY |
強制的审计的用户、命令
管理者的访问、审计设定的变更历史为默认审计
- 用户
- SYS, SYSDBA, SYSOPER
- SYSASM, SYSBACKUP, SYSDG, SYSKM
- 命令
- CREATE AUDIT POLICY
- ALTER AUDIT POLICY
- DROP AUDIT POLICY
- AUDIT, NOAUDIT
- EXECUTE DBMS_FGA, DBMS_AUDIT_MGMT
- ALTER TABLE (AUDSYS用户拥有的表)
RMAN event的审计
$ rman target /
RMAN> backup tablespace users;
RMAN> restore tablespace users;
RMAN> recover tablespace users;
- 参考UNIFIED_AUDIT_TRAIL的RMAN列
SELECT event_timestamp,action_name,rman_operation,rman_object_type FROM unified_audit_trail
WHERE rman_operation IS NOT NULL;
EVENT_TIMESTAMP ACTION_NAME RMAN_OPERATION RMAN_OBJECT_TYPE
----------------------------------------------------------------------------------------------------------------------------------------------
13-02-14 02:19:26 RMAN ACTION Backup DF Full
13-02-14 02:19:26 RMAN ACTION Restore DF Full
13-02-14 02:19:26 RMAN ACTION Recover DF Full
Data pump event的审计
SQL> CREATE AUDIT POLICY audit_dp_all_pol ACTIONS COMPONENT=DATAPUMP ALL;
SQL> AUDIT POLICY audit_dp_all_pol;
$ expdp scott/tiger dumpfile=scott_tables tables=emp,dept directory=dp_dir
Export: Release 12.1.0.1.0 - Production on 木 2月 14 11:44:52 2013
Copyright (c) 1982, 2013, Oracle and/or its affiliates. All rights reserved.
连接地址: Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics, Real Application Testing and Unified Auditing options
启动"SCOTT"."SYS_EXPORT_TABLE_01":
scott/******** dumpfile=scott_tables tables=emp,dept directory=dp_dir
・・
. . “SCOTT”.“DEPT” 6 KB 4行被输出
. . “SCOTT”.“EMP” 8.671 KB 12被输出
主表“SCOTT”.“SYS_EXPORT_TABLE_01”正常加载/卸载完成
******************************************************************************
本文永久地址:https://www.askmaclean.com/archives/oracle-12c-security.html
- 参考UNIFIED_AUDIT_TRAIL 的DP列
SELECT event_timestamp,dp_text_parameters1,dp_boolean_parameters1
FROM unified_audit_trail WHERE dp_text_parameters1 is not null
EVENT_TIMESTAMP
--------------------------------
13-02-14 11:44:56
DP_TEXT_PARAMETERS1
------------------------------------------------------------------------------------------------------------------------------------------------
MASTER TABLE: "SCOTT"."SYS_EXPORT_TABLE_01" , JOB_TYPE: EXPORT, METADATA_JOB_MODE: TABLE_EXPORT,JOB VERSION: 12.0.0.0.0, ACCESS METHOD: AUTOMATIC,
DATA OPTIONS: 0, DUMPER DIRECTORY: NULL REMOTE LINK: NULL, TABLE EXISTS: NULL,
PARTITION OPTIONS: NONE
DP_BOOLEAN_PARAMETERS1
------------------------------------------------------------------------------------------------------------------------------------------------
MASTER_ONLY: FALSE, DATA_ONLY: FALSE, METADATA_ONLY: FALSE,
DUMPFILE_PRESENT: TRUE, JOB_RESTARTED: FALSE
SQL*Loader Direct Path Load event的审计
- 设定SQL*Loader Direct Path Load的对策
SQL> CREATE AUDIT POLICY audit_sqlldr_load_pol ACTIONS COMPONENT=DIRECT_LOAD LOAD;
SQL> AUDIT POLICY audit_sqlldr_load_pol ;
- 执行SQL*Loader Direct Path Load
$ sqlldr userid=hr/hr control=emp.ctl data=emp.csv direct=y
select event_timestamp,audit_type,dbusername,action_name,object_schema,object_name,sql_text,
direct_path_num_columns_loaded from unified_audit_trail where audit_type='Direct path API‘
EVENT_TIMESTAMP AUDIT_TYPE ACTION_NAME OBJECT_SCHEMA OBJECT_NAME
----------------------------------------------------------------------------------------------------------------------------------------------
13-02-14 13:05:31 Direct path API LOAD HR EMP
SQL_TEXT
----------------------------------------------------------------------------------------------------------------------------------------------
INSERT /*+ SYS_DL_CURSOR */ INTO "HR"."EMP" ("EMP_ID","EMP_NAME") VALUES (NULL,NULL)
DIRECT_PATH_NUM_COLUMNS_LOADED
--------------------------------------------------------------
2
审计Database Vault event
- 设定Database Vault的对策
- 对象: Realm, the rule set, factor
- 访问失败/成功等
SQL> CREATE AUDIT POLICY audit_dv ACTIONS COMPONENT=DV Realm Violation
ON "HR Application";
SQL> AUDIT POLICY audit_dv;
- 参考UNIFIED_AUDIT_TRAIL 的DV列
SELECT dbusername,object_name,sql_text,dv_action_name FROM unified_audit_trail
WHERE db_return_code <> 0;
DBUSERNAME OBJECT_NAME SQL_TEXT DV_ACTION_NAME
-----------------------------------------------------------------------------------------------------------------------------------------------
HR EMPLOYEE select * from hr.employee Realm Violation Audit
Mixed Mode Auditing
下位兼容性support
- 12c的数据库可以使用传统的Audit或者Unified Auditing
- 安装时都是以可以使用的Mixed 模式来运行
- Mixed 模式的情况下,AUDIT_SYS_OPERATION的SYSDBA的日志文件在
传统OS的目录中被输出
- 另外,RMAN以及Datapump等的utility的日志无法在Unified Auditing中整合
确认审计模式
SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';
-------------------------------------------
TRUE --> Unified Auditing
FALSE --> Mixed Mode
- Mixed模式因为Unified Auditing的对象范围被Audit Policy限制了,所以推荐以以下顺序完成
- 关闭数据库、终止listener
- cd $ORACLE_HOME/rdbms/lib
- make -f ins_rdbms.mk uniaud_on ioracle ORACLE_HOME=$ORACLE_HOME
- 启动listener、数据库的起動
只想使用传统的Audit时,以Mixed模式使得所有的Unified Audit对策无效化,通过audit_trail参数与Audit命令来设定
追加的AUDIT专用角色
数据库利用者与审计的权限分离
对跨越间隔的审计日志进行清理
DBMS_AUDIT_MGMT package
BEGIN
DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
LAST_ARCHIVE_TIME => '2013-02-15 10:00:00.00');
END;
- 制成对超过了两周(336H)的审计日志进行清理的job
BEGIN
DBMS_AUDIT_MGMT.CREATE_PURGE_JOB (
AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
AUDIT_TRAIL_PURGE_INTERVAL => 336,
AUDIT_TRAIL_PURGE_NAME => 'Audit_Trail_Purge_Job’,
USE_LAST_ARCH_TIMESTAMP => TRUE);
END;
审计日志的归档
清理之前,对审计日志进行备份的方法
- 在UNIFIED_AUDIT_TRAIL视图中作为其他表来抽出,取出EXPDP
- 归档到Oracle Audit Vault and Database Firewall (12.1.1)
Unified Auditing的负载

查看・更新SQL造成的差异

OTLP应用的情况
Unified Auditing中生成的日志尺寸 SYSAUX表区域的尺寸
权限管理 新功能 Privilege Analysis
Privilege Analysis
不正常访问的原因一般都是检测到过度的权限赋予
- 清理出赋予用户以及角色的系统权限、对象权限,确认是否使用,进行报告
- 赋予应用以及开发者・管理者真正需要的权限
- 原则上以最小权限来实现。防止不正常访问
权限分析的对象
找出被执行的系统/对象权限
- 角色
- 条件指定
- 分析适合指定条件的情况,分析权限的使用状況
(特定的用户以及应用等)
- 角色+条件指定
- 数据库
- 分析数据库内的所有的权限的使用状況
(除去SYS用户)
权限分析的顺序
通过DBMS_PRIVILEGE_CAPTURE开始捕获
| DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE |
| name |
对策名 |
| description |
说明(任意) |
| type |
选择任意一个
DBMS_PRIVILEGE_CAPTURE.G_DATABASE
DBMS_PRIVILEGE_CAPTURE.G_ROLE
DBMS_PRIVILEGE_CAPTURE.G_CONTEXT
DBMS_PRIVILEGE_CAPTURE.G_ROLE_AND_CONTEXT |
| roles |
Ex) role_name_list('role1', 'role2') |
| condition |
Ex) SYS_CONTEXT(''USERENV'', ''SESSION_USER'')=‘SCOTT’ |
DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE (‘对策名')
权限分析的顺序 捕获终止~报告
EXEC DBMS_PRIVILEGE_CAPTURE.DISABLE_CAPTURE (‘对策名)
- 分析报告的制成 (执行后,可以在专用的视图中查看分析结果)
EXEC DBMS_PRIVILEGE_CAPTURE.GENERATE_RESULT (‘对策名')
EXEC DBMS_PRIVILEGE_CAPTURE.DROP_CAPTURE (‘对策名‘)
Privilege Analysis的专用视图
| 结果表 |
説明 |
| DBA_USED_PRIVS
DBA_UNUSED_PRIVS |
所有的使用/未使用的权限。
(包含系统权限、用户权限、对象权限与PUBLIC权限) |
| DBA_USED_OBJPRIVS
DBA_UNUSED_OBJPRIVS
DBA_USED_OBJPRIVS_PATH
DBA_UNUSED_OBJPRIVS_PATH |
所有的使用/未使用的对象权限。
对有「PATH」的表赋予权限。 |
| DBA_USED_SYSPRIVS
DBA_UNUSED_SYSPRIVS
DBA_USED_SYSPRIVS_PATH
DBA_UNUSED_SYSPRIVS_PATH |
所有的使用/未使用的系统权限。
对有「PATH」的表赋予权限 |
| DBA_USED_PUBPRIVS |
所有的使用过的PUBLIC权限。 |
| DBA_USED_USERPRIVS
DBA_UNUSED_USERPRIVS
DBA_USED_USERPRIVS_PATH
DBA_UNUSED_USERPRIVS_PATH |
所有的使用/未使用的用户权限。
「对有「PATH」的表赋予权限 |
例) 用户没有Any权限的调査
BEGIN
DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE(
name => 'ANY_priv_analysis_pol',
type => DBMS_PRIVILEGE_CAPTURE.G_CONTEXT,
condition => 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'')=''APP_USER''');
END;/
EXEC DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE ('ANY_priv_analysis_pol');
-----处理执行-----
EXEC DBMS_PRIVILEGE_CAPTURE.DISABLE_CAPTURE ('ANY_priv_analysis_pol');
EXEC DBMS_PRIVILEGE_CAPTURE.GENERATE_RESULT ('ANY_priv_analysis_pol');
SELECT USERNAME, SYS_PRIV, OBJECT_OWNER, OBJECT_NAME FROM DBA_USED_PRIVS;
USERNAME SYS_PRIV OBJECT_OWNER OBJECT_NAME
---------------- ---------------------------- ----------------------- -----------------------
APP_USER SELECT ANY TABLE HR EMPLOYEES
APP_USER CREATE SESSION
APP_USER SYS ORA$BASE
APP_USER SYS DUAL
发现APP_USER以
SELECT ANY TABLE权限在
HR用户的EMPLYEES表中访问过
-> SELECT ANY TABLE是否不必要?
例) 调查DBA角色的使用状況
BEGIN
DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE(
name => 'dba_role_analysis',
type => DBMS_PRIVILEGE_CAPTURE.G_ROLE,
roles => role_name_list('dba'));
END;/
EXEC DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE ('dba_role_analysis');
-----处理执行-----
EXEC DBMS_PRIVILEGE_CAPTURE.DISABLE_CAPTURE ('dba_role_analysis');
EXEC DBMS_PRIVILEGE_CAPTURE.GENERATE_RESULT ('dba_role_analysis');
SELECT USERNAME, USED_ROLE,SYS_PRIV,PATH FROM DBA_USED_SYSPRIVS_PATH;
USER USED_ROLE SYS_PRIV PATH
---------- ---------------------------- ----------------------- -----------------------
SCOTT OLAP_DBA DROP ANY TABLE SYS.GRANT_PATH(SCOTT,DBA,OLAP_DBA)
SELECT USERNAME, SYS_PRIV, OBJECT_OWNER, OBJECT_NAME FROM DBA_USED_PRIVS
USERNAME SYS_PRIV OBJECT_OWNER OBJECT_NAME
---------------- ---------------------------- ----------------------- -----------------------
SCOTT SELECT ANY TABLE HR TEST
SCOTT用户使用
DROP ANY TABLE权限
(DBA - >OLAP_DBA角色)
删除了HR用户的TEST表
Database Vault 新功能
Oracle Database Vault 特权用户管理
- 控制数据库内的特权用户(SYS用户、DBA角色等)的強制访问
特权用户无法访问应用数据
- 将应用进行bypass的访问,也可以在数据库中包含数据
- 可以制成包含用户以及IP地址等等的客户端信息以及星期几・时间等详细信息的对策
- 提供SAP以及SIEBEL等的应用的访问对策的提供
DV的起动设定
默认已经安装好所有必须的部件
- 制成DV的管理者用户与账户管理者 (提供SYS用户执行)
GRANT CREATE SESSION TO dbv_owner IDENTIFIED BY password;
GRANT CREATE SESSION TO dbv_acctmgr IDENTIFIED BY password;
BEGIN
DVSYS.CONFIGURE_DV (
dvowner_uname => 'dbv_owner',
dvacctmgr_uname => 'dbv_acctmgr');
END;
EXEC DVSYS.DBMS_MACADM.ENABLE_DV;
EXEC DVSYS.DBMS_MACADM.DISABLE_DV;
切断特权用户的访问
通过Realm理论地定义对象防御范围
- 为了访问Realm中的对象,需要满足
Realm的认可、规则的許可、对象的访问权等条件
強制Realm
更严格的、不遗漏的默认隔断
- 对于对象的所有者(制成者)、即使是有对象权限的用户,
只要Realm不认可,就不能访问
对应Multi-tenant 架构 更安全地管理集约数据库