【安全】Oracle 安全管理與審計(二)
一 資料庫版本
SYS@LEO1>select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 – Production
作業系統資訊
[oracle@leonarding1 admin]$ uname -a
Linux leonarding1.oracle.com 2.6.32-200.13.1.el5uek #1 SMP Wed Jul 27 21:02:33 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux
二 再談Oracle安全管理
1.上一篇我們聊到《洪興社的Oracle情節之安全管理篇(一)》 http://space.itpub.net/26686207/viewspace-763470
主要介紹了“安全認證” “TDE透明資料加密” “細粒度許可權控制”這三個方面的Oracle安全技術。從原理到實踐我們由淺入深分析了技術細節和應用場景,使大家從整體上了解Oracle技術的發展狀態,下面展示一下Oracle安全產品的發展路線
下面是Oracle常見安全解決方案
本文重點講述內容列表
1.VPN 虛擬私有資料庫訪問控制
2.OLS 標籤安全訪問控制
3.Database vault 資料庫保險箱
4.FGA細粒度審計
5.SYS管理員級審計
什麼是重點:Oracle產品的原理並不複雜,關鍵是知道在什麼場合下適用什麼樣的產品,產品特性,帶來的效果。
三 演示一個VPD進行資料訪問控制的示例
1.什麼是VPD:Virtual Private Database 虛擬私有資料庫,聽起來像是一個獨立自主的資料庫,其實在邏輯上是獨立的,物理上就是一個資料庫。原理就是透過指定過濾策略,對使用者的SQL新增謂詞條件,來達到過濾資料的目的。
2.VPD優點:
精細化訪問
對業務透明,不同的客戶發出相同SQL語句,查詢到的結果集不一樣,可以讓不同客戶只看其相關的資料
對使用者透明,使用者感知不到
不對資料本身做任何操作,只在SQL層面進行過濾處理
VPD是資料庫預設自帶的,無需獨立安裝
3.實驗
我們建一張業務表car,有汽車名,汽車數量,汽車價格三個欄位,插入9條記錄,分成高中低三個檔次
LEO1@LEO1>create table car (name varchar2(20),num number,cost number);
Table created.
LEO1@LEO1>insert into car values('toyota',10,30); 高階車
1 row created.
LEO1@LEO1>insert into car values('volvo',50,30);
1 row created.
LEO1@LEO1>insert into car values('honda',60,30);
1 row created.
LEO1@LEO1>insert into car values('biaozhi',70,20); 中級車
1 row created.
LEO1@LEO1>insert into car values('xuetielong',80,20);
1 row created.
LEO1@LEO1>insert into car values('polo',90,20);
1 row created.
LEO1@LEO1>insert into car values('xiali',20,10); 低階車
1 row created.
LEO1@LEO1>insert into car values('jili',30,10);
1 row created.
LEO1@LEO1>insert into car values('byd',40,10);
1 row created.
LEO1@LEO1>commit;
Commit complete.
LEO1@LEO1>select * from car;
NAME NUM COST
-------------------- ---------- -------------------- -------------------- ----------
toyota 10 30
volvo 50 30
honda 60 30
biaozhi 70 20
xuetielong 80 20
polo 90 20
xiali 20 10
jili 30 10
byd 40 10
9 rows selected.
我們的思路:car表上新增過濾策略“filter_name”和“filter_num”,當select語句中有name欄位時觸發“filter_name”策略,當select語句中有num欄位時觸發“filter_num”策略,過濾策略由函式“fun_name”和“fun_num”實現。
建立函式“fun_name”
LEO1@LEO1>create or replace function fun_name (fun_scheme varchar2,fun_object varchar2)
return varchar2 as fun_cost varchar2(20);
begin
fun_cost:='cost=30';
return(fun_cost);
end fun_name;
/
2 3 4 5 6 7
Function created.
建立函式“fun_num”
LEO1@LEO1>create or replace function fun_num (fun_scheme varchar2,fun_object varchar2)
return varchar2 as fun_cost varchar2(20);
begin
fun_cost:='cost=10';
return(fun_cost);
end fun_num;
/
2 3 4 5 6 7
Function created.
新增過濾策略“filter_name”
LEO1@LEO1>begin
dbms_rls.add_policy(
object_schema => 'leo1',
object_name => 'car',
policy_name => 'filter_name',
policy_function => 'fun_name',
sec_relevant_cols => 'name');
end;
/
2 3 4 5 6 7 8 9
PL/SQL procedure successfully completed.
新增過濾策略“filter_num”
LEO1@LEO1>begin
dbms_rls.add_policy(
object_schema => 'leo1',
object_name => 'car',
policy_name => 'filter_num',
policy_function => 'fun_num',
sec_relevant_cols => 'num');
end;
/
2 3 4 5 6 7 8 9
PL/SQL procedure successfully completed.
當我們要查詢汽車名的時候,會觸發filter_name過濾策略,從而呼叫fun_name函式限制where cost=30的記錄顯示
LEO1@LEO1>select name,cost from car;
NAME COST
-------------------- ----------
toyota 30
volvo 30
honda 30
當我們要查詢汽車數量的時候,會觸發filter_num過濾策略,從而呼叫fun_num函式限制where cost=10的記錄顯示
LEO1@LEO1>select num,cost from car;
NUM COST
---------- ----------
20 10
30 10
40 10
當我們不想使用過濾策略的時候,如何刪除?
使用drop_policy儲存過程來刪除,filter_name和filter_num過濾策略
LEO1@LEO1>execute dbms_rls.drop_policy('leo1','car','filter_name');
PL/SQL procedure successfully completed.
LEO1@LEO1>execute dbms_rls.drop_policy('leo1','car','filter_num');
PL/SQL procedure successfully completed.
LEO1@LEO1>select * from car;
NAME NUM COST
-------------------- ---------- ----------
toyota 10 30
volvo 50 30
honda 60 30
biaozhi 70 20
xuetielong 80 20
polo 90 20
xiali 20 10
jili 30 10
byd 40 10
9 rows selected.
利用VPD隱藏敏感列資訊
我們設計一個新的“filter_num”策略,只顯示cost=10的記錄,隱藏num列的汽車數量
LEO1@LEO1>begin
dbms_rls.add_policy(
object_schema => 'leo1',
object_name => 'car',
policy_name => 'filter_num',
policy_function => 'fun_num',
sec_relevant_cols => 'num',
sec_relevant_cols_opt => dbms_rls.all_rows); 只顯示相關的行資訊
end;
/
2 3 4 5 6 7 8 9 10
PL/SQL procedure successfully completed.
LEO1@LEO1>select * from car;
NAME NUM COST
-------------------- ---------- ----------
toyota 30
volvo 30
honda 30
biaozhi 20
xuetielong 20
polo 20
xiali 20 10
jili 30 10
byd 40 10
9 rows selected.
小結:VPD是一種行級安全控制,操作簡單無需新增任何元件即可實施。
四 演示一個OLS進行資料訪問控制的示例
1.什麼是OLS:Oracle Label Security 甲骨文標籤安全訪問控制,透過建立標籤來過濾結果集,這種方式會修改表結構,會增加一列叫“標籤列”又叫“偽列”,透過給不同的記錄指定不同的標籤,從而達到顯示不同的結果集。OLS比VPD功能更強大一些,並且不是資料庫預設自帶的,需要獨立安裝。
2.Oracle Label Security的安裝
Oracle 10g 安裝OLS
執行Oracle程式安裝檔案
./runInstaller 安裝元件->選擇“Oracle Label Security 10.2.0.1.0”
Oracle 11g 安裝OLS
11g不需安裝OLS元件,已經安裝好了,只需要啟動就好。
Red Hat Linux
(1)[oracle@leonarding1 oracle]$ chopt enable lbac 啟動OLS,寫入OLS日誌
Writing to /u02/app/oracle/product/11.2.0/db_1/install/enable_lbac.log...
%s_unixOSDMakePath% -f /u02/app/oracle/product/11.2.0/db_1/rdbms/lib/ins_rdbms.mk lbac_on
%s_unixOSDMakePath% -f /u02/app/oracle/product/11.2.0/db_1/rdbms/lib/ins_rdbms.mk ioracle
(2)啟動dbca安裝Oracle Label Security資料庫物件和專屬使用者
[oracle@leonarding1 oracle]$ dbca
配置資料庫選項,點選“下一步”
選擇哪個資料庫->“LEO1” 點選“下一步”
Oracle Label Security 元件上挑勾,點選“下一步”
這裡就出現了不可思議的場景,Oracle Label Security是灰框框,不可打勾,如果這裡是白框框那麼恭喜你可以成功繼續下一步了。當然沒有安裝上的筒子們也不要氣餒,條條大路通羅馬,請看下面的指令碼方法。
Oracle Label Security 元件的指令碼安裝法
(1)我們使用Oracle自帶的OLS安裝指令碼來部署OLS元件$ORACLE_HOME/rdbms/admin/catols.sql
[oracle@leonarding1 ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Fri Jun 14 18:57:08 2013
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SYS@LEO1>@?/rdbms/admin/catols.sql
<<<<<<<<<<<<<<省略指令碼執行資訊>>>>>>>>>>>>>>>
請注意在建立完資料庫物件後會自動關閉資料庫,你需要重新啟動
Database closed.
Database dismounted.
ORACLE instance shut down.
(2)檢查OLS專屬使用者LBACSYS的狀態,正常安裝指令碼後為OPEN,如果是LOCKED,請執行下面解鎖步驟
SYS@LEO1>select username,account_status from dba_users;
。。。。。。省略無用內容。。。。。。
USERNAME ACCOUNT_STATUS
------------------------------ --------------------------------
LBACSYS OPEN
SYS OPEN
SYSTEM OPEN
OUTLN EXPIRED & LOCKED
MGMT_VIEW EXPIRED & LOCKED
33 rows selected.
解鎖並設定密碼,如果要是OPEN狀態,可跳過這一步
alter user lbacsys account unlock;
alter user lbacsys identified by lbacsys;
小結:LBACSYS是OLS管理員使用者,安裝OLS之後就會自動建立,如果有鎖請解鎖即可使用。
(3)檢查LBACSYS使用者中涉及到的資料庫物件資訊
LBACSYS使用者中不存在無效的資料庫物件。
SYS@LEO1>select object_type,object_name from dba_objects where owner='LBACSYS' and status='INVALID';
no rows selected
SYS@LEO1>set pagesize 999 設定999行才有一個分界符
SYS@LEO1>select object_type,count(*) from dba_objects where owner='LBACSYS' group by object_type;
OBJECT_TYPE COUNT(*)
--------------------------------------------------
SEQUENCE 2
PROCEDURE 5
LIBRARY 10
PACKAGE 24
LOB 1
PACKAGE BODY 23
TYPE BODY 5
TRIGGER 3
FUNCTION 35
TABLE 21
INDEX 28
VIEW 57
TYPE 10
13 rows selected.
這就是Oracle Label Security所使用的資料庫物件,以上我們完成了Oracle Label Security元件的安裝。
(4)如何解除安裝Oracle Label Security元件
有安裝指令碼自然就會有解除安裝指令碼,執行catnools.sql指令碼就可自動解除安裝OLS
SYS@LEO1>@?/rdbms/admin/catnools.sql
PL/SQL procedure successfully completed. 刪除儲存過程
PL/SQL procedure successfully completed.
Trigger dropped. 刪除觸發器
Trigger dropped.
Trigger dropped.
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
User dropped. 最後刪除使用者
2 rows deleted.
Commit complete.
先刪除Oracle Label Security對應的資料庫物件再刪除LBACSYS使用者。
(5)如何使用好Oracle Label Security
建立標籤策略
SYS@LEO1>alter user lbacsys identified by lbacsys; 設定密碼
User altered.
SYS@LEO1>conn lbacsys/lbacsys 切換lbacsys使用者
Connected.
LBACSYS@LEO1>execute sa_sysdba.create_policy(policy_name => 'ACCESS_LEO1',column_name => 'OLS_COLUMN');
BEGIN sa_sysdba.create_policy(policy_name => 'ACCESS_LEO1',column_name => 'OLS_COLUMN'); END;
*
ERROR at line 1:
ORA-00439: feature not enabled: Oracle Label Security
ORA-06512: at "LBACSYS.LBAC_SYSDBA", line 113
ORA-06512: at "LBACSYS.SA_SYSDBA", line 44
ORA-06512: at line 1
####################################################################################################
安裝database vault
(1)啟動chopt enable dv 服務
(2)依賴Oracle Label Security
(3)重啟資料庫startup force
(4)dbca建立資料庫物件
啟動chopt enable dv 服務
[oracle@leonarding1 ~]$ chopt enable dv
Writing to /u02/app/oracle/product/11.2.0/db_1/install/enable_dv.log...
%s_unixOSDMakePath% -f /u02/app/oracle/product/11.2.0/db_1/rdbms/lib/ins_rdbms.mk dv_on
%s_unixOSDMakePath% -f /u02/app/oracle/product/11.2.0/db_1/rdbms/lib/ins_rdbms.mk ioracle
五 演示一個透過觸發器進行審計的示例。
Car表是一個非常重要的表,記錄了4S店汽車的銷量情況,我們要對操作這個表動作進行審計
LEO1@LEO1>select * from car;
NAME NUM COST
-------------------- ---------- ----------
toyota 10 30
volvo 50 30
honda 60 30
biaozhi 70 20
xuetielong 80 20
polo 90 20
xiali 20 10
jili 30 10
byd 40 10
9 rows selected.
建立審計表car_audit
LEO1@LEO1>create table car_audit (
name varchar2(20),
num number,
cost number,
uuser varchar2(20),
ddate date); 2 3 4 5 6
Table created.
建立審計觸發器
LEO1@LEO1>create trigger trg_car_audit
after insert or delete or update on car
for each row
declare
a_name varchar2(20);
a_num number;
a_cost number;
begin
a_name :=:old.name;
a_num :=:old.num;
a_cost :=:old.cost;
insert into car_audit values(a_name,a_num,a_cost,user,sysdate);
end;
/
2 3 4 5 6 7 8 9 10 11 12 13 14
Trigger created.
刪除記錄
LEO1@LEO1>delete from car where num=100;
1 row deleted.
LEO1@LEO1>commit;
Commit complete.
插入記錄
LEO1@LEO1>insert into car values('kia',100,50);
1 row created.
LEO1@LEO1>commit;
Commit complete.
更新記錄
LEO1@LEO1>update car set num=200 where num=100;
1 row updated.
LEO1@LEO1>commit;
Commit complete.
凡是對car表進行DML操作都會觸發審計觸發器,並在car_audit表中留下審計記錄
LEO1@LEO1>select * from car_audit;
NAME NUM COST UUSER DDATE
-------------------- ---------- ---------- -------------------- ---------
kia 100 50 LEO1 15-JUN-13
LEO1 15-JUN-13
kia 100 50 LEO1 15-JUN-13
六 分別演示對sys使用者和普通使用者進行審計的示例。
我們在運算元據庫的時候,知道SYS使用者的許可權是最大的幹什麼事很方便,同時帶來的問題就是非常危險,沒有人可以束縛住。因此我們有時需要對SYS使用者進行審計
SYS@LEO1>show parameter audit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /u02/app/oracle/admin/LEO1/adump
audit_sys_operations boolean FALSE 預設SYS使用者審計是關閉的,這個引數是開啟審計SYS使用者所有SQL語句
audit_syslog_level string 預設是關閉的,這個引數指出SYS使用者審計日誌的存放位置
audit_trail string DB
SYS@LEO1>alter system set audit_sys_operations=true scope=spfile; 開啟SYS使用者審計
System altered.
SYS@LEO1>alter system set audit_syslog_level='user.notice' scope=spfile; 使用者日誌
System altered.
SYS@LEO1>startup force 重啟資料庫使靜態引數生效
ORACLE instance started.
Total System Global Area 471830528 bytes
Fixed Size 2214456 bytes
Variable Size 285214152 bytes
Database Buffers 176160768 bytes
Redo Buffers 8241152 bytes
Database mounted.
Database opened.
SYS@LEO1>show parameter audit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /u02/app/oracle/admin/LEO1/adump
audit_sys_operations boolean TRUE 審計啟動
audit_syslog_level string USER.NOTICE
audit_trail string DB
設定sys使用者審計日誌輸出位置,Linux 中syslog.conf檔案配置了各種型別日誌的輸出位置和訊息源
我們只需要將Oracle日誌輸出配置資訊新增到該檔案中就可以了
[root@leonarding1 log]# vi /etc/syslog.conf
新增如下資訊
# About Oracle SysLog
user.notice /var/log/oracle_dbms
新增完之後,我們還要重新載入一下配置資訊,syslog.conf檔案生效
[root@leonarding1 log]# ps -ef | grep syslogd
root 2385 1 0 Jun14 ? 00:00:01 syslogd -m 0
root 29740 29502 0 17:25 pts/1 00:00:00 grep syslogd
[root@leonarding1 log]# kill -HUP 2385 重新載入
Ok,作業系統的配置內容完成了。
下面我們來演示一下SYS使用者的審計
SYS@LEO1>create table test as select * from dba_objects; 我們建立一個表
Table created.
SYS@LEO1>drop table test purge; 再刪除一個表
Table dropped.
好了,SYS使用者操作做完了,我們來看看oracle_dbms審計日誌中有沒有抓取到SQL語句
[root@leonarding1 log]# cat oracle_dbms
Jun 15 18:08:40 leonarding1 Oracle Audit[29903]: LENGTH : '199' ACTION :[46] 'create table test as select * from dba_objects' DATABASE USER:[1] '/' PRIVILEGE :[6] 'SYSDBA' CLIENT USER:[6] 'oracle' CLIENT TERMINAL:[5] 'pts/3' STATUS:[1] '0' DBID:[10] '1692458681'
Jun 15 18:08:49 leonarding1 Oracle Audit[29903]: LENGTH : '174' ACTION :[21] 'drop table test purge' DATABASE USER:[1] '/' PRIVILEGE :[6] 'SYSDBA' CLIENT USER:[6] 'oracle' CLIENT TERMINAL:[5] 'pts/3' STATUS:[1] '0' DBID:[10] '1692458681'
Good 建立表test和刪除表test的命令都抓取到了,例如 startup shutdown connect等操作都是可以抓取到的。
小結:透過上面的測試例項,我們瞭解到了對資料庫管理員的審計也逐漸成為資訊保安中的重要一項,這樣可以對管理員人員進行監督,許可權限制,提高資料庫安全級別,完善安全管理制度。這裡提及一個問題,為什麼SYS使用者的操作記錄需要記錄在作業系統檔案中呢,這裡就有一個淵源了,由於SYS使用者本身權力就大,大到可以把自己的操作記錄都可以刪除,因此為了節制SYS使用者,就把記錄操作的日誌放在了作業系統下面,還不是普通使用者可以訪問的,必須是作業系統管理員才能檢視,這下同學們應該知道原委了吧。
普通使用者審計的示例
我們既可以對SYS使用者進行審計,那麼在平時的時候更多的是對普通使用者的審計,對普通使用者的審計就沒有這麼嚴格了,它的審計記錄是可以放在資料庫基表sys.aud$中的,我們可以在資料庫層面上進行檢視。
標準審計內容
(1)審計會話
(2)審計物件
(3)審計操作
(4)審計授權
實驗
SYS@LEO1>show user
USER is "SYS"
SYS@LEO1>alter system set audit_trail=db,extended scope=spfile; 啟動審計追逐資料庫功能
System altered.
SYS@LEO1>startup force; 重啟資料庫使靜態引數生效
ORACLE instance started.
Total System Global Area 471830528 bytes
Fixed Size 2214456 bytes
Variable Size 285214152 bytes
Database Buffers 176160768 bytes
Redo Buffers 8241152 bytes
Database mounted.
Database opened.
我們計劃對leo1使用者的car表進行審計
SYS@LEO1>audit select,insert,update,delete on leo1.car;
Audit succeeded.
指定審計物件和審計動作,對select,insert,update,delete這四個操作Oracle都會進行審計。
插入記錄
LEO1@LEO1> insert into leo1.car values('mini',150,150);
1 row created.
LEO1@LEO1>commit;
Commit complete.
LEO1@LEO1> select * from car;
。。。。。。省略。。。。。。
LEO1@LEO1>select userid,obj$name,sqltext from sys.aud$;
USERID OBJ$NAME SQLTEXT
--------------------------------------------------------------------------------------------------------------------------------
LEO1 CAR select * from car
LEO1 CAR insert into leo1.car values('mini',150,150)
VPD OLS db vault audit sys使用者
劉盛
2013.6.16
北京&summer
分享技術~成就夢想
Blog:
##########################################################################################
如果喜歡我的文章就請掃下面二維碼吧!關注微訊號:leonarding_public
在這裡你能得到技術、實事、熱點訊息等新興事物的思考和觀點,別的地方可能沒有的東西。我將為大家提供最新技術與資訊動態,傳遞正能量。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26686207/viewspace-1475501/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 安全管理:polardb資料庫審計功能資料庫
- 構建安全護盾:HarmonyOS 應用的資料安全審計與日誌管理實戰
- Graudit程式碼安全審計
- 網路安全法草案二審
- 讀軟體開發安全之道:概念、設計與實施10安全設計審查
- OceanBase 安全審計之透明加密加密
- Linux網路流量安全審計Linux
- 網路安全審計工具Nmap
- 企業安全管理(二)
- python 安全編碼&程式碼審計Python
- 資料庫安全審計在資料安全中的功能資料庫
- Oracle:審計清理Oracle
- Oracle審計(轉)Oracle
- 基於Java關鍵詞審計技巧?網路安全原始碼審計Java原始碼
- 網路安全審計主要包括哪些內容?
- mysql 5.7新增server_audit 安全審計功能MySqlServer
- Oracle Linux 7使用syslog來管理Oracle ASM的審計檔案OracleLinuxASM
- Oracle Audit 審計功能的認識與使用Oracle
- ORACLE AUDIT審計(1)Oracle
- 基於php審計關鍵詞審計技巧總結 網路安全學習PHP
- SQL Server安全審計中的常見疏忽NFSQLServer
- (轉)Rustls 完成第三方安全審計RustTLS
- Oracle安全配置Oracle
- 網路安全學原始碼審計嗎?怎樣才能學好網路安全原始碼
- 美國安全審計公司Certik完成Punk.Network的智慧合約程式碼審計
- 騰訊安全嵌入式安全審計平臺入選國家級試點!
- 新版《網路安全審查辦法》施行,資料安全納入審查範圍
- 審計SQL Server安全性的幾種方式YGSQLServer
- oracle 細粒度審計(fga)Oracle
- oracle審計-細粒度(轉)Oracle
- 點對點分析CII與等級保護系列 安全管理部分(二)
- Spring Security(二)登入與安全控制Spring
- Oracle Linux 7使用cron來管理Oracle ASM審計檔案目錄的增長OracleLinuxASM
- 從技術角度解讀《資料安全法(草案)》二審稿
- 安全審計的目的是什麼?其型別都有哪些?型別
- 【網路安全入門必看】常用的審計工具都有哪些?
- 在Linux中,如何理解安全審計工具?如Lynis和OSSEC。Linux
- 網路安全審計工具—Nmap!滲透測試入門
- oracle fga審計(欄位級)Oracle