熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

9i新特性之二安全篇

2022-06-13   來源: Oracle 

  這篇文章主要講解應用程序客戶端訪問數據庫的新特性有些地方理解不好
  寫得也不是很好請大家幫忙指正謝謝!
  I安全認證擁有
  解決了阻止未經認證的用戶通過其他客戶端訪問數據的問題
  在隱藏密碼的實現方面有了比以前更好的機制
  角色的有效性是通過一個包來檢測而不是一個口令
  ……應用設置的概念在i中已經作了介紹i中細粒度訪問控制能夠達到制作有效的私有數據庫而在i中應用設置已經可以用一個角色來實現因此提高了私有數據庫的可用性
  
  為了確認一個角色是否有效必須調用關聯的存儲過程這個存儲過程可以通過使用sys_context(userenvnnn)來制定一系列的額外檢查nnn可以是ip_addressproxy_account等(舉例我們可以在存儲過程和觸發器裡調用select sys_context(userenvip_address) from dual得到客戶端的ip然後根據這個資料進行判斷sys_context的具體用法如下
  
  select
  SYS_CONTEXT(USERENVTERMINAL) terminal
  SYS_CONTEXT(USERENVLANGUAGE) language
  SYS_CONTEXT(USERENVSESSIONID) sessionid
  SYS_CONTEXT(USERENVINSTANCE) instance
  SYS_CONTEXT(USERENVENTRYID) entryid
  SYS_CONTEXT(USERENVISDBA) isdba
  SYS_CONTEXT(USERENVNLS_TERRITORY) nls_territory
  SYS_CONTEXT(USERENVNLS_CURRENCY) nls_currency
  SYS_CONTEXT(USERENVNLS_CALENDAR) nls_calendar
  SYS_CONTEXT(USERENVNLS_DATE_FORMAT) nls_date_format
  SYS_CONTEXT(USERENVNLS_DATE_LANGUAGE) nls_date_language
  SYS_CONTEXT(USERENVNLS_SORT) nls_sort
  SYS_CONTEXT(USERENVCURRENT_USER) current_user
  SYS_CONTEXT(USERENVCURRENT_USERID) current_userid
  SYS_CONTEXT(USERENVSESSION_USER) session_user
  SYS_CONTEXT(USERENVSESSION_USERID) session_userid
  SYS_CONTEXT(USERENVPROXY_USER) proxy_user
  SYS_CONTEXT(USERENVPROXY_USERID) proxy_userid
  SYS_CONTEXT(USERENVDB_DOMAIN) db_domain
  SYS_CONTEXT(USERENVDB_NAME) db_name
  SYS_CONTEXT(USERENVHOST) host
  SYS_CONTEXT(USERENVOS_USER) os_user
  SYS_CONTEXT(USERENVEXTERNAL_NAME) external_name
  SYS_CONTEXT(USERENVIP_ADDRESS) ip_address
  SYS_CONTEXT(USERENVNETWORK_PROTOCOL) network_protocol
  SYS_CONTEXT(USERENVBG_JOB_ID) bg_job_id
  SYS_CONTEXT(USERENVFG_JOB_ID) fg_job_id
  SYS_CONTEXT(USERENVAUTHENTICATION_TYPE) authentication_type
  SYS_CONTEXT(USERENVAUTHENTICATION_DATA) authentication_data
  from dual
  
  i以前的版本認證角色是通過password的方法將用戶名口令寫入應用程序來進行連接
  這樣的缺點是如果口令在客戶端被解析出來任何應用程序都能夠訪問你的數據
  下面我們看一個i認證角色的例子
  CREATE ROLE salesuser
  IDENTIFIED USING shsales_chk;
  
  CREATE OR REPLACE PROCEDURE sales_chk
  AUTHID CURRENT_USER IS
  ipchk STRING();
  BEGIN /* Only certain IP addresses allowed */
  SELECT SYS_CONTEXT(USERENVIP_ADDRESS)
  INTO ipchk FROM DUAL;
  IF SUBSTR(ipchk) !=
  THEN RETURN; END IF; /* Fail silently */
  DBMS_SESSIONSET_ROLE(SALESUSER); /* Enable */
  END;
  /
  這個過程做到如果不在網段這個角色失效
  
  全局應用設置
  一個設置現在能夠被全局化和共享
  全局化應用設置就是:
  比每個進程一個設置更節省資源
  利用有效私有數據庫能夠更好的適應基於web的應用
  仍然可以通過identifier驗證訪問權限
  更適應多路連接
  oraclei的有效私有數據庫特性提供了連接池以允許多重會話使用一個或多個全局應用設置而不需要為每個用戶建立一個應用設置全局應用設置為基於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 hrinit ACCESSED GLOBALLY;
  應用服務器啟動將為HR用戶建立多重連接
  當用戶JOHN連接到應用服務器後JOHN不是一個數據庫用戶應用服務器將在應用裡鑒別JOHN並且為這個連接設置一個臨時的會話ID基於唯一應用會話屬性這個會話ID作為COOKIE或者應用服務器的維護的一部分返回用戶JOHN的浏覽器
  
  應用服務器為這個客戶端初始應用設置稱為HRINIT包它執行
  DBMS_SESSIONSET_CONTEXT(webhrid JOHN HR);
  DBMS_SESSIONSET_CONTEXT(webhrdepsalesHR);
  例子
  CREATE CONTEXT webhr USING hrinit ACCESSED GLOBALLY;
  DBMS_SESSIONSET_CONTEXT(webhridJOHNHR);
  DBMS_SESSIONSET_IDENTIFIER();
  …
  SYS_CONTEXT calls are in Johns context
  …
  DBMS_SESSIONCLEAR_IDENTIFIER();
  當用戶JOHN用應用服務器訪問數據應用服務器找到所有登陸的會話並執行DBMS_SESSIONSET_IDENTIFIER(所有的這個會話的SYS_CONTEXT將只返回屬於這個客戶端的應用程序設置例如SYS_CONTEXT(WEBHRID) 將只返回JOHN
  
  最後注意如果數據訪問是通過有效私有數據庫來管理的建立設置並不能自動限制數據訪問

From:http://tw.wingwit.com/Article/program/Oracle/201311/18800.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.