保護Oracle資料庫的安全

逍遙三人發表於2012-02-12
轉載:http://blog.163.com/z_rx/blog/static/27636376200991531315901/

每個組織都應該制定一份安全準則,安全無對錯之分,這只是遵從或違反約定程式的問題。管理員只要按規則中的要求和建議行 事,任何安全紕漏將不再是他們的責任。過去的經驗表明,出現任何安全問題時,總有人心中燃燒著將責任推卸給他人的強烈慾望。管理員必須拿出安全準則,以及 示範執行方式的程式和記錄(測試的過程記錄或恢復文件),這樣責任將轉嫁到規範說明和安全準則的制定者身上。如果沒有這樣的手冊,那麼責任往往會推到資料 庫管理員身上。Oracle系列產品提供了多項功能,來實施達到或超過任何組織制定的最高標準的安全性。

1資料庫安全和最小許可權原則
訪 問計算機系統時需要遵循的最重要的安全原則是"最小許可權"原則,即使用者應當只擁有執行其任務所需的最小許可權,並禁止所有未被特別允許的許可權。Oracle 遵循了最小許可權原則,在預設情況下,只有使用者SYS和SYSTEM才擁有所有許可權。授予PUBLIC帳戶的許可權以及一些例項引數,來幫助實現最小許可權原 則。

1.1PUBLIC許可權
PUBLIC角色將隱式授予每位使用者。只要為PUBLIC授予任何許可權,相應的許可權實際上就會授予可以連線到資料庫的每個人;建立的每個帳戶都有權訪問這些許可權。預設方式下,PUBLIC使用者擁有大量許可權,尤其是擁有能夠執行許多PL/SQL實用程式包的許可權。
[ORACLE]保護Oracle資料庫的安全 - z_rx - rainsnow的部落格
雖然應用軟體可以為PUBLIC使用者授予執行UTL程式包的許可權,但是應當取消PUBLIC使用者的這個許可權,下面許可權可以取消該許可權:
SQL> revoke execute on utl_file from public;
較不安全的程式包:
UTL_FILE:允許使用者讀寫作業系統Oracle所有者可以訪問的任何檔案和目錄,這些檔案與目錄包括所有的資料庫檔案以及Oracle_HOME目錄。
UTL_TCP:允許使用者為了連線網路中所有可訪問的地址而開啟伺服器上的TCP埠。
UTL_SMTP:使用UTL_TCP呼叫編寫的這個程式包允許使用者傳送郵件訊息。受UTL_SMTP_SERVER引數限制,此引數給出了出站郵件伺服器的地址。
UTL_HTTP:使用UTL_TCP呼叫進行編寫,允許傳送HTTP訊息和接收響應,結果是將資料庫轉換為Web瀏覽器。

[提示]PUBLIC是授予所有人的角色-但是在使用AS SYSOPER語法連線到例項時,看似是連線到PUBLIC帳戶。

