設定角色的安全性
更新:2007 年 11 月
角色管理能夠讓您使用自己建立的分類 (稱為「角色」) 管理應用程式授權。您可以將使用者指派到角色,根據角色而不是 (或是同時使用) 使用者名稱,控制 Web 應用程式不同部分或功能的存取權。例如,員工應用程式可能有像是「經理」、「員工」或「董事」等等的角色,每個角色指定的權限各有不同。
使用者可以屬於一個以上的角色。例如,如果您的站台是討論論壇,某些使用者可能同時具有「成員」和「主持人」的角色。您可以定義每個角色擁有不同的站台權限,而同時具備兩種角色的使用者就會擁有兩種權限集合。
下列程式碼和組態最佳作法可以改進應用程式的安全性,同樣重要的是使用 Microsoft Windows 和網際網路資訊服務 (IIS) 的最新安全性修補檔案,以及 Microsoft SQL Server、Active Directory 或其他角色資料來源的任何修補檔案,將應用程式伺服器保持在最新的狀態。
如需撰寫安全程式碼以及設定應用程式安全性的最佳作法詳細資訊,請參閱 Michael Howard 和 David LeBlanc 所著的《撰寫安全的程式碼》,以及「Microsoft 典範與實例」提供的指南 (https://www.microsoft.com/taiwan/resources/practices/default.mspx)。
保護角色管理員組態的安全性
預設會停用 ASP.NET 應用程式的角色管理功能,以改進不使用角色管理員之應用程式的安全性。當啟用角色管理員的功能時,預設組態設定會設定為最安全的值。如需角色管理員組態設定和其預設值的詳細資訊,請參閱 roleManager 項目 (ASP.NET 設定結構描述)。
設定組態值的安全性
儲存敏感應用程式資訊至組態檔案時,您應該使用「受保護的組態」將敏感資料加密。資訊 (特別是敏感的資訊) 包含了儲存在 machineKey 組態項目中的加密金鑰,以及儲存在 connectionStrings 組態項目中的資料來源連接字串。如需詳細資訊,請參閱使用受保護的組態加密組態資訊。
保護加密金鑰和雜湊的安全
強烈建議您將 roleManager 項目的 cookieProtection 屬性設為 All,以保護 Cookie 中快取的角色名稱。指定加密演算法的加密金鑰值會儲存在 machineKey 組態項目中。根據所選取的加密演算法,指定隨機產生適當長度的加密金鑰值,以獲得增強的加密法。
在裝載多重應用程式的伺服器上,您應該為每個應用程式定義唯一的加密金鑰。較不安全的替代方案是定義單一加密金鑰,然後搭配金鑰指定 IsolateApps 選項。
主伺服器也可以在電腦組態中,藉由拒絕覆寫權限限制覆寫組態設定的能力。這包括拒絕在應用程式之 Web.config 檔中重新定義加密金鑰的能力。
設定角色資料來源連接的安全性
連接字串
如同在稍早提到的,保護用來存取 SQL Server、Active Directory 或其他資料來源應用程式的連接字串是很重要的。若要保護資料庫伺服器連接的安全性,您應該使用「受保護的組態」加密組態中的連接字串資訊。如需詳細資訊,請參閱使用受保護的組態加密組態資訊。
使用整合式安全性連接 SQL Server
若要連接執行 SQL Server 的電腦,您應該使用「整合式安全性」避免連接字串被洩漏,以及使用者 ID 和密碼被公開的可能性。當您指定使用「整合式安全性」連接到執行 SQL Server 的電腦時,角色管理員功能會還原成處理序的識別。您應該確定執行 ASP.NET 的處理序識別 (例如,應用程式集區),是預設處理序帳戶或限制的使用者帳戶。如需詳細資訊,請參閱 ASP.NET 模擬。
SQL Server 資料庫使用權限
用來儲存角色之使用者資訊的 SQL Server 資料庫,其中包含的資料庫角色和檢視,能夠讓您限制使用者僅能存取必要的能力與可視性。您應該指派最少權限給用來連接 SQL Server 角色資料庫的使用者 ID。如需詳細資訊,請參閱SQL Server 應用程式服務資料庫中的角色和檢視。
SQL Server Express 背景工作處理序識別
SQL Server Express 2005 包含新的作業模式,可讓 SQL Server 啟動背景工作處理序,以連接使用者的識別執行。這項功能稱為「以使用者身分執行」模式。雖然在使用 IIS 的時候這種作業模式適合於桌上型應用程式開發,但啟動背景工作處理序並不適合用於裝載多個未受信任客戶程式碼基底 (Code Base) 的 Web 伺服器。包含應用程式的共用裝載伺服器,在互不信任的情況下,應該明確停用「以使用者身分執行」功能。您可以連接至 SQL Express 執行個體 (例如,osql –E –S .\sqlexpress) 然後發出下列 Transact-SQL 命令,以便關閉這項功能。
EXEC sp_configure 'show advanced option', '1'
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sp_configure 'user instances enabled', 0
GO
RECONFIGURE WITH OVERRIDE
GO
設定授權存放區的安全性
當使用 AuthorizationStoreRoleProvider 時,若要改進資料來源的安全性,您應該將角色資訊存放在 Active Directory 伺服器中,而非檔案架構的授權存放區。這可以避免 Web 伺服器受到攻擊時公開原則存放檔案。
當連接至 Active Directory 伺服器時,角色管理員功能會還原成處理序的識別。您應該確定執行 ASP.NET 的處理序識別 (例如,應用程式集區),是預設處理序帳戶或限制的使用者帳戶。如需詳細資訊,請參閱 ASP.NET 模擬。此外,您應該指派使用權限給 Active Directory 授權存放區中的帳戶,只讓特定「授權管理員」應用程式或是 ASP.NET 應用程式所需範圍才能存取。
您應該使用像是網際網路通訊協定安全性 (IPSec) 的網路加密工具,保護與 Active Directory 伺服器的連接。
設定角色 Cookie 的安全性
您可以將 roleManager 項目的 cacheRolesInCookie 屬性設為 true,以指定要在工作階段 Cookie 快取使用者的該角色名稱,進而改善效能。根據預設,角色名稱是以加密格式儲存,但是您應該將 cookieRequireSSL 屬性設定為 true 以提供角色 Cookie 額外的安全性,並且只有在啟用 SSL 時才快取工作階段 Cookie 中的角色。這可以避免在網路上公開角色 Cookie,並且用以防止對應用程式的重播攻擊。
避免在應用程式之間共用 Cookie
如果 roleManager 項目的 cacheRolesInCookie 屬性是設為 true,而且 cookiePath 屬性是設為包含多個應用程式的路徑,則會將相同的角色 Cookie 傳送到多個應用程式。您可以在每個應用程式的 machineKey 組態項目中指定相同的加密資訊,以便在多個應用程式之間共用角色 Cookie。
若要避免在多個應用程式之間共用角色名稱 Cookie,請在每個應用程式的 machineKey 組態項目中指定不同的加密金鑰,將每個應用程式的 cookiePath 屬性設定為特定應用程式路徑,並且將每個應用程式的 ApplicationName 屬性設定為唯一的值。
保護使用角色的 Web 網頁安全
使用敏感資料,例如登入頁面的應用程式頁面,應該使用標準的 Web 安全性機制進行保護。其中包含使用 Secure Sockets Layer (SSL),並且要求使用者要登入才能執行像是更新使用者資訊,或刪除使用者的敏感作業。
此外,頁面上不應該以明文公開機密功能資料,例如密碼和使用者名稱 (某些情況下)。請確定顯示這類資訊的頁面使用 SSL,並且只能由已驗證的使用者使用。此外,避免將敏感的功能資料儲存在 Cookie 中,或是透過不安全的連接進行傳送。
保護不受拒絕服務攻擊
如果某些用戶端同時呼叫執行更新或大量搜尋作業的方法,可能會降低角色資料來源的回應程度。若要減少曝露在拒絕服務攻擊的危險性,請限制只有系統管理使用者,才能使用執行資料庫更新或搜尋的方法存取 ASP.NET 網頁;而在一般使用時只公開提供角色成員資格驗證的 ASP.NET 網頁。
錯誤訊息和事件
例外狀況
若要避免機密資訊公開給不適當的對象,請設定應用程式為不顯示詳細的錯誤訊息,或只在用戶端就是 Web 伺服器本身時才顯示詳細錯誤訊息。如需詳細資訊,請參閱 customErrors 項目 (ASP.NET 設定結構描述)。
事件記錄檔
如果您的伺服器執行的是 Windows Server 2003,可以藉由設定事件記錄檔安全性以及設定與事件記錄檔的大小和保留期間等相關的參數,防止間接的拒絕服務攻擊,以改進應用程式的安全性。
追蹤資訊
Web 伺服器可以設定為,當發生某些關於角色管理員功能的動作時進行追蹤,然後將追蹤資訊存放在記錄檔中。因為在追蹤記錄檔中可以存放像是使用者名稱和角色名稱的敏感資訊,所以您應該限制只有系統管理員能夠啟用追蹤、設定追蹤記錄檔的位置以及存取追蹤記錄檔的能力。
自訂角色提供者
當建立自訂角色提供者時,請確定遵循安全性最佳作法,以避免在使用資料庫時遭受像是 SQL Injection 的攻擊。當使用自訂角色提供者時,請確定該提供者已通過安全性最佳作法的審核。
使用區分文化特性的字元
當使用 SQL Server 角色提供者或自訂角色提供者時,可能會將資料來源設為以區分文化特性的格式來儲存角色資料。然而,ASP.NET 會一直將授權設定項目中指定的角色名稱和資料來源中的角色名稱評估為不因文化特性而異,因此,未經授權的使用者可能會獲得不必要的使用權限,因為其未經授權的角色名稱被視為不因文化特性而異時,它就等同於授權的角色名稱。為了避免使用者取得未經授權的存取,請確認角色名稱在評估為不因文化特性而異時是唯一的名稱。