在 Intranet 環(huán)境中保護 .NET Web 應用程序
2024-07-10 13:00:58
供稿:網(wǎng)友
microsoft corporation
內(nèi)容簡介
基于 intranet web 應用程序的安全性并不是不重要,因為它存在于許多控制網(wǎng)絡中,并且對一個限制集合中的用戶是可以訪問的。不同個體和部門可能需要對應用程序提供的功能和數(shù)據(jù)有不同的訪問等級,所以在傳輸過程中仍然必須保護機密數(shù)據(jù)的安全性。為了使問題復雜化,應用程序的安全性結(jié)構(gòu)必須補償任何安全性相關的問題,這些問題源于存在的基礎和要配置應用程序的 intranet 的操作特點。
通過關注某些常用分布式應用程序結(jié)構(gòu)的要求,本章介紹了基于 intranet web 應用程序的身份驗證、授權(quán)、安全通信的推薦解決方法。
目標
使用本章的目的:
• 保護 intranet .net 應用程序
• 理解安全問題和下面方案中推薦的與使用 asp.net web 應用程序和 sql server 2000通信相關的解決方案:
• 直接通信
• 使用 enterprise services 作為中介
• 使用 web 服務作為中介
• 使用 .net remoting 作為中介
• 在基于 intranet 分布式 web 應用程序中決定實現(xiàn)身份驗證、授權(quán)、安全通信的最好方法。
適用于:
本章適用于下面的產(chǎn)品和技術:
• microsoft windows_ xp 或者 windows 2000 server (帶有 service pack 3) 和更高版本操作系統(tǒng)
• microsoft internet information services (iis) 5.0 和更高版本操作系統(tǒng)
• microsoft active directory_ 目錄服務
• .net framework 1.0 版本(帶有 service pack 2) 和更高版本
• sql server 2000 (帶有 service pack 2) 和更高版本
如何使用本章
為了從本章中獲得最大的益處:
• 您必須有開發(fā)和配置 asp.net、sql server、iis 的經(jīng)驗。
• 您必須有配置 windows 安全性和 active directory 的經(jīng)驗。
• 您必須有配置 enterprise services (com+) 應用程序的經(jīng)驗。
• 請參閱本指南中的“構(gòu)建安全 asp.net 應用程序介紹”。這部分定義了分布式 web 應用程序身份驗證、授權(quán)、安全通信的重要性。
• 請參閱本指南中的“asp.net 應用程序安全性模型”。這部分概括闡述在創(chuàng)建分布式 asp.net web 應用程序中使用的結(jié)構(gòu)和技術,并強調(diào)身份驗證、授權(quán)、安全通信適合本結(jié)構(gòu)中的哪些部分。
• 結(jié)合下面的章節(jié)使用本章,它們闡明了本章中討論的技術:
• “how to create a custom account to run asp.net”。
• “how to implement kerberos delegation for windows 2000”。
• “how to create a dpapi library”。
• “how to use dpapi (machine store) from asp.net”。
• “how to use dpapi (user store) from asp.net with enterprise services”。
• “how to use role-based security with enterprise services”。
• “how to set up ssl on a web server”。
• “how to use ipsec to provide secure communication between two servers”。
• “how to use ssl to secure communication with sql server 2000”。
本頁內(nèi)容
預備知識
asp.net 到 sql server
asp.net 到 enterprise services 到 sql server
asp.net 到 web services 到 sql server
asp.net 到 remoting 到 sql server
將原調(diào)用方傳遞到數(shù)據(jù)庫
小結(jié)
預備知識
對 intranet 應用程序的訪問被限制到一組有限的授權(quán)用戶(例如,屬于某個域的雇員)。雖然 intranet 設置限制了應用程序的公開,但是當您制定身份驗證、授權(quán)和安全通信策略時,可能仍要面臨一些難題。例如,您可能包含非信任域,因此很難將調(diào)用方的安全性上下文和標識傳遞到系統(tǒng)內(nèi)的后端資源。另外,您的運行環(huán)境可能是具有混合瀏覽器類型的異類環(huán)境。因此,更加不便使用通用身份驗證機制。
如果同類 intranet 中的所有計算機均運行 microsoft windows 2000 或更高版本的操作系統(tǒng),并且在域中信任用戶使用委派,則可以選擇將原調(diào)用方的安全性上下文委派到后端。
您還必須考慮安全通信問題。盡管您的應用程序運行在 intranet 環(huán)境中,也不能認為在網(wǎng)絡中傳送的數(shù)據(jù)是安全的。除了需要保護應用程序服務器和數(shù)據(jù)庫之間傳送的數(shù)據(jù)外,可能還需要保護瀏覽器和 web 服務器之間傳送的數(shù)據(jù)。
本章使用以下常見的 intranet 方案來闡釋主要的身份驗證、授權(quán)和安全通信技術:
• asp.net 到 sql server
• asp.net 到 enterprise services 到 sql server
• asp.net 到 web services到sql server
• asp.net到remoting到sql server
此外,本章還介紹了一個 windows 2000 委派方案(“將原調(diào)用方傳遞到數(shù)據(jù)庫”)。在此方案中,使用中間 web 服務器和應用程序服務器,在操作系統(tǒng)級別將原調(diào)用方的安全性上下文和標識從瀏覽器傳遞到數(shù)據(jù)庫。
注本章中描述的幾個方案或者替換用于運行 asp.net 應用程序的默認 aspnet 帳戶,或者更改其密碼以允許在遠程計算機上創(chuàng)建重復的帳戶。這些方案要求更新 machine.config 中的 <processmodel> 元素。<processmodel> 憑據(jù)不應該以明文形式存儲在 machine.config 中。而應該使用 aspnet_setreg.exe 工具以加密憑據(jù)的形式存儲在注冊表中。有關詳細信息請參見本指南中的“asp.net安全性”和 microsoft 知識庫文章 q329290 “howto: use the asp.net utility to encrypt credentials and session state connection strings”(如何做:使用 asp.net 工具加密憑證和會話狀態(tài)鏈接字符串)。
asp.net 到 sql server
在此方案中,人力資源數(shù)據(jù)庫在同類 intranet 中安全地提供每個用戶的數(shù)據(jù)。應用程序使用受信任的子系統(tǒng)模型并代表原調(diào)用方執(zhí)行調(diào)用。應用程序使用集成 windows 身份驗證來驗證調(diào)用方的身份,并使用 asp.net 進程標識來調(diào)用數(shù)據(jù)庫。由于數(shù)據(jù)本身所具有的機密性,因此,在 web 服務器和客戶端之間使用了 ssl。
圖 1 顯示此應用程序方案的基本模型。
圖 1. asp.net 到 sql server
特點
本方案具有以下特點:
• 客戶端上安裝了 internet explorer。
• 用戶帳戶位于 active directory 中。
• 應用程序提供每個用戶的機密數(shù)據(jù)。
• 只有經(jīng)過身份驗證的客戶端能夠訪問應用程序。
• 數(shù)據(jù)庫委派該應用程序?qū)τ脩暨M行正確的身份驗證(即,應用程序代表用戶對數(shù)據(jù)庫進行調(diào)用)。
• microsoft sql server 使用單個數(shù)據(jù)庫用戶角色進行授權(quán)。
保護方案
在此方案中,web 服務器驗證調(diào)用方的身份,并通過使用調(diào)用方的標識限制對本地資源的訪問。要限制原調(diào)用方對資源的訪問,您不必在 web 應用程序中進行模擬。數(shù)據(jù)庫驗證 asp.net 默認進程標識(它是權(quán)限最少的帳戶)的身份(即數(shù)據(jù)庫信任 asp.net 應用程序)。
表 1:安全措施
類別 詳細信息
身份驗證
通過在 iis 中使用集成 windows 身份驗證,在 web 服務器上提供增強身份驗證來驗證原調(diào)用方的身份。
在 asp.net 內(nèi)使用 windows 身份驗證(不模擬)。
通過將 sql server 配置為使用 windows 身份驗證,確保數(shù)據(jù)庫連接的安全。
數(shù)據(jù)庫信任 asp.net 輔助進程以進行調(diào)用。可以在數(shù)據(jù)庫中驗證 asp.net 進程標識的身份。
授權(quán)
使用綁定到原調(diào)用方的 acl 在 web 服務器上配置資源。為了簡化管理,將用戶添加到 windows 組中并在 acl 中使用組。
web 應用程序?qū)υ{(diào)用方執(zhí)行 .net 角色檢查,以限制對頁面的訪問。
安全通信
保護在 web 服務器和數(shù)據(jù)庫之間傳送的機密數(shù)據(jù)
保護在原調(diào)用方和 web 應用程序之間傳送的機密數(shù)據(jù)
結(jié)果
圖 2 顯示了此方案的建議安全配置。
圖 2. asp.net 到 sql server intranet 方案的建議安全配置
安全配置步驟
在開始之前,您需要查看以下內(nèi)容:
• 創(chuàng)建自定義 asp.net 帳戶(請參見本指南中的“how to create a custom account to run asp.net”)
• 創(chuàng)建一個權(quán)限最少的數(shù)據(jù)庫帳戶(請參見本指南中的“數(shù)據(jù)訪問安全性”)
• 在 web 服務器上配置 ssl(請參見本指南中的“how to set up ssl on a web server”)
• 配置 ipsec(請參見本指南中的“how to use ipsec to provide secure communication between two servers”)
配置 iis
步驟 更多信息
禁用對 web 應用程序的虛擬根目錄的匿名訪問
啟用集成的 windows 身份驗證
要使用 iis 身份驗證設置,請使用 iis mmc 管理單元。右擊應用程序的虛擬目錄,然后單擊“屬性”。
單擊“目錄安全性”選項卡,然后單擊“匿名訪問和驗證控件”組中的“編輯”。
配置 asp.net
步驟 更多信息
將 aspnet 密碼更改為一個已知的強密碼值
aspnet 是權(quán)限最少的本地帳戶,默認情況下用來運行 asp.net web 應用程序。
通過使用“本地用戶和組”將 aspnet 帳戶的密碼設置為一個已知值。
編輯位于 %windir%/microsoft.net/framework/ v1.0.3705/config 中的 machine.config 并重新配置 <processmodel> 元素的 username 和 password 屬性
默認
<!-- username="machine" password="autogenerate" -->
成為
<!--
username="registry:hklm/software/yoursecureapp/
processmodel/aspnet_setreg,username" password="registry:hklm/software/yoursecureapp/
processmodel/aspnet_setreg,password" -->
注意,使用 aspnet_setreg.exe 工具以在加密密碼的形式存儲在注冊表中。
將 asp.net web 應用程序配置為使用 windows 身份驗證
編輯應用程序的虛擬根目錄下的 web.config
將 <authentication> 元素設置為:
確保模擬處于關閉狀態(tài)
默認情況下模擬處于關閉狀態(tài);不過,請執(zhí)行如下操作,再次檢查以確保它在 web.config 中是關閉的:
刪除 <identity> 元素也能達到同樣的效果。
配置 sql server
步驟 更多信息
在 sql server 計算機上創(chuàng)建一個與 asp.net 進程帳戶 (aspnet) 匹配的 windows 帳戶
用戶名和密碼必須與 aspnet 帳戶匹配。
給予該帳戶以下權(quán)限:
- 從網(wǎng)絡訪問此計算機
- 拒絕本地登錄
- 以批處理作業(yè)登錄
配置 sql server 以便進行 windows 身份驗證
為本地 aspnet 帳戶創(chuàng)建一個 sql server 登錄
這將授予對 sql server 的訪問權(quán)限
創(chuàng)建一個新數(shù)據(jù)庫用戶,并將登錄名映射到數(shù)據(jù)庫用戶
這將授予對指定數(shù)據(jù)庫的訪問權(quán)限
創(chuàng)建一個新的用戶定義的數(shù)據(jù)庫角色,并將數(shù)據(jù)庫用戶添加到該角色
建立該數(shù)據(jù)庫角色的數(shù)據(jù)庫權(quán)限
授予最少的權(quán)限
有關詳細信息,請參見本指南中的“數(shù)據(jù)訪問安全性”。
配置安全通信
步驟 更多信息
配置 web 站點的 ssl
請參見本指南中的“how to set up ssl on a web server”。
配置 web 服務器和數(shù)據(jù)庫服務器之間的 ipsec
請參見本指南中的“how to use ipsec to provide secure communication between two servers”。
分析
• 在此方案中,由于所有用戶都使用 windows 帳戶并且使用的是 microsoft internet explorer,所以在 iis 中最好使用集成 windows 身份驗證。集成 windows 身份驗證的優(yōu)點是從不通過網(wǎng)絡傳送用戶的密碼。此外,由于 windows 使用當前交互式用戶的登錄會話,所以對于用戶來說登錄是透明的。
• asp.net 作為權(quán)限最少的帳戶運行,所以,一旦遭到攻擊,潛在危害被大大降低。
• 要執(zhí)行 .net 角色檢查或在 windows acl 中針對原調(diào)用方保證資源的安全,您不必在 asp.net 中進行模擬。為了對原調(diào)用方執(zhí)行 .net 角色檢查,按如下所示從 http 上下文中檢索代表原調(diào)用方的 windowsprincipal 對象:
windowsprincipal wp = (httpcontext.current.user as windowsprincipal);
if ( wp.isinrole("manager") )
{
// user is authorized to perform manager-specific functionality
}
asp.net fileauthorizationmodule 針對原調(diào)用方在 acl 中檢查在 iis 中映射到 aspnet_isapi.dll 的 asp.net 文件類型。對于靜態(tài)文件類型(例如 .jpg、.gif 和 .htm 文件),iis 充當關守,它根據(jù)文件的相關 ntfs 權(quán)限,使用原調(diào)用方的標識執(zhí)行訪問檢查。
• 對 sql server 使用 windows 身份驗證意味著,不必將憑據(jù)存儲在文件中并通過網(wǎng)絡將憑據(jù)傳遞到數(shù)據(jù)庫服務器。
• 在數(shù)據(jù)庫服務器上使用重復的 windows 帳戶(與 asp.net 本地帳戶匹配的帳戶)會導致增加管理負擔。如果一臺計算機上的密碼有改動,則必須在其他計算機上同步并更新它。在某些方案中,您可能能夠使用權(quán)限最少的域帳戶進行更簡單的管理。
• 當設置防火墻時(此時 windows 身份驗證所需的端口可能沒有打開),重復的本地帳戶方法同樣有效。在此方案中可能無法使用 windows 身份驗證和域帳戶。
• 您需要確保 windows 組的粒度與您的安全要求一樣。由于基于 .net 角色的安全性以 windows 組成員身份為基礎,所以此解決方案依賴于以正確的粒度設置 windows 組,以便與訪問應用程序的用戶類別(共享相同的安全權(quán)限)匹配。這里用來管理角色的 windows 組可以是此計算機的本地組或域組。
• sql server 數(shù)據(jù)庫用戶角色優(yōu)先于 sql server 應用程序角色,這樣可以避免與使用 sql 應用程序角色有關的密碼管理和連接池問題。
應用程序通過用角色名和密碼調(diào)用內(nèi)置的存儲過程,來激活 sql 應用程序角色。因此,必須安全地存儲密碼。當使用 sql 應用程序角色時,還必須禁用數(shù)據(jù)庫連接池,因為它會嚴重影響應用程序的可伸縮性。
有關 sql server 數(shù)據(jù)庫用戶角色和 sql server 應用程序角色的詳細信息,請參見本指南中的“數(shù)據(jù)訪問安全性”。
• 將數(shù)據(jù)庫用戶添加到數(shù)據(jù)庫用戶角色中,并且為角色指定了權(quán)限,因此,當數(shù)據(jù)庫帳戶更改時,您不必更改所有數(shù)據(jù)庫對象的權(quán)限。
問與答
• 為什么我不能啟用 web 應用程序模擬,以便使用配置的 acl 針對原調(diào)用方來保護 web 應用程序所訪問的資源?
如果啟用模擬,則模擬的安全性上下文不具有網(wǎng)絡憑據(jù)(假定未啟用委派并且您使用的是集成 windows 身份驗證)。因此,對 sql server 的遠程調(diào)用將使用 null 會話,而這將會導致調(diào)用失敗。如果禁用模擬,則遠程請求使用 asp.net 進程標識。
上述方案使用 asp.net fileauthorizationmodule,它使用 windows acl 針對原調(diào)用方標識執(zhí)行授權(quán),并且不要求進行模擬。
如果您使用基本身份驗證而不是集成 windows 身份驗證 (ntlm),并且確實啟用了模擬,則每個數(shù)據(jù)庫調(diào)用都將使用原調(diào)用方的安全性上下文。每個用戶帳戶(或用戶所屬的 windows 組)都要求使用 sql server 登錄。需要限制 windows 組(或原調(diào)用方)訪問數(shù)據(jù)庫對象的權(quán)限以確保安全性。
• 數(shù)據(jù)庫不知道誰是原始調(diào)用方。我如何能創(chuàng)建一條審核記錄?
審核 web 應用程序中的最終用戶活動,或者將用戶標識作為數(shù)據(jù)訪問調(diào)用的參數(shù)明確地進行傳遞。
相關方案
非 internet explorer 瀏覽器
對 iis 執(zhí)行集成 windows 身份驗證需要使用 internet explorer。在混合瀏覽器環(huán)境中,您的典型選項包括:
• 基本身份驗證和 ssl。.大多數(shù)瀏覽器都支持基本身份驗證。由于用戶的憑據(jù)是通過網(wǎng)絡傳遞的,所以必須使用 ssl 來保證此方案的安全。
• 客戶端證書。.可以將各個客戶端證書映射到唯一的 windows 帳戶,或者使用單個 windows 帳戶來代表所有客戶端。t使用客戶端證書還要求使用 ssl。
• 表單身份驗證。表單身份驗證可以根據(jù)自定義數(shù)據(jù)存儲(如數(shù)據(jù)庫)或 active directory 來驗證憑據(jù)。
如果根據(jù) active directory 進行身份驗證,請確保僅檢索與應用程序有關的必要的組。正如不應該使用 select * 子句對數(shù)據(jù)庫執(zhí)行查詢一樣,不應盲目地從 active directory 中檢索所有的組。
如果根據(jù)數(shù)據(jù)庫進行身份驗證,您需要仔細分析 sql 命令中使用的輸入值,以防止 sql 注入攻擊,并且應該在數(shù)據(jù)庫中存儲密碼哈希值(帶有 salt),而不是存儲明文密碼或加密密碼。
有關使用 sql server 作為憑據(jù)存儲和將密碼存儲在數(shù)據(jù)庫中的詳細信息,請參見本指南中的“數(shù)據(jù)訪問安全性”。
注意,在所有情況中,如果您沒有使用集成 windows 身份驗證(其中,由平臺為您管理憑據(jù)),則最后將使用 ssl。不過,此優(yōu)點僅限于身份驗證過程。如果您通過網(wǎng)絡傳遞安全機密數(shù)據(jù),則仍須使用 ipsec 或 ssl。
對數(shù)據(jù)庫的 sql 身份驗證
在有些方案中,您可能必須使數(shù)據(jù)訪問安全性而不是首選的 windows 身份驗證。例如,在 web 應用程序和數(shù)據(jù)庫之間可能設置了防火墻,或者由于安全原因,web 服務器可能不屬于您所在的域。這也會妨礙 windows 身份驗證。這種情況下,您可以在數(shù)據(jù)庫和 web 服務器之間使用 sql 身份驗證。為保證此方案的安全,您應該:
• 使用數(shù)據(jù)保護 api (dpapi) 來保護包含用戶名和密碼的數(shù)據(jù)庫連接字符串。有關詳細信息,請參閱以下內(nèi)容:
• 請參見本指南中的“數(shù)據(jù)訪問安全性”中的“安全存儲數(shù)據(jù)庫連接字符串”。
• "how to use dpapi (machine store) from asp.net"
• "how to use dpapi (user store) from asp.net with enterprise services"
• "how to create a dpapi library"
• 在 web 服務器和數(shù)據(jù)庫服務器之間,使用 ipsec 或 ssl 來保護通過網(wǎng)絡傳遞的明文憑據(jù)。
將原調(diào)用方傳遞到數(shù)據(jù)庫
在此方案中,使用原調(diào)用方的安全性上下文從 web 應用程序調(diào)用數(shù)據(jù)庫。使用此方法時,一定要注意以下幾點:
• 如果選擇此方法,則需要使用 kerberos 身份驗證(將帳戶配置為使用委派)或基本身份驗證。
本章后面的“將原調(diào)用方傳遞到數(shù)據(jù)庫”部分討論了委派方案。
• 還必須在 asp.net 中啟用模擬。這意味著使用原調(diào)用方的安全性上下文執(zhí)行本地系統(tǒng)資源訪問,因此需要正確地配置本地資源(例如注冊表和事件日志)的 acl。
• 由于原調(diào)用方無法共享連接,因此數(shù)據(jù)庫連接池受到限制。每個連接都與調(diào)用方的安全性上下文關聯(lián)。
• 另一種傳遞用戶安全性上下文的方法是在應用程序級別傳遞原調(diào)用方的標識(例如,通過使用方法和存儲過程參數(shù))。
asp.net 到 enterprise services 到 sql server
在此方案中,asp.net 頁面調(diào)用 enterprise services 應用程序中駐留的業(yè)務組件,而 enterprise services 應用程序又連接到數(shù)據(jù)庫上。例如,請看一個內(nèi)部定單系統(tǒng),它通過 intranet 進行交易并允許內(nèi)部部門下定單。圖 3 中顯示了此方案。
圖 3. asp.net會在 enterprise services 中調(diào)用一個組件,該組件將調(diào)用該數(shù)據(jù)庫
特點
本方案具有以下特點:
• 用戶安裝了 internet explorer。
• 在 web 服務器上部署了組件。
• 應用程序處理機密數(shù)據(jù),在傳輸過程中必須保護這些數(shù)據(jù)的安全。
• 業(yè)務組件使用 windows 身份驗證連接到 sql server。
• 基于調(diào)用方的標識來限制這些組件中的業(yè)務功能。
• 將服務組件配置為服務器應用程序(進程外)。
• 件使用服務器應用程序的進程標識連接到數(shù)據(jù)庫。
• 在 asp.net 中啟用模擬(確保基于 enterprise services 角色的安全性)。
保護方案
在此方案中,web 服務器驗證原調(diào)用方的身份,并將調(diào)用方的安全性上下文傳遞到服務組件。服務組件基于原調(diào)用方的標識授予業(yè)務功能的訪問權(quán)限。數(shù)據(jù)庫根據(jù) enterprise service 應用程序的進程標識進行身份驗證(即數(shù)據(jù)庫信任 enterprise services 應用程序中的服務組件)。當服務組件調(diào)用數(shù)據(jù)庫時,它在應用程序級別傳遞用戶的標識(通過使用受信任的查詢參數(shù))。
表 2:安全措施
類別 詳細信息
身份驗證
使用集成 windows 身份驗證在 web 服務器上提供增強身份驗證。
將原調(diào)用方的安全性上下文傳遞到服務組件以支持 enterprise services (com+) 角色檢查。
使用 windows 身份驗證保護數(shù)據(jù)庫連接的安全。
數(shù)據(jù)庫信任服務組件的標識以調(diào)用數(shù)據(jù)庫。數(shù)據(jù)庫驗證 enterprise services 應用程序進程標識的身份。
授權(quán)
使用 enterprise services (com+) 角色授予業(yè)務邏輯的訪問權(quán)限。
安全通信
使用 ssl 保護用戶和 web 應用程序之間傳送的機密數(shù)據(jù)。
使用 ipsec 保護在 web 服務器和數(shù)據(jù)庫之間傳送的機密數(shù)據(jù)。
結(jié)果
圖 4 顯示了此方案的建議安全配置。
圖 4. asp.net 到本地enterprise services 到 sql server 的 intranet 方案的建議安全配置
安全配置步驟
在開始之前,您需要查看以下內(nèi)容:
• 創(chuàng)建一個權(quán)限最少的數(shù)據(jù)庫帳戶(請參見本指南中的“數(shù)據(jù)訪問安全性”)
• 在 web 服務器上配置 ssl(請參見本指南中的“how to set up ssl on a web server”)
• configuring ipsec (see the module, "how to use ipsec to provide secure communication between two servers")
• 配置 ipsec(請參見本指南中的“how to: use role-based security with enterprise services”)
配置 iis
步驟 更多信息
禁用對 web 應用程序的虛擬根目錄的匿名訪問
啟用集成的 windows 身份驗證
配置 asp.net
步驟 更多信息
將 asp.net web 應用程序配置為使用 windows 身份驗證
編輯應用程序的虛擬根目錄下的 web.config
將 <authentication> 元素設置為:
配置 asp.net web 應用程序的模擬
編輯 web 應用程序的虛擬目錄下的 web.config
將 <identity> 元素設置為:
配置 asp.net dcom 安全性,確保 enterprise services 調(diào)用支持調(diào)用方模擬
編輯 machine.config 并找到 <processmodel> 元素。確認將 comimpersonationlevel 屬性設置為 impersonate (默認設置)
< comimpersonationlevel="impersonate">
配置 enterprise services
步驟 更多信息
創(chuàng)建一個用于運行 enterprise services 的自定義帳戶
注 如果使用本地帳戶,則還必須在 sql server 計算機上創(chuàng)建一個重復的帳戶。
將 enterprise services 應用程序配置為服務器應用程序
這可以通過使用“組件服務”工具,或通過位于服務組件程序集中的以下 .net 屬性進行配置。
[assembly: applicationactivation(activationoption.server)]
配置 enterprise services (com+) 角色
使用“組件服務”工具或腳本將 windows 用戶和/或組添加到角色中。
可以使用服務組件程序集中的 .net 屬性來定義角色。
將 enterprise services 配置為以自定義帳戶運行
必須使用“組件服務”工具或腳本進行配置。不能使用服務組件程序集中的 .net 屬性。
配置 sql server
步驟 更多信息
在 sql server 計算機上創(chuàng)建一個與 enterprise services 進程帳戶匹配的 windows 帳戶
用戶名和密碼必須匹配自定義 enterprise services 帳戶。
給予該帳戶以下權(quán)限:
- 從網(wǎng)絡訪問此計算機
- 拒絕本地登錄
- 以批處理作業(yè)登錄
配置 sql server 以便進行 windows 身份驗證
為 enterprise services 帳戶創(chuàng)建一個 sql server 登錄
這將授予對 sql server 的訪問權(quán)限。
創(chuàng)建一個新數(shù)據(jù)庫用戶,并將登錄名映射到數(shù)據(jù)庫用戶
這將授予對特定數(shù)據(jù)庫的訪問權(quán)限。
創(chuàng)建一個新的數(shù)據(jù)庫用戶角色,并將數(shù)據(jù)庫用戶添加給該角色
建立數(shù)據(jù)庫用戶角色的數(shù)據(jù)庫權(quán)限
授予最少的權(quán)限
有關詳細信息,請參見本指南中的“數(shù)據(jù)訪問安全性”。
配置安全通信
步驟 更多信息
配置 web 站點的 ssl
請參見本指南中的“how to set up ssl on a web server”。
配置 web 服務器和數(shù)據(jù)庫服務器之間的 ipsec
請參見本指南中的“how to: use ipsec to provide secure communication between two servers”。
分析
• asp.net 和 enterprise services 作為權(quán)限最少的帳戶運行,所以,一旦遭到攻擊,潛在危害被大大降低。當任何一方的進程標識遭到攻擊時,由于帳戶僅具有有限的權(quán)限,因此縮小了危害的范圍。另外,在 asp.net 中,如果注入了惡意腳本,也可以限制潛在的危害。
• 要將原調(diào)用方的安全性上下文傳遞到 enterprise services 組件(以支持基于 enterprise services (com+) 角色的授權(quán)),必須配置 asp.net 應用程序以支持模擬。如果不進行模擬,則對進程標識(即 asp.net 輔助進程)進行角色檢查。模擬影響被授予資源訪問權(quán)限的對象。
• 在未進行模擬時,針對 asp.net 進程標識進行系統(tǒng)資源檢查。在進行模擬時,針對原調(diào)用方進行系統(tǒng)資源檢查。有關從 asp.net 訪問系統(tǒng)資源的詳細信息,請參見本指南中的“asp.net安全性”。
• 通過使用 enterprise services (com+) 角色,將訪問檢查推到中間層(業(yè)務邏輯所在的位置)進行。在這種情況下,在入口處檢查調(diào)用方,將其映射到角色,以及基于角色調(diào)用業(yè)務邏輯。這可避免不必要的后端調(diào)用。enterprise services (com+) 角色的另一優(yōu)點是:可以在部署時使用組件服務管理器創(chuàng)建和管理角色。
• 對 sql 的 windows 身份驗證意味著,可以避免在文件中存儲憑據(jù)并通過網(wǎng)絡進行傳送。
• 當設置了防火墻時(此時 windows 身份驗證所需的端口可能沒有打開),仍然可以使用本地帳戶運行 enterprise services 應用程序,以及在數(shù)據(jù)庫服務器上使用重復的帳戶。在此方案中可能無法使用 windows 身份驗證和域帳戶。
缺陷
• 在數(shù)據(jù)庫服務器上使用重復的 windows 帳戶(與 enterprise services 進程帳戶匹配的帳戶)會導致增大管理負擔。密碼應當定期手動更新并同步。
• 由于基于 .net 角色的安全性以 windows 組成員身份為基礎,此解決方案依賴于以正確的粒度設置 windows 組,以便與訪問應用程序的用戶類別(共享相同的安全權(quán)限)匹配。
asp.net 到 web services 到 sql server
在此方案中,運行 asp.net 頁的 web 服務器連接到遠程服務器上的 web 服務。該服務器又連接到遠程數(shù)據(jù)庫服務器。例如,請看一個提供用戶特定機密數(shù)據(jù)的人力資源 web 應用程序。此應用程序依賴 web 服務進行數(shù)據(jù)檢索。圖 5 顯示了此應用程序方案的基本模型。
圖 5. asp.net到遠程 web 服務到 sql server
web 服務公開一個允許個別雇員檢索他或她的個人詳細信息的方法。必須使用 web 應用程序只給通過身份驗證的個人提供詳細信息。 web 服務還提供了一個支持任何雇員詳細信息檢索的方法。只有人力資源或工資部門的成員可以使用此功能。在此方案中,將雇員分為三個 windows 組:
• hrdept(人力資源部門的成員) 該組的成員可以檢索有關任何雇員的詳細信息。
• payrolldept(工資部門的成員) 該組的成員可以檢索有關任何雇員的詳細信息。
• employees (所有雇員) 該組的成員只能檢索他們自己的詳細信息。
由于數(shù)據(jù)本身所具有的保密性,應保證所有節(jié)點之間通信的安全。
特點
• 用戶安裝了 internet explorer 5.x 或更高版本。
• 所有計算機運行的都是 windows 2000 或更高版本。
• 用戶帳戶位于單一目錄林的 active directory 中。
• 應用程序?qū)⒃{(diào)用方的安全性上下文一直傳遞到數(shù)據(jù)庫。
• 所有層都使用 windows 身份驗證。
• 將域用戶帳戶配置為使用委派。
• 數(shù)據(jù)庫不支持委派。
保護方案
在此方案中,駐留 asp.net web 應用程序的 web 服務器驗證原調(diào)用方的標識,并將它們的安全性上下文傳遞到駐留 web 服務的遠程服務器。這樣就可以對 web 方法應用授權(quán)檢查,以允許或拒絕對原調(diào)用方的訪問。數(shù)據(jù)庫驗證 web 服務進程標識的身份(數(shù)據(jù)庫信任 web 服務)。web 服務反過來調(diào)用數(shù)據(jù)庫,并使用存儲過程參數(shù)在應用程序級別傳遞用戶的標識。
表 3:安全措施
類別 詳細信息
身份驗證
web 應用程序在 iis 中使用集成 windows 身份驗證來驗證用戶的身份。
web 服務在 iis 中使用集成 windows 身份驗證。它對 web 應用程序所委派的原調(diào)用方安全性上下文進行身份驗證。
可以使用 kerberos 身份驗證協(xié)議,通過委派將原調(diào)用方安全性上下文從 web 應用程序傳遞到 web 服務。
可以使用 windows 身份驗證,通過 asp.net 進程帳戶連接到數(shù)據(jù)庫。
授權(quán)
web 應用程序?qū)υ{(diào)用方執(zhí)行角色檢查,以限制對頁面的訪問。
通過使用基于原調(diào)用方 windows 組成員身份的 .net 角色,控制對 web 服務方法的訪問。
安全通信
可通過使用 ssl 來保護在原調(diào)用方和 web 應用程序及 web 服務之間傳送的機密數(shù)據(jù)。
可通過使用 ipsec 來保護在 web 服務和數(shù)據(jù)庫之間傳送的機密數(shù)據(jù)。
結(jié)果
圖 6 顯示了此方案的建議安全配置。
圖 6. asp.net 到 web 服務到 sql server 的 intranet 方案的建議安全配置
安全配置步驟
在開始之前,您需要查看以下內(nèi)容:
• 在 web 服務器上配置 ssl(請參見本指南中的“how to set up ssl on a web server”)
• 配置 ipsec (請參見本指南中的“how to use ipsec to provide secure communication between two servers”)
配置 web 服務器(它駐留 web 應用程序)
配置 iis
步驟
更多信息
禁用對 web 應用程序的虛擬根目錄的匿名訪問
對 web 應用程序的虛擬根目錄啟用 windows 集成身份驗證
配置 asp.net
步驟
更多信息
將 asp.net web 應用程序配置為使用 windows 身份驗證
編輯 web 應用程序的虛擬目錄下的 web.config
將 <authentication> 元素設置為:
配置 asp.net web 應用程序的模擬
編輯 web 應用程序的虛擬目錄下的 web.config
將 <identity> 元素設置為:
配置應用程序服務器(它駐留 web 服務)
配置 iis
步驟
更多信息
禁用對 web 服務的虛擬根目錄的匿名訪問
對 web 服務的虛擬根目錄啟用 windows 集成身份驗證
配置 asp.net
步驟
更多信息
將 aspnet 密碼更改為一個已知值
aspnet 是權(quán)限最少的本地帳戶,默認情況下用來運行 asp.net web 應用程序。
通過使用本地用戶和組將 aspnet 帳戶的密碼改為一個已知值。
編輯位于 %windir%/microsoft.net/framework/ v1.0.3705/config 中的 machine.config
并重新配置 <processmodel> 元素的 username 和 password 屬性:默認值
<!-- username="machine" password="autogenerate" -->
<!--
username="registry:hklm/software/yoursecureapp/
processmodel/aspnet_setreg,username" password="registry:hklm/software/yoursecureapp/
processmodel/aspnet_setreg,password" -->
將 asp.net web 服務配置為使用 windows 身份驗證
編輯 web 服務的虛擬目錄下的 web.config
將 <authentication> 元素設置為:
確保模擬處于關閉狀態(tài)
默認情況下模擬處于關閉狀態(tài);不過,請執(zhí)行如下操作,再次檢查以確保它在 web.config 中是關閉的:
注意,由于默認情況下禁用模擬,因此通過刪除 <identity> 元素可以達到同樣的效果。
配置 sql server
步驟 更多信息
計算機上創(chuàng)建一個 windows 帳戶,以便匹配用于運行 web 服務的 asp.net 進程帳戶
用戶名和密碼必須匹配自定義 asp.net 帳戶。
給予該帳戶以下權(quán)限:
- 從網(wǎng)絡訪問此計算機
- 拒絕本地登錄
- 以批處理作業(yè)登錄
配置 sql server 以便進行 windows 身份驗證
為自定義 asp.net 帳戶創(chuàng)建一個 sql server 登錄
這將授予對 sql server 的訪問權(quán)限。
創(chuàng)建一個新數(shù)據(jù)庫用戶,并將登錄名映射到數(shù)據(jù)庫用戶
這將授予對特定數(shù)據(jù)庫的訪問權(quán)限。
創(chuàng)建一個新的數(shù)據(jù)庫用戶角色,并將數(shù)據(jù)庫用戶添加給該角色
建立數(shù)據(jù)庫用戶角色的數(shù)據(jù)庫權(quán)限
授予最少的權(quán)限
配置安全通信
步驟 更多信息
在 web 服務器上配置 web 站點的 ssl
請參見本指南中的“how to set up ssl on a web server”。
配置 web 服務器和數(shù)據(jù)庫服務器之間的 ipsec
請參見本指南中的“how to use ipsec to provide secure communication between two servers”。
分析
• 在此方案中,iis 中的集成 windows 身份驗證是理想的選擇。這是因為,所有用戶都使用 windows 2000 或更高版本、internet explorer 5.x 或更高版本,并且都使用 active directory 帳戶,因此具備了使用 kerberos 身份驗證協(xié)議(其支持委派)的條件。t這樣,您就可以跨計算機邊界傳遞用戶的安全性上下文。
• 在 active directory 中,不能將最終用戶帳戶標記為“敏感,不能被委派”。在 active directory 中,必須將 web 服務器計算機帳戶標記為“可以委派其他帳戶”。有關詳細信息,請參見本指南中的“how to implement kerberos delegation for windows 2000”。
• web 服務器和應用程序服務器上的 asp.net 作為權(quán)限最少的本地帳戶(本地 aspnet 帳戶)運行,這樣一旦遭到攻擊,潛在危害被大大降低。
• 將 web 服務和 web 應用程序配置為使用 windows 身份驗證。將兩臺計算機上的 iis 配置為使用集成 windows 身份驗證。
• 當從 web 應用程序調(diào)用 web 服務時,默認情況下不傳遞憑據(jù)。要響應下游 web 服務器上 iis 發(fā)出的網(wǎng)絡身份驗證質(zhì)詢,必須使用憑據(jù)。必須使用以下方法設置 web 服務代理的 credentials 屬性以明確地指定這一點:
wsproxy.credentials = credentialcache.defaultcredentials;
有關使用憑據(jù)調(diào)用 web 服務的詳細信息,請參見本指南中的“web 服務安全性”。
• 將 web 應用程序配置為使用模擬。因此,在從 web 應用程序調(diào)用 web 服務時,就會傳遞原調(diào)用方的安全性上下文,并且允許 web 服務對原調(diào)用方進行身份驗證(和授權(quán))。
• 在 web 服務中使用 .net 角色,基于用戶所屬的 windows 組(hrdept、payrolldept 和 employees)對用戶進行授權(quán)。 hrdept 和 payrolldept 的成員可以檢索任何雇員的雇員詳細信息,而 employees 組的成員僅有權(quán)檢索他們自己的詳細信息。
可以使用 principalpermissionattribute 類在 web 方法中加上注釋,以查詢特定的角色成員身份,如以下代碼示例所示。注意,可以用 b>principalpermission 代替 principalpermissionattribute。這是所有 .net 屬性類型的共同特性。
[webmethod]
[principalpermission(securityaction.demand,
[email protected]"domainname/hrdept)]
public dataset retrieveemployeedetails()
{
}
上述代碼中顯示的屬性表示,只允許 domainname/hrdept windows 組的成員調(diào)用 retrieveemployeedetails 方法。如果任何非成員試圖調(diào)用此方法,就會發(fā)生安全異常。
• asp.net 文件授權(quán)(在 web 應用程序和 web 服務中)針對調(diào)用方在 acl 中檢查在 iis 元數(shù)據(jù)庫中是否將任何文件類型映射到 aspnet_isapi.dll。iis 檢查不存在 isapi 映射的靜態(tài)文件類型(例如 .jpg、.gif、.htm 等),同樣使用的是附加到文件中的 acl。
• 因為將 web 應用程序配置為使用模擬,所以必須用 acl 來配置應用程序本身所訪問的資源,以便給原調(diào)用方至少授予讀取權(quán)限。
• web 服務不使用模擬或委派;因此,它使用 asp.net 進程標識來訪問本地系統(tǒng)資源和數(shù)據(jù)庫。因此,所有調(diào)用都是使用單個進程帳戶完成的。因此,可以使用數(shù)據(jù)庫連接池。如果數(shù)據(jù)庫不支持委派(例如 sql server 7.0 或更低版本),則最好選擇此方案。
• 對 sql server 進行的 windows 身份驗證意味著不必在 web 服務器上存儲憑據(jù),也意味著不必通過網(wǎng)絡將憑據(jù)發(fā)送到 sql server 計算機。
• 原調(diào)用方和 web 服務器之間的 ssl 保護傳遞到和來自 web 應用程序的數(shù)據(jù)。
• 下游 web 服務器和數(shù)據(jù)庫之間的 ipsec 保護傳遞到和來自數(shù)據(jù)庫的數(shù)據(jù)。
缺陷
• 在數(shù)據(jù)庫服務器上使用重復的 windows 帳戶(與 asp.net 進程帳戶匹配的帳戶)會導致增大管理負擔。密碼應當定期手動更新并同步。
另一種方法是,考慮使用權(quán)限最少的域帳戶。有關選擇 asp.net 進程標識的詳細信息,請參見本指南中的“asp.net 安全性”。
• 因為基于 .net 角色的安全性以 windows 組成員為基礎,所以此解決方案需要根據(jù)相應層次的 windows 組來匹配那些將要訪問該應用程序的用戶類別(共享相同的安全權(quán)限)。
• kerberos 委派是不受限制的,因此必須嚴格控制在 web 服務器上運行的應用程序標識。為了提高安全門檻,應從 domain users 組中刪除域帳戶以限制域帳戶的訪問范圍,并且只從相應的計算機提供訪問。有關詳細信息,請參見 microsoft web 網(wǎng)站 http://www.microsoft.com/windows2000/techinfo/planning/security/secdefs.asp 上的“default access control settings”(默認訪問控制設置)白皮書。
問與答
數(shù)據(jù)庫不知道誰是原始調(diào)用方。我如何能創(chuàng)建一條審核記錄?
審核 web 服務中的最終用戶活動,或者將用戶的標識作為數(shù)據(jù)訪問調(diào)用的參數(shù)明確地進行傳遞。
相關方案
如果您需要連接到非 sql server 數(shù)據(jù)庫,或者目前使用的是 sql 身份驗證,則必須使用連接字符串明確地傳遞數(shù)據(jù)庫帳戶憑據(jù)。如果您這樣做,請確保安全地存儲連接字符串。
有關詳細信息,請參見本指南中的“數(shù)據(jù)訪問安全性”中的“安全存儲連接字符串”。
asp.net 到 remoting 到 sql server
在此方案中,運行 asp.net 頁的 web 地連接到遠程應用程序服務器上的遠程組件。web 服務器通過使用 .net remoting 在 http 通道上與該組件進行通信。遠程組件由 asp.net 駐留。圖 7 顯示了此方案。
圖 7. asp.net 到 remoting using .net remoting 到 sql server
特點
• 用戶使用不同類型的 web 瀏覽器。
• 遠程組件由 asp.net 駐留。
• web 應用程序使用 http 通道與遠程組件進行通信。
• asp.net 應用程序調(diào)用 .net 遠程組件,并傳遞原調(diào)用方的憑據(jù)以進行身份驗證。基本身份驗證提供了這些功能。
• 由于數(shù)據(jù)本身所具有的機密性,必須在進程與計算機之間保證數(shù)據(jù)的安全。
保護方案
在此方案中,駐留 asp.net web 應用程序的 web 服務器驗證原調(diào)用方的身份。web 應用程序可以從 http 服務器變量中檢索調(diào)用方的身份驗證憑據(jù)(用戶名和密碼)。然后,web 應用程序通過配置遠程組件代理,使用這些憑據(jù)連接到駐留遠程組件的應用程序服務器。數(shù)據(jù)庫使用 windows 身份驗證來驗證 asp.net 進程標識的身份(即,數(shù)據(jù)庫信任遠程組件)。遠程組件反過來調(diào)用數(shù)據(jù)庫,并使用存儲過程參數(shù)在應用程序級別傳遞原調(diào)用方的標識。
表 4:安全措施
類別 詳細信息
身份驗證
在 iis 中使用基本身份驗證對用戶進行身份驗證(除 ssl 外)。
在遠程組件 (asp.net /iis) 中使用 windows 身份驗證。
使用權(quán)限最少的 asp.net 帳戶,通過 windows 身份驗證連接到數(shù)據(jù)庫。
授權(quán)
在 web 服務器上對原調(diào)用方執(zhí)行 acl 檢查。
在遠程組件中對原調(diào)用方執(zhí)行角色檢查。
授予 asp.net(遠程組件)標識訪問數(shù)據(jù)庫的權(quán)限。
安全通信
使用 ssl 保護在用戶和 iis 中駐留的 web 應用程序及遠程對象之間傳送的機密數(shù)據(jù)。
使用 ipsec 保護在 web 服務器和數(shù)據(jù)庫之間傳送的機密數(shù)據(jù)。
結(jié)果
圖 8 顯示了此方案的建議安全配置。
圖 8. asp.net 到遠程 web 服務到 sql server 的 intranet 方案的建議安全配置
安全配置步驟
在開始之前,您需要查看以下內(nèi)容:
• 創(chuàng)建一個權(quán)限最少的數(shù)據(jù)庫帳戶(請參見本指南中的“數(shù)據(jù)訪問安全性”)
• 在 web 服務器上配置 ssl(請參見本指南本指南中的“how to set up ssl on a web server”)
• 配置 ipsec(請參見本指南中的“how to use ipsec to provide secure communication between two servers”)
配置 web 服務器
配置 iis
步驟
更多信息
禁用對 web 應用程序的虛擬根目錄的匿名訪問
啟用基本身份驗證
使用 ssl 保護基本身份驗證憑據(jù)。
配置 asp.net
步驟
更多信息
將 asp.net web 應用程序配置為使用 windows 身份驗證
編輯應用程序的虛擬根目錄下的 web.config
將 <authentication> 元素設置為:
配置應用程序服務器
配置 iis
步驟 更多信息
禁用對 web 應用程序的虛擬根目錄的匿名訪問
啟用集成 windows 身份驗證
配置 asp.net
步驟
更多信息
將遠程組件(在 asp.net 中)配置為使用 windows 身份驗證
編輯遠程組件的虛擬根目錄下的 web.config
將<authentication> 元素設置為:
將 aspnet 密碼更改為一個已知值
aspnet 是權(quán)限最少的本地帳戶,默認情況下用來運行 asp.net web 應用程序(此處用于運行遠程組件主機進程)。
通過使用本地用戶和組將 aspnet 帳戶的密碼改為一個已知值。
編輯位于 %windir%/microsoft.net/framework/ v1.0.3705/config 中的 machine.config
machine.config 并重新配置 <processmodel> 元素的 username 和 password 屬性
默認
<!-- username="machine" password="autogenerate" -->
成為
<!--
username="registry:hklm/software/yoursecureapp/
processmodel/aspnet_setreg,username" password="registry:hklm/software/yoursecureapp/
processmodel/aspnet_setreg,password" -->
注意,使用 aspnet_setreg.exe 工具以在加密密碼的形式存儲在注冊表中。
確保模擬是關閉的
默認情況下模擬是關閉的;不過請復查一下,確保它在 web.config 中是關閉的,如下所示:
<identity impersonate="false" />
刪除 <identity> 元素也能達到同樣的效果。
配置 sql server
步驟 更多信息
在 sql server 計算機上創(chuàng)建一個 windows 帳戶,以便匹配用于運行 web 服務的 asp.net 進程帳戶
t用戶名和密碼必須匹配自定義 asp.net 帳戶。
給予該帳戶以下權(quán)限:
- 從網(wǎng)絡訪問此計算機
- 拒絕本地登錄
- 以批處理作業(yè)登錄
配置 sql server 以便進行 windows 身份驗證
為自定義 asp.net 帳戶創(chuàng)建一個 sql server 登錄
這將授予對 sql server 的訪問權(quán)限
創(chuàng)建一個新數(shù)據(jù)庫用戶,并將登錄名映射到數(shù)據(jù)庫用戶
這將授予對指定數(shù)據(jù)庫的訪問權(quán)限
創(chuàng)建一個新的數(shù)據(jù)庫用戶角色,并將數(shù)據(jù)庫用戶添加給該角色
建立數(shù)據(jù)庫用戶角色的數(shù)據(jù)庫權(quán)限
授予最少的權(quán)限
配置安全通信
步驟 更多信息
在 web 服務器上配置 web 站點的 ssl
[請參見本指南中的“how to set up ssl on a web server”。
在應用程序服務器上配置 web 站點的 ssl
請參見本指南中的“how to set up ssl on a web server”。
配置應用程序服務器和數(shù)據(jù)庫服務器之間的 ipsec
請參見本指南中的“how to use ipsec to provide secure communication between two servers”。
分析
• web 服務器和應用程序服務器上的 asp.net 作為權(quán)限最少的本地帳戶運行,因此一旦遭到攻擊,潛在危害被大大降低。這兩種情況下,均使用默認的 aspnet 帳戶。
使用 aspnet 本地帳戶(在 sql server 計算機上具有重復的帳戶)可進一步降低潛在的安全風險。數(shù)據(jù)庫服務器上的重復 windows 帳戶允許在應用程序服務器上使用權(quán)限最少的 asp.net 帳戶來運行遠程組件。
• 在 web 服務器上,基本身份驗證允許 web 應用程序使用用戶的憑據(jù)響應來自應用程序服務器的 windows 身份驗證質(zhì)詢。
為使用調(diào)用方的憑據(jù)來調(diào)用遠程組件,web 應用程序按如下所示的代碼段來配置遠程組件代理。
string pwd = request.servervariables["auth_password"];
string uid = request.servervariables["auth_user"];
idictionary channelproperties =
channelservices.getchannelsinkproperties(proxy);
networkcredential credentials;
credentials = new networkcredential(uid, pwd);
objref objectreference = remotingservices.marshal(proxy);
uri objecturi = new uri(objectreference.uri);
credentialcache credcache = new credentialcache();
credcache.add(objecturi, "negotiate", credentials);
channelproperties["credentials"] = credcache;
channelproperties["preauthenticate"] = true;
有關將安全憑據(jù)傳遞到遠程組件的詳細信息,請參見本指南中的“.net remoting安全性”。
• 在 asp.net web 應用程序中禁止使用模擬,因為遠程處理代理是使用基本身份驗證獲取的用戶憑據(jù)專門配置的。 web 應用程序所訪問的任何其他資源均使用 asp.net 進程帳戶提供的安全性上下文。
• 用戶和 web 服務器之間的 ssl 保護傳遞到或來自 web 服務器的數(shù)據(jù),并且還保護在身份驗證過程中以明文傳遞的基本憑據(jù)。
• 在應用程序服務器上,集成 windows 身份驗證提供對原調(diào)用方的 .net 角色檢查。角色對應于 windows 組。
即使沒有模擬,也可以執(zhí)行基于角色的檢查。
• asp.net 文件授權(quán)針對調(diào)用方在 acl 中檢查在 iis 元數(shù)據(jù)庫中是否將任何文件類型映射到 aspnet_isapi.dll。iis 對靜態(tài)文件(在 iis 中沒有映射到 isapi 擴展)執(zhí)行訪問檢查。
• 因為在應用程序服務器上沒有啟用模擬,所以遠程組件執(zhí)行的任何本地或遠程資源訪問均使用 aspnet 安全性上下文。應該相應地設置 acl。
• 對 sql server 進行的 windows 身份驗證意味著不必在應用程序服務器上存儲憑據(jù),也意味著不必通過網(wǎng)絡將憑據(jù)發(fā)送到 sql server 計算機。
缺陷
• 在數(shù)據(jù)庫服務器上使用重復的 windows 帳戶(與 asp.net 進程帳戶匹配的帳戶)會導致增大管理負擔。密碼應當定期手動更新并同步。
• 因為基于 .net 角色的安全性以 windows 組成員為基礎,所以此解決方案需要根據(jù)相應層次的 windows 組來匹配那些將要訪問該應用程序的用戶類別(共享相同的安全權(quán)限)。
相關方案
web 服務器使用 kerberos 來驗證調(diào)用方的身份。使用 kerberos 委派將原調(diào)用方的安全性上下文傳遞到應用程序服務器上的遠程組件。
此方法要求將所有用戶帳戶配置為使用委派。還將 web 應用程序配置為使用模擬,并且 web 應用程序使用 defaultcredentials 來配置遠程組件代理。本指南中的“.net remoting安全性”中的“傳送原調(diào)用方”部分深入討論了這種技術。
將原調(diào)用方傳遞到數(shù)據(jù)庫
前面討論的方案使用了受信任的子系統(tǒng)模型,并且在所有情況下,數(shù)據(jù)庫都信任應用程序服務器或 web 服務器以便正確地對用戶進行身份驗證和授權(quán)。雖然受信任的子系統(tǒng)模型具有許多優(yōu)點,但是某些方案(多半是出于審核原因)可能要求您使用模擬/委派模型,并且跨計算機邊界將原調(diào)用方的安全性上下文一直傳遞到數(shù)據(jù)庫。
需要將原調(diào)用方傳遞到數(shù)據(jù)庫的典型原因包括:
• 您需要細分數(shù)據(jù)庫訪問,并且權(quán)限受對象限制。特定的用戶或組可以讀取個別對象,而其他用戶或組可以寫入個別對象。
這與沒有細分且基于任務的授權(quán)正好相反,后者由角色成員身份決定特定對象的讀寫能力。
• 您可能需要使用平臺的審核功能,而不是在應用程序級別傳遞標識和執(zhí)行審核。
如果您確實選擇了模擬/委派模型(或者由于公司的安全策略而必須這樣做),并將原調(diào)用方的上下文通過應用程序?qū)觽鬟f到后端,則在設計時必須考慮委派和網(wǎng)絡訪問問題(在跨多臺計算機時,這個問題很重要)。共享資源池(如數(shù)據(jù)庫連接)也是一個關鍵的問題,它可能會顯著降低應用程序的伸縮性。
這部分說明如何為兩個最常見的應用方案實現(xiàn)模擬/委派:
• asp.net 到 sql server
• asp.net 到 enterprise services到sql server
有關受信任的子系統(tǒng)模型和模擬/委派模型及其相對優(yōu)點的詳細信息,請參見本指南中的“身份驗證和授權(quán)設計”。
asp.net 到 sql server
在此方案中,使用原調(diào)用方的安全性上下文來調(diào)用數(shù)據(jù)庫。這部分描述的身份驗證選項包括基本身份驗證和集成 windows 身份驗證。“asp.net 到 enterprise services 到 sql server”部分描述了 kerberos 委派方案。
在 web 服務器上使用基本身份驗證
以下基本身份驗證配置設置允許將原調(diào)用方一直傳遞到數(shù)據(jù)庫。
表 5:安全措施
類別 詳細信息
身份驗證
在 iis 中使用基本身份驗證對用戶進行驗證。
在 asp.net. 中使用 windows 身份驗證。
在 asp.net 中啟用模擬。
使用 windows 身份驗證與 sql server 進行通信。
授權(quán)
在 web 服務器上對原調(diào)用方進行 acl 檢查。
如果將原調(diào)用方映射到 windows 組(基于應用程序的要求,例如 managers、tellers 等),則可以對原調(diào)用方進行 .net 角色檢查以限制對方法的訪問。
安全通信
使用 ssl 保護在 web 服務器和數(shù)據(jù)庫之間傳送的明文憑據(jù)。
要保護在 web 應用程序和數(shù)據(jù)庫之間傳送的所有機密數(shù)據(jù),請使用 ipsec。
在此方法中,一定要注意以下幾點:
• 基本身份驗證使用彈出式對話框提示用戶,用戶可以在該對話框中鍵入憑據(jù)(用戶名和密碼)。
• 數(shù)據(jù)庫必須識別原調(diào)用方。果 web 服務器和數(shù)據(jù)庫位于不同的域中,則必須啟用相應的信任關系以允許數(shù)據(jù)庫對原調(diào)用方進行身份驗證。
在 web 服務器上使用集成 windows 身份驗證
集成 windows 身份驗證導致 ntlm 或 kerberos 身份驗證,具體情況取決于客戶機和服務器計算機的配置。
ntlm 身份驗證不支持委派,因此不允許將原調(diào)用方的安全性上下文從 web 服務器傳遞到物理上的遠程數(shù)據(jù)庫。在瀏覽器和 web 服務器之間使用單個網(wǎng)絡中繼點以便進行 ntlm 身份驗證。要使用 ntlm 身份驗證,必須在 web 服務器上安裝 sql server,這可能僅適用于很小的 intranet 應用程序。
asp.net到 enterprise services 到 sql server
在此方案中,asp.net 頁調(diào)用遠程 enterprise services 應用程序中駐留的業(yè)務組件,而這些組件又連接到數(shù)據(jù)庫上。原調(diào)用方的安全性上下文從瀏覽器一直傳遞到數(shù)據(jù)庫。圖 9 中顯示了這種情況。
圖 9. asp.net在 enterprise services 中調(diào)用一個組件,該組件調(diào)用數(shù)據(jù)庫
特點
• 用戶安裝了 internet explorer 5.x 或更高版本。
• 所有計算機運行的都是 windows 2000 或更高版本。
• 用戶帳戶保存在單一目錄林的 active directory 中。
• 應用程序?qū)⒃{(diào)用方的安全性上下文(在操作系統(tǒng)級別)一直傳遞到數(shù)據(jù)庫。
• 所有層都使用 windows 身份驗證。
• 將域用戶帳戶配置為使用委派,而在 active directory 中必須將用來運行 enterprise services 應用程序的帳戶標記為“可以委派其他帳戶”。
保護方案
在此方案中,web 服務器驗證調(diào)用方的身份。然后,您必須將 asp.net 配置為使用模擬,以便將原調(diào)用方的安全性上下文傳遞到遠程 enterprise services 應用程序。在 enterprise services 應用程序中,組件代碼必須明確地模擬調(diào)用方(使用 coimpersonateclient),確保將調(diào)用方的上下文傳遞到數(shù)據(jù)庫。
表 6:安全措施
類別 詳細措施
身份驗證
所有層都支持 kerberos 身份驗證(web 服務器、應用程序服務器和數(shù)據(jù)庫服務器)。
授權(quán)
針對原調(diào)用方的標識,在中間層使用 enterprise services (com+) 角色來執(zhí)行授權(quán)檢查。
安全通信
在瀏覽器和 web 服務器之間使用 ssl 來保護機密數(shù)據(jù)。
在 asp.net 和遠程 enterprise services 應用程序中的服務組件之間使用 rpc 數(shù)據(jù)包保密性(提供加密)。
在服務組件和數(shù)據(jù)庫之間使用 ipsec。
結(jié)果
圖 10 顯示了此方案的建議安全配置。
[caption]
圖 10. asp.net調(diào)用 enterprise services 中的一個組件,該組件調(diào)用數(shù)據(jù)庫。原調(diào)用方的安全性上下文傳遞到數(shù)據(jù)庫。
安全配置步驟
在開始之前,應注意以下配置問題:
• 在 active directory 中,必須將 enterprise services 進程帳戶標記為“可以委派其他帳戶”,不能將最終用戶帳戶標記為“敏感,不能委派”。有關詳細信息,請參見本指南中的“how to: implement kerberos delegation for windows 2000”。
• 所有計算機都要求安裝 windows 2000 或更高版本。這包括客戶端(瀏覽器)計算機和所有服務器。
• 所有計算機都必須在 active directory 中,并且必須屬于單個目錄林。
• 駐留 enterprise services 的應用程序服務器必須運行 windows 2000 sp3。
• 如果在 windows 2000 上使用 internet explorer 6.0,則它默認使用 ntlm 身份驗證,而不是所需的 kerberos 身份驗證。要啟用 kerberos 委派,請參見 microsoft 知識庫文章 q299838 “unable to negotiate kerberos authentication after upgrading to internet explorer 6” (在升級到 internet explorer 6 之后,無法協(xié)商 kerberos 身份驗證)。
配置 web 服務器 (iis)
步驟 更多信息
禁用對 web 應用程序的虛擬根目錄的匿名訪問
啟用 windows 集成的身份驗證
配置 web 服務器 (asp.net)
步驟
更多信息
將 asp.net web 應用程序配置為使用 windows 身份驗證
編輯 web 應用程序的虛擬根目錄下的 web.config
將 <authentication> 元素設置為:
配置 asp.net web 應用程序的模擬
編輯 web 應用程序的虛擬目錄下的 web.config
將 <identity> 元素設置為:
配置 asp.net web 應用程序用于傳出調(diào)用的 dcom 模擬級別
asp.net web 應用程序通過 dcom 調(diào)用遠程服務組件。用于 asp.net 所發(fā)出調(diào)用的默認模擬級別是“impersonate”。在 machine.config 中必須將它更改為“delegate”。
編輯 machine.config 并找到 <processmodel> 元素,將 comimpersonatelevel 屬性設置為 "delegate"(如下所示)。
在客戶端配置 dcom 身份驗證級別
dcom 身份驗證級別是由客戶端和服務器共同確定的。在此方案中,dcom 客戶端是 asp.net。
編輯 machine.config 并找到 <processmodel> 元素,將 comauthenitcationlevel 屬性設置為 "pktprivacy",如下所示。
配置服務組件(和應用程序服務器)
步驟
更多信息
托管類必須從 servicedcomponent 類繼承
請參見 microsoft 知識庫文章 q306296 “how to: create a serviced .net component in visual c# .net”(如何做:在 visual c# .net 中創(chuàng)建服務 .net 組件)。
在服務組件中添加模擬調(diào)用方的代碼,在訪問遠程資源(例如,數(shù)據(jù)庫)之前,從 ole32.dll 中調(diào)用
coimpersonateclient() 和 coreverttoself(),以便使用調(diào)用方的上下文。默認情況下,使用 enterprise services 進程上下文進行傳出調(diào)用。
添加對 ole32.dll 的引用:
class comsec
{
[dllimport("ole32.dll", charset=charset.auto)]
public static extern long coimpersonateclient();
[dllimport("ole32.dll", charset=charset.auto)]
public static extern long coreverttoself();
}
在調(diào)用遠程資源之前,先調(diào)用這些外部函數(shù):
comsec.coimpersonateclient();
comsec.coreverttoself();
有關詳細信息,請參見本指南中的“enterprise services 安全性”。
將 enterprise services 應用程序配置為服務器應用程序
這可以通過使用“組件服務”工具,或通過位于服務組件程序集中的以下 .net 屬性進行配置。
[assembly: applicationactivation(activationoption.server)]
配置 enterprise services 應用程序以使用數(shù)據(jù)包保密性身份驗證(以便用加密提供安全通信)
將以下 .net 屬性添加到服務組件程序集。
[assembly: applicationaccesscontrol(
authentication =
authenticationoption.privacy)]
配置 enterprise services 應用程序以獲得組件級基于角色的安全性
要在進程和組件級別(包括接口和類)配置角色檢查,請使用下列屬性。
[assembly: applicationaccesscontrol(accesscheckslevel=
accesschecksleveloption. applicationcomponent)]
decorate classes with the following attribute:
[componentaccesscontrol(true)]
有關配置接口和方法級角色檢查的詳細信息,請參見本指南中的“enterprise services 安全性”中的“配置安全”。
創(chuàng)建一個用于運行 enterprise services 的自定義帳戶,并在 active directory 中將它標記為“可以委派其他帳戶”
在 active directory 中,需要使用標記為“可以委派其他帳戶”的域帳戶運行 enterprise services 應用程序。有關詳細信息,請參見本指南中的“how to implement kerberos delegation for windows 2000”。
將 enterprise services 配置為以自定義帳戶運行
必須使用“組件服務”工具或腳本進行配置。不能在服務組件程序集中使用 .net 屬性。
配置數(shù)據(jù)庫服務器 (sql server)
步驟
更多信息
配置 sql server 以便進行 windows 身份驗證
為用戶所屬的 windows 組創(chuàng)建 sql server 登錄。
這將授予對 sql server 的訪問權(quán)限。
訪問控制策略將 windows 組按角色進行處理。例如,您可以設置類似 b>employees、hrdept 和 payrolldept 的組。
為每個 sql server 登錄創(chuàng)建新的數(shù)據(jù)庫用戶
這將授予對特定數(shù)據(jù)庫的訪問權(quán)限。
為數(shù)據(jù)庫用戶設置數(shù)據(jù)庫權(quán)限
授予最少的權(quán)限
有關詳細信息,請參見本指南中的“數(shù)據(jù)訪問安全性”。
分析
• 傳遞原調(diào)用方安全性上下文的關鍵是 kerberos 身份驗證(它生成委派級別令牌)。當服務器進程 (iis) 收到委派級別令牌后,它可以將該令牌傳遞到在同一臺計算機上使用某個帳戶運行的任何其他進程,而無需更改它的委派級別。是使用本地帳戶還是域帳戶運行輔助進程都無關緊要。重要的是 iis 的運行方式。如果它不是使用 localsystem 帳戶運行的,則需要在 active directory 中將運行它的帳戶標記為“可以委派其他帳戶”。
如果 iis 是使用 localsystem 帳戶運行的,則必須將計算機帳戶標記為“可以委派其他帳戶”。有關詳細信息,請參見本指南中的“how to implement kerberos delegation for windows 2000”。
• 在此方案中,由于所有用戶都使用 windows 帳戶并且使用的是 internet explorer 5.x 或更高版本,所以在 iis 中最好使用集成 windows 身份驗證(帶 kerberos)。集成 windows 身份驗證的優(yōu)點是從不通過網(wǎng)絡發(fā)送用戶的密碼。另外,登錄是透明的,因為 windows 使用當前交互用戶的登錄會話。
• asp.net 構(gòu)造一個 windowsprincipal 對象,并將它附加到當前的 web 請求上下文 (httpcontext.user)。如果您需要在 web 應用程序中執(zhí)行授權(quán)檢查,則可以使用下面的代碼。
windowsprincipal wp = (httpcontext.current.user as windowsprincipal);
if ( wp.isinrole("manager") )
{
// user is authorized to perform manager-specific functionality
}
asp.net fileauthorizationmodule 針對原調(diào)用方在 acl 中檢查在 iis 中映射到 aspnet_isapi.dll 的 asp.net 文件類型。對于靜態(tài)文件類型(例如 .jpg、.gif 和 .htm 文件),iis 充當關守,它使用原調(diào)用方的標識執(zhí)行訪問檢查。
• 過對 sql 使用 windows 身份驗證,可以避免在應用程序服務器的文件中存儲憑據(jù),也可以避免通過網(wǎng)絡傳遞它們。例如,在連接字符串中包含 trusted_connection 屬性:
constr="server=yourserver; database=yourdatabase; trusted_connection=yes;"
• 經(jīng)過所有層傳遞原調(diào)用方的上下文,這使審核變得非常容易。可以使用平臺級審核(例如,windows 和 sql server 提供的審核功能)。
缺陷
• 如果在 windows 2000 上使用 internet explorer 6.0,則協(xié)商的默認身份驗證機制是 ntlm(而不是 kerberos)。有關詳細信息,請參見 microsoft 知識庫文章 q299838 “unable to negotiate kerberos authentication after upgrading to internet explorer 6” (在升級到 internet explorer 6 之后,無法協(xié)商 kerberos 身份驗證)。
• 與使用受信任的子系統(tǒng)模型相比,跨層委派用戶在性能和應用程序伸縮性方面費用很高。您無法利用數(shù)據(jù)庫連接池的優(yōu)點,因為數(shù)據(jù)庫連接與原調(diào)用方的安全性上下文綁定在一起,因此無法有效地進行池處理。
• 此方法也依賴于符合應用程序安全需要的 windows 組粒度。也就是說,必須在正確的粒度級別設置 windows 組,以便與訪問應用程序的用戶類別(共享相同的安全權(quán)限)匹配。
小結(jié)
本章介紹了如何保護一套常見的 intranet 應用程序方案。
有關 extranet 和 internet 應用程序方案,請參見本指南中的“在 extranet 環(huán)境中保護 .net web 應用程序 ”和“在 internet 環(huán)境中保護 .net web 應用程序 ”。