1.2對安全性至關重要的例項引數(靜態引數)
UTL_FILE_DIR:
預設為NULL,允許PL/SQL通過UTL_FILE補充程式包來訪問伺服器計算機的檔案系統。引數為一個用逗號分隔的目錄列表,使用下面語法設定這個引數:
SQL> alter system set utl_file_dir='/oracle/tmp','/oracle/interface' scope=spfile; --可以使用萬用字元,不要設定為"*"。
REMOTE_OS_AUTHENT:預設為FALSE,控制某個使用者是否能夠在不需要給出口令的情況下從遠端計算機上連線資料庫。目前系統不需再需要執行這種操作,但仍保留了該功能。之前為了避免使用者兩次提供使用者名稱與口令(作業系統與資料庫),通常使用如下語法建立Oracle使用者:
SQL> create user jon identified externally;
這樣身份驗證操作被委託給伺服器的作業系統完成,如下所示,做為作業系統使用者"jon"登入伺服器的任何人都能夠在不需要進行身份驗證的情況下連線資料庫:
$ sqlplus /
Connected to:Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
SQL> show user;
USER is "JON"
SQL>
[提示]啟用遠端作業系統身份驗證並非是一種好做法。
OS_AUTHENT_PREFIX:預設值為"OPS$"的OS_AUTHEN_PREFIX引數指定了一個字首,作業系統名在對映為Oracle使用者名稱之前必須應用這個字首,下例中,使用如下語法清空了這個引數:
SQL> alter system set os_authent_prefix='' scope=spfile;      ------否則,Oracle使用者名稱肯定為OPS$JON
O7_DICTIONARY_ACCESSIBILITY:
因在Oracle7版本中開始使用而得名。控制使用ANY關鍵字授予物件許可權的效果。預設值為FALSE,這意味著ANY許可權不被授予SYS擁有的物件,保護了資料字典。,如果引數修改為TRUE,,這意味著所有物件都被授予了ANY許可權。使用下例為使用者JON授予檢視資料庫中所有表的許可權:
SQL> grant select any table to jon;
[提示]安裝某個軟體產品時,必須將O7_DICTIONARY_ACCESSIBILITY例項引數設定為TRUE,然後再將其恢復為預設值FALSE。可以將這些使用者授予SELECT ANY DICTIONARY的許可權。
REMOTE_LOGIN_PASSWORDFILE:控 制具有SYSDBA或SYSOPER許可權的使用者能否通過網路連線例項。預設值NONE,將引數值設為EXCLUSIVE或SHARED,使用者能夠作為 SYSDBA連線例項。V$PWFILE_USERS檢視顯示其口令被輸入口令檔案的使用者以及這些使用者是否具有SYSOPER許可權或SYSDBA許可權。
[ORACLE]保護Oracle資料庫的安全 - z_rx - rainsnow的部落格
[提示]做為SYSDBA連線例項時,即使使用了使用者名稱和密碼,最終仍然是做為使用者SYS進行連線,做為SYSOPER連線例項時,實際上是做為PUBLIC使用者進行連線。
[提示]啟用口令檔案並不能提高安全性,相反,由於允許使用者除了始終可用的本地作業系統身份驗證外,還能以其它方式獲取具有許可權的連線,這樣會降低安全性。但是,標準的做法是啟用口令檔案,如果沒有此檔案,不能在遠端管理資料庫。某些計算機審計者不瞭解作業系統和口令檔案身份驗證,甚至聲稱必須建立口令檔案來提高安全性。

1.3 練習:研究資料庫和應用環境
本練習將生成一個指令碼,可以從PUBLIC刪除一些更具危險性的許可權。使用SQL*PLUS。
以使用者SYSTEM的身份連線到資料庫。
編輯SQL*Plus,從其輸出中刪除無關的字元:

set headers off
set pagesize 0
set feedback off

將輸出列印到適當目錄的檔案中,下面是Unix和Windows系統中的示例:
spool $HOME/oracle/scripts/clear_public_privs.sql
spool c:\oracle\scripts\clear_public_privs.sql

通過執行以下語句生成SQL命令檔案:

select 'revoke execute on '||table_name||' from public;' from dba_tab_privs where table_name like 'UTL_%';

停止正在進行的後臺列印:
spool off
使用自己選擇的編輯器開啟生成的檔案。注意,可能需要做幾處編輯,然後才能執行操作來刪除第一行和最後一行;由於站點情況不同,某些許可權(如果有)可能無法真正取消。

2使用標準資料庫審計
無 論安全策略多麼完善,總是存在使用策略顯得不足的場合。可能不得不接受具有潛在危險許可權的使用者,能夠做到的就是監視使用者的許可權使用以及跟蹤通過這些許可權進 行的實際操作。上述情況的最極端示例就是資料庫管理員。具有SYSDBA許可權的任何人可以在資料庫內進行任何操作。為了讓人相信資料庫管理員不會濫用權 利,有必要審計所有的SYSDBA活動。對於普通使用者來說,資料庫管理員也可能希望跟蹤他們所進行的操作。雖然可能無法阻止這些使用者違反與資料訪問相關的 公司規定,但資料庫管理員卻能夠跟蹤他們的違規行為。Oracle提供了4種審計技術:
SYSDBA審計:
資料庫審計:能夠跟蹤特定許可權的使用、特定命令的執行、對特定表的訪問以及登入嘗試。
基於值的審計:使用了資料庫觸發器,在插入、更新或刪除記錄時,就會執行一個包括記錄事件全部細節的PL/SQL程式碼塊。
細粒度審計:允許根據所訪問的記錄來跟蹤對錶的訪問。細粒度審計更為精確,並且可以將生成的審計記錄的範圍限制為感興趣的審計記錄。
[提示]任何一種審計都會增加資料庫必須完成的工作量。為了限制這種工作量,應當進行重點審計,同時不跟蹤不重要的事件。

