Oracle 12c 数据库安全核心技术讨论

本文永久地址:https://www.askmac.cn/archives/oracle-12c-security.html

Oracle Advanced Security新功能 =>Oracle Data Redaction

Oracle Data Redaction

对应用户权限的实时访问控制

  • 根据用户的权限以及客户端信息,Redaction实时数据
  • 修正应用代码代表在不必要的数据库中完成列访问的控制
  • 根据客服中心以及技术支持的职责不同,对访问客户信息进行控制,以及控制表示对应PCIDSS的信用卡编号、控制应用开发者的直接访问等

 

oracle_data_redaction1

 

受支持的Redaction的种类

根据用途定义数据的参考范围

 

oracle_data_redaction2

 

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到任意值

oracle_data_redaction3

 

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.askmac.cn/archives/oracle-12c-security.html

Full Redaction (fullRedaction)

  • 除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
  • 作为应用的总计过载所花费的处理时间=>响应时间

oracle_data_redaction4

 

Redaction的种类差异

oracle_data_redaction5

 

Redaction的对象列数造成的差异

oracle_data_redaction6

 

实际应用情况

  • 通过连接的用户所拥有的角色来控制,不需要对应用进行修改,通过
    expression => ‘SYS_CONTEXT(’‘SYS_SESSION_ROLES’‘,’‘MGR’‘) = ’‘FALSE’‘‘来控制

 

数据库审计新功能 Unified Auditing

传统的数据库审计功能的课题 audit_trail架构

  • 需要通过Audit命令来进行细致设置
  • 无法获得指定的会话信息中限制的日志
  • 担心由于Audit对性能造成的影响
  • 由于数据库的功能以及utility输出地址也不同

不仅是传统的AUDIT功能扩展,还需要

使用便利性高速 新架构

 

Unified Auditing 简答&高速, 新设计的数据库审计功能

oracle_unified_auditing1

 

与传统的审计功能的比较

传统 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队列造成的并列处理非同步写入

oracle_unified_auditing2

 

无法刷新时的架构

防止遗漏日志

  • 无法刷新SYSAUX时,就会作为二进制文件写入到$ORACLE_BASE/audit /$ORACLE_SID中
  • 被输出的审计文件可以通过UNIFIED_AUDIT_TRAILDBMS_AUDIT_MGMT.
    LOAD_UNIFIED_AUDIT_FILES输入
  • 输入完成后,删除审计文件

oracle_unified_auditing3

 

审计日志的写入方法

同步・非同步模式

 

写入方法 特性
Queued-write mode

队列写入

•通过SGA队列的非同步写入方法

•默认

•通过UNIFIED_AUDIT_SGA_QUEUE_SIZE参数,可以将SGA队列的尺寸从1MB扩展到30MB。默认值为1MB

•实例故障以及SHUTDOWN ABORT等等
数据库没有正常关闭时,SGA队列中可能失去审计日志

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

oracle_unified_auditing4

 

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.askmac.cn/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限制了,所以推荐以以下顺序完成
  1. 关闭数据库、终止listener
  2. cd $ORACLE_HOME/rdbms/lib
  3. make -f ins_rdbms.mk uniaud_on ioracle ORACLE_HOME=$ORACLE_HOME
  4. 启动listener、数据库的起動

只想使用传统的Audit时,以Mixed模式使得所有的Unified Audit对策无效化,通过audit_trail参数与Audit命令来设定

 

追加AUDIT专用角色

数据库利用者与审计的权限分离

oracle_unified_auditing5

 

对跨越间隔的审计日志进行清理

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)

oracle_unified_auditing6

 

Unified Auditing的负载

oracle_unified_auditing7

查看・更新SQL造成的差异

 

oracle_unified_auditing8

 

OTLP应用的情况

oracle_unified_auditing9

 

Unified Auditing生成日志尺寸  SYSAUX表区域的尺寸

oracle_unified_auditing10

 

权限管理 新功能 Privilege Analysis

Privilege Analysis

不正常访问的原因一般都是检测到过度的权限赋予

  • 清理出赋予用户以及角色的系统权限、对象权限,确认是否使用,进行报告
  • 赋予应用以及开发者・管理者真正需要的权限
  • 原则上以最小权限来实现。防止不正常访问

oracle_unified_auditing11

权限分析的对象

找出被执行的系统/对象权限

  • 角色
    • 分析指定角色权限的使用状況 (可以指定多个)
  • 条件指定
    • 分析适合指定条件的情况,分析权限的使用状況
      (特定的用户以及应用等)
  • 角色+条件指定
    • 适合指定角色以及条件的情况,分析权限的使用状況
  • 数据库
    • 分析数据库内的所有的权限的使用状況
      (除去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 (‘对策名‘)

 

 

权限分析的顺序  捕获终止~报告

oracle_unified_auditing12

  • 分析对策的无效化

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等的应用的访问对策的提供

 

oracle_unified_auditing13

 

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的认可、规则的許可、对象的访问权等条件

database_vault_1

強制Realm

更严格的、不遗漏的默认隔断

  • 对于对象的所有者(制成者)、即使是有对象权限的用户,
    只要Realm不认可,就不能访问

database_vault_2

 

对应Multi-tenant 架构  更安全地管理集约数据库

database_vault_3


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *