Web 安全解決方案一覽
在本單元中
本單元包括一個總結了在提高 Web 應用程序安全:威脅與對策中介紹的解決方案的路線圖。提供了本指南相應材料的鏈接,從而使您容易找到所需要的信息和具體問題的解決方案。本單元是按照角色組織的,覆蓋了適合於設計人員與架構師、開發人員和管理員的解決方案。
目標
使用本單元:
• |
迅速找到具體安全問題的解決方案。 |
• |
快速、容易地導航本指南。 |
應用於
本單元沒有任何技術信息,只有適用於下列產品和技術的指南:
• |
Microsoft® Windows® Server 2000 and Windows Server™ 2003 操作系統 |
• |
Microsoft .NET Framework 1.1 |
• |
ASP.NET 1.1 |
• |
Microsoft SQL Server™ 2000 |
如何使用本單元
可以使用本單元尋找提高 Web 應用程序安全:威脅與對策中覆蓋的安全解決方案的鏈接和參考。
本指南介紹的安全解決方案適用於產品的整個生命週期和多種角色。本單元介紹的解決方案路線圖是爲架構師、開發人員和系統管理員組織的。
• |
對架構師:
| ||||||||||||||||||||||||||||
• |
對開發人員:
| ||||||||||||||||||||||||||||
• |
對於管理員:
|
本頁內容
體系結構和設計解決方案 | |
開發解決方案 | |
管理解決方案 |
體系結構和設計解決方案
爲了幫助您設計安全的 Web 應用程序,本指南爲架構師提供了下列解決方案:
• |
如何識別和評估威脅 使用威脅建模系統地識別威脅,而不是以任意的方式應用安全性。接着,根據攻擊或安全損害產生的風險和可能造成的潛在損失,對威脅進行評價。這樣就可以適當的次序對威脅進行處理。 有關創建威脅模型和評估威脅風險的詳細信息,請參閱“威脅建模”單元。 |
• |
如何創建安全的設計 使用嘗試或檢驗過的設計原則。集中處理關鍵區域,在這些區域,方法正確是必須的,而且經常會出現錯誤。本指南將它們稱爲應用程序缺陷類別。其中包括輸入驗證、身份驗證、授權、配置管理、敏感數據保護、會話管理、密碼系統、參數處理、異常管理和審覈與日誌記錄各項。要特別注意部署問題,包括拓撲、網絡基礎設施、安全策略和步驟。 有關更多信息,請參閱“設計安全 Web 應用程序的指導方針”單元。 |
• |
如何執行體系結構和設計複查 應用程序設計的複查與目標部署環境和相關的安全策略有關。需要考慮底層基礎設施層安全性(包括邊界網絡、防火牆、遠程應用程序服務器等)帶來的限制。使用應用程序缺陷類別幫助您對應用程序進行分類,並分析適合於每個領域的方法。 有關更多信息,請參閱“安全性體系結構和設計檢查”單元。 |
開發解決方案
本指南爲開發人員提供了下列解決方案:
• |
什麼是 .NET Framework 安全性? .NET Framework 提供了用戶和代碼安全模型,允許對用戶和代碼可以執行的操作進行限制。要對基於角色的安全性和代碼訪問安全性進行編程,可以從 System.Security 命名空間中使用類型。.NET Framework 還提供了 System.Security.Cryptography 命名空間,公開對稱和不對稱的加密與解密、散列、隨機數生成、數字簽名支持等。 要理解 .NET Framework 安全性基本設置,請參閱“.NET 安全基礎”單元。 |
• |
如何編寫安全託管代碼 用強名稱對程序集進行數字簽名,使它們不能隨意改動。同時,在結合使用強名稱的程序集和 ASP.NET 時,需要注意強名稱的問題。通過遵守堅固的面向對象設計原理,減小程序集受攻擊面,然後使用代碼訪問安全性,進一步限制哪些代碼可以調用您的代碼。使用結構化的異常處理方法防止敏感信息蔓延到當前信任邊界之外,並開發更加可靠的代碼。避免常規問題,特別是輸入文件名和 URL 的問題。 有關如何提高託管代碼安全性的信息,請參閱“構建安全的程序集”單元。有關如何有效使用代碼訪問安全性,以進一步提高安全性的詳細信息,請參閱“代碼訪問安全實踐”單元。有關執行託管代碼複查的信息,請參閱“Security Code Review”單元。 |
• |
如何安全地處理異常 不要顯示內部系統或應用程序的詳細信息,如堆棧跟蹤、SQL 語句片斷等。確保這類信息不被允許蔓延到最終用戶或當前信任邊界以外。 在異常事件中安全地失敗,確保應用程序拒絕訪問,而且沒有停留在不安全的狀態下。不記錄敏感或私有數據,如密碼,以免造成危害。在記錄或報告異常時,如果用戶的輸入包括在異常消息中,對其進行驗證或清理。例如,如果返回一個 HTML 錯誤消息,您應該對輸出進行編碼,以避免腳本注入。 有關更多信息,請參閱“構建安全的程序集”和“構建安全的 ASP.NET 頁和控件”兩單元的“Exception Management”部分。 |
• |
如何執行託管代碼的安全複查 使用分析工具(如 FxCop)分析二進制程序集,確保它們符合 .NETFramework 設計準則。修複分析工具識別出的所有安全缺陷。使用文本搜索工具掃描硬編碼機密(如密碼)的源代碼庫。之後,複查具體的應用程序元素,包括 Web 頁面和控件、數據訪問代碼、Web 服務、服務組件等。要特別注意 SQL 注入和跨站點腳本編寫缺陷。 還要對使用敏感的代碼訪問安全技術進行復查,如鏈接聲明和斷言。有關更多信息,請參閱“Code Review”單元。 |
• |
如何保證開發人員工作站的安全性 您可以使用一套方法保證工作站的安全性。保證您的帳戶、協議、端口、服務、共享、文件與目錄和註冊表的安全。最重要的是,保持您的工作站具有當前最新的補丁與更新。如果您在 Microsoft Windows_ XP 或 Windows 2000 上運行 Internet 信息服務 (IIS),則運行 IISLockdown。IISLockdown 應用安全的 IIS 配置,並安裝 URLScan Internet 安全應用程序編程接口 (ISAPI) 篩選器,該篩選器用於檢測和拒絕潛在的惡意 HTTP 請求。例如,您可能需要修改默認 URLScan 的配置,這樣您就可以在開發和測試期間調試 Web 應用程序。 有關更多信息,請參閱本指南的“如何做”部分的“如何保證開發人員工作站的安全”。 |
• |
如何結合使用代碼訪問安全性和 ASP.NET 使用 .NET Framework 版本 1.1,您可以在 Machine.config 或 Web.config 中設置 ASP.NET 的信任級。這些信任級使用代碼訪問安全性,以限制 ASP.NET 應用程序可以訪問的資源,例如文件系統、註冊表、網絡、數據庫等。此外,它們還提供了應用程序隔離。 有關從 ASP.NET 使用代碼訪問安全性、開發部分信任的 Web 應用程序和沙箱化特權代碼的詳細信息,請參閱“在 ASP.NET 中使用代碼訪問安全”單元。 有關代碼訪問安全性的基礎的詳細信息,請參閱“代碼訪問安全實踐”單元。 有關在開發託管代碼時需要考慮的代碼訪問安全性問題的詳細信息,請參閱“構建安全的服務組件”、“構建安全的 Web 服務”、“構建安全的遠程組件”和“構建安全的數據訪問”等單元的“代碼訪問安全注意事項”部分。 |
• |
如何編寫具有最低權限的代碼 可以限制代碼能夠執行的操作,這與運行該代碼所使用的帳戶無關。通過配置策略或如何編寫代碼,您可以使用代碼訪問安全性來限制代碼允許被訪問的資源和操作。如果代碼不需要訪問某種資源或執行某種敏感操作(如調用非託管代碼),可以使用聲明性安全屬性來確保代碼不會被管理員授予這種權限。 有關更多信息,請參閱 “代碼訪問安全實踐”單元。 |
• |
如何限制文件 I/O 可以使用代碼訪問安全性來限制程序集訪問文件系統區域和執行 I/O 的能力。例如,可以限制某個 Web 應用程序,使它只能在它的虛擬目錄層次結構下執行文件 I/O。您也可以將文件 I/O 限制在特定的目錄上。這可以通過編程或配置代碼訪問安全策略來完成。 有關更多信息,請參閱“代碼訪問安全實踐”單元的“文件 I/O”和“在 ASP.NET 中使用代碼訪問安全”單元的“媒體信任”。有關配置代碼訪問安全策略的詳細信息,請參閱“如何使用 CAS 策略約束程序集”。 |
• |
如何防止 SQL 注入 使用數據訪問的參數化存儲過程。使用參數要確保輸入值的類型和長度都得到檢查。參數也被視作安全文本值和數據庫內的不可執行代碼。如果不能使用存儲過程,就使用帶有參數的 SQL 語句。不要通過連接 SQL 命令和輸入值來構建 SQL 語句。還要確保應用程序使用具有最低權限的數據庫登錄,以限制它在數據庫中的功能。 有關 SQL 注入的詳細信息和進一步對策,請參閱“構建安全的數據訪問”單元的“SQL 注入”。 |
• |
如何防止跨站點腳本編寫 對輸入類型、長度、格式和範圍進行驗證,並對輸出進行編碼。如果輸出包括輸入(包括 Web 輸入),則對輸出進行編碼。例如,對窗體字段、查詢字符串參數、cookie 等進行編碼,以及對從無法假定其數據是安全的數據庫(特別是共享數據庫)中讀取的輸入進行編碼。對需要以 HTML 返回客戶端的自由格式輸入字段,對輸出進行編碼,然後選擇性地清除在許可元素(如用於格式化的 <b> 或 標記)上的編碼。 有關更多信息,請參閱“構建 ASP.NET 頁和控件”單元的“跨站點腳本編寫”。 |
• |
如何管理機密 最好尋找避免存儲機密的替代方法。如果必須存儲它們,則不要在源代碼或配置文件中以明文的方式存儲。使用數據保護應用程序編程接口 (DPAPI) 加密機密,以避免關鍵的管理問題。 有關更多信息,請參閱“構建安全的 ASP.NET 頁和控件”單元的“敏感數據”、“構建安全的程序集”單元的“加密”和“保證 ASP.NET 應用程序的安全”單元的“Aspnet_setreg.exe 與進程、會話和標識”。 |
• |
如何安全地調用非託管代碼 特別注意傳遞給非託管 API 和非託管 API 傳遞出的參數,防止潛在的緩衝區溢出。驗證輸入和輸出字符串參數的長度,檢查數組邊界,並特別小心文件路徑的長度。在斷言非託管代碼權限之前,使用自定義權限聲明保護對非託管資源的訪問。如果用 SuppressUnmanagedCodeSecurityAttribute 提高性能,請小心使用。 |
• |
如何執行安全的輸入驗證 對輸入進行限制、拒絕和清理,因爲驗證已知有效類型、模式和範圍的數據要比通過查找已知錯誤字符來驗證數據容易得多。驗證數據的類型、長度、格式和範圍。對字符串輸入,請使用正則表達式。要使用執行類型檢查,則使用 .NET Framework 類型系統。有時候,可能需要對輸入進行清理。一個例子是對數據編碼,以保證其安全性。 有關輸入驗證設計策略,請參閱“設計安全 Web 應用程序的指導方針”單元的“輸入驗證”。有關實現細節,請參閱“構建安全的 ASP.NET 頁和控件”、“構建安全的 Web 服務”、“構建安全的遠程組件”和“構建安全的數據訪問”單元的“輸入驗證”部分。 |
• |
如何保證窗體身份驗證的安全性 劃分 Web 站點,隔離匿名用戶可以訪問的公共可訪問頁面和需要身份驗證訪問的限制性頁面。使用安全套接字層 (SSL) 來保護窗體身份驗證憑據和窗體身份驗證 cookie。限制會話生存時間和確保身份驗證 cookie 只在 HTTPS 上傳輸。對身份驗證 cookie 加密,不要在客戶端計算機上保留它,也不要將其用於個性化目的;對個性化使用單獨的 cookie。 有關更多信息,請參閱“保證 ASP.NET 應用程序的安全”和“構建安全的 ASP.NET 頁和控件”兩單元中的 “身份驗證”部分。 |
管理解決方案
本指南爲管理員提供了以下解決方案:
• |
如何實現補丁管理 使用 Microsoft Baseline Security Analyzer (MBSA) 檢查當前安裝可能漏掉的補丁和更新。定期運行該操作,保持您的服務器當前安裝有最新的補丁和更新。在應用補丁前,備份服務器;在將補丁安裝在產品服務器上之前,先在測試服務器上進行測試。還要使用 Microsoft 提供的安全通知服務,並訂閱通過電子郵件接收安全佈告。 有關更多信息,請參閱“如何實現修補程序管理”。 |
• |
如何使 Machine.config 和 Web.config 中的設置更加安全 不要以明文形式存儲密碼或敏感數據。例如,使用 Aspnet_setreg.exe 實用工具加密 <processModel>、<identity> 和 <sessionState> 的值。不要對客戶端顯示異常詳細信息。例如,不能在 ASP.NET 中使用 <customErrors> 的 mode="Off",因爲這會導致含有系統級信息的詳細錯誤頁面返回客戶端。對具有訪問配置文件和設置的權限的用戶進行限制。如果需要,使用<location> 標記和 allowOverride 元素鎖定配置設置。 有關提高適於應用情境的 Machine.config 和 Web.config 安全性的詳細信息,請參閱“保證 ASP.NET 的安全”單元。有關 <location> 標記的詳細信息,請參閱“保證 ASP.NET 的安全”單元解釋的“Machine.Config 和 Web.Config”。有關 Aspnet_setreg.exe 的詳細信息,請參閱“保證 ASP.NET 應用程序的安全”單元的“Aspnet_setreg.exe 與進程、會話和標識”。 |
• |
如何保證運行 .NET Framework 的 Web 服務器的安全性 用一種方法系統配置 Web 服務器的安全性。保證帳戶、協議、端口、服務、共享、文件與目錄和註冊表的安全性。可以使用 IISLockdown,以有助於自動進行某些安全配置。使用一個增強的 Machine.config 配置,對服務器上安裝的所有 .NET Framework 應用程序應用嚴格的安全性。最重要的是,保持您的服務器安裝了當前最新的補丁和更新。 有關更多信息,請參閱“保證應用程序服務器的安全”單元。 |
• |
如何保證數據庫服務器的安全性 應用一種常見方法評估帳戶、協議、端口、服務、共享、文件與目錄和註冊表。還要評估 SQL Server的安全設置,如身份驗證模式和審覈配置。評估身份驗證方法和 SQL Server登錄、用戶與角色的使用。確保您具有最新的服務包,定期監測操作系統和 SQL Server 補丁與更新。 有關更多信息,請參閱“保證數據庫服務器的安全”單元。 |
• |
如何保證應用程序服務器的安全性 評估帳戶、協議、端口、服務器、共享、文件與目錄和註冊表。使用 Internet 協議安全 (IPSec) 或 SSL 保證 Web 服務器和應用程序服務器之間的通信通道及應用程序服務器和數據庫服務器之間的通信通道的安全。複查企業服務應用程序、Web 服務和遠程處理應用程序的安全。限制客戶端可以連接到應用程序服務器的端口的範圍,並考慮使用 IPSec 約束來限制客戶端的範圍。 有關更多信息,請參閱“保證應用程序服務器的安全”單元。 |
• |
如何安全地承載多個 ASP.NET 應用程序 使用單獨標識來允許在安全資源上配置訪問控制列表 (ACL),以控制哪些應用程序可以訪問這些安全資源。在 Microsoft Windows Server 2003 操作系統上,使用單獨的具有 IIS6 應用程序池的進程標識。在 Windows 2000 Server 上,使用多個匿名 Internet 用戶帳戶並允許模擬。在這兩種平臺上,通過 .NET Framework版本 1.1,可以使用部分信任級和使用代碼訪問安全,提供進一步的應用程序隔離。例如,可以使用這些方法防止應用程序訪問彼此的虛擬目錄和重要的系統資源。 有關更多信息,請參閱“承載多個 ASP.NET 應用程序”單元。 |
• |
如何保證 Web 服務的安全性 在跨平臺和無法控制兩個終結點的情況下,可以使用 Microsoft .NET 的 Web Service Enhancement 1.0 (WSE) 實現符合新興的 WS-Security 標準的消息級安全解決方案。在簡單對象訪問協議 (SOAP) 頭中傳遞身份驗證令牌。使用 XML 加密以確保敏感數據保持其私有性。使用數字簽名保證消息的完整性。在能夠控制兩個終結點的企業內部,可以使用操作系統和 IIS 提供的身份驗證、授權和安全通信功能。 有關更多信息,請參閱“Securing Your Application Server”和“保證 ASP.NET 應用程序的安全”兩單元。有關開發安全的 Web 服務的信息,請參閱“構建安全的 Web 服務”單元。 |
• |
如何保證企業服務的安全性 配置使用最低權限帳戶運行的服務器應用程序。啓用 COM+ 基於角色的安全性,並實行組件級訪問檢查。至少要使用調用級身份驗證來防止匿名訪問。要保證傳輸到遠程服務組件的通信的安全性,請使用 IPSec 加密的通道或使用遠程過程調用 (RPC) 加密。限制分佈式 COM (DCOM) 動態分配的端口範圍或使用靜態終結點映射將端口範圍限制在特定端口內。定期監測 COM+ 運行庫的 Quick Fix Engineer (QFE) 更新。 有關更多信息,請參閱“保證應用程序服務器的安全”單元。 |
• |
如何保證 Microsoft .NET 的遠程處理安全性 通過將 .rem 和 .soap 擴展名映射爲 Machine.config 中的 ASP.NET HttpForbiddenHandler HTTP 模塊,禁用面向 Internet 的 Web 服務器上的遠程處理。寄宿在 ASP.NET 中,使用 HttpChannel 類型名稱從 ASP.NET 和 IIS 身份驗證和授權服務中獲益。如果需要使用 TcpChannel 類型名稱,則將遠程組件寄宿在 Windows 服務中,使用 IPSec 限制哪些客戶端可以連接到服務器。只能在受信任的服務器的情況下使用該方法,在這裏遠程處理客戶端(例如 Web 應用程序)對初始調用者進行身份驗證和授權。 有關更多信息,請參閱“保證應用程序服務器的安全”單元。 |
• |
如何保證會話狀態的安全性 在網絡上傳輸和在狀態存儲區中時,需要保護會話狀態。如果使用遠程狀態存儲區,請使用 SSL 或 IPSec 保證通往狀態存儲區的通信通道的安全。同時,加密 Machine.config 中的連接字符串。如果使用 SQL Server 狀態存儲區,則在連接狀態存儲區時,使用 Windows 身份驗證,並限制應用程序對數據庫的登錄。如果使用 ASP.NET 狀態服務,則使用最低權限帳戶運行該服務,並考慮改變服務偵聽的默認端口。如果不需要狀態服務,請禁用它。 有關更多信息,請參閱“保證 ASP.NET 應用程序的安全”單元的“會話狀態”。 |
• |
如何安全地管理應用程序的配置 應該限制或避免遠程管理。管理界面必需有嚴格的身份驗證。通過 ACL 和權限限制對配置存儲區的訪問。確保您具有支持責任劃分所需的授權粒度。 有關保證配置管理安全性的常規考慮,請參閱“設計安全 Web 應用程序的指導方針”。要驗證安全默認設置和確保您應用了安全的機器級別的設置和安全的應用程序具體的設置,請參閱“保證 ASP.NET 應用程序的安全”單元。 |
• |
如何防止拒絕服務攻擊 確保加強了服務器上的 TCP/IP 堆棧配置,以應對如 SYN flood 這樣的攻擊。配置 ASP.NET 以限制接受的 POST 請求的規模,並對請求的執行時間做出限制。 有關加強 TCP/IP 的詳細信息,請參閱“如何加固 TCP/IP 棧”。有關用於幫助防止拒絕服務攻擊的 ASP.NET 設置的詳細信息,請參閱“保證 ASP.NET 應用程序的安全”單元。 |
• |
如何限制文件 I/O 您可以配置代碼訪問安全策略,以確保限制單個程序集或整個 Web 應用程序只能訪問文件系統。例如,通過配置運行在媒體信任級上的 Web 應用程序,可以防止應用程序訪問其虛擬目錄層次結構以外的文件。 同時,通過爲特定程序集授予受限的文件 I/O 權限,可以精確控制哪些文件可以被訪問以及應該如何訪問它們。 有關更多信息,請參閱 “在 ASP.NET 中使用代碼訪問安全”單元和本指南的“如何做”部分的“如何使用 CAS 策略約束程序集”。 |
• |
如何執行遠程管理 終端服務提供了一種專用的協議 (RDP)。它支持身份驗證,並可以提供加密。如果需要文件傳輸工具,可以從 Windows 2000 Server 資源包中安裝文件複製實用工具。建議不要使用 IIS Web 管理,如果運行 IISLockdown 該選項將被清除。應該考慮提供一個加密的通信通道,並使用 IPSec 限制可以用於遠程管理您的服務器的計算機。還應該限制管理帳戶的數量。 有關更多信息,請參閱“保證 Web 服務器的安全”單元的“遠程管理”部分和“保證數據庫服務器的安全”。 |