當今大多數 Web 應用程序都需要至少采用某種基本的安全策略例如提供用口令保護的內容的網站僅具有管理員後端的網站網志和個人雜志電子商務網站企業內聯網等等
構建這些類型的 Web 應用程序最常用的設計方法是將安全策略整合到 Web 應用程序的業務邏輯中即由應用程序決定某個用戶是否有權訪問數據庫中的某個數據在這種情形下數據庫的角色僅為存儲數據和依請求提供數據換句話說如果 Web 應用程序命令數據庫提供特定信息則數據庫會直接執行該命令而不檢查用戶的權限
在該文中您將學習如何利用 Oracle 內置的安全特性在數據庫級執行應用程序安全規則以提高應用程序的整體安全性作為附帶的好處直接在數據庫中實現數據訪問安全不但有助於提高應用程的安全性而且有助於降低復雜性
對數據庫端安全性的需求
從 Web 應用程序控制數據訪問會怎麼樣?大多數情況下沒有問題這是個不錯的解決方案尤其是在涉及的數據為非任務關鍵或絕密的時候許多書和在線資源中都用到了該方法實際上有本很受歡迎的 PHP/MySQL 書明確反對每個應用程序創建一個以上的數據庫用戶帳戶這是因為額外的用戶或復雜的權限會因某個操作在繼續前要檢查更多的信息而降低 MySQL 的執行速度確實如此但是在放棄將安全性整合到數據庫邏輯中的想法前可能要考慮幾件事情我們來看以下示例
假設創建一個內容管理系統 (CMS)其中使用數據庫來存儲網站上發布的內容大部分數據是公開的允許匿名 Web 用戶讀取但只允許編輯更改數據使用單一數據庫帳戶訪問和修改數據庫中的記錄並通過用口令保護僅管理員可以訪問的頁面的訪問權限用 PHP 代碼控制安全性
如果 Web 應用程序的公共端遭受了一個諸如公共搜索表單(即編碼不夠嚴密的表單)上的 SQL 注入的攻擊則該入侵者可能能夠對該公共帳戶可以訪問的數據庫對象執行任意 SQL 語句當然就這裡的情形而言執行 SELECT 語句不會造成什麼大問題這是因為數據本來就是公共的但由於公共權限和管理權限使用同一數據庫帳戶因此入侵者還能執行 UPDATE 和 DELETE 語句甚至是從數據庫中刪除表
怎麼才能防止該情況的發生呢?最簡單的方法就是徹底限制公共數據庫帳戶修改數據的權限我們來看看 Oracle 是如何解決這個問題的
Oracle 安全性基本概述
Oracle 數據庫為 Web 開發人員提供了控制數據訪問的許多方法從管理對特定數據庫對象(如表視圖和過程)的訪問到控制個別行或列的數據的訪問很顯然對 Oracle 每個安全特性或可用選項的討論超出了本文的范圍在這裡我們將不涉及過多細節而僅介紹 Oracle 數據訪問安全性的最基本方面
·驗證和用戶帳戶
·權限
·角色
驗證和用戶帳戶 與其他數據庫一樣請求訪問 Oracle 的每個用戶(數據庫帳戶)必須通過驗證驗證工作可以由數據庫操作系統或網絡服務來做除基本的驗證(口令驗證)外Oracle 還支持強驗證機制如KerberosCyberSafeRADIUS等等
角色 Oracle 角色是一個權限的有名集盡管可以直接授予用戶帳戶權限但使用角色可以極大簡化用戶管理尤其是需要管理大量用戶時創建易管理的小角色然後根據用戶的安全級別授予用戶一個或多個角色這樣做的效率非常高更不用說修改權限變得如何簡單了 — 只需修改角色關聯的角色即可無需修改每個用戶帳戶
為了簡化新用戶創建初期的工作Oracle 自帶了三個預定義的角色
·CONNECT 角色 — 該角色使用戶可以連接數據庫以及執行基本的操作如創建自己的表默認情況下該角色不能訪問其他用戶的表
·RESOURCE 角色 — RESOURCE 角色與 CONNECT 角色相似但它允許用戶擁有較多的系統權限如創建觸發器或存儲過程
·DBA 角色 — 允許用戶擁有所有系統權限
使用中的授權和權限
在本部分中我們將討論如何使用 Oracle 的授權和權限來提高本文開頭部分討論的那個簡單 CMS 示例的安全性假定提供給應用程序用戶的內容存儲在 WEB_CONTENT 表中
首先創建該表啟動 Oracle 數據庫特別版以系統管理員身份登錄如果還沒有釋放示例 HR 用戶請將其釋放按照特別版安裝附帶的入門指南中的指示操作請注意默認情況下HR 用戶被賦予 RESOURCE 角色在這裡賦予該用戶 DBA 角色這樣就可以使用該帳戶管理 CMS 應用程序的數據庫方面了當然不會使用 HR 用戶帳戶進行在線訪問只用它管理數據庫
現在可以使用對象浏覽器或通過執行 SQL Commands 窗口創建新表下面是創建該表的代碼
CREATE TABLE WEB_CONTENT (
page_id NUMBER PRIMARY KEY
page_content VARCHAR()
);
由於該表是使用 HR 用戶帳戶創建的因此該表歸 HR 帳戶所有並位於 HR 模式中並且在明確授予其他用戶訪問該表的權限前其他用戶無法訪問該表如果不信可以創建一個新用戶用該用戶訪問 WEB_CONTENT 表試試
現在創建兩個新用戶CMS_USER 和 CMS_EDITOR最終將授予 CMS_USER 對 WEB_CONTENT 表的只讀權限並將該用戶用作為匿名 Web 用戶提供內容的數據庫帳戶CMS_EDITOR 帳戶將在該表上擁有更多權限將被用作 CMS 編輯的帳戶(該帳戶需要更改和維護該表中的數據)
可以使用 XE 的圖形界面或通過執行以下命令創建新用戶
CREATE USER cms_user IDENTIFIED BY cms_user;
CREATE USER cms_editor IDENTIFIED BY cms_editor; (出於簡化的目的此處的口令與用戶名對應)
為了讓這兩個帳戶都登錄數據庫我們需要賦予它們 CONNECT 角色為此在 XE 圖形界面的 Administration/Database Users 部分選中用戶信息下的 CONNECT 復選框或執行以下命令
GRANT CONNECT to cms_user;
GRANT CONNECT to cms_editor;
現在如果嘗試以 CMS_USER 或 CMS_EDITOR 用戶登錄並試圖從 WEB_CONTENT 表讀取數據 (select * from hrweb_content;)將遇到以下錯誤
ORA:table or view does not exist
為了訪問數據或僅是看到表需要授予 CMS_USER 和 CMS_EDITOR 帳戶對 WEB_CONTENT 表的只讀權限
GRANT SELECT on hrweb_content to cms_user;
GRANT SELECT on hrweb_content to cms_editor;
以上代碼使這兩個帳戶可以對 WEB_CONTENT 表執行 SELECT 語句如果嘗試執行其他語句則會遇到錯誤例如插入一行
INSERT INTO hrweb_content (page_idpage_content) VALUES (hello world);
將產生錯誤消息
ORA:insufficient privileges
要允許 CMS_EDITOR 更改該表的內容需要授予以下權限
GRANT INSERTUPDATEDELETE on hrweb_content to cms_editor;
從現在起CMS_EDITOR 帳戶可以對 WEB_CONTENT 表執行 INSERTUPDATE 和 DELETE 語句
您看這有多簡單!可見通過角色管理權限是更有效的方法如果使用的 Oracle 數據庫不是 XE可以執行如下操作
創建角色
CREATE ROLE reader;
CREATE ROLE writer;
授予角色權限
GRANT SELECT ON web_content TO reader;
GRANT INSERTUPDATEDELETE ON web_content TO writer;
賦予用戶角色
GRANT reader TO cms_user;
GRANT reader TO cms_editor; (they need to read too)
GRANT writer TO cms_editor;
請注意如果更改 READER 角色的定義則這些更改會影響所有具有該角色的用戶帳戶如果是直接將權限授予用戶的則必須逐個更新每個用戶帳戶
完成上述步驟後可以配置 PHP 應用程序使之對由匿名 Web 用戶請求的所有數據庫連接均使用 CMS_USER 帳戶對由受口令保護的管理頁面引發的連接使用 CMS_EDITOR 帳戶現在即使公共 Web 表單受到攻擊該攻擊對數據庫的影響將微乎其微這是因為 CMS_USER 帳戶僅具有只讀權限
結論
在本文中我們只是簡單介紹了 Oracle 數據訪問安全性的一些最基本的特性此外Oracle 還有許多其他特性可把您的 Web 應用程序的安全性提高到一個新的等級 — 包括虛擬專用數據庫 (VPD) 和標簽安全性
From:http://tw.wingwit.com/Article/program/Oracle/201311/18582.html