Visual Basic .NET 與 Visual C# .NET 程序員需要處理的安全問題(二)
發(fā)表時間:2024-06-21 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]其他資源除了上面的概述中介紹的內(nèi)容外,還有許多其他內(nèi)容可供選擇。以下主題更詳細地討論了代碼訪問安全性: Introduction to Code Access Security(英文) Code Access Security(英文) Security Namespaces in Visual S...
其他資源
除了上面的概述中介紹的內(nèi)容外,還有許多其他內(nèi)容可供選擇。以下主題更詳細地討論了代碼訪問安全性:
Introduction to Code Access Security(英文)
Code Access Security(英文)
Security Namespaces in Visual Studio(英文)
Web 應(yīng)用程序
解決 Web 應(yīng)用程序的安全問題,可以保護您的服務(wù)器免受惡意代碼的攻擊,并保護數(shù)據(jù)不被破壞。您可以使用多種方法來保護服務(wù)器。
通過禁用 XML Web services 的動態(tài)發(fā)現(xiàn)功能來禁止用戶查找和運行您的 XML Web services。
在允許用戶訪問服務(wù)器之前,通過身份驗證來驗證用戶的標識。
通過使用 ASPNET 進程標識,可以更好地調(diào)整用戶可以使用的資源。
下面將詳細討論每一種方法。
動態(tài)發(fā)現(xiàn)
動態(tài)發(fā)現(xiàn)是 .NET 框架的一項功能,它允許 Web 瀏覽器查找在服務(wù)器上運行的 XML Web services。找到 XML Web service 后,用戶就可以調(diào)用該 XML Web services 的方法。動態(tài)發(fā)現(xiàn)雖然為用戶提供了強大的功能,但同時也給服務(wù)器帶來潛在的安全危險。多數(shù)情況下,您不需要啟用動態(tài)發(fā)現(xiàn)功能。安裝 .NET 框架時,動態(tài)發(fā)現(xiàn)在默認情況下處于禁用狀態(tài)。這并不表示 XML Web services 不可用,而只表示服務(wù)器將不提供可用服務(wù)的目錄。客戶端仍然可以使用 XML Web services,但您需要向其提供該服務(wù)的確切位置。
警告:禁用動態(tài)發(fā)現(xiàn)后,您需要將 XML Web services 的位置發(fā)送給客戶端。
在部署服務(wù)器上,有兩個項可以控制 XML Web services 的發(fā)現(xiàn)功能。第一項(machine.config 文件)控制服務(wù)器的整體發(fā)現(xiàn)功能。machine.config 文件是一個包含控制服務(wù)器上 Web 應(yīng)用程序的設(shè)置的 XML 文件,它位于 \%windows%\Microsoft.NET\Framework\Version\Config 文件夾。此文件包含一個默認情況下被注釋掉的元素。要啟用發(fā)現(xiàn)功能,您需要刪除這些注釋字符。還需要使用 ASPNET 帳戶來運行應(yīng)用程序,如下一節(jié)“ASPNET 進程標識”中所述。
<!--<add verb="*" path="*.vsdisco"
type="System.Web.Services.Discovery.DiscoveryRequestHandler,
System.Web.Services, Version=1.0.3300.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a" validate="false"/>-->
第二項是一個發(fā)現(xiàn)文件。發(fā)現(xiàn)文件可以是默認的發(fā)現(xiàn)文件 (default.vsdisco),也可以是 XML Web services 特定的發(fā)現(xiàn)文件。它是一個 XML 文件,包含有關(guān) XML Web services 文件位置的信息。
要客戶端能夠發(fā)現(xiàn)特定的 XML Web services,您需要在 machine.config 文件中啟用發(fā)現(xiàn)功能,并創(chuàng)建和部署應(yīng)用程序的發(fā)現(xiàn)文件。發(fā)現(xiàn)文件是一個僅列出不包含 XML Web services 的路徑的 XML 文件。下面提供了一個示例。有關(guān)創(chuàng)建和部署此文件的完整說明,請參閱 Deploying XML Web Services in Managed Code(英文)。
<?xml version="1.0" encoding="utf-8" ?>
<dynamicDiscovery xmlns="urn:schemas-dynamicdiscovery:disco.2000-03-17">
<exclude path="_vti_cnf" />
<exclude path="_vti_pvt" />
<exclude path="_vti_log" />
<exclude path="_vti_script" />
<exclude path="_vti_txt" />
<exclude path="Web References" />
</dynamicDiscovery>
如果您的部署服務(wù)器安裝有 Visual Studio .NET,則 Web 根文件夾將包含默認的發(fā)現(xiàn)文件 (default.vsdisco),該文件是在 Visual Studio .NET 的安裝過程中創(chuàng)建的。如果服務(wù)器中包含此文件并且在 machine.config 文件中啟用了發(fā)現(xiàn)功能,則可以發(fā)現(xiàn)服務(wù)器上的所有 XML Web services。如果要禁止發(fā)現(xiàn) XML Web services,則需要刪除此文件。
警告:如果部署服務(wù)器安裝了 Visual Studio .NET,則在服務(wù)器投入使用之前應(yīng)該刪除 default.vsdisco 文件。
建議您不要在已安裝 Visual Studio .NET 的服務(wù)器上部署 XML Web services。Visual Studio .NET 安裝程序會將可以使用的文件和用戶都添加到您的系統(tǒng)上。您可以保護已安裝 Visual Studio .NET 的系統(tǒng)的安全,但是,如果不需要在部署服務(wù)器上安裝 Visual Studio .NET,建議您不要安裝。
有關(guān)啟用動態(tài)發(fā)現(xiàn)的詳細信息,請參閱 Enabling Discovery for an XML Web services(英文)和 Fine-Tuning Discovery Mechanisms(英文)。
身份驗證、模擬和委托
默認情況下,Web 應(yīng)用程序?qū)⒁阅涿J竭\行,也就是說,應(yīng)用程序不需要任何有關(guān)用戶標識的信息。這對于那些包含公共信息的站點非常適用。如果要對訪問應(yīng)用程序或其他資源的用戶進行控制,則需要向應(yīng)用程序添加身份驗證。身份驗證是識別應(yīng)用程序的用戶并驗證該用戶是否有權(quán)訪問此應(yīng)用程序的過程。ASP.NET 支持多種身份驗證方法。其中最常用的方法有:
匿名 無需用戶提供任何標識信息。此方法適用于包含公共內(nèi)容的 Web 站點。如果需要個性化站點,則可以使用 cookie。有關(guān)在 ASP.NET 應(yīng)用程序中使用 cookie 的詳細信息,請參閱 Introduction to Web Forms State Management(英文)。
窗體 應(yīng)用程序向用戶提供一個登錄窗體,要求用戶提供登錄信息(如姓名和密碼)。窗體將被發(fā)送回服務(wù)器,服務(wù)器將該信息與數(shù)據(jù)倉庫進行比較。
基本 基本身份驗證是使用 Internet 信息服務(wù) (IIS) 配置的,大部分瀏覽器都支持基本身份驗證。如果啟用,瀏覽器將提示用戶輸入姓名和密碼,然后用 Base64 編碼(此編碼易于解密)將信息傳回 ASP.NET 應(yīng)用程序。此方法要求用戶擁有 Windows 帳戶。如果在基本身份驗證之外再使用安全套接字層 (SSL),則可以確保此身份驗證方法的安全性。有關(guān) ASP.NET 中的 SSL 支持的信息,請參閱 Using Secure Sockets Layer(英文)。
簡要 簡要身份驗證是使用 IIS 配置的,可用于運行 Microsoft Windows® 2000 或 Windows XP 的服務(wù)器。簡要身份驗證提供了比基本身份驗證更高的密碼加密級別。此方法要求用戶擁有存儲在 Microsoft Active Directory® 中的 Windows 帳戶。
集成 Windows 集成 Windows 身份驗證類似于基本身份驗證和簡要身份驗證,唯一區(qū)別是用戶的姓名和密碼不傳回 Web 應(yīng)用程序。此方法尤其適用于 Intranet 環(huán)境。它要求用戶擁有 Windows 帳戶,并且只有 Internet Explorer 瀏覽器支持該方法。
證書 證書是安裝在計算機中的數(shù)字密鑰。當(dāng)用戶試圖訪問服務(wù)器時,需要提供此密鑰。然后服務(wù)器在域或 Active Directory 中對該證書進行驗證。此方法適用于那些需要高度安全性而不惜付出管理證書成本的應(yīng)用程序。
Passport Microsoft 提供了這種集中的身份驗證服務(wù)。Passport 身份驗證適用于以下情況:當(dāng)您的 Web 站點與其他 Passport 站點一起使用時,使用戶只需登錄一次就能夠訪問所有站點;或者您不想維護用戶數(shù)據(jù)庫。
身份驗證允許您為應(yīng)用程序的用戶授權(quán),但這并不足以使用戶能夠訪問資源,例如文件和數(shù)據(jù)庫。您可以對資源進行配置,使其對特定的用戶(而不是 Web 應(yīng)用程序本身)可用。在這種情況下,可以使用模擬來允許用戶訪問這些資源。使用模擬時,服務(wù)器進程以通過身份驗證的用戶標識來運行。當(dāng)應(yīng)用程序使用模擬并查詢數(shù)據(jù)庫時,數(shù)據(jù)庫應(yīng)用程序在處理查詢時會認為查詢來自用戶,而不是服務(wù)器。如下例所示,可以通過在應(yīng)用程序的 Web.config 文件中設(shè)置 identity 元素的 impersonate 屬性來啟用模擬。Web.config 文件作為每個 Web 應(yīng)用程序項目的一部分而創(chuàng)建。
<identity impersonate="true">
比模擬更進一步的是委托,委托在訪問遠程資源(其他計算機)時使用用戶標識。如下表所示,并非所有的身份驗證方法都支持委托。
支持委托 不支持委托
基本 匿名
集成 Windows 簡要
證書 Passport
窗體
有關(guān)選擇和實施身份驗證方法的詳細論述,請參閱 Authentication in ASP.NET:.NET Security Guidance(英文)。有關(guān) Web 應(yīng)用程序安全性的詳細信息,請參閱 Web Application Security at Run Time(英文)。
ASPNET 進程標識
當(dāng) Web 應(yīng)用程序開始在服務(wù)器上運行時,它并不是像以您(Web 應(yīng)用程序的作者)的身份登錄那樣運行。而是像使用服務(wù)器上定義的一個 Windows 用戶帳戶登錄那樣運行。該帳戶(也稱作標識)可以是以下三個帳戶之一:ASPNET 標識、SYSTEM 標識或自定義標識。該標識是在 machine.config XML 文件(位于服務(wù)器的 \%windows%\Microsoft.NET\Framework\Version\Config 文件夾中)中指定的。以下所示是該元素三種配置方法的簡化示例。文件中的元素具有若干個屬性,此示例中并未顯示出來。
<!-- 選擇 ASPNET 標識 -->
<system.web>
<processModel enable="true" username="MACHINE" password="AutoGenerate"/>
</system.web>
<!-- 選擇 SYSTEM 標識 -->
<system.web>
<processModel enable="true" username="SYSTEM" password="AutoGenerate"/>
</system.web>
<!-- 選擇自定義標識 -->
<system.web>
<processModel enable="true" username="domain\user" password="pwd"/>
</system.web>
ASPNET 是在隨 .NET 框架安裝 machine.config 文件時所選擇的默認標識。ASPNET 帳戶是 Users 組的成員,默認情況下,Users 組只擁有最小的權(quán)限。ASPNET 帳戶還擁有其他幾個權(quán)限,其中包括對 ASP.NET 和 Windows 臨時目錄的全部權(quán)限。
如果將標識更改為 SYSTEM,則應(yīng)用程序?qū)⒃?SYSTEM 標識下運行,該標識擁有 Administrators 組的權(quán)限。SYSTEM 帳戶幾乎可以訪問服務(wù)器上的所有資源。
警告:如果服務(wù)器在 SYSTEM 標識下運行,受惡意代碼攻擊和數(shù)據(jù)遭到破壞的危險非常大。
要使用自定義標識,必須創(chuàng)建帳戶并按特定方式配置其權(quán)限。有關(guān)創(chuàng)建自定義標識的詳細信息,請參閱 Authentication in ASP.NET:.NET Security Guidelines(英文)。
默認情況下,有幾種系統(tǒng)資源對 ASPNET 帳戶不可用。下面概要介紹了常見的限制和解決方案。建議您使用 ASPNET 帳戶和所介紹的解決方案,而不要在 SYSTEM 標識下運行應(yīng)用程序。
文件資源 可以通過 Windows 資源管理器訪問各個文件和文件夾的訪問控制列表 (ACL),來調(diào)整授予 ASPNET 帳戶的文件和文件夾權(quán)限。對 ASPNET 的 ACL 的更改不會自動通過部署傳播。例如,您可能允許 ASPNET 帳戶對開發(fā)計算機上的 c:\picture.bmp 文件擁有寫入權(quán)限。當(dāng)部署應(yīng)用程序時,應(yīng)用程序?qū)⒃诹硪慌_計算機上運行,該計算機也具有 ASPNET 帳戶。您需要在部署計算機上為 ASPNET 帳戶添加對部署計算機上 c:\picture.bmp 文件的寫入權(quán)限。幸運的是,您可以在部署項目中使用自定義操作對 ACL 進行更改,但必須對所要做的更改進行跟蹤。
事件日志 ASPNET 帳戶可以向現(xiàn)有日志添加條目,但不能創(chuàng)建新的事件日志類別。這時您可以在使用 ASPNET 帳戶時啟用模擬,以便創(chuàng)建新的事件日志類別。模擬標識必須具有足夠的權(quán)限才能創(chuàng)建事件日志類別。如果應(yīng)用程序需要的事件日志可以在投入使用前指定,則可以由部署項目來創(chuàng)建這些日志。
目錄服務(wù)和 Active Directory 要對它們進行訪問,需要使用模擬和委托,或者將特定的安全憑據(jù)傳遞給 DirectoryEntry 對象。如果選擇將特定安全憑據(jù)傳遞給 DirectoryEntry 對象,則需要確保已正確存儲此信息。
性能計數(shù)器 ASPNET 帳戶只能寫入而不能讀取性能計數(shù)器,并且不能創(chuàng)建新的性能計數(shù)器類別。這時您可以在使用 ASPNET 帳戶時啟用模擬,以便創(chuàng)建新的性能計數(shù)器類別。模擬標識必須具有足夠的權(quán)限才能創(chuàng)建性能計數(shù)器類別。如果應(yīng)用程序需要的性能計數(shù)器可以在投入使用前指定,則可以由部署項目來創(chuàng)建這些性能計數(shù)器。
在 ASPNET 標識下運行時保護文件資源的安全
注意:本節(jié)中的說明適用于運行 NTFS 文件系統(tǒng)的系統(tǒng)。如果您的服務(wù)器運行的是 FAT32 文件系統(tǒng),請參閱文件系統(tǒng)說明文件,了解有關(guān)保護文件安全的信息。
默認情況下,ASPNET 帳戶只擁有 Users 組的讀取和執(zhí)行權(quán)限。如果 Web 應(yīng)用程序需要寫入或創(chuàng)建新文件,則可以通過修改訪問控制列表 (ACL) 為特定文件和文件夾授權(quán)。要訪問某個文件的 ACL,可以在 Windows 資源管理器中右擊該文件,然后依次選擇“屬性”和“安全”選項卡。最好是修改特定文件的 ACL,而不是向 ASPNET 帳戶添加通用權(quán)限。最常使用的權(quán)限包括:
讀取 - 數(shù)據(jù)文件和可執(zhí)行文件需要讀取權(quán)限。
寫入 - 由應(yīng)用程序更新的數(shù)據(jù)文件需要寫入權(quán)限。
執(zhí)行 - 在 Web 應(yīng)用程序中,.asmx 文件為可執(zhí)行文件。
創(chuàng)建 - 要創(chuàng)建文件,需要為要在其中創(chuàng)建文件的文件夾添加創(chuàng)建權(quán)限。
這些權(quán)限適用于:
文件
文件夾
警告:應(yīng)避免允許對同一文件或目錄同時擁有執(zhí)行權(quán)限和寫入或創(chuàng)建權(quán)限。在這種情況下,用戶可能會設(shè)法在文件中寫入惡意代碼,然后再執(zhí)行。
以下是有關(guān)簡化授權(quán)過程的一些技巧:
根據(jù)應(yīng)用程序中文件所需的權(quán)限,將文件分別放入不同的目錄。例如,如果在一個目錄中只存放讀取/執(zhí)行文件,則只需要為一個目錄設(shè)置這些權(quán)限,而不必單獨為每個文件設(shè)置權(quán)限。請考慮在應(yīng)用程序中為讀取/執(zhí)行、讀取/寫入和讀取/創(chuàng)建權(quán)限分別創(chuàng)建目錄。
應(yīng)用程序可以包含在部署時為空的數(shù)據(jù)文件,還可以包含首次運行應(yīng)用程序時創(chuàng)建文件所需的代碼。這需要為目錄添加創(chuàng)建權(quán)限,這是一種較高的安全設(shè)置。為了避免添加代碼來創(chuàng)建新的空文件,請考慮在部署時即給應(yīng)用程序提供一個空文件。這樣,您只需給該文件添加寫入權(quán)限,而不必給目錄添加創(chuàng)建權(quán)限。
在開發(fā)應(yīng)用程序時,您將為開發(fā)計算機上的文件和目錄添加權(quán)限,以便精確調(diào)整應(yīng)用程序的安全級別。不幸的是,ACL 不會被傳遞到部署計算機上的相應(yīng)文件。要規(guī)劃傳遞這些 ACL,請記住以下幾點:
可以在部署程序包中使用自定義操作來更改 ACL。有關(guān)詳細信息,請參閱 Custom Actions(英文)。
可以使用第三方工具來跟蹤和查找所做的更改。
可能需要同系統(tǒng)管理員確認每一個設(shè)置。您需要記錄進行更改的原因,以及為什么必須通過更改設(shè)置來達到目的。
使用 ASPNET 標識進行調(diào)試
調(diào)試 XML Web services 時,如果在 machine.config 文件中定義了 ASPNET 標識,將使用該標識來調(diào)用此 XML Web services。默認情況下,ASPNET 標識不是 Debugger Users 組的成員(請參見下一節(jié)“Visual Studio .NET 開發(fā)環(huán)境中的安全機制”),因此不能在調(diào)試過程中訪問 XML Web services 代碼。要調(diào)試 XML Web services,請打開 XML Web services 的代碼并設(shè)置一個斷點。
建議您在測試計算機(而不是部署計算機)上進行調(diào)試。這將在下一節(jié)“Visual Studio .NET 開發(fā)環(huán)境中的安全機制”中討論。
有關(guān)配置進程標識的詳細信息,請參閱 ASP.NET Process Identity(英文)和 ASP.NET Impersonation(英文)。
Visual Studio .NET 開發(fā)環(huán)境中的安全機制
除了保護服務(wù)器的安全外,還要保護開發(fā)計算機免受惡意代碼的攻擊和數(shù)據(jù)破壞。您可以利用開發(fā)環(huán)境中的多種機制來保護開發(fā)服務(wù)器的安全:
VS Developers 和 Debuggers 安裝 Visual Studio .NET 時將添加這兩個帳戶組。VS Developers 組具有在服務(wù)器上創(chuàng)建和開發(fā) Web 應(yīng)用程序的必要文件、共享和 IIS 權(quán)限。Debuggers 組可以在特定計算機(本地或遠程)上調(diào)試進程。這兩個組都是服務(wù)器上具有很大權(quán)限的用戶,可以訪問大多數(shù)資源。有關(guān)詳細信息,請參閱 Web Application Security at Design Time in Visual Studio(英文)。
調(diào)試 建議您在測試計算機(而不是部署計算機)上進行調(diào)試。如果必須在部署服務(wù)器上調(diào)試,請僅安裝遠程調(diào)試組件,并在完成調(diào)試后卸載該組件。請在脫機狀態(tài)下調(diào)試服務(wù)器。有關(guān)詳細信息,請參閱 Introduction to Web Application Debugging(英文)。
部署 對于大多數(shù)應(yīng)用程序,只需要在服務(wù)器上安裝 .NET 框架就足夠了。如果在部署計算機上安裝了 Visual Studio .NET 或 Visual Studio .NET 服務(wù)器組件,則 VS Developers 組和 Debuggers 組都將出現(xiàn)在部署計算機上。您需要對 VS Developers 的成員和 Debugger 用戶加以限制。此外,可能還需要禁用動態(tài)發(fā)現(xiàn)。
警告:強烈建議您不要在部署服務(wù)器上安裝 Visual Studio。
Visual Studio .NET 的“復(fù)制項目”功能包括使用配置文件 (Web.config) 部署應(yīng)用程序的選項,該配置文件不同于開發(fā)中所使用的配置文件。開發(fā)文件可能啟用了調(diào)試,在部署后,將允許用戶在引發(fā)異常時檢查調(diào)用堆棧。建議您使用不允許調(diào)試的配置文件進行部署。
總結(jié)
保護資源的安全是一個涉及多種技術(shù)和整個開發(fā)周期的過程。通過對應(yīng)用程序進行周密的設(shè)計、實現(xiàn)、測試和部署,您可以創(chuàng)建非常安全的應(yīng)用程序。可以使用由 ASP.NET、操作系統(tǒng)和 Web 瀏覽器提供的安全技術(shù)來保護應(yīng)用程序的安全。