2.1審計SYSDBA活動
參 數AUDIT_SYS_OPERATIONS引數為TRUE(預設值DEFAULT),做為SYSDBA、SYSOPER連線資料庫的使用者所發出的每條語 句都會被寫入作業系統的審計跟蹤,審計跟蹤必須受到保護,如果DBA能夠刪除審計記錄,那建立這些記錄將無意義。所以要避免“責任分離 (separation of duties)”,需要對系統進行配置,使DBA不能訪問跟蹤DBA活動的審計記錄,這些審計記錄只能被計算機系統管理員訪問。如果DBA是系統管理員, 那麼這種審計就毫無作用,所以對於審計人員應當始終堅持這種觀點:DBA不擁有系統的“超級使用者”或“管理員”口令。
Windows系統中,審計記錄資料夾為Windows Application Log。Unix系統中,目的資料夾由AUDIT_FILE_DEST引數控制。


2.2資料庫審計
設定資料庫審計前,必須設定AUDIT_TRAIL引數:
NONE(或FALSE):無論試圖配置哪一種審計,這個引數都會禁用資料庫審計。
OS:審計記錄會被寫至作業系統的審計跟蹤,通過使用適當的編輯器,檢視在作業系統審計跟蹤中建立的檔案,可以檢視審計結果。
DB:審計記錄會被寫入資料字典表SYS.AUD$。
DB_EXTENDED:與DB作用大致相同,不過包含生成審計記錄的、具有繫結變數的SQL語句。
審計記錄會被寫入資料字典表SYS.AUD$。
XML:與OS的作用大體相同,但使用XML標記設定格式,
通過使用適當的編輯器,檢視在作業系統審計跟蹤中建立的檔案,可以檢視審計結果。
XML_EXTENDED:與XML的作用大體相同,但使用SQL語句和繫結變數。
審計對沒有成功執行的命令特別有用,此時生成的任何記錄都會說明使用者試圖違反自己的訪問許可權。使用AUDIT命令可以配置資料庫審計,例如:
SQL> audit create any trigger;
SQL> audit select any table by session;
如 果程式設計人員需要被授予CREATE ANY TRIGGER許可權時應特別注意,這時一個可以被惡意使用的危險許可權。有時需要SELECT ANY TABLE和UPDATE ANY TABLE許可權。預設方式下,審計會為違法審計條件的每個會話生成一條審計記錄,而不考慮違法條件的次數。這相當於為AUDIT命令追加關鍵字BY SESSION,這會為每次違反條件的情況生成一條記錄。
[提示]BY SESSION通常並不是需要的設定,但此設定將生成的審計記錄數量限制為更易於管理的資料。
設定物件導向的審計:
SQL> audit insert on ar.hz_parties whenever successful; --WHENEVER SUCCESSFUL記錄限制為操作成功的記錄;WHENEVER NOT SUCCESSFUL會審計所有操作;
SQL> audit all on ar.ra_interface_lines_all;
   --審計針對指定表執行DDL語句的每個會話;
