本文永久地址: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