保護 ASP.NET 組態
更新:2007 年 11 月
ASP.NET 組態提供設定整個伺服器、ASP.NET 應用程式或應用程式子目錄中個別網頁的功能。您可以設定像是驗證模式、網頁快取、編譯器選項、自訂錯誤、偵錯和追蹤選項以及更多的功能。這個主題描述如何在設定本機或遠端 ASP.NET 應用程式時,經由最佳作法最佳化組態功能的安全性。如需保護 ASP.NET 其他功能的詳細資訊,請參閱請參閱一節中所列的資訊。
雖然下列編碼和設定最佳作法有助於改進應用程式的安全性,但使用 Microsoft Windows 和 Microsoft Internet Information Services (IIS) 的最新安全性更新,以及 Microsoft SQL Server 或其他成員資料來源的任何安全性更新,以持續保持應用程式伺服器的更新,這一點仍然很重要。
如需撰寫安全程式碼和保護應用程式之最佳作法的詳細資訊,請參閱 Michael Howard 和 David LeBlanc 所著的《撰寫安全的程式碼》一書,以及參閱 Microsoft 典範與實例所提供的指南。
重要事項: |
---|
ASP.NET 組態系統只會設定 ASP.NET 資源和功能。使用 IIS 的組態功能設定非 ASP.NET 資源。如需設定 IIS 的詳細資訊,請參閱使用 Metabase (IIS 6.0) 和 IIS Metabase 屬性參考 (英文)。 |
組態檔安全性
下列表格列出 Machine.config 檔和根目錄 Web.config 檔預設的存取控制清單 (ACL),兩個檔案都位於 %SystemRoot%\Microsoft.NET\Framework\version\CONFIG 目錄。這些 ACL 也會設定在目錄本身,但是其中包含 Power User 群組的「修改」權限。目錄是唯讀的。
Windows 帳戶 |
使用權限 |
---|---|
Administrators |
完全控制 |
ASP.NET 電腦帳戶 (<server>\ASPNET) |
讀取和執行 |
IIS_WPG (<server>\IIS_WPG) |
讀取和執行 |
LOCAL SERVICE |
讀取和執行 |
NETWORK SERVICE |
讀取和執行 |
進階使用者 (<server>\Power Users) |
修改 |
SYSTEM |
完全控制 |
使用者 (<server>\Users) |
讀取和執行 |
下列表格列出應該設定於 Web.config 檔以及 configSource 屬性 (Attribute) 中列出之任何檔案上的 ACL。
Windows 帳戶 |
使用權限 |
---|---|
Administrators |
完全控制 |
IIS_WPG (<server>\IIS_WPG) |
讀取和執行 |
INTERACTIVE |
Read |
Internet Guest 帳戶 (<server>\IUSR_<server>) |
Read |
NETWORK |
Read |
NETWORK SERVICE |
Read |
SYSTEM |
完全控制 |
使用者 (<server>\Users) |
讀取和執行 |
特殊 |
不論如何編輯組態設定,ASP.NET 組態系統都會接受組態檔設定的 ACL。如需詳細資訊,請參閱編輯 ASP.NET 組態檔。
設定組態值的安全性
當您將應用程式的機密資訊儲存至組態檔時,應該要使用受保護的組態加密機密值。資訊 (特別是機密的資訊) 包含了儲存在 machineKey 組態項目中的加密金鑰,以及儲存在 connectionStrings 組態項目中的資料來源連接字串。如需詳細資訊,請參閱使用受保護的組態加密組態資訊。
保護組態加密金鑰容器
使用加密金鑰的一個重要觀念是對檔案提供保護,也稱為容器,也就是儲存金鑰的地方。重點的是要牢記與容器相關聯的保護層級。請注意,容器是儲存在標準的作業系統檔中,而對加密金鑰的存取是由檔案上的 ACL 管理。ACL 可以繼承自建立之檔案所屬的資料夾。具有本機電腦範圍 (useMachineContainer"true") 的金鑰容器會儲存在 %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys 的隱藏資料夾中。
依照預設,建立金鑰容器的使用者可以完整存取金鑰。視容器上設定的 ACL 而定,其他使用者 (包括 Administrators 群組) 可能有也可能沒有該容器的存取權。其他使用者可以透過使用 ASP.NET IIS 註冊工具的 –pa 參數 (ASP.NET IIS 註冊工具 (Aspnet_regiis.exe)),以接收對該容器的存取。嘗試使用指定的金鑰來加密或解密的使用者必須具有必要的權限才能存取金鑰容器。
但在某些情況下,沒有系統管理權限的使用者仍可以建立加密金鑰。當金鑰不存在時,如果應用程式要求組態加密,便可能發生這種情況。請注意,在沒有容器的情況下會建立容器,而且會執行加密作業。
在此情況下,.NET Framework 會建立必要的金鑰,以及與目前使用者之 ACL 相關的容器。這裡可能發生的問題是,擁有系統管理權限的使用者可能會在存取加密金鑰容器時遭拒。系統管理員可以藉由取得上述資料夾中實體檔案的擁有權,重新取得金鑰的存取權。建議讓擁有系統管理權限的使用者,在使用前先行建立所需的金鑰,如此可避免在加密時才建立金鑰。
保護共用裝載環境中組態的安全
在共用裝載環境中,惡意使用者可能會透過直接修改組態檔、經由組態 API 修改,或透過其他管理和組態工具修改組態設定。您可以鎖定組態區段以防止修改應用程式組態。您可以將 location 項目加入 Machine.config 檔,或是加入在組態架構中的層級高於想要限制之組態檔的任何組態檔中,以鎖定組態區段防止修改應用程式組態。location 項目是用來防止子組態檔的設定遭到修改。如需詳細資訊,請參閱 HOW TO:鎖定 ASP.NET 組態設定和 HOW TO:使用位置設定設定特定的目錄。
遠端組態
根據預設會停用遠端組態。當啟用遠端組態時,使用者會在 DCOM 層級經過驗證,並且只有本機系統管理員才可獲得讀取或寫入組態資料的授權。如需詳細資訊,請參閱編輯 ASP.NET 遠端組態檔。
自訂組態提供者
不論目前使用者的安全性語彙基元為何,自訂區段處理常式程式碼都會使用裝載處理序帳戶的認證執行。在 Web 情況中,這個認證會是 Windows 2000 和 Windows XP 中的 <server>\ASPNET 帳戶、Windows Server 2003 中的 NETWORK SERVICE 帳戶,或是明確設定的使用者帳戶。在用戶端情況中,這個認證會是目前執行的處理序識別。
在呼叫自訂組態區段處理常式之前,組態系統會設定使用權限,並且在任何情況下 .NET Framework 都不會信任這個呼叫。這個呼叫會使用應用程式的信任權限執行。ASP.NET 組態系統會信任 %SystemRoot%\Microsoft.NET\Framework\version\CONFIG 目錄,但是不會信任階層架構中位於較低層級的目錄。
自訂組態區段處理常式應該設定程式碼存取安全性 (CAS) 需求屬性以取得使用權限。如需詳細資訊,請參閱 ASP.NET 程式碼存取安全性或程式碼存取安全性的基本概念。
將檔案鎖定儲存在組態檔
只有在多人嘗試儲存組態檔或開啟檔案處理時會鎖定組態檔。惡意使用者可能會嘗試鎖定 Machine.config 檔或根目錄 Web.config 檔,但是需要完全信任才能執行這項動作,而在 ASP.NET 中預設已停用該功能。
使用組態 API 讀取任意檔案
組態 API 的類別無法讀取不屬於應用程式定義域的任何目錄,也無法讀取副檔名不是 .config 的任何檔案。
IIS Metabase 設定套用至 ASP.NET 要求
當 IIS 收到 ASP.NET 應用程式的要求時,不論應用程式的 ASP.NET 組態設定為何,IIS Metabase 設定都會套用至該 ASP.NET 應用程式。這項條件約束會導致使用者無法存取 ASP.NET 應用程式,或是使應用程式的限制安全性設定減少。
例如,如果 IIS Metabase 中的安全性設定是設定為只允許經過驗證的使用者存取站台,而 Web.config 檔中的安全性設定是設定為允許匿名存取站台,則匿名使用者會被拒絕存取站台。若要補救這個問題,就要在 IIS 管理員中將 Web 應用程式設定為允許匿名使用者。
如需保護 IIS 功能的詳細資訊,請參閱 Security in IIS 6.0。
錯誤訊息和事件
下列章節討論如何減輕未預期的錯誤訊息和事件所公開的潛在安全性風險。
例外狀況
若要避免機密資訊公開給不適當的對象,請設定應用程式為不顯示詳細的錯誤訊息,或只在用戶端就是 Web 伺服器本身時才顯示詳細錯誤訊息。如需詳細資訊,請參閱 customErrors 項目 (ASP.NET 設定結構描述)。
事件記錄檔
如果伺服器執行的是 Windows Server 2003,您可以藉由保護事件記錄檔安全性以及設定與事件記錄檔的大小、保留期間和其他功能相關的參數,防止間接的拒絕服務攻擊,以改進應用程式的安全性。如需設定事件記錄檔的詳細資訊,請在「Windows 說明及支援」中搜尋「事件檢視器」。
健康監視
成功和失敗的登入嘗試都會使用 ASP.NET 健康監視功能記錄下來。在預設組態中,這表示失敗的登入嘗試會將使用者名稱和其他診斷資訊記錄在 [應用程式] 事件記錄檔中。請確定限制事件記錄檔的存取以維持這項資訊的私用性。