MSDN 首頁 

第 5 單元:內部網路安全性

發佈日期: 2004 年 5 月 28 日
本頁內容
本單元內容本單元內容
目標目標
適用於適用於
如何使用本單元如何使用本單元
開始之前開始之前
ASP.NET 連接至 SQL ServerASP.NET 連接至 SQL Server
ASP.NET 連接至 Enterprise Services 再至 SQL ServerASP.NET 連接至 Enterprise Services 再至 SQL Server
ASP.NET 連接至 Web 服務再至 SQL ServerASP.NET 連接至 Web 服務再至 SQL Server
ASP.NET 連接至遠端再至 SQL ServerASP.NET 連接至遠端再至 SQL Server
將原始呼叫者傳送到資料庫將原始呼叫者傳送到資料庫
摘要摘要

本單元內容

內部網路架構 Web 應用程式的安全性也很重要,因為它存在於控制之網路的界限之內,且一組受限制的使用者可以對其進行存取。不同的人員及部門可能需要不同層級的存取權,來存取應用程式提供的功能及資料,且在傳輸期間還必須確保機密資料的安全。狀況的複雜之處在於:應用程式的安全性架構必須彌補任何與安全性相關的問題,而這些問題是由於要在其上部署應用程式之內部網路的現有基礎結構及作業特性所導致的。

本單元藉由著重描述一組常用分散式應用程式架構的需求,來說明用於解決內部網路架構 Web 應用程式之驗證、授權及安全通訊問題的建議方法。

回到頁首回到頁首

目標

透過此單元即可:

確保您內部網路 .NET 應用程式的安全。

瞭解下列情況中使用 ASP.NET Web 應用程式與 SQL Server 2000 進行通訊的相關安全性問題及建議方案:

直接通訊

將 Enterprise Services 用作中繼裝置

將 Web 服務用作中繼裝置

將「.NET 遠端處理」用作中繼裝置

決定內部網路架構分散式 Web 應用程式中之驗證、授權及安全通訊的最佳實作方法。

回到頁首回到頁首

適用於

本單元適用於下列產品及技術:

Windows XP 或 Windows 2000 Server (含 Service Pack 3) 及更新的作業系統

Microsoft Internet Information Services (IIS) 5.0 及更新版本

Microsoft Active Directory

.NET Framework 1.0 版 (含 Service Pack 2) 及更新版本

SQL Server 2000 (含 Service Pack 2) 及更新版本

回到頁首回到頁首

如何使用本單元

若要充分瞭解此單元:

您必須具有使用 ASP.NET、SQL Server 及 IIS 進行開發及設定它們的經驗。

您必須具有設定 Windows 安全性及 Active Directory 的經驗。

您必須具有設定 Enterprise Services (COM+) 應用程式的經驗。

請閱讀第 1 單元<簡介>。當中定義了驗證、授權及安全通訊對於分散式 Web 應用程式的重要性。

請閱讀第 2 單元<ASP.NET 應用程式的安全性模型>。當中提供了建立分散式 ASP.NET Web 應用程式時所使用之架構及技術的概觀,並強調指出驗證、授權及安全通訊在何處適用於此架構。

搭配使用目前的單元與下列示範此單元中所討論之技術的單元:

How To:建立自訂帳戶以執行 ASP.NET>。

How To:實作 Windows 2000 的 Kerberos 委派>。

How To:建立 DPAPI 程式庫>。

How To:使用 ASP.NET 的 DPAPI (電腦存放區)>。

How To:同時使用 ASP.NET 的 DPAPI (使用者存放區) 和 Enterprise Services>。

How To:同時使用角色安全性和 Enterprise Services>。

How To:在網頁伺服器上設定 SSL>。

How To:使用 IPSec 在兩部伺服器間進行安全通訊>。

How To:使用 SSL 與 SQL Server 2000 進行安全通訊>。

回到頁首回到頁首

開始之前

只有部份獲得授權的使用者群組 (例如某個網域的員工) 能存取內部網路應用程式。雖然內部網路設定可以限制公開應用程式,但您在開發驗證、授權和安全通訊策略時,仍然會面臨一些挑戰。例如,您可能不信任某些網域,因而無法將呼叫者的安全性內容和身分識別,傳送到系統的後端資源。您也可能在異質性環境中使用各種瀏覽器進行操作。這會導致無法使用一般的驗證機制。

如果您同質性內部網路上的所有電腦都執行 Microsoft® Windows® 2000 作業系統或更新版本,且網域上的使用者都受信任可以委派,則可選擇將原始呼叫者的安全性內容委派到後端。

此外,您還必須考量安全通訊的問題。儘管是在內部網路環境中執行應用程式,但要在網路上傳送資料,仍有安全上的顧慮。就好比您不但要確保應用程式伺服器和資料庫之間傳送資料的安全,您還必須確保瀏覽器和網頁伺服器之間傳送資料的安全。

本單元使用下列一般內部網路案例,說明主要的驗證、授權及安全通訊技術:

ASP.NET 連接至 SQL Server

ASP.NET 連接至 Enterprise Services 再至 SQL Server

ASP.NET 連接至 Web 服務再至 SQL Server

ASP.NET 連接至遠端再至 SQL Server

此外,本單元還介紹 Windows 2000 委派案例 (將原始呼叫者傳送到資料庫)。在這個案例中,原始呼叫者的安全性內容及身分識別,在作業系統層次上以中繼 Web 及應用程式伺服器,從瀏覽器傳送到資料庫。

注意:本單元中描述的一些案例會變更預設 ASPNET 帳戶的密碼,以允許在遠端電腦上建立重複的帳戶,從而達到網路驗證目的。這需要更新 Machine.config 的 <processModel> 項目。<processModel> 憑證不應當以純文字儲存在 machine.config 中。改為使用 aspnet_setreg.exe 公用程式將加密憑證儲存在登錄中。若需相關資訊,請參閱第 8 單元<ASP.NET 安全性>及 Microsoft 知識庫文件 Q329290<HOWTO:Use the ASP.NET Utility to Encrypt Credentials and Session State Connection Strings (英文)>。

回到頁首回到頁首

ASP.NET 連接至 SQL Server

這個案例中的 HR 資料庫,在同質性內部網路中,安全地提供各使用者資料。應用程式使用信任的子系統模型,代替原始呼叫者執行呼叫。應用程式以「整合式 Windows」驗證對呼叫者進行驗證,並以 ASP.NET 處理序身分識別對資料庫進行呼叫。出於資料機密性的考量,應在網頁伺服器與用戶端之間使用 SSL。

圖 5.1 顯示這個應用程式案例的基本模型。

ASP.NET 連接至 SQL Server

圖 5.1
ASP.NET 連接至 SQL Server

特性

這個案例具有下列特性:

用戶端有 Internet Explorer。

使用者帳戶在 Microsoft Active Directory® 目錄服務中。

應用程式提供各使用者的機密資料。

僅有經過驗證的用戶端,才能存取應用程式。

資料庫信任應用程式,讓它來適當地驗證使用者 (亦即應用程式會代替使用者呼叫資料庫)。

Microsoft SQL Server™ 在進行授權時,使用單一資料庫使用者角色。

確保案例安全

這個案例中的網頁伺服器,使用呼叫者身分識別來驗證呼叫者和限制存取本機資源。您不必為了限制原始呼叫者存取資源而在 Web 應用程式中模擬。資料庫會針對最小權限帳戶的 ASP.NET 預設處理序身分識別進行驗證 (亦即資料庫信任 ASP.NET 應用程式)。

表 5.1:安全性措施

類別詳細資料

驗證

在網頁伺服器上使用 IIS 中的「整合式 Windows」驗證,以增強式驗證對原始呼叫者進行驗證。

在 ASP.NET (不模擬) 中使用 Windows 驗證。