使用AUDIT SESSION命令可以審計登入,如:
SQL> audit session whenever not successful;  --會話審計記錄針對資料庫的每次連線,這可能十分有用,記錄嘗試是否正在侵入資料庫;
DATABASE CONTROL的審計系統的圖形介面:
[ORACLE]保護Oracle資料庫的安全 - z_rx - rainsnow的部落格
DBA_AUDIT_TRAIL是一個重要檢視,下圖是常用的列:
[ORACLE]保護Oracle資料庫的安全 - z_rx - rainsnow的部落格
審計檢視DBA_AUDIT_OBJECT、DBA_AUDIT_STATEMENT、DBA_AUDIT_SESSION顯示DBA_AUDIT_TRAIL檢視的一個子集,僅顯示與其相關的某些審計記錄和列。
[提示]數 據庫的安全性對所有站點都至關重要。所有DBA都必須瞭解“最小許可權”準則;未特定授予的所有許可權都必須予以禁止。建立資料庫時針對PUBLIC角色的某 些預設授權視為潛在的安全風險。一般情況,預設設定是安全的,但始終應檢查這些設定及其記錄的值。使用者需要的許可權可能導致濫用,審計是一種管理方式:知道 使用者可能破壞安全,將他們所做的事實記錄下來,可以起到威懾作用,允許使用者捕獲此類操作。將系統管理員與資料庫管理員的職責分開意味著,也可以對DBA本 人進行審計。

2.3使用觸發器執行基於值的審計
使用者無法阻止觸發器的激發,如果需要捕獲被改變行的實際值,就需要使用資料庫觸發器。
考慮以下建立觸發器的語句:

SQL> CREATE OR REPLACE TRIGGER system.creditrating_audit
2 AFTER UPDATE OF creditrating
3 ON oe.customers
4 REFERENCING NEW AS NEW OLD AS OLD
5 FOR EACH ROW
6 BEGIN
7 IF :old.creditrating != :new.creditrating THEN
8 INSERT INTO system.creditrating_audit
9 VALUES (sys_context('userenv','os_user'),
10 sys_context('userenv','ip_address'),
11 :new.cust_id ||' credit rating changed from
12 '||:old.creditrating||
13 ' to '||:new.creditrating);
14 END IF;
15 END;
16 /
[提示]與資料庫審計相比較,通過觸發器的審計是一個很緩慢的過程,不過能夠提供更多的資訊,允許實施複雜的業務規則。

2.4細粒度審計(FGA)
數 據庫審計可以捕獲對某個表的所有訪問,包括SELECT與DML操作。細粒度審計可以被配置為只在訪問特定行或特定行的特定列時生成審計記錄,還可以被配 置為在違反審計條件時執行一個PL/SQL程式碼塊。配置FGA將會涉及程式包DBMS_FGA。為了建立一個FGA審計策略,需要使用 ADD_POLICY過程,這個過程接受下表所示的引數:
[ORACLE]保護Oracle資料庫的安全 - z_rx - rainsnow的部落格
其他DBMS_FGA過程用於啟用、禁用或刪除FGA策略。可以查詢DBA_FGA_AUDIT_TRAIL檢視來檢視FGA結果
SQL> describe dba_fga_audit_trail;
Name Null? Type
----------------------------- -------- ---------------------------
SESSION_ID NOT NULL NUMBER
TIMESTAMP DATE
DB_USER VARCHAR2(30)
OS_USER VARCHAR2(255)
USERHOST VARCHAR2(128)
CLIENT_ID VARCHAR2(64)
EXT_NAME VARCHAR2(4000)
OBJECT_SCHEMA VARCHAR2(30)
OBJECT_NAME VARCHAR2(128)
POLICY_NAME VARCHAR2(30)
SCN NUMBER
SQL_TEXT NVARCHAR2(2000)
SQL_BIND NVARCHAR2(2000)
COMMENT$TEXT VARCHAR2(4000)
STATEMENT_TYPE VARCHAR2(7)
EXTENDED_TIMESTAMP TIMESTAMP(6) WITH TIME ZONE
PROXY_SESSIONID NUMBER
GLOBAL_UID VARCHAR2(32)
INSTANCE_NUMBER NUMBER
OS_PROCESS VARCHAR2(16)
TRANSACTIONID RAW(8)
STATEMENTID NUMBER
ENTRYID NUMBER

此過程呼叫將建立POL1策略,此策略將捕獲讀取HR.EMPLOYEES表SALARY列的所有SELECT語句(如果檢索到的行至少有一個在部門80):
SQL> execute dbms_fga.add_policy(-
> object_schema=>'HR',-
> object_name=>'EMPLOYEES',-
> policy_name=>'POL1',-
> audit_condition=>'department_id=80',-
> audit_column=>'SALARY');
[提示]標準資料庫審計結果檢視(DBA_AUDIT_TRAIL),細粒度審計結果檢視(DBA_FGA_AUDIT_TRAIL),兩者審計結果的檢視(DBA_COMMON_AUDIT_TRAIL)。要檢視使用觸發器審計的結果,必須建立處理自己的表的自定義檢視。

