---txfy
9i新特性之二安全篇
這篇文章主要講解應用程序客戶端訪問數據庫的新特性。有些地方理解不好
寫得也不是很好,請大家幫忙指正,謝謝!
9I安全認證擁有
..解決了阻止未經認證的用戶通過其他客戶端訪問數據的問題.
..在隱藏密碼的實現方面有了比以前更好的機制.
..角色的有效性是通過一個包來檢測而不是一個口令
..應用設置的概念在8i中已經作了介紹,8i中細粒度訪問控制能夠達到
制作有效的私有數據庫,而在9i中應用設置已經可以用一個角色來實
現,因此提高了私有數據庫的可用性.
---------------------------------------------------------------
為了確認一個角色是否有效,必須調用關聯的存儲過程,這個存儲過
程可以通過使用sys_context('userenv',nnn)來制定一系列的額外
檢查.nnn可以是ip_address,PRoxy_account等.
(舉例,我們可以在存儲過程和觸發器里調用select sys_context
('userenv',ip_address) from dual得到客戶端的ip,然后根據
這個資料進行判定.sys_context的具體用法如下:
select
SYS_CONTEXT('USERENV','TERMINAL') terminal,
SYS_CONTEXT('USERENV','LANGUAGE') language,
SYS_CONTEXT('USERENV','sessionID') sessionid,
SYS_CONTEXT('USERENV','INSTANCE') instance,
SYS_CONTEXT('USERENV','ENTRYID') entryid,
SYS_CONTEXT('USERENV','ISDBA') isdba,
SYS_CONTEXT('USERENV','NLS_TERRITORY') nls_territory,
SYS_CONTEXT('USERENV','NLS_CURRENCY') nls_currency,
SYS_CONTEXT('USERENV','NLS_CALENDAR') nls_calendar,
SYS_CONTEXT('USERENV','NLS_DATE_FORMAT') nls_date_format,
SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') nls_date_language,
SYS_CONTEXT('USERENV','NLS_SORT') nls_sort,
SYS_CONTEXT('USERENV','CURRENT_USER') current_user,
SYS_CONTEXT('USERENV','CURRENT_USERID') current_userid,
SYS_CONTEXT('USERENV','SESSION_USER') session_user,
SYS_CONTEXT('USERENV','SESSION_USERID') session_userid,
SYS_CONTEXT('USERENV','PROXY_USER') proxy_user,
SYS_CONTEXT('USERENV','PROXY_USERID') proxy_userid,
SYS_CONTEXT('USERENV','DB_DOMAIN') db_domain,
SYS_CONTEXT('USERENV','DB_NAME') db_name,
SYS_CONTEXT('USERENV','HOST') host,
SYS_CONTEXT('USERENV','OS_USER') os_user,
SYS_CONTEXT('USERENV','EXTERNAL_NAME') external_name,
SYS_CONTEXT('USERENV','IP_ADDRESS') ip_address,
SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') network_protocol,
SYS_CONTEXT('USERENV','BG_JOB_ID') bg_job_id,
SYS_CONTEXT('USERENV','FG_JOB_ID') fg_job_id,
SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE') authentication_type,
SYS_CONTEXT('USERENV','AUTHENTICATION_DATA') authentication_data
from dual
------------------------------------------------------------------------
9i以前的版本,認證角色是通過passWord的方法,將用戶名,口令寫入應用程序來進行連接.
這樣的缺點是,假如口令在客戶端被解析出來,任何應用程序都能夠訪問你的數據.
下面我們看一個9i認證角色的例子.
CREATE ROLE salesuser
IDENTIFIED USING sh.sales_chk;
CREATE OR REPLACE PROCEDURE sales_chk
AUTHID CURRENT_USER IS
ipchk STRING(30);
BEGIN /* Only certain IP addresses allowed */
SELECT SYS_CONTEXT(’USERENV’,’IP_ADDRESS’)
INTO ipchk FROM DUAL;
IF SUBSTR(ipchk,1,4) != ’192.’
THEN RETURN; END IF; /* Fail silently */
DBMS_SESSION.SET_ROLE(’SALESUSER’); /* Enable */
END;
/
這個過程做到,假如不在192網段,這個角色失效.
---------------------------------------------------------------------
全局應用設置
一個設置現在能夠被全局化和共享.
全局化應用設置就是:
..比每個進程一個設置更節省資源.
..利用有效私有數據庫能夠更好的適應基于web的應用.
..仍然可以通過identifier驗證訪問權限.
..更適應多路連接.
Oracle9i的有效私有數據庫特性提供了連接池以答應多重會話使用一個
或多個全局應用設置,而不需要為每個用戶建立一個應用設置.全局應用
設置為基于web的應用提供了額外的靈活的設置.在多重會話中重復利用
普通應用設置大大提高了性能。
在ebusiness應用中,應用用戶代理認證可以使用公用應用設置來提高適
應性和性能。通過公用應用設置的一次設立代替為每個會話獨立設置初
始化應用設置這種方式進行會話級重用提高了性能。
為了決定當前會話的運行環境以符合細粒度訪問控制,中間件必須為
每一個應用設定應用設置。全局設置答應中間件把各種應用設置存儲在
實例里并且在會話建立時為一個用戶會話指派設置。這個設置也就成為
了會話的運行設置。這將大大減小用戶會話在應用連接池環境中的建立
時間。
---------------------------------------------------------------
治理全局應用設置。
一些接口已經被加到dbms_session包里來治理客戶端會話的應用設置。
包括
..set_context
..clear_context
..set_identifier
..clear_identifier
為了支持通過中間件應用治理的會話連接池,對于dbms_session接口的
治理應用設置也為每一個應用設置增加了一個客戶端認證。在這種方式
下,我們可以全局治理應用設置而客戶端僅僅看到為他們設置的應用設
置。
中間件應用器服務能夠使用set_context來為一個制定的客戶id設置應用
設置.那么,當分配數據庫連接來處理客戶端需求,應用服務器需要執行
set_identifier來表示這個應用會話的id.那么,每次客戶端調用
sys_context,僅僅被指派給這個驗證用戶的設置被返回。
--------------------------------------------------------------
全局應用設置函數。(舉例)
治理員通過以下指令建立全局設置。
SQL> CREATE CONTEXT webhr USING hr.init accessED GLOBALLY;
應用服務器啟動將為HR用戶建立多重連接。
當用戶JOHN連接到應用服務器后,JOHN不是一個數據庫用戶。應
用服務器將在應用里鑒別JOHN,并且為這個連接0設置一個臨時的會
話ID,4523,基于唯一應用會話屬性,這個會話ID作為COOKIE或者
應用服務器的維護的一部分返回用戶JOHN的瀏覽器。
應用服務器為這個客戶端初始應用設置稱為HR.INIT包,它執行
DBMS_SESSION.SET_CONTEXT(’webhr’,’id’, ’JOHN’, ’HR’,4523);
DBMS_SESSION.SET_CONTEXT(’webhr’,’dep’,’sales’,’HR’,4523);
例子:
CREATE CONTEXT webhr USING hr.init ACCESSED GLOBALLY;
DBMS_SESSION.SET_CONTEXT(’webhr’,’id’,’JOHN’,’HR’,4523);
DBMS_SESSION.SET_IDENTIFIER(4523);
…
SYS_CONTEXT calls are in John’s context
…
DBMS_SESSION.CLEAR_IDENTIFIER(4523);
當用戶JOHN用應用服務器訪問數據,應用服務器找到所有登陸的
會話,并執行DBMS_SESSION.SET_IDENTIFIER(4523);所有的這個
會話的SYS_CONTEXT將只返回屬于這個客戶端的應用程序設置,
例如SYS_CONTEXT('WEBHR','ID') 將只返回'JOHN'.
最后注重:假如數據訪問是通過有效私有數據庫來治理的,建立
設置并不能自動限制數據訪問。