使用為 Windows 驗證設定的 SQL Server,確保資料庫連線的安全。

資料庫信任 ASP.NET 工作者處理序進行呼叫。驗證資料庫的 ASP.NET 處理序身分識別。

授權

使用原始呼叫者的相關 ACL,設定網頁伺服器的資源。為了便於管理,會將使用者新增到供 ACL 使用的 Windows 群組中。

Web 應用程式會針對原始呼叫者執行 .NET 角色檢查,以限制存取網頁。

安全通訊

確保網頁伺服器和資料庫之間傳送機密資料的安全

確保原始呼叫者和 Web 應用程式之間傳送機密資料的安全

結果

圖 5.2 顯示針對這個案例的建議安全性設定。

針對 ASP.NET 連接至 SQL Server 內部網路案例所建議的安全性設定

圖 5.2
針對 ASP.NET 連接至 SQL Server 內部網路案例所建議的安全性設定

安全性設定步驟

開始之前,可能需要參閱下列資訊:

建立自訂 ASP.NET 帳戶 (請參閱本手冊中的<How To:建立自訂帳戶以執行 ASP.NET

建立具有最小權限的資料庫帳戶 (請參閱第 12 單元<資料存取安全性>)

在網頁伺服器上設定 SSL (請參閱本手冊中的<How To:在網頁伺服器上設定 SSL

設定 IPSec (請參閱本手冊中的<How To:使用 IPSec 在兩部伺服器間進行安全通訊

設定 IIS

步驟其他資訊

停用 Web 應用程式虛擬根目錄的「匿名」存取

啟用「整合式 Windows」驗證

若要進行 IIS 驗證設定,請使用 IIS MMC 嵌入式管理單元。在應用程式的虛擬目錄上按一下滑鼠右鍵,再按 [內容]。
按一下 [目錄安全性] 索引標籤,再按 [匿名存取及驗證控制] 群組中的 [編輯]。

設定 ASP.NET

步驟其他資訊

將 ASP.NET 密碼變更為已知的增強式密碼值

ASPNET 是具有最小權限的本機帳戶,預設以它來執行 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> 項目設為:

<authentication mode="Windows" />

確定關閉模擬

預設會關閉模擬,但仍請您再度確定它在 Web.config 中是關閉的,如下所示:

<identity impersonate="false" />

藉由移除 <identity> 項目,可以達到相同的效果。

設定 SQL Server

步驟其他資訊

在 SQL Server 電腦上,建立一個與
ASP.NET 處理序帳戶 (ASPNET) 相符的 Windows 帳戶

使用者名稱和密碼必須與 ASPNET 帳戶相符。

將下列權限授與帳戶:
- 從網路存取這台電腦
- 拒絕本機登入
- 以批次工作登入

將 SQL Server 設定為使用 Windows 驗證

 

為本機 ASPNET 帳戶建立 SQL Server 登入

這會授與存取 SQL Server 的權限。

建立新的資料庫使用者,並將其登入名稱對應到資料庫使用者

這會授與存取指定資料庫的權限。

建立一個使用者定義的新資料庫角色,然後將資料庫使用者新增到角色中

 

建立資料庫角色的資料庫使用權限

授與最小權限
若需相關資訊,請參閱第 12 單元<資料存取安全性>。

設定安全通訊

步驟其他資訊

將網站設定為使用 SSL

請參閱本手冊中的<How To:在網頁伺服器上設定 SSL>。

在網頁伺服器和資料庫伺服器間設定為使用 IPSec

請參閱本手冊中的<How To:使用 IPSec 在兩部伺服器間進行安全通訊>。

分析

IIS 中的「整合式 Windows」驗證很適合這個案例,因為所有使用者都有 Windows 帳戶,而且使用 Microsoft Internet Explorer。「整合式 Windows」驗證的優點是不在網路上傳送使用者密碼。此外,因為 Windows 使用目前互動式使用者的登入工作階段,所以對於使用者來說,登入是透明的。

ASP.NET 是以最小權限的帳戶執行,因此可減輕攻擊的潛在破壞。

您不必在 ASP.NET 中模擬,以對原始呼叫者執行 .NET 角色檢查或確保 Windows ACL 中資源的安全。為了對原始呼叫者執行 .NET 角色檢查,它會從 HTTP 內容,擷取代表原始呼叫者的 WindowsPrincipal 物件,如下所示:

WindowsPrincipal wp = (HttpContext.Current.User as WindowsPrincipal);
if ( wp.IsInRole("管理員") )
{
  // 授權使用者執行管理員特定的功能
}

ASP.NET FileAuthorizationModule 會對 ASP.NET 檔案類型 (它們在 IIS 中會對應到 aspnet_isapi.dll) 的原始呼叫者,執行 ACL 檢查。IIS 相當於 .jpg、.gif 及 .htm 檔案等靜態檔案類型的Gatekeeper,它根據與檔案有關聯的 NTFS 使用權限,使用原始呼叫者身分識別,執行存取檢查。

對 SQL Server 執行 Windows 驗證,表示您不用將憑證儲存在檔案中,也不用透過網路將憑證傳遞給資料庫伺服器。

在資料庫伺服器上使用重複的 Windows 帳戶 (與 ASPNET 本機帳戶相符的帳戶),會增加管理負擔。如果一台電腦上的密碼變更,另一台電腦上的密碼必須同步更新。在某些案例中,您也許可以使用最小權限的網域帳戶,以簡化管理工作。

無法在防火牆中開啟 Windows 驗證需要的通訊埠時,也可以使用重複的本機帳戶作法。此時就不宜使用 Windows 驗證和網域帳戶。

您必須確定 Windows 群組符合安全性需要的細微性。由於 .NET 角色安全性是以 Windows 群組成員資格為基礎,所以這個方案有賴於在正確的細微層次上設定 Windows 群組,以符合存取應用程式的使用者 (共用相同安全性權限) 類別。這裡用來管理角色的 Windows 群組,可能是該電腦的本機群組或網域群組。

慣用 SQL Server 資料庫使用者角色,而不是 SQL Server 應用程式角色,這可避免與使用 SQL 應用程式角色相關的密碼管理和連接共用問題。
應用程式使用角色名稱及密碼,呼叫內建預存程序,以此啟動 SQL 應用程式角色。因此,密碼必須儲存在安全的地方。使用 SQL 應用程式角色時必須停用資料庫連接共用,因為它會嚴重影響應用程式的延展性。

若需 SQL Server 資料庫使用者角色及 SQL Server 應用程式角色的相關資訊,請參閱第 12 單元<資料存取安全性>。

資料庫使用者會新增到資料庫使用者角色中,並會指派給角色的使用權限;如果資料庫帳戶變更,您不必變更所有資料庫物件的使用權限。

問題與解答

為何我無法啟用 Web 應用程式的模擬功能,以便可以使用對原始呼叫者設定的 ACL,確保 Web 應用程式存取的資源安全?
如果您啟用模擬,模擬的安全性內容將沒有網路憑證 (假設不啟用委派,而且您正在使用「整合式 Windows」驗證)。因此,遠端呼叫 SQL Server 時,將使用 NULL 工作階段,這會造成呼叫失敗。如果停用模擬,遠端要求即可使用 ASP.NET 處理序身分識別。

前述案例使用 ASP.NET FileAuthorizationModule,它以 Windows ACL 對原始呼叫者身分識別進行授權,不需要模擬。

如果您以「基本」驗證取代「整合式 Windows」驗證 (NTLM),並且啟用模擬,則每次呼叫資料庫時,都會使用原始呼叫者的安全性內容。每個使用者帳戶 (或使用者所屬的 Windows 群組) 都需要 SQL Server 登入。而且還必須對 Windows 群組 (或原始呼叫者) 確保資料庫物件的使用權限安全。

資料庫不知道誰是原始呼叫者。要如何才可以建立稽核追蹤?
稽核 Web 應用程式中的使用者活動,或將使用者身分識別明確地作為資料存取呼叫的參數來傳遞。

相關案例

非 Internet Explorer 瀏覽器

對 IIS 執行「整合式 Windows」驗證時,需要 Internet Explorer。在混合式瀏覽器環境中,通常有下列選項:

基本驗證及 SSL。大部份的瀏覽器都支援「基本」驗證。由於會在網路上傳遞使用者憑證,您必須使用 SSL,確保案例安全。

用戶端憑證。個別用戶端憑證可以對應到唯一的 Windows 帳戶,或是以單一 Windows 帳戶代表所有用戶端。使用用戶端憑證時也需要 SSL。

表單驗證。表單驗證可以驗證自訂資料存放區 (例如資料庫) 或 Active Directory 的憑證。
驗證 Active Directory 時,請確定只擷取與應用程式有關的必要群組。您不應該盲目擷取 Active Directory 的所有群組,正如不應該使用 SELECT * 子句查詢資料庫。
驗證資料庫時,請務必仔細剖析 SQL 命令中使用的輸入,以防 SQL 資料隱碼攻擊;此外,您應該在資料庫中儲存密碼雜湊 (結合 Salt),而非純文字或加密的密碼。
若需使用 SQL Server 作為憑證存放區及將密碼存入資料庫的相關資訊,請參閱第 12 單元<資料存取安全性>。

請注意,在任何情況下,不使用「整合式 Windows」驗證 (平台會管理憑證) 時,即可停用 SSL。不過,這個優點只適用於驗證處理程序。如果在網路上傳遞安全性機密資料,則還必須使用 IPSec 或 SSL。

對資料庫執行 SQL 驗證

有時您可能必須捨棄慣用的 Windows 驗證,而改用 SQL 驗證。例如,Web 應用程式和資料庫之間可能有防火牆,或網頁伺服器基於安全考量而不屬於網域。這也會導致無法使用 Windows 驗證。此時,您可以在資料庫和網頁伺服器之間使用 SQL 驗證。為確保案例安全,您應該:

使用「資料保護 API (DPAPI)」,確保資料庫連接字串 (含使用者名稱和密碼) 的安全。若需相關資訊,請參閱下列資源:

第 12 單元<資料存取安全性>中的<安全儲存資料庫連接字串

本手冊中的<How To:使用 ASP.NET 的 DPAPI (電腦存放區)

本手冊中的<How To:同時使用 ASP.NET 的 DPAPI (使用者存放區) 和 Enterprise Services

本手冊中的<How To:建立 DPAPI 程式庫

在網頁伺服器和資料庫伺服器之間使用 IPSec 或 SSL,保護網路上傳遞的純文字憑證。

將原始呼叫者傳送到資料庫

本案例使用原始呼叫者的安全性內容,從 Web 應用程式呼叫資料庫。使用這個作法時,請注意下列幾點:

選擇這個作法時,必須使用 Kerberos 驗證 (設定委派帳戶) 或「基本」驗證。
若需委派案例的相關資訊,請參閱本單元稍後的<將原始呼叫者傳送到資料庫>。

此外,必須在 ASP.NET 中啟用模擬。這表示要以原始呼叫者的安全性內容,存取本機系統資源;因此,本機資源 (例如登錄和事件記錄檔) 的 ACL 需要適當的設定。

資料庫連接共用受到限制,因為原始呼叫者無法共用連線。每個連線都與呼叫者的安全性內容相關聯。

傳送使用者安全性內容的另一個作法,是在應用程式層次上傳送原始呼叫者的身分識別 (例如,藉由使用方法和預存程序參數)。

回到頁首回到頁首

ASP.NET 連接至 Enterprise Services 再至 SQL Server

這個案例中的 ASP.NET 網頁呼叫 Enterprise Services 應用程式中裝載的商業元件,再用它來連接資料庫。以內部採購系統為例,它在內部網路上進行交易,並且允許內部部門下訂單。這個案例如圖 5.3 所示。

ASP.NET 呼叫 Enterprise Services 中的元件,用它來呼叫資料庫

圖 5.3
ASP.NET 呼叫 Enterprise Services 中的元件,用它來呼叫資料庫

特性

這個案例具有下列特性:

使用者有 Internet Explorer。

元件部署在網頁伺服器上。

傳輸時,必須確保應用程式處理之機密資料的安全。

商業元件使用 Windows 驗證連接到 SQL Server。

這些元件中的商業功能,受限於呼叫者的身分識別。

服務元件設定為伺服器應用程式 (跨處理序)。

元件使用伺服器應用程式的處理序身分識別,連接到資料庫。

在 ASP.NET 中啟用模擬 (發揮 Enterprise Services 角色安全性的功能)。

確保案例安全

這個案例中的網頁伺服器驗證原始呼叫者,並將呼叫者的安全性內容傳送到服務元件。服務元件則根據原始呼叫者的身分識別,授權存取商業功能。資料庫會驗證 Enterprise Services 應用程式的處理序身分識別 (亦即資料庫信任 Enterprise Services 應用程式中的服務元件)。服務元件呼叫資料庫時,是在應用程式層次上傳遞使用者的身分識別 (藉由使用信任的查詢參數)。

表 5.2:安全性措施

類別詳細資料

驗證

在網頁伺服器上使用「整合式 Windows」驗證,進行增強式驗證。

將原始呼叫者的安全性內容傳送到服務元件,以支援 Enterprise Services (COM+) 角色檢查。

使用 Windows 驗證,確保資料庫連線的安全。

資料庫信任服務元件的身分識別,讓它來呼叫資料庫。資料庫會驗證 Enterprise Services 應用程式處理序身分識別。

授權

使用 Enterprise Services (COM+) 角色,授權存取商務邏輯。

安全通訊

使用 SSL,確保使用者和 Web 應用程式之間傳送機密資料的安全。

使用 IPSec,確保網頁伺服器和資料庫之間傳送機密資料的安全。

結果

圖 5.4 顯示針對這個案例的建議安全性設定。

針對 ASP.NET 連接至本機 Enterprise Services 再至 SQL Server 內部網路案例所建議的安全性設定

圖 5.4
針對 ASP.NET 連接至本機 Enterprise Services 再至 SQL Server 內部網路案例所建議的安全性設定

安全性設定步驟

開始之前,可能需要參閱下列資訊:

建立具有最小權限的資料庫帳戶 (請參閱第 12 單元<資料存取安全性>)

在網頁伺服器上設定 SSL (請參閱本手冊中的<How To:在網頁伺服器上設定 SSL

設定 IPSec (請參閱本手冊中的<How To:使用 IPSec 在兩部伺服器間進行安全通訊

設定 Enterprise Services 安全性 (請參閱本手冊中的<How To:同時使用角色安全性和 Enterprise Services

設定 IIS

步驟其他資訊

停用 Web 應用程式虛擬根目錄的「匿名」存取

啟用「整合式 Windows」驗證

 

設定 ASP.NET

步驟其他資訊

設定 ASP.NET Web 應用程式使用 Windows 驗證

編輯應用程式虛擬根目錄中的 Web.config
將 <authentication> 項目設為:

<authentication mode="Windows" />

設定 ASP.NET Web 應用程式以進行模擬

編輯 Web 應用程式虛擬目錄中的 Web.config
將 <identity> 項目設為:

<identity impersonate="true" />

設定 ASP.NET DCOM 安全性,確保對 Enterprise Services 的呼叫支援呼叫者模擬

編輯 Machine.config,並尋找 <processModel> 項目。確定 comImpersonationLevel 屬性已設為 Impersonate (預設值)

<processModel
    comImpersonationLevel="Impersonate"

設定 Enterprise Services

步驟其他資訊

建立自訂帳戶以執行 Enterprise Services

注意:如果使用本機帳戶,還必須在 SQL Server 電腦上建立重複帳戶。

將 Enterprise Services 應用程式設定為伺服器應用程式

設定時,您可以使用「元件服務」工具,或透過服務元件組件中的下列 .NET 屬性。

[assembly:
ApplicationActivation(ActivationOption.Server)]

設定 Enterprise Services (COM+) 角色

使用「元件服務」工具或指令碼,將 Windows 使用者和/或群組新增到角色中。

服務元件組件中的 .NET 屬性,可以用來定義角色。

設定 Enterprise Services 以自訂帳戶執行

這必須使用「元件服務」工具或指令碼來設定。不能使用服務元件組件中的 .NET 屬性。

設定 SQL Server

步驟其他資訊

在 SQL Server 電腦上建立 Windows 帳戶,該帳戶與 Enterprise.Services 處理序帳戶相符

使用者名稱和密碼必須符合自訂的 Enterprise Services 帳戶。

將下列權限授與帳戶:
- 從網路存取這台電腦
- 拒絕本機登入
- 以批次工作登入

將 SQL Server 設定為使用 Windows 驗證

 

建立 Enterprise Services 帳戶的 SQL Server 登入

這會授與存取 SQL Server 的權限。

建立新的資料庫使用者,並將其登入名稱對應到資料庫使用者

這會授與存取指定資料庫的權限。

建立新的資料庫使用者角色,並將資料庫使用者新增到角色中

 

建立資料庫使用者角色的資料庫使用權限

授與最小權限
若需詳細資訊,請參閱第 12 單元<資料存取安全性

設定安全通訊

步驟其他資訊

將網站設定為使用 SSL

請參閱本手冊中的<How To:在網頁伺服器上設定 SSL>。

在網頁伺服器和資料庫伺服器間設定為使用 IPSec

請參閱本手冊中的<How To:使用 IPSec 在兩部伺服器間進行安全通訊>。

分析

ASP.NET 和 Enterprise Services 是以最小權限的帳戶執行,因此可減輕攻擊的潛在破壞。如果任一處理序身分識別被洩露,由於帳戶的權限有限,可以縮小損害範圍。如果 ASP.NET 被插入惡意指令碼,也能抑制可能的損害。

ASP.NET 應用程式必須設定模擬,才能將原始呼叫者的安全性內容,傳送到 Enterprise Services 元件 (以支援 Enterprise Services (COM+) 角色式授權)。如果不模擬,則會對處理序身分識別 (亦即 ASP.NET 工作者處理序) 執行角色檢查。模擬會影響資源的授權對象。
如果不模擬,則會對 ASP.NET 處理序身分識別執行系統資源檢查。如果模擬,則會對原始呼叫者執行系統資源檢查。若需從 ASP.NET 存取系統資源的相關資訊,請參閱第 8 單元<ASP.NET 安全性>中的<存取系統資源>。

Enterprise Services (COM+) 角色可用來將存取檢查推進到商務邏輯所在的中介層。此時會在閘道檢查呼叫者、對應呼叫者的角色,並且根據角色呼叫商務邏輯。這可以避免呼叫不必要的後端處理。Enterprise Services (COM+) 角色的另一個優點是可以在部署時使用「元件服務管理員」,建立和管理角色。

對 SQL 執行 Windows 驗證,表示您不用儲存憑證,也不用在網路上傳送憑證。

無法在防火牆中開啟 Windows 驗證需要的通訊埠時,您可以使用本機帳戶與資料庫伺服器上的重複帳戶,執行 Enterprise Services 應用程式。此時就不宜使用 Windows 驗證和網域帳戶。

潛在風險

在資料庫伺服器上使用重複的 Windows 帳戶 (與 Enterprise Services 處理序帳戶相符的帳戶),會增加管理負擔。密碼應該定期執行手動同步更新。

由於 .NET 角色安全性是以 Windows 群組成員資格為基礎,所以這個方案有賴於在正確的細微層次上設定 Windows 群組,以符合存取應用程式的使用者 (共用相同安全性權限) 類別。

回到頁首回到頁首

ASP.NET 連接至 Web 服務再至 SQL Server

這個案例中執行 ASP.NET 網頁的網頁伺服器,連接到遠端伺服器上的 Web 服務。然後,再由這個伺服器連接到遠端資料庫伺服器。以 HR Web 應用程式為例,它提供使用者特有的機密資料。這個應用程式依賴 Web 服務來擷取資料。圖 5 顯示這個應用程式案例的基本模型。

ASP.NET 連接至遠端 Web 服務再至 SQL Server

圖 5.5
ASP.NET 連接至遠端 Web 服務再至 SQL Server

Web 服務公開一個方法,允許個別員工擷取自己的個人詳細資料。唯有經過驗證的個別員工,才能以 Web 應用程式取得詳細資料。Web 服務還提供另一個方法,該方法支援任何員工詳細資料的擷取。只有 HR 或薪資部門的成員可以使用這個功能。這個案例將員工分成 3 個 Windows 群組:

HRDept (HR 部門的成員)
這個群組的成員可以擷取任何員工的詳細資料。

PayrollDept (薪資部門的成員)
這個群組的成員可以擷取任何員工的詳細資料。

員工 (所有員工)
這個群組的成員只能擷取自己的詳細資料。

出於資料機密性的考量,所有節點之間的流量都應該確保其安全。

特性

使用者有 Internet Explorer 5.x 或更新版本。

所有電腦都執行 Windows 2000 或更新版本。

使用者帳戶在單一樹系的 Active Directory 中。

應用程式將原始呼叫者的安全性內容一直傳送到資料庫。

各層都使用 Windows 驗證。

設定網域使用者帳戶可以委派。

資料庫不支援委派。

確保案例安全

這個案例中裝載 ASP.NET Web 應用程式的網頁伺服器,會驗證原始呼叫者身分識別,並將原始呼叫者的安全性內容傳送到裝載 Web 服務的遠端伺服器。這能將授權檢查套用到 Web 方法,以允許或拒絕存取原始呼叫者。資料庫會驗證 Web 服務處理序身分識別 (資料庫信任 Web 服務)。然後,再由 Web 服務呼叫資料庫,並且使用預存程序參數,在應用程式層次上傳遞使用者的身分識別。

表 5.3:安全性措施

類別詳細資料

驗證

Web 應用程式從 IIS 使用「整合式 Windows」驗證,驗證使用者。

Web 服務從 IIS 使用「整合式 Windows」驗證。它會驗證 Web 應用程式委派的原始呼叫者安全性內容。

使用委派,以 Kerberos 驗證通訊協定將原始呼叫者安全性內容從 Web 應用程式傳送到 Web 服務。

使用 ASP.NET 處理序帳戶,以 Windows 驗證連接到資料庫。

授權

Web 應用程式會針對原始呼叫者執行角色檢查,以限制存取網頁。

根據原始呼叫者的 Windows 群組成員資格,使用 .NET 角色,控制存取 Web 服務方法。

安全通訊

使用 SSL,確保原始呼叫者與 Web 應用程式及 Web 服務之間傳送機密資料的安全。

使用 IPSec,確保 Web 服務和資料庫之間傳送機密資料的安全。

結果

圖 5.6 顯示針對這個案例的建議安全性設定。

針對 ASP.NET 連接至 Web 服務再至 SQL Server 內部網路案例所建議的安全性設定

圖 5.6
針對 ASP.NET 連接至 Web 服務再至 SQL Server 內部網路案例所建議的安全性設定

安全性設定步驟

開始之前,可能需要參閱下列資訊:

在網頁伺服器上設定 SSL (請參閱本手冊中的<How To:在網頁伺服器上設定 SSL

設定 IPSec (請參閱本手冊中的<How To:使用 IPSec 在兩部伺服器間進行安全通訊

設定網頁伺服器 (裝載 Web 應用程式)

設定 IIS
步驟其他資訊

停用 Web 應用程式虛擬根目錄的「匿名」存取

啟用 Web 應用程式虛擬根目錄的「Windows 整合式」驗證

 

設定 ASP.NET
步驟其他資訊

設定 ASP.NET Web 應用程式使用 Windows 驗證

編輯 Web 應用程式虛擬目錄中的 Web.config
將 <authentication> 項目設為:

<authentication mode="Windows" />

設定 ASP.NET Web 應用程式以進行模擬

編輯 Web 應用程式虛擬目錄中的 Web.config
將 <identity> 項目設為:

<identity impersonate="true" />

設定應用程式伺服器 (裝載 Web 服務)

設定 IIS
步驟其他資訊

停用 Web 服務虛擬根目錄的「匿名」存取

啟用 Web 服務虛擬根目錄的「Windows 整合式」驗證

 

設定 ASP.NET
步驟其他資訊

將 ASPNET 密碼變更為已知值

ASPNET 是具有最小權限的本機帳戶,預設以它來執行 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 服務虛擬目錄中的 Web.config
將 <authentication> 項目設為:

<authentication mode="Windows" />

確定關閉模擬

預設會關閉模擬,但仍請您再度確定它在 Web.config 中是關閉的,如下所示:

<identity impersonate="false" />

請注意,預設值是關閉模擬,但移除 <identity> 項目,也有相同效果。

設定 SQL Server

步驟其他資訊

在 SQL Server 電腦上,建立一個與用於執行
Web 服務之 ASP.NET 處理序帳戶相符的 Windows 帳戶

使用者名稱和密碼必須與自訂的 ASP.NET 帳戶相符。

將下列權限授與帳戶:
- 從網路存取這台電腦
- 拒絕本機登入
- 以批次工作登入

將 SQL Server 設定為使用 Windows 驗證

 

為自訂的 ASP.NET 帳戶建立 SQL Server 登入

這會授與存取 SQL Server 的權限。

建立新的資料庫使用者,並將其登入名稱對應到資料庫使用者

這會授與存取指定資料庫的權限。

建立新的資料庫使用者角色,並將資料庫使用者新增到角色中

 

建立資料庫使用者角色的資料庫使用權限

授與最小權限

設定安全通訊

步驟其他資訊

在網頁伺服器上將網站設定為使用 SSL

請參閱本手冊中的<How To:在網頁伺服器上設定 SSL>。

在網頁伺服器和資料庫伺服器間設定為使用 IPSec

請參閱本手冊中的<How To:使用 IPSec 在兩部伺服器間進行安全通訊>。

分析

IIS 中的「整合式 Windows」驗證很適合這個案例,因為所有使用者都使用 Windows 2000 或更新版本、Internet Explorer 5.x 或更新版本,而且在 Active Directory 中有帳戶,能夠使用 Kerberos 驗證通訊協定 (支援委派)。這樣則可以跨越電腦界限傳送使用者的安全性內容。

Active Directory 中的使用者帳戶不得標示為「這是機密帳戶,無法委派」。Active Directory 中的網頁伺服器電腦帳戶必須標示為「受信任可以委派」。若需詳細資訊,請參閱本手冊中的<How To:實作 Windows 2000 的 Kerberos 委派>。

網頁伺服器和應用程式伺服器上的 ASP.NET 是以最小權限的本機帳戶 (本機 ASPNET 帳戶) 執行,因此可減輕攻擊的潛在破壞。

Web 服務和 Web 應用程式都設定為使用 Windows 驗證。二台電腦上的 IIS 都設定為使用「整合式 Windows」驗證。

從 Web 應用程式呼叫 Web 服務時,預設不會傳遞憑證。只有在回應下游網頁伺服器上的 IIS 發出網路驗證質詢時,才會需要這些憑證。此時,您必須如下所示,設定 Web 服務 Proxy 的 Credentials 屬性,明確指定所要的憑證:

wsproxy.Credentials = CredentialCache.DefaultCredentials;

若需以憑證呼叫 Web 服務的相關資訊,請參閱第 10 單元<Web 服務安全性>。

Web 應用程式設定為使用模擬功能。因此,從 Web 應用程式呼叫 Web 服務,不但可以傳送原始呼叫者的安全性內容,還允許 Web 服務驗證 (和授權) 原始呼叫者。

在 Web 服務中使用 .NET 角色,根據使用者所屬的 Windows 群組 (HRDept、PayrollDept 和 Employees),授權使用者。HRDept 及 PayrollDept 成員可以擷取每個員工的詳細資料,而 Employees 群組成員只能擷取自己的詳細資料。
如下列程式碼範例所示,Web 方法可以使用 PrincipalPermissionAttribute 類別進行註解,要求特定的角色成員。請注意,PrincipalPermission 可以取代 PrincipalPermissionAttribute。這是所有 .NET 屬性類型的一般特性。

[WebMethod]
[PrincipalPermission(SecurityAction.Demand,
                  Role=@"DomainName\HRDept)]
public DataSet RetrieveEmployeeDetails()
{
}

上述程式碼中的屬性表示,只有 DomainName\HRDept Windows 群組成員才能呼叫 RetrieveEmployeeDetails 方法。非成員呼叫這個方法時,會發生安全性例外狀況。

Web 應用程式和 Web 服務中的「ASP.NET 檔案授權」,會對在 IIS Metabase (將檔案類型對應到 Aspnet_isapi.dll) 中有對應之任何檔案類型的呼叫者,執行 ACL 檢查。沒有 ISAPI 對應的靜態檔案類型 (例如 .jpg、.gif、.htm 等),則由 IIS 來檢查 (同樣使用檔案附加的 ACL)。

因為 Web 應用程式已設定為使用模擬功能,所以應用程式本身存取的資源必須設定 ACL,至少要將讀取權授與原始呼叫者。

Web 服務不模擬或不委派,因此它使用 ASP.NET 處理序身分識別,存取本機系統資源和資料庫。最後,所有呼叫都是以單一處理序帳戶進行的。這樣則可以使用資料庫連接共用。如果資料庫不支援委派 (例如 SQL Server 7.0 或更早版本),這個案例是很好的選擇。

對 SQL Server 執行 Windows 驗證,表示您不用將憑證儲存在網頁伺服器上,也不用透過網路將憑證傳遞給 SQL Server 電腦。

原始呼叫者和網頁伺服器之間的 SSL,可以保護與 Web 應用程式相互傳遞的資料。

下游網頁伺服器和資料庫之間的 IPSec,可以保護與資料庫相互傳遞的資料。

潛在風險

在資料庫伺服器上使用重複的 Windows 帳戶 (與 ASP.NET 處理序帳戶相符的帳戶),會增加管理負擔。密碼應該定期執行手動同步更新。
或者,您可以使用具有最小權限的網域帳戶。若需選擇 ASP.NET 處理序身分識別的相關資訊,請參閱第 8 單元<ASP.NET 安全性>。

由於 .NET 角色安全性是以 Windows 群組成員資格為基礎,所以這個方案有賴於在正確的細微層次上設定 Windows 群組,以符合存取應用程式的使用者 (共用相同安全性權限) 類別。

Kerberos 委派是無限制的,因此您必須小心控制網頁伺服器上執行的應用程式身分識別。若要提高安全門檻,您應該從 Domain Users 群組中移除該網域帳戶,以限制該帳戶的接觸範圍,並且只讓適當的電腦存取。若需相關資訊,請參閱 Microsoft 網站上的白皮書《Default Access Control Settings (英文)》,網址為: http://www.microsoft.com/windows2000/techinfo/planning/security/secdefs.asp

問題與解答

資料庫不知道誰是原始呼叫者。要如何才可以建立稽核追蹤?

稽核 Web 服務中的使用者活動,或將使用者身分識別明確地作為資料存取呼叫的參數來傳遞。

相關案例

如果您要連接到非 SQL Server 資料庫,或正在使用 SQL 驗證,則必須使用連接字串,明確地傳遞資料庫帳戶憑證。這樣做時,請務必將連接字串儲存在安全的地方。

若需相關資訊,請參閱第 12 單元<資料存取安全性>中的<安全儲存資料庫連接字串>。

回到頁首回到頁首

ASP.NET 連接至遠端再至 SQL Server

這個案例中執行 ASP.NET 網頁的網頁伺服器,能安全連接到遠端應用程式伺服器上的遠端元件。網頁伺服器透過 HTTP 通道,使用「.NET 遠端處理」與元件通訊。圖 5.7 顯示 ASP.NET 裝載的遠端元件。

ASP.NET 使用「.NET 遠端處理」連接至遠端再至 SQL Server

圖 5.7
ASP.NET 使用「.NET 遠端處理」連接至遠端再至 SQL Server

特性

使用者有各種類型的網頁瀏覽器。

由 ASP.NET 裝載遠端元件。

Web 應用程式使用 HTTP 通道,與遠端元件通訊。

ASP.NET 應用程式呼叫 .NET 遠端元件,並傳遞驗證用的原始呼叫者憑證。這些憑證可從「基本」驗證取得。

這是機密資料,必須確保它在處理序和電腦之間傳送時的安全。

確保案例安全

這個案例中裝載 ASP.NET Web 應用程式的網頁伺服器,會驗證原始呼叫者。Web 應用程式可以從 HTTP 伺服器變數,擷取呼叫者的驗證憑證 (使用者名稱和密碼)。然後,藉由設定遠端元件 Proxy,使用憑證連接到裝載遠端元件的應用程式伺服器。資料庫使用 Windows 驗證,驗證 ASP.NET 處理序身分識別 (亦即資料庫信任遠端元件)。然後,再由遠端元件呼叫資料庫,並且使用預存程序參數,在應用程式層次上傳遞原始呼叫者的身分識別。

表 5.4:安全性措施

類別詳細資料

驗證

從 IIS 使用「基本」驗證,驗證使用者 (除了 SSL 之外)。

從遠端元件 (ASP.NET/IIS) 使用 Windows 驗證。

使用 Windows 驗證,以最小權限的 ASP.NET 帳戶連接到資料庫。

授權

對網頁伺服器上的原始呼叫者,執行 ACL 檢查。

在遠端元件中,對原始呼叫者執行角色檢查。

對 ASP.NET (遠端元件) 身分識別授與資料庫使用權限。

安全通訊

使用 SSL,確保使用者與 Web 應用程式及 IIS 中裝載的遠端物件之間傳送機密資料的安全。

使用 IPSec,確保網頁伺服器和資料庫之間傳送機密資料的安全。

結果

圖 5.8 顯示針對這個案例的建議安全性設定。

針對 ASP.NET 連接至遠端 Web 服務再至 SQL Server 內部網路案例所建議的安全性設定

圖 5.8
針對 ASP.NET 連接至遠端 Web 服務再至 SQL Server 內部網路案例所建議的安全性設定

安全性設定步驟

開始之前,可能需要參閱下列資訊:

建立具有最小權限的資料庫帳戶 (請參閱第 12 單元<資料存取安全性>)

在網頁伺服器上設定 SSL (請參閱本手冊中的<How To:在網頁伺服器上設定 SSL

設定 IPSec (請參閱本手冊中的<How To:使用 IPSec 在兩部伺服器間進行安全通訊

設定網頁伺服器

設定 IIS
步驟其他資訊

停用 Web 應用程式虛擬根目錄的「匿名」存取

啟用「基本」驗證



使用 SSL 保護「基本」驗證憑證。

設定 ASP.NET
步驟其他資訊

設定 ASP.NET Web 應用程式使用 Windows 驗證

編輯應用程式虛擬根目錄中的 Web.config
將 <authentication> 項目設為:

<authentication mode="Windows" />

設定應用程式伺服器

設定 IIS
步驟其他資訊

停用 Web 應用程式虛擬根目錄的「匿名」存取

啟用「整合式 Windows」驗證

 

設定遠端元件 (在 ASP.NET 中) 使用 Windows 驗證

編輯遠端元件虛擬根目錄中的 Web.config
將 <authentication> 項目設為:

<authentication mode="Windows" />

將 ASPNET 密碼變更為已知值

ASPNET 是具有最小權限的本機帳戶,預設以它來執行 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 公用程式已用於將加密密碼儲存在登錄中。

確定關閉模擬

預設為關閉模擬,但仍請您再度確定它在 Web.config 中是關閉的,如下所示:

<identity impersonate="false" />

藉由移除 <identity> 項目,可以達到相同的效果。

設定 SQL Server

步驟其他資訊

在 SQL Server 電腦上,建立一個與用於執行
Web 服務之 ASP.NET 處理序帳戶相符的 Windows 帳戶

使用者名稱和密碼必須與自訂的 ASP.NET 帳戶相符。

將下列權限授與帳戶:
- 從網路存取這台電腦
- 拒絕本機登入
- 以批次工作登入

將 SQL Server 設定為使用 Windows 驗證

 

為自訂的 ASP.NET 帳戶建立 SQL Server 登入

這會授與存取 SQL Server 的權限。

建立新的資料庫使用者,並將其登入名稱對應到資料庫使用者

這會授與存取指定資料庫的權限。

建立新的資料庫使用者角色,並將資料庫使用者新增到角色中

 

建立資料庫使用者角色的資料庫使用權限

授與最小權限

設定安全通訊

步驟其他資訊

在網頁伺服器上將網站設定為使用 SSL

請參閱本手冊中的<How To:在網頁伺服器上設定 SSL>。

在應用程式伺服器上將網站設定為使用 SSL

請參閱本手冊中的<How To:在網頁伺服器上設定 SSL>。

將應用程式伺服器和資料庫伺服器間設定為使用 IPSec

請參閱本手冊中的<How To:使用 IPSec 在兩部伺服器間進行安全通訊>。

分析

網頁伺服器和應用程式伺服器上的 ASP.NET 是以最小權限的本機帳戶執行,因此可減輕攻擊的潛在破壞。雙方都使用預設 ASP.NET 帳戶。
使用 ASPNET 本機帳戶 (在 SQL Server 電腦上重複),可以進一步降低可能的安全性風險。資料庫伺服器上重複的 Windows 帳戶,允許遠端元件使用最小權限的 ASP.NET 帳戶,在應用程式伺服器上執行。

網頁伺服器的「基本」驗證,允許 Web 應用程式以使用者憑證回應應用程式伺服器的 Windows 驗證質詢。
Web 應用程式為了以呼叫者憑證來呼叫遠端元件,於是將遠端元件 Proxy 設定為下列的程式碼片段。

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;

若需將安全性憑證傳送到遠端元件的相關資訊,請參閱第 11 單元<.NET 遠端處理安全性>。

ASP.NET Web 應用程式不啟用模擬,因為遠端 Proxy 是以「基本」驗證取得的使用者憑證而特別設定的。Web 應用程式存取的任何其他資源,使用 ASP.NET 處理序帳戶提供的安全性內容。

使用者和網頁伺服器之間的 SSL,可以保護與網頁伺服器相互傳遞的資料,以及驗證處理程序期間以純文字方式傳遞的「基本」憑證。

應用程式伺服器的「整合式 Windows」驗證,提供原始呼叫者的 .NET 角色檢查。這些角色對應到 Windows 群組。

即使不模擬,也能執行角色式檢查。

「ASP.NET 檔案授權」會對在 IIS Metabase (將檔案類型對應到 aspnet_isapi.dll) 中有對應之任何檔案類型的呼叫者,執行 ACL 檢查。IIS 會對靜態檔案 (未對應到 IIS 中的 ISAPI 擴充程式) 執行存取檢查。

由於應用程式伺服器未啟用模擬,於是遠端元件使用 ASP.NET 安全性內容來存取本機或遠端資源。此外,別忘了設定 ACL。

對 SQL Server 執行 Windows 驗證,表示您不用將憑證儲存在應用程式伺服器上,也不用透過網路將憑證傳遞給 SQL Server 電腦。

潛在風險

在資料庫伺服器上使用重複的 Windows 帳戶 (與 ASP.NET 處理序帳戶相符的帳戶),會增加管理負擔。密碼應該定期執行手動同步更新。

由於 .NET 角色安全性是以 Windows 群組成員資格為基礎,所以這個方案有賴於在正確的細微層次上設定 Windows 群組,以符合存取應用程式的使用者 (共用相同安全性權限) 類別。

相關案例

網頁伺服器使用 Kerberos 來驗證呼叫者。Kerberos 委派可將原始呼叫者的安全性內容,傳送到應用程式伺服器上的遠端元件。

這個作法需要將所有使用者帳戶都設定為可以委派。Web 應用程式也會設定模擬,並使用 DefaultCredentials 設定遠端元件 Proxy。若需這個技術的相關資訊,請參閱第 11 單元<.NET 遠端處理安全性>中的<傳送原始呼叫者>。

回到頁首回到頁首

將原始呼叫者傳送到資料庫

前述案例使用信任的子系統模型,資料庫也完全信任應用程式伺服器或網頁伺服器能正確的驗證和授權使用者。信任的子系統模型有許多優點,有些案例 (也許為了稽核) 可能會要求您使用模擬/委派模型,將原始呼叫者的安全性內容跨越電腦界限,傳送到資料庫。

需要將原始呼叫者傳送到資料庫,通常有下列幾個原因:

您必須在資料庫中精細存取,而且使用權限受限於物件。特定的使用者或群組可以讀取,其他使用者或群組可以寫入到個別物件。
相比之下,在較粗略的工作授權中,由角色成員決定特定物件的讀取及寫入功能。

您可能想使用平台稽核功能,取代傳送身分識別以及在應用程式層次上執行稽核。

如果您選擇模擬/委派模型 (或因公司安全性原則要求),要將原始呼叫者的內容透過應用程式層傳送到後端處理,則設計時必須考量委派和網路存取 (如果跨越多重電腦,則更具重要性)。共用資源集區 (例如資料庫連線) 會成為一大問題,可能會大幅降低應用程式的延展性。

本節提供兩個常見應用程式案例的模擬/委派實作方式介紹:

ASP.NET 連接至 SQL Server

ASP.NET 連接至 Enterprise Services 再至 SQL Server

若需信任的子系統模型與模擬/委派模型及其相對優點的相關資訊,請參閱第 3 單元<驗證及授權>。

ASP.NET 連接至 SQL Server

這個案例中使用原始呼叫者的安全性內容,呼叫資料庫。本節介紹的驗證選項,包含「基本」驗證和「整合式 Windows」驗證。若需 Kerberos 委派案例的相關資訊,請參閱<ASP.NET 連接至 Enterprise Services 再至 SQL Server>。

在網頁伺服器上使用基本驗證

下列「基本」驗證的組態設定,可讓您將原始呼叫者一直傳送到資料庫。

資料表 5.5: 安全性措施

類別詳細資料

驗證

從 IIS 使用「基本」驗證,驗證使用者。

在 ASP.NET 中使用 Windows 驗證。

在 ASP.NET 中開啟模擬。

使用 Windows 驗證,與 SQL Server 通訊。

授權

對網頁伺服器上的原始呼叫者,執行 ACL 檢查。

如果原始呼叫者對應到 Windows 群組 (基於應用程式的需求,例如「管理員」、「出納員」等),您可以對原始呼叫者使用 .NET 角色檢查,限制方法的存取。

安全通訊

使用 SSL,確保網頁伺服器和資料庫之間傳送純文字憑證的安全。

使用 IPSec,確保網頁伺服器和資料庫之間傳送機密資料的安全。

使用這個作法時,請注意下列幾點:

「基本」驗證以快顯對話方塊提示使用者鍵入憑證 (使用者名稱和密碼)。

資料庫必須辨識原始呼叫者。如果網頁伺服器和資料庫分屬不同網域,則必須啟用適當的信任關係,讓資料庫驗證原始呼叫者。

在網頁伺服器上使用整合式 Windows 驗證

「整合式 Windows」驗證會產生 NTLM 或 Kerberos 驗證,並與用戶端和伺服器電腦設定相關。

NTLM 驗證不支援委派,因而無法將原始呼叫者的安全性內容,從網頁伺服器傳送到實體的遠端資料庫。瀏覽器和網頁伺服器之間使用 NTLM 驗證允許的單一網路躍點。您必須在網頁伺服器上安裝 SQL Server,才能使用 NTLM 驗證;這只適合非常小的內部網路應用程式。

ASP.NET 連接至 Enterprise Services 再至 SQL Server

這個案例中的 ASP.NET 網頁呼叫遠端 Enterprise Services 應用程式中裝載的商業元件,用來連接資料庫。原始呼叫者的安全性內容,會從瀏覽器一直傳送到資料庫。如圖 5.9 所示。

ASP.NET 呼叫 Enterprise Services 中的元件,用它來呼叫資料庫

圖 5.9
ASP.NET 呼叫 Enterprise Services 中的元件,用它來呼叫資料庫

特性

使用者有 Internet Explorer 5.x 或更新版本。

所有電腦都是 Windows 2000 或更新版本。

在單一樹系的 Active Directory 中維護使用者帳戶。

應用程式將原始呼叫者的安全性內容 (在作業系統層次上) 一直傳送到資料庫。

各層都使用 Windows 驗證。

設定網域使用者帳戶可以委派,Active Directory 中用來執行 Enterprise Services 應用程式的帳戶必須標示為「受信任可以委派」。

確保案例安全

這個案例中的網頁伺服器會驗證呼叫者。然後,您必須設定 ASP.NET 使用模擬功能,才能將原始呼叫者的安全性內容,傳送到遠端 Enterprise Services 應用程式。Enterprise Services 應用程式中的元件程式碼必須明確模擬呼叫者 (使用 CoImpersonateClient),呼叫者的內容才能傳送到資料庫。

表 5.6:安全性措施

類別詳細資料

驗證

各層都支援 Kerberos 驗證 (網頁伺服器、應用程式伺服器和資料庫伺服器)。

授權

以 Enterprise Services (COM+) 角色,在中介層對原始呼叫者的身分識別執行授權檢查。

安全通訊

使用 SSL,確保瀏覽器和網頁伺服器之間傳送機密資料的安全。

遠端 Enterprise Services 應用程式中的服務元件和 ASP.NET 之間,使用「RPC 封包私密性」(提供加密)。

服務元件和資料庫之間使用 IPSec。

結果

圖 5.10 顯示針對這個案例的建議安全性設定。

ASP.NET 呼叫 Enterprise Services 中的元件,用它來呼叫資料庫。原始呼叫者的
安全性內容會傳送到資料庫。

圖 5.10
ASP.NET 呼叫 Enterprise Services 中的元件,用它來呼叫資料庫。原始呼叫者的安全性內容,會傳送到資料庫。

安全性設定步驟

開始之前,請先注意下列幾個設定問題:

Active Directory 中的 Enterprise Services 處理序帳戶必須標示為「受信任可以委派」,而使用者帳戶不得標示為「這是機密帳戶,無法委派」。若需相關資訊,請參閱本手冊中的<How To:實作 Windows 2000 的 Kerberos 委派>。

所有電腦都需要 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 (英文)>。

設定網頁伺服器 (IIS)
步驟其他資訊

停用 Web 應用程式虛擬根目錄的「匿名」存取

啟用「Windows 整合式」驗證

 

設定網頁伺服器 (ASP.NET)
步驟其他資訊

設定 ASP.NET Web 應用程式使用 Windows 驗證

編輯 Web 應用程式虛擬根目錄中的 Web.config
將 <authentication> 項目設為:

<authentication mode="Windows" />

設定 ASP.NET Web 應用程式以進行模擬

編輯 Web 應用程式虛擬目錄中的 Web.config
將 <identity> 項目設為:

<identity impersonate="true" />

設定 ASP.NET Web 應用程式用來傳出呼叫的 DCOM 模擬等級

ASP.NET Web 應用程式透過 DCOM 呼叫遠端服務元件。從 ASP.NET 發出傳出呼叫時的預設模擬等級是 Impersonate。在 Machine.config 中必須將其變更為 Delegate。

編輯 Machine.config,尋找 <processModel> 項目,並將 comImpersonateLevel 屬性設為 "Delegate",如下所示。

<processModel comImpersonationLevel="Delegate"

在用戶端設定 DCOM 驗證等級

DCOM 驗證等級是由用戶端和伺服器共同決定的。這個案例中的 DCOM 用戶端是 ASP.NET。

編輯 Machine.config,尋找 <processModel> 項目,並將 comAuthenitcationLevel 屬性設為 "PktPrivacy",如下所示。

<processModel
comAuthenticationLevel="PktPrivacy"
設定服務元件 (和應用程式伺服器)
步驟其他資訊

Managed 類別必須繼承自 ServicedComponent 類別

請參閱 Microsoft 知識庫文件 Q306296<HOW TO:Create a Serviced .NET Component in Visual C# .NET (英文)>。

將程式碼新增到服務元件中,以模擬呼叫者;作法是先從 OLE32.DLL 呼叫 CoImpersonateClient() CoRevertToSelf() API,然後存取遠端資源 (例如,資料庫),以使用呼叫者的內容。傳出呼叫預設會使用 Enterprise Services 處理序內容。

加入 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();
 }
 

先呼叫外部函式,然後呼叫遠端資源:

COMSec.CoImpersonateClient();
COMSec.CoRevertToSelf();

若需相關資訊,請參閱第 9 單元<Enterprise Services 安全性>。

將 Enterprise Services 應用程式設定為伺服器應用程式

設定時,您可以使用「元件服務」工具,或透過服務元件組件中的下列 .NET 屬性。

  [assembly:
  ApplicationActivation(ActivationOption.Server)]
  

設定 Enterprise Services 應用程式使用封包私密性驗證 (以加密方式提供安全通訊)

將下列 .NET 屬性新增到服務元件組件。

[assembly: ApplicationAccessControl(
	  Authentication =
	  AuthenticationOption.Privacy)]

設定 Enterprise Services 應用程式以提供元件等級角色安全性

使用下列屬性,按處理序和元件等級 (包含介面和類別) 設定角色檢查。

 [assembly: 
ApplicationAccessControl(AccessChecksLevel= 
AccessChecksLevelOption. ApplicationComponent)]

使用下列屬性,裝飾類別:

 [ComponentAccessControl(true)]

若需設定介面及方法等級角色檢查的相關資訊,請參閱第 9 單元<Enterprise Services 安全性>中的<設定安全性>。

在 Active Directory 中建立用來執行 Enterprise Services 的自訂帳戶,並且標示為「受信任可以委派」

Enterprise Services 應用程式必須作為 Active Directory 中標示為「受信任可以委派」的網域帳戶來執行。若需相關資訊,請參閱本手冊中的<How To:實作 Windows 2000 的 Kerberos 委派>。

設定 Enterprise Services 以自訂帳戶執行

這必須使用「元件服務」工具或指令碼來設定。不能使用服務元件組件中的 .NET 屬性。

設定資料庫伺服器 (SQL Server)
步驟其他資訊

將 SQL Server 設定為使用 Windows 驗證

 

為使用者所屬 Windows 群組建立 SQL Server 登入。

這會授與存取 SQL Server 的權限。
存取控制原則將 Windows 群組視為角色。
例如,您可能有 EmployeesHRDept PayrollDept 等群組。

為每個 SQL Server 登入建立新的資料庫使用者

這會授與存取指定資料庫的權限。

建立資料庫使用者的資料庫使用權限

授與最小權限
若需相關資訊,請參閱第 12 單元<資料存取安全性>。

分析

Kerberos 驗證會產生委派層次語彙基元,它是傳送原始呼叫者之安全性內容的關鍵。伺服器處理序 (IIS) 可以將收到的委派層次語彙基元,傳遞給同一台電腦上任何帳戶下執行的任何其他處理序,而不必變更其委派層次。即使工作者處理序是以本機或網域帳戶執行也不要緊。但是要注意 IIS 是以何種身分執行。如果不是以 LocalSystem 執行,執行的帳戶必須在 Active Directory 中標示為「受信任可以委派」。
如果 IIS 是以 LocalSystem 執行,電腦帳戶必須標示為「受信任可以委派」。若需相關資訊,請參閱本手冊中的<How To:實作 Windows 2000 的 Kerberos 委派>。

IIS 中的「整合式 Windows」驗證 (使用 Kerberos) 很適合這個案例,因為所有使用者都有 Windows 帳戶,而且使用 Internet Explorer 5.x 或更新版本。「整合式 Windows」驗證的優點是不在線路上傳送使用者密碼。此外,因為 Windows 使用目前互動式使用者的登入工作階段,所以登入是透明的。

ASP.NET 會建構 WindowsPrincipal 物件,並將它附加到目前的 Web 要求內容 (HttpContext.User)。如果您必須在 Web 應用程式中執行授權檢查,則可以使用下列程式碼。

WindowsPrincipal wp = (HttpContext.Current.User as WindowsPrincipal);
if ( wp.IsInRole("管理員") )
{
  // 授權使用者執行管理員特定的功能
}

ASP.NET FileAuthorizationModule 會對 ASP.NET 檔案類型 (它們在 IIS 中會對應到 Aspnet_isapi.dll) 的原始呼叫者,執行 ACL 檢查。IIS 相當於 .jpg、.gif 及 .htm 檔案等靜態檔案類型的Gatekeeper,它使用原始呼叫者身分識別,執行存取檢查。

對 SQL 執行 Windows 驗證,您則不用將憑證儲存在應用程式伺服器的檔案中,也不用在網路上傳遞憑證。例如,將 Trusted_Connection 屬性併入連接字串中:

ConStr="server=YourServer; database=yourdatabase; Trusted_Connection=Yes;"

原始呼叫者的內容在所有層上傳送,很容易稽核。您可以使用平台層次稽核 (例如,Windows 和 SQL Server 提供的稽核功能)。

潛在風險

如果您在 Windows 2000 上使用 Internet Explorer 6.0,則所交涉的預設驗證機制是 NTLM (而非 Kerberos)。若需相關資訊,請參閱 Microsoft 知識庫文件 Q299838<Unable to Negotiate Kerberos Authentication After Upgrading to Internet Explorer 6 (英文)>。

與使用可信任的子系統模型相比,在各層間委派使用者,需要耗費很大的效能和應用程式延展性。資料庫的連線與原始呼叫者的安全性內容相關,因而無法有效運用集區,也就無法發揮資料庫連接共用的優點。

這個作法也要求 Windows 群組的細微層次符合應用程式的安全性需要。亦即必須在正確的細微層次上設定 Windows 群組,以符合存取應用程式的使用者 (共用相同安全性權限) 類別。

回到頁首回到頁首

摘要

本單元介紹了如何確保常見內部網路應用程式案例集的安全。

若需外部網路及網際網路應用程式案例的相關資訊,請參閱第 6 單元<外部網路安全性>及<網際網路安全性>。


回到頁首回到頁首