2.5練習:使用標準資料庫審計

1. 以使用者SYSTEM的身份連線到資料庫,並建立本練習使用的使用者和表:
create user sabine identified by oracle;
create table system.audi as select * from all_users;
grant create session, select any table to sabine;
grant select on audi to sabine;
2. 使用SQL*Plus,啟用對SABINE使用SELECT ANY PRIVILEGE的審計,以及對錶AUDI的所有訪問的審計:
audit select any table by access;
audit all on system.audi by access;
在使用Database Control時,可在Audit Settings視窗中執行此操作。
3. 以使用者SYS的身份連線到資料庫。這是必須的,因為此步驟需要重新啟動例項。將審計跟蹤目標設定為DB,啟用許可權使用者的審計,關閉並重啟例項,使用如下的SQL*Plus:
alter system set audit_trail='DB_EXTENDED' scope=spfile;
alter system set audit_sys_operations=true scope =spfile;
startup force;
使 用Database Control時,資料庫主頁可能的導航路徑為:選擇Server選項卡,然後單擊Security區域中的Audit Settings。如果單擊Configuration區域中的Audit Trail連結,將彈出一個視窗,允許修改spfile中的引數設定。另外,在Server選項卡上,單擊Database Configuration區域的Initialization Parameters連結,可以直接進入Initialization Parameters視窗.
在spfile中設定兩個引數,此後,在資料庫主頁中關閉並重新啟動資料庫。
4. 以SYS身份連線時,將審計所有的語句。執行以下語句:
select count(*) from system.audi;
5.如果使用Linux 或Unix, 可通過查詢AUDIT_FILE_DEST引數來確定系統審計跟蹤的位置。這將用於審計SYS操作,而不考慮AUDIT_DEST設定。使用SQL*Plus執行以下語句:
select value from v$parameter where name='audit_file_dest';
Using an operating system utility, navigate to this directory and open the
most recently created file.
如果使用Microsoft Windows, 請在Event Viewer中開啟Application Log。無論如何,都將看到以SYS身份執行的SELECT語句,以及作業系統使用者和主機名的詳細資訊。
6. 以SABINE的身份連線到資料庫,並執行以下查詢:
select count(*)from system.audi;
select count(*) from system.product_user_pro
file;
7. 以使用者SYSTEM的身份,執行查詢來檢視審計事件:
select sql_text,priv_used,act
ion_name from dba_audit_trail
where username='SABINE';
注意,這裡使用了最低許可權:通過物件許可權來訪問AUDI表,而非功能更強大的系統許可權(獲取
PRODUCT_USER_PROFILE需要此許可權)。
8. 進行整理:
drop user sabine;
drop table system.audi;

[提示]應對電腦保安審計:審計者想要看到系統像平常一樣執行。應與審計者密切合作,嚴格的計算機審計十分有用,實現任何建議需要做大量工作。
[提示]啟用標準資料庫審計會影響效能,緊盯審計的重點,只審計確有價值的事件的記錄。儘可能按會話(而非訪問)進行審計。如果審計資料庫,SYS.AUD$表可能增加到數GB:這需要定期執行刪除。

3小結
應將“最小許可權”原則和“職責分離”應用於所有Oracle安裝。過去的經驗表明,使用者有時濫用完成工作所需的許可權。設計用於對此進行管理:實際上,無法阻止使用者觸犯規則,但可將他們的所作所為記錄下來。
資料庫審計可以捕獲與許可權使用、某些語句的執行和某些物件的訪問有關的事件。細粒度審計更精確:它可以注意到對特定行和列的訪問。使用DML觸發器進行審計較完善:它可以捕獲執行DML語句時需要的任何操作。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21584437/viewspace-716094/,如需轉載,請註明出處,否則將追究法律責任。

相關文章