本文永久地址: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
 实时理解查询结果  | 
| 存储数据的影响 | 永久变更数据 | 没有影响 | 
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(条件式)的制成方法
- DB用户名为SCOTT的情况
 
SYS_CONTEXT(‘USERENV’,’SESSION_USER’) = ‘SCOTT’
- IP地址为NULL的情况
 
SYS_CONTEXT(’SERENV’,’IP_ADRESS’) IS NULL
- 客户端信息中不包含MGR的用户名的情况
 
SYS_CONTEXT(’USERENV’, CLIENT_IDENTIFIER’) not like ‘MGR%’
- 用户没有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
正则表现的指定方法
- 仅仅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等等  | 
| Immediate-write mode
 即时写入  | 
•传统的同步写入方法
 •可以获得所有日志,但可能对性能造成影响  | 
审计日志的写入方法的设定
DBMS_AUDIT_MGMTpackage
- Queued-write mode的设定
 
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;
- Immediate-write mode的设定
 
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 | 客户端程序名 | [email protected] (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命令
 
$ 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的审计
- 设定Datapump的对策
 
SQL> CREATE AUDIT POLICY audit_dp_all_pol ACTIONS COMPONENT=DATAPUMP ALL; SQL> AUDIT POLICY audit_dp_all_pol;
- 
EXPORT的执行
 
$ 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
- 参考UNIFIED_AUDIT_TRAIL
 
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;
- DV的有效化 (需要以DV管理者执行、重启)
 
EXEC DVSYS.DBMS_MACADM.ENABLE_DV;
- DV的无效化 (需要以DV管理者执行、重启)
 
EXEC DVSYS.DBMS_MACADM.DISABLE_DV;
切断特权用户的访问
通过Realm理论地定义对象防御范围
- 为了访问Realm中的对象,需要满足
Realm的认可、规则的許可、对象的访问权等条件 
強制Realm
更严格的、不遗漏的默认隔断
- 对于对象的所有者(制成者)、即使是有对象权限的用户,
只要Realm不认可,就不能访问 
对应Multi-tenant 架构 更安全地管理集约数据库






















Leave a Reply