本文永久地址:https://www.askmac.cn/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.askmac.cn/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 | 客户端程序名 | 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命令
$ 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限制了,所以推荐以以下顺序完成
- 关闭数据库、终止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 架构 更安全地管理集约数据库
Comment