- 論壇徽章:
- 0
|
---txfy
9i新特性之二安全篇
這篇文章主要講解應(yīng)用程序客戶端訪問(wèn)數(shù)據(jù)庫(kù)的新特性。有些地方理解不好
寫(xiě)得也不是很好,請(qǐng)大家?guī)兔χ刚x謝!
9I安全認(rèn)證擁有
..解決了阻止未經(jīng)認(rèn)證的用戶通過(guò)其他客戶端訪問(wèn)數(shù)據(jù)的問(wèn)題.
..在隱藏密碼的實(shí)現(xiàn)方面有了比以前更好的機(jī)制.
..角色的有效性是通過(guò)一個(gè)包來(lái)檢測(cè)而不是一個(gè)口令
..應(yīng)用設(shè)置的概念在8i中已經(jīng)作了介紹,8i中細(xì)粒度訪問(wèn)控制能夠達(dá)到
制作有效的私有數(shù)據(jù)庫(kù),而在9i中應(yīng)用設(shè)置已經(jīng)可以用一個(gè)角色來(lái)實(shí)
現(xiàn),因此提高了私有數(shù)據(jù)庫(kù)的可用性.
---------------------------------------------------------------
為了確認(rèn)一個(gè)角色是否有效,必須調(diào)用關(guān)聯(lián)的存儲(chǔ)過(guò)程,這個(gè)存儲(chǔ)過(guò)
程可以通過(guò)使用sys_context('userenv',nnn)來(lái)制定一系列的額外
檢查.nnn可以是ip_address,proxy_account等.
(舉例,我們可以在存儲(chǔ)過(guò)程和觸發(fā)器里調(diào)用select sys_context
('userenv',ip_address) from dual得到客戶端的ip,然后根據(jù)
這個(gè)資料進(jìn)行判斷.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以前的版本,認(rèn)證角色是通過(guò)password的方法,將用戶名,口令寫(xiě)入應(yīng)用程序來(lái)進(jìn)行連接.
這樣的缺點(diǎn)是,如果口令在客戶端被解析出來(lái),任何應(yīng)用程序都能夠訪問(wèn)你的數(shù)據(jù).
下面我們看一個(gè)9i認(rèn)證角色的例子.
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;
/
這個(gè)過(guò)程做到,如果不在192網(wǎng)段,這個(gè)角色失效.
---------------------------------------------------------------------
全局應(yīng)用設(shè)置
一個(gè)設(shè)置現(xiàn)在能夠被全局化和共享.
全局化應(yīng)用設(shè)置就是:
..比每個(gè)進(jìn)程一個(gè)設(shè)置更節(jié)省資源.
..利用有效私有數(shù)據(jù)庫(kù)能夠更好的適應(yīng)基于web的應(yīng)用.
..仍然可以通過(guò)identifier驗(yàn)證訪問(wèn)權(quán)限.
..更適應(yīng)多路連接.
oracle9i的有效私有數(shù)據(jù)庫(kù)特性提供了連接池以允許多重會(huì)話使用一個(gè)
或多個(gè)全局應(yīng)用設(shè)置,而不需要為每個(gè)用戶建立一個(gè)應(yīng)用設(shè)置.全局應(yīng)用
設(shè)置為基于web的應(yīng)用提供了額外的靈活的設(shè)置.在多重會(huì)話中重復(fù)利用
普通應(yīng)用設(shè)置大大提高了性能。
在ebusiness應(yīng)用中,應(yīng)用用戶代理認(rèn)證可以使用公用應(yīng)用設(shè)置來(lái)提高適
應(yīng)性和性能。通過(guò)公用應(yīng)用設(shè)置的一次設(shè)立代替為每個(gè)會(huì)話獨(dú)立設(shè)置初
始化應(yīng)用設(shè)置這種方式進(jìn)行會(huì)話級(jí)重用提高了性能。
為了決定當(dāng)前會(huì)話的運(yùn)行環(huán)境以符合細(xì)粒度訪問(wèn)控制,中間件必須為
每一個(gè)應(yīng)用設(shè)定應(yīng)用設(shè)置。全局設(shè)置允許中間件把各種應(yīng)用設(shè)置存儲(chǔ)在
實(shí)例里并且在會(huì)話建立時(shí)為一個(gè)用戶會(huì)話指派設(shè)置。這個(gè)設(shè)置也就成為
了會(huì)話的運(yùn)行設(shè)置。這將大大減小用戶會(huì)話在應(yīng)用連接池環(huán)境中的建立
時(shí)間。
---------------------------------------------------------------
管理全局應(yīng)用設(shè)置。
一些接口已經(jīng)被加到dbms_session包里來(lái)管理客戶端會(huì)話的應(yīng)用設(shè)置。
包括
..set_context
..clear_context
..set_identifier
..clear_identifier
為了支持通過(guò)中間件應(yīng)用管理的會(huì)話連接池,對(duì)于dbms_session接口的
管理應(yīng)用設(shè)置也為每一個(gè)應(yīng)用設(shè)置增加了一個(gè)客戶端認(rèn)證。在這種方式
下,我們可以全局管理應(yīng)用設(shè)置而客戶端僅僅看到為他們?cè)O(shè)置的應(yīng)用設(shè)
置。
中間件應(yīng)用器服務(wù)能夠使用set_context來(lái)為一個(gè)制定的客戶id設(shè)置應(yīng)用
設(shè)置.那么,當(dāng)分配數(shù)據(jù)庫(kù)連接來(lái)處理客戶端需求,應(yīng)用服務(wù)器需要執(zhí)行
set_identifier來(lái)表示這個(gè)應(yīng)用會(huì)話的id.那么,每次客戶端調(diào)用
sys_context,僅僅被指派給這個(gè)驗(yàn)證用戶的設(shè)置被返回。
--------------------------------------------------------------
全局應(yīng)用設(shè)置函數(shù)。(舉例)
管理員通過(guò)以下指令建立全局設(shè)置。
SQL>; CREATE CONTEXT webhr USING hr.init ACCESSED GLOBALLY;
應(yīng)用服務(wù)器啟動(dòng)將為HR用戶建立多重連接。
當(dāng)用戶JOHN連接到應(yīng)用服務(wù)器后,JOHN不是一個(gè)數(shù)據(jù)庫(kù)用戶。應(yīng)
用服務(wù)器將在應(yīng)用里鑒別JOHN,并且為這個(gè)連接0設(shè)置一個(gè)臨時(shí)的會(huì)
話ID,4523,基于唯一應(yīng)用會(huì)話屬性,這個(gè)會(huì)話ID作為COOKIE或者
應(yīng)用服務(wù)器的維護(hù)的一部分返回用戶JOHN的瀏覽器。
應(yīng)用服務(wù)器為這個(gè)客戶端初始應(yīng)用設(shè)置稱(chēng)為HR.INIT包,它執(zhí)行
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);
當(dāng)用戶JOHN用應(yīng)用服務(wù)器訪問(wèn)數(shù)據(jù),應(yīng)用服務(wù)器找到所有登陸的
會(huì)話,并執(zhí)行DBMS_SESSION.SET_IDENTIFIER(4523);所有的這個(gè)
會(huì)話的SYS_CONTEXT將只返回屬于這個(gè)客戶端的應(yīng)用程序設(shè)置,
例如SYS_CONTEXT('WEBHR','ID') 將只返回'JOHN'.
最后注意:如果數(shù)據(jù)訪問(wèn)是通過(guò)有效私有數(shù)據(jù)庫(kù)來(lái)管理的,建立
設(shè)置并不能自動(dòng)限制數(shù)據(jù)訪問(wèn)。 |
|