本文概述了微軟NET Framework安全結構包括基於證據的安全基於角色的安全認證和授權的概念以及隔離存儲密碼加密和擴展性本文還概述了NET Framework安全策略帶給開發人員管理員和最終用戶的主要好處本文假定讀者已經基本熟悉了NET Framework通用語言運行時和管理代碼的概念
引言
目前的安全問題
在今天的軟件環境中應用程序的來源很多它們執行很多任務對應用程序代碼的信任是一個主要需求因為我們誰也不想軟件或信息遭到破壞給予許可的安全策略不會允許對敏感信息的不適當的訪問或將本地機器暴露給惡意的程序或甚至是有平常錯誤的代碼
過去安全結構提供了基於用戶帳號的隔離和訪問控制在這些限制內給予代碼完全訪問權並假定由特定用戶可運行的代碼具有相同的信任度不幸的是如果所有程序都代表某用戶運行根據用戶對代碼的隔離對於保護一個程序不被其它用戶使用是不夠的另一種情況不能被完全信任的代碼經常被轉移到沙箱模型中執行在此代碼運行於隔離環境而不會訪問大部分的服務
對今天應用程序的成功的安全解決方案必須能強化兩個安全模型間的平衡它必須提供對資源的訪問以便以完成有用的工作它需要對應用程序的安全性作細致的控制以確保代碼被識別檢測並給予合適的安全級別NET Framework就提供了一個這樣的安全模型
Microsoft NET Framework安全解決方案
NET Framework安全解決方案基於管理代碼的概念以及由通用語言運行時(CLR)加強的安全規則大部分管理代碼需要進行驗證以確保類型安全及預先定義好的其它屬性的行為的安全例如在驗證的代碼中聲明為接收字節值的訪問將拒絕提供字節參數的調用因為不是類型安全的驗證過程還確保了執行流只傳送到已知的位置如方法入口點這個過程去除了跳轉到任意位置執行的能力
驗證將阻止不是類型安全的代碼執行在它們引起破壞前捕獲很多常見的編程錯誤通常的弱點如緩存溢出對任意內存或沒有初始化的內存的讀取對控件的隨意傳送都不再可能出現這將使最終用戶受益因為在他們執行代碼前對其進行檢查這也有益於開發人員他們會發現很多常見錯誤(過去一直在困繞前開發)現在可以查明並能阻止它們引起破壞
CLR也能使非管理代碼運行但非管理代碼不能從這些安全措施中受益特殊的許可與對非管理代碼的調用能力相關一個強大的安全策略能確保這些許可被恰當地給予經過很長時間後非管理代碼到管理代碼的移植將減少對非管理代碼的調用頻率
微軟NET Framework安全機制的構件
基於證據的安全
NET Framework引入了基於證據的安全的概念在本質上它是對安全策略暴露出來問題的解答:
· 組合從哪個站點獲得?
組合是NET Framework應用程序的構件它們組成了部署版本控制重用激活作用域安全認證的基本單元應用程序的組合是從網站上下載到客戶端的
· 組合是從哪個URL獲得的?
安全策略需要明確的地址而組合是從這個地址下載的
· 組合是從哪個區獲得的?
區是基於代碼的位置對安全標准如 Internet intranet和本機等等的描述
· 組合的強名(strong name)是什麼?
強名是由組合的創建者提供了密碼強化後的標識符盡管它沒有提供對創建者的任何證明但它唯一標識了組合確保了組合沒有被破壞過
根據對這些問題的回答及其它證據安全策略可以對賦予組合垢合適許可進行計算從多種來源可以得到證據包括CLR浏覽器微軟ASPNET及外殼這依賴於代碼的來源
策略驅動的信任模型使用代碼證據
當組合被調入內存進CLR策略系統通過收集組合的證據並在策略環境中對證據進行計算從而決定賦予組合什麼樣的許可權CLR策略系統然後根據評估過的證據和組合作出的許可請求給予組合一組許可只有在組合被給予了一組最少的許可後或組合根本不需要許可權組合的創建者才能知道組合正確運行通過一個或多個對特定許可的請求這樣的附加需求可以被傳送室策略系統
根據許可請求的類型策略系統可以進一步限制給予組合的許可(刪除不必要的許可)或甚至拒絕將組合裝入內存(如果運行組合所需的最小許可沒有被策略給予)在不存在任何許可請求的情況下組合永遠不會被給予多於策略系統將會給予的許可權限請求只是進一步限制得到的許可
安全策略包含了許多代碼組這些組包含了根據證據應給予的許可權代碼組描述的許可可提供給從特定的安全區域獲得的組合或提供給由特定發行商簽名過的組合等等盡管隨CLR發行了一組默認的代碼組(及相關許可)但管理員可以對這些CLR安全的進行定置以適合他們的特殊需求記住通過定義與證據相關的代碼組任何東西都可以作為證據提交只要安全策略可以使用它
創建許可的的過程涉及到對證據的評估以確定代碼組適用於哪個等級:企業機器和用戶策略按上面順序對這三個等級進行評估然後創建交插了三個等級的許可設置管理員可以將任何一個策略等級標記為終結(final)這樣做應付阻止在其它等級上對策略做進一步評估例如管理員可以在機器級別上對組合終止策略這樣就會阻止用戶級策略對該組合的應用
一旦策略完成許可的最初設置也就創建了組合通過從三個方面做出特定的請求可以優化這些許可:
· 第一方面是指定為了使組合運行它必須擁有的最小許可設置如果這些許可沒有給予那麼組合將不同調入到內存並拋出例外
· 第二可以指定一組可選的許可盡管組合希望存在這些許可但如果無法獲得這些許可它仍可以調入到內存
· 最後行為特別好的組合實際上會拒絕它們所不需的有風險的許可這三個優化選項是調入時作為聲明語句實現的
在運行時許可是根據代碼的執行計算的右側的圖總結了這個過程的發生順序組合A將它的證據和來自主機的證據提供給策略評估器策略評估器在創建許可時也要考慮從組合得到的許可請求G組合A由組合A調用而A又是由組合A調用的當組合A執行一個引發安全檢查的操作時A和A獲得的許可同樣也要進行檢查以確保它們擁有A所請求的許可權限在這個過程中此過程稱為堆棧遍歷(walking)堆棧中每個組合的許可權限都要進行檢查以確定所給予的權限設置是否包含安全檢查所需要的許可如果堆棧中的每個組合被給予了安全檢查所需要的許可調用將成功如何任何組合沒有給予所需要的許可堆棧遍歷過程失敗安全例外將被拋出
圖 主機和組合為策略評估器提供證據評估器使用安全策略和許可請求確定組合的許可權限應用程序中不同運行組件的許可權限然後用於作出授權決定
代碼訪問安全堆棧遍歷可以保護代碼不受攻擊在精通的攻擊中惡意代碼欺騙受信任代碼執行它獨自不能運行的操作有效地利用代碼的許可權限實現惡意的目的對這類攻擊開發人員很難進行防備但堆棧遍歷確保了如果涉及到了低級信任等級的代碼有效許可將被減少到信任等級最低的代碼具有的許可
結果代碼將從源處獲得不同的信任等級並在適合於特定的代碼執行環境的限制下運行
NET Framework調用的自由安全性
一些活動如讀寫文件顯示對話框讀寫環境變量可以通過包含在框架安全構架中的NET Framework方法實現這就使NET Framework能根據安全策略允許或不允許一個操作而不需要程序員做額外的工作盡管暴露了保護資源的管理類的創建者在他們的庫中做了明確的安全需求使用NET Framework類庫訪問受保護資源的開發人員可以自由地利用代碼訪問安全系統;他們不必作出明確的安全調用
管理員可以通過決定給予哪些許可來優化安全策略然後依靠NET Framework處理所有的安全操作代碼訪問安全能阻止大部分的惡意攻擊對代碼的驗證減少了緩存溢出和其它會導致安全攻擊的不期望的行為因此應用程序和組件生來就受到了保護它們免於大多數安全問題的沖擊而這些安全問題一直困繞著本地代碼的實現
基於角色的安全
有時根據已認證的身份或根據與代碼執行上下文相關的角色作出認證決定是合適的例如金融和企業軟件可以通過評估角色信息的企業邏輯加強策略根據作出請求的用戶角色可以對金融交易的數據進行限制出納被允許可以處理一定金額的請求而多於該金額的所有工作需要監督人的角色來處理
身份可以映射到登錄系統的用戶或由應用程序定義相應的原則封裝了身份和其它相關的角色信息(例如但並不限於此用戶的組由操作系統定義)
認證和授權
認證是一個過程它接收來自用戶的證書並對證書的授權進行確認如果證書是有效的那麼用戶就可以說他擁有已認證的身份而授權的過程是:確定認證用戶是否能夠訪問給定的資源認證可通過系統或企業邏輯來完成通過某個API它是或獲得的認證API是完全可擴展的因此開發人員根據需要使用自己的企業邏輯開發人員可以對他們的認證需求進行編碼也可以修改底層的認證方法而無需對他們的代碼作太大變化除了微軟Windows?操作系統身份認證外還有的認證方法包括基本HTTP摘要和 Kerberos以及微軟Passport和基於窗體的認證這些認證方法已經完全集成到ASPNET中了
在ASPNET窗體認證中用戶提供證書並提交窗體如果應用程序簦別請求系統發送一個cookie 該cookie以某種形式包含包含了證書或包含重新獲得身份的關鍵字接下來發送的請求在頭中包含了cookieASPNET處理程序通過應用程序所期望的任何有效方法對這些請求認證和授權如果請求沒有經過認證HTTP客戶端將用於把請求發送到認證窗體在那裡用戶可能提供信任證書窗體認證有時用於個性化為已知用戶的內容進行定置在一些情況下身份是問題所在而不是認證因此用戶的個性化信息可以簡單地通過訪問用戶或獲得
授權的目的是確定作出請求的身份是否被給予了對給定資源的訪問權ASPNET提供了兩種類型的授權服務:文件授權和URL授權文件授權根據正在作用的方法和作出請求的身份決定用戶使用於哪個訪問控制列表URL授權是URI名稱空間和不同用戶或角色間的邏輯映射
隔離存儲
NET Framework提供了一個特殊的功能隔離存儲用於存儲數據甚至是當不允許對文件進行訪問時例如當從Internet下載了一個管理控件並運行它為它提供了有限的許可權但沒有權力讀寫文件
隔離存儲是一組新的用於NET支持的用於本地存儲的類型和方法在本質上每個組合可以訪問磁盤上一斷被隔離的存儲空間它不允許訪問其它數據隔離存儲只對為它創建的組合有效
隔離存儲也可被應用程序用於保存活動記錄保存設置或者將狀態數據保存到磁盤上以備將來之用因為隔離存儲的位置是預先決定好的所以隔離存儲為指定唯一存儲空間提供了一種方便的方式而不需要決定文件路徑
從本地企業局域網獲得的代碼具有相似的限制但更少它可以訪問大限額的隔離存儲最後從受限站點區域(不信任站點)來的代碼沒有對隔離存儲的訪問權
加密
NET Framework提供了一組加密對象它們支持加密算法數字簽名散列生成隨機數是通過眾所周知的運算法則實現的如RSA DSA Rijndael/AES Triple DES DES 和 RC 以及MD SHA SHA SHA 和 SHA散列算法同時還支持在IETF和WC開發的XML數字簽名規范NET Framework使用加密對象支持內部服務這些對象還作為管理代碼提供給需要加密支持的開發人員
如何指定安全性?
如果要對組合運行時的行為進行修改根據程序員的需要可以作出聲明式安全或強迫式安全的修改
聲明式安全
聲明式安全使程序員可以直接在組合代碼的元數據中為組合指定安全需求許可請求和所有其它形式的聲明式安全是在代碼中是作為定置屬性指定的類屬性和方法的注釋用於優化許可例如聲明式安全可用於類的調用者在調用方法前檢查調用者是否被已知地行商簽名過或有一個特定的強名
由於聲明屬性是組合元數據的一部分所以組合的安全需求易於辨別可以使用工具對組合進行掃描以發現哪些方法需要某些許可哪些方法斷言了某些許可
當被請求的活動和許可在編譯時是知道時聲明式檢查可作為選擇的解決方案之一例如如果方法總是檢查對C:\temp的寫訪問許可那麼許可檢查就會從聲明中得到好處另一方面如果被請求的具有訪問權的位置發生了變化那麼強迫式安全也許是一個比較好的解決方案
強迫式安全
強迫式安全直接在代碼中實現程序員通過程序采取安全活動並且根據安全堆棧的狀態決定是給予還是拒絕許可例如當一個方法請求訪問一個特定的文件時如果調用者(或方法的任何一個調用者)沒有被給予必需的許可權限那麼請求失敗因為強迫式安全是通過程序實現的所以滿足了動態需求如果你需要對一個特定文件的訪問許可但該許可還要根據其它信息發生變化那麼強迫式安全就是可選的解決方案
總結
NET Framework安全迎合了這種事實:軟件向多樣化的移動組件發發展並根據這種事實提供保護在一個細化的可擴展的策略和許可系統下用戶能夠運行功能強大的代碼而同時減少相關的風險在沒有運行時對用戶作出信任決定時管理員可以在各個級別創建強壯的安全策略策略是完全可定置的開發人員能夠集中解決應用程序邏輯而不用關心核心的安全問題(它由CLR透明地處理)然而開發人員可以在任何時候擴展安全模型
From:http://tw.wingwit.com/Article/program/ASP/201311/21736.html