發布日期: 12/15/2004 | 更新日期: 12/15/2004
查看全部的安全性指南主題
Microsoft Corporation 本單元概要
代碼訪問安全是一個資源約束模型,使管理員可確定特定代碼是否和如何訪問指定的資源並執行其他特權操作。本單元的重點放在 ASP.NET 代碼訪問安全性原則配置上,說明如何克服開發部分信任 Web 應用程式時可能遇到的一些主要障礙。
本單元詳細闡述了代碼訪問安全的實際要素,您將學到如何開發中度信任的 Web 應用程式,在獲益於代碼訪問安全提供的安全保護的同時,仍然能夠使用要求完全信任組件。
本單元還包含有關如何建立自訂 ASP.NET 信任策略的資訊,並包含兩個非常有價值的列表:
| • |
適用 APTCA (AllowPartiallyTrustedCallersAttribute) 的系統程式集。 |
| • |
預設的 ASP.NET 策略許可權和信任級。它指定了每個 ASP.NET 信任級都施加了哪些關鍵限制。 |
返回頁首
目標
通過本單元能夠:
| • |
瞭解 ASP.NET 策略檔案的工作原理以及如何建立自訂策略。 |
| • |
開發部分信任 Web 應用程式。 |
| • |
從部分信任 Web 應用程式使用 OLE DB、事件記錄、Web 服務和註冊表。 |
| • |
用沙箱保護特權代碼。 |
| • |
瞭解何時用沙箱保護和何時自訂現有的 ASP.NET 信任策略。 |
返回頁首
應用範圍
本單元適用於下列產品和技術:
| • |
Microsoft® Windows® 2000 Server 和 Microsoft Windows Server® 2003 作業系統 |
| • |
Microsoft .NET Framework 1.1 和 ASP.NET 1.1 |
返回頁首
如何使用本單元
本單元並未涵蓋代碼訪問安全的基礎知識。我們假設讀者已經具備一些預備知識,雖然重要的概念在適當的時候會進行重述。有關代碼訪問安全工作原理的更多資訊,請參閱“代碼訪問安全實踐”單元。
使用本單元可以學會如何使用代碼訪問安全鎖定 Web 應用程式,並針對潛在的攻擊加固伺服器。
如果您管理著共用宿主環境,或者為一個 網際網路服務提供者 (ISP) 工作,要在同一台 Web 服務器上運行多個來自不同公司的應用程式,就可以使用代碼訪問安全:
| • |
使應用程式互相獨立。 例如,代碼訪問安全可以用來確保 Web 應用程式無法寫另一個 Web 應用程式的目錄。 |
| • |
將應用程式與系統資源獨立開來。 例如,代碼訪問安全可以限制對檔案系統、註冊表、事件記錄、網路資源和其他系統資源的訪問。 |
還要注意的是,Windows Server 2003 和 Internet 資訊服務 (IIS) 6.0 為 Web 應用程式提供了進一步的進程獨立。進程獨立結合代碼訪問安全是應用程式獨立的推薦模型。
有關更多資訊,請參閱單元“寄宿多個 ASP.NET 應用程式”。 本頁內容
|
本單元概要 |
|
目標 |
|
應用範圍 |
|
如何使用本單元 |
|
概述 |
|
資源訪問 |
|
完全信任和部分信任 |
|
在 ASP.NET 中配置代碼訪問安全 |
|
ASP.NET 策略檔案 |
|
ASP.NET 策略 |
|
開發部分信任 Web 應用程式 |
|
信任級 |
|
部分信任 Web 應用程式的處理辦法 |
|
自訂策略 |
|
用沙箱保護特權代碼 |
|
確定採用哪種辦法 |
|
中度信任 |
|
中度信任的限制 |
|
小結 |
|
其他資源 |
返回頁首
概述
傳統的基於使用者的安全,比如作業系統提供的安全,需要根據使用者標識對各種資源的訪問進行授權。
在 Microsoft .NET Framework 1.1 版中,管理員可以為 ASP.NET Web 應用程式和 Web 服務(可以由多個程式集組成)配置策略。它們還可授予代碼訪問安全許可權,以允許應用程式訪問特定的資源類型以及執行特定的特權操作。
例如:
| • |
一個管理員可能決定應該不對從 Internet 下載的代碼授予訪問任何資源的許可權,而某個特定的公司開發的 Web 應用程式代碼應該獲得更高的信任度,例如,允許訪問檔案系統、事件記錄和 Microsoft SQL Server 資料庫。 |
| • |
本地管理員啟動的程式在本機上是沒有限制的。糟糕的是,如果管理員的標識被哄騙,而且惡意使用者能夠使用管理員的安全上下文執行代碼,那麼惡意使用者同樣沒有限制。 |
這些領域中代碼訪問安全非常重要,因為它可以根據代碼本身而不是運行代碼的使用者提供更多的限制和安全。
注 使用 .NET Framework 1.0 版構建的 Web 應用程式和 Web 服務總是以無限的代碼存取權限啟動並執行。這是不可配置的。 返回頁首 資源訪問
所有來自 ASP.NET 應用程式和Managed 程式碼的資源訪問一般而言要受以下兩個安全層次的限制:
| • |
代碼訪問安全。這一安全層將驗證當前呼叫堆疊中的所有代碼(一直引向並包括資源存取碼)是否已經得到訪問資源的授權。管理員可以使用代碼訪問安全性原則將許可權授予程式集。許可權準確確定了程式集可以訪問哪些資源類型。可以訪問的不同資源類型對應於許多權限類別型。這些類型包含檔案系統、註冊表、事件記錄、目錄服務、Microsoft SQL Server_、OLE DB 資料來源和網路資源。 有關代碼存取權限的完整列表,請參閱“代碼訪問安全實踐”單元。 |
| • |
作業系統/平台安全。這一安全層將驗證請求方線程的安全上下文是否可以訪問資源。如果線程正在類比,則使用線程類比標記。否則,則使用進程標記並與同資源相關聯的存取控制清單 (ACL) 比較,以確定所請求的操作是否可以執行,所請求的資源是否可以訪問。 |
資源如果要成功地進行訪問,必須通過以上兩種檢查。.NET Framework 類公開的所有資源類型都是用代碼存取權限保護的。圖 1 說明了 Web 應用程式訪問的一組常見的資源類型,以及訪問想要成功必需的相關代碼存取權限。
圖 1. 從 ASP.NET Web 應用程式訪問的常見資源類型和相關權限類別型 返回頁首 完全信任和部分信任
預設時,Web 應用程式以完全信任運行。完全信任應用程式將被代碼訪問安全性原則授予無限的代碼存取權限。這些許可權包括內建的系統許可權和自訂許可權。這意味著代碼訪問安全將不會阻止應用程式訪問任何得到保護的資源類型,如圖 1 所示。資源訪問的成敗完全取決於作業系統級安全。以完全信任啟動並執行 Web 應用程式包括所有用 .NET Framework 1.0 版構建的 ASP.NET 應用程式。預設時,.NET Framework 1.1 版應用程式是以完全信任啟動並執行,但信任級可以配置為使用 <trust> 元素,這一點在本單元後面將進行講述。
如果一個應用程式被配置為“Full”之外的某個信任級,就稱它為部分信任應用程式。部分信任應用程式的許可權都是受限的,該許可權將限制它們訪問得到保護的資源的能力。
重要說明 用 .NET Framework 1.0 版構建的 Web 應用程式始終是以完全信任啟動並執行,因為 System.Web 中的類型要求完全信任調用方。 返回頁首 在 ASP.NET 中配置代碼訪問安全
預設時,Web 應用程式以完全信任運行,具有無限許可權。在 ASP.NET 中要修改代碼訪問安全的信任級,必須在 Machine.config 或者 Web.config 中設定一個開關,將應用程式配置為部分信任應用程式。 配置信任級
Machine.config 中的 <trust> 元素控制著是否為 Web 應用程式啟用代碼訪問安全。開啟 Machine.config,搜尋“”,可以看到以下內容。
<system.web> <!-- level="[Full|High|Medium|Low|Minimal]" --> <trust level="Full" originUrl=""/></system.web>
當信任級設定為“Full”時,實際上將禁用代碼訪問安全,因為許可權要求並不阻止訪問資源的嘗試。這是 .NET Framework 1.0 版上構建的 ASP.NET Web 應用程式的唯一選擇。從“Full”到“Minimal”,每個層級都會刪去更多許可權,從而進一步限制應用程式訪問得到保護的資源和執行特權操作的能力。每個層級都提供了更大程度的應用程式獨立。表 1 說明了預定義的信任級,並指出了與前一層級相比較的主要限制。
| 表 1 ASP.NET 信任級所施加的限制 |
| ASP.NET 信任級 |
主要限制 |
Full |
無限許可權。應用程式可以訪問任何受作業系統安全限制的資源。支援所有特權操作。 |
High |
不能調用Unmanaged 程式碼 不能調用服務元件 不能寫事件記錄 不能訪問 Microsoft 訊息佇列 不能訪問 OLE DB 資料來源 |
Medium |
除上述之外,檔案訪問僅限於當前應用程式目錄,註冊表訪問是不允許的。 |
Low |
除上述之外,應用程式不能串連 SQL Server,代碼無法調用 CodeAccessPermission.Assert(即不能斷言安全許可權)。 |
Minimal |
只有執行許可權。 |
鎖定信任級
如果 Web 服務器管理員想使用代碼訪問安全以確保應用程式獨立,並限制對系統級資源的訪問,管理員必須能夠在機器級定義安全性原則,防止單獨的應用程式將其改寫。
應用程式服務提供者或者負責在同一伺服器上運行多個 Web 應用程式的任何人,應該鎖定所有 Web 應用程式的信任級。為此,將 Machine.config 中的 <trust> 元素裝入 <location> 標記,並將 allowOverride 屬性設定為 false,如下例所示。
<location allowOverride="false"> <system.web> <!-- level="[Full|High|Medium|Low|Minimal]" --> <trust level="Medium" originUrl=""/> </system.web></location>
還可以使用 <location> 元素的一個 path 屬性將某個配置應用於無法被改寫的特定網站或者 Web 應用程式。有關 <location> 元素的更多資訊,請參閱“保護 ASP.NET 應用程式的安全”單元。 返回頁首 ASP.NET 策略檔案
每個信任級都與一個 XML 策略檔案對應,策略檔案列出了每個信任級授與權限集。策略檔案位於以下目錄:
%windir%/Microsoft.NET/Framework/{version}/CONFIG
信任級通過 Machine.config 中的 <trustLevel> 元素對應於各個策略檔案,這些元素正好位於 <trust> 元素之上,如下例所示。
<location allowOverride="true"> <system.web> <securityPolicy> <trustLevel name="Full" policyFile="internal"/> <trustLevel name="High" policyFile="web_hightrust.config"/> <trustLevel name="Medium" policyFile="web_mediumtrust.config"/> <trustLevel name="Low" policyFile="web_lowtrust.config"/> <trustLevel name="Minimal" policyFile="web_minimaltrust.config"/> </securityPolicy> <!-- level="[Full|High|Medium|Low|Minimal]" --> <trust level="Full" originUrl=""/> </system.web></location>
注 完全信任級沒有對應的策略檔案。這是一個特例,只是表示所有許可權的無限集。
ASP.NET 策略是完全可配置的。除了預設策略級之外,管理員可以建立自訂許可權檔案,並使用 <trust> 元素對其進行配置,這一點將在本單元後面敘述。與自訂層級相關的策略檔案也必須用 Machine.config 中的 <trustLevel> 元素定義。 返回頁首 ASP.NET 策略
代碼訪問安全性原則是層次化的,可以在多個層級上進行管理。我們可以為企業級、機器級、使用者級和應用程式定義域級建立策略。ASP.NET 代碼訪問安全性原則是應用程式定義域級策略的一個例子。
一個 XML 設定檔中的設定為每個級都定義了策略。企業級、機器級和使用者級策略可以用 Microsoft .NET Framework 組態工具進行配置,但是 ASP.NET 策略檔案必須使用 XML 編輯器或者文字編輯器手工進行編輯。
單獨的 ASP.NET 信任級策略檔案可指出哪些許可權可以被授予在某個特定的信任級配置的應用程式。授予一個 ASP.NET 應用程式的實際 許可權是由所有 策略級(包括企業級、機器級、使用者級和 ASP.NET(應用程式定義域)級策略)授與權限的交集所確定的。
因為策略是從企業級向下計算到 ASP.NET 應用程式級的,許可權只能不斷刪除。如果沒有更高的層級首先授予許可權,就無法在 ASP.NET 級添加許可權。這種方式確保了企業級管理員始終具有最終決定權,在一個應用程式定義域中啟動並執行惡意代碼無法請求並被授予比管理員所配置的許可權更多的許可權。
有關策略計算的更多資訊,請參閱“代碼訪問安全實踐”單元。 ASP.NET 策略檔案揭密
為了瞭解某個特定的信任級都定義了哪些許可權,可以在記事本或者 XML 編輯器(更佳)中開啟相應的策略檔案,找到“ASP.NET”命名許可權集。此許可權集列出了為當前信任級的應用程式配置的許可權。
注 還可以看到“FullTrust”和“Nothing”許可權集。這些集合中不包含許可權元素,因為“FullTrust”意味著所有許可權,而“Nothing”意味著不包含許可權。
以下程式碼片段顯示了一個 ASP.NET 策略檔案的主要元素:
<configuration> <mscorlib> <security> <policy> <PolicyLevel version="1"> <SecurityClasses> ... list of security classes, permission types, and code group types ... </SecurityClasses> <NamedPermissionSets> <PermissionSet Name="FullTrust" ... /> <PermissionSet Name="Nothing" .../> <PermissionSet Name="ASP.NET" ... ... This is the interesting part ... ... List of individual permissions... <IPermission class="AspNetHostingPermission" version="1" Level="High" /> <IPermission class="DnsPermission" version="1" Unrestricted="true" /> ...Continued list of permissions... </PermissionSet> </PolicyLevel version="1"> </policy> </security> </mscorlib></configuration>
請注意 <IPermission> 元素定義的每個許可權,它定義了權限類別型名、版本和是否處於無限狀態。 許可權的狀態和無限許可權
許多許可權都包含狀態,狀態可以用於微調許可權指定的存取權限。狀態準確確定了許可權允許應用程式做些什麼。例如,FileIOPermission 可能指定一個目錄和一個訪問類型(讀取、寫等等)。以下許可權要求需要呼叫代碼被授予訪問 C:/SomeDir 目錄的讀取許可權:
(new FileIOPermission(FileIOPermissionAccess.Read, @"C:/SomeDir")).Demand();
處於無限狀態時,FileIOPermission 允許對檔案系統任何地區進行任何類型的訪問(當然,作業系統安全仍然適用)。以下許可權要求需要呼叫代碼被授予無限的 FileIOPermission 許可權:
(new FileIOPermission(PermissionState.Unrestricted)).Demand();
ASP.NET 命名許可權集
ASP.NET 策略檔案包含一個“ASP.NET”命名許可權集。該許可權集定義了應用程式定義域策略授予相關應用程式的許可權集。
ASP.NET 策略還引入了一個自訂的 AspNetHostingPermission,它有與預設層級之一相對應的一個相關 Level 屬性。System.Web 和 System.Web.Mobile 中所有公用類型都是用此許可權的 Minimum 級要求進行保護的。這種降低風險策略的目的,是確保如果沒有管理員的特定策略配置,Web 應用程式代碼就無法用於其他部分信任環境。 替換參數
如果對某個AS