| 本單元內容 | |
| 目標 | |
| 適用於 | |
| 如何使用本單元 | |
| 開始之前 | |
| 公開 Web 服務 | |
| 公開 Web 應用程式 | |
| 摘要 |
外部網路是一種邏輯網路,允許兩個或多個組織跨越共用的 (甚或是公用的) 實體網路,共用資源及應用程式。多個組織的參與使得外部網路應用程式的安全性架構變得複雜,因為應用程式必須與各個組織的 (通常為) 分散系統及標準整合。應用程式使用共用的或公用的網路,因此必須將受信任的與不受信任的使用者區別開來,並確保受信任的組織彼此都看不到各自的機密資訊。此外,在應用程式處理機密資訊或具有商業價值的資訊時,使用安全通訊通道很重要。
本單元藉由著重描述部份常用分散式應用程式架構的需求,來說明用於解決外部網路架構 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 應用程式時所使用之架構及技術的概觀,並強調指出驗證、授權及安全通訊在何處適用於此架構。 | ||||||||||||
| • | 搭配使用目前的單元與下列示範此單元中所討論之技術的單元:
|
外部網路應用程式是那些在兩個不同公司或部門之間,共用資源或應用程式的程式。這些應用程式和資源是經由網際網路公開的。外部網路應用程式的一個主要挑戰是發展出雙方都能接受的驗證作法。因為可能需要與現有驗證機制相互溝通,所以您在這方面的選擇會很有限。
外部網路應用程式通常具有下列共同特性:
| • | 與網際網路案例相比,您具有更嚴格的使用者帳戶控制。 |
| • | 與具有網際網路使用者的應用程式相比,您具有更高的使用者帳戶信任層級。 |
本單元提出的案例可用於說明建議的驗證、授權及安全通訊技術,其中包括:
| • | 公開 Web 服務 |
| • | 公開 Web 應用程式 |
注意:本單元中描述的案例會變更用於執行 ASP.NET 應用程式的預設 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 (英文)>。
請考量一個企業夥伴間交換資訊的案例,該案例中有一家出版公司經由網際網路發行並銷售服務。該公司使用 Web 服務將資訊向選定的合作公司公開。每家合作公司的使用者會使用內部網路架構的內部 Web 應用程式存取 Web 服務。這個案例如圖 6.1 所示。

圖 6.1
企業夥伴間交換資訊的外部網路 Web 服務
這個案例具有下列特性:
| • | 出版公司經由網際網路公開 Web 服務。 |
| • | 由出版商驗證合作公司 (非個別使用者) 的憑證 (X.509 用戶端憑證),以授權存取資源。出版商不需要知道在合作公司使用者的個別登入。 |
| • | 用戶端憑證會對應到出版公司的 Active Directory® 目錄服務帳戶。 |
| • | 外部網路包含另一套 Active Directory,有別於 (內部) 公司的 Active Directory。外部網路 Active Directory 在單獨的樹系中,它提供個別的信任界限。 |
| • | Web 服務授權是根據對應的 Active Directory 帳戶而定。您可以根據合作公司的身分識別 (以每家公司的個別 Active Directory 帳戶表示),來使用不同的授權決策。 |
| • | 您可用對應 ASP.NET Web 服務處理序身分識別的單一受信任連線,存取資料庫。 |
| • | 從 Web 服務擷取的資料是機密的,在傳輸 (出版公司內部或網際網路外部進行傳送) 時必須確保其安全。 |
在這個案例中,每家合作公司的內部 Web 應用程式會透過 Web 服務擷取出版公司的資料,然後再將擷取的資料展示給使用者。雖然合作公司中個別使用者的身分識別沒有關聯,但出版商需要一種安全機制來驗證合作公司。
因為兩家公司經由網際網路傳送機密性資料,所以在傳輸時必須使用 SSL 進行保護。
使用只允許從外部網路合作公司 IP 位址傳來之輸入連線的防火牆,可避免其他未授權的網際網路使用者開啟 Web 服務伺服器的網路連線。
表 6.1:安全性措施
| 類別 | 詳細資料 | ||||||
驗證 |
| ||||||
授權 |
| ||||||
安全通訊 |
|
圖 6.2 顯示針對這個案例的建議安全性設定。

圖 6.2
針對企業夥伴間交換資訊案例之 Web 服務所建議的安全性設定
開始之前,可能需要參閱下列資訊:
| • | 建立自訂 ASP.NET 帳戶 (請參閱本手冊中的<How To:建立自訂帳戶以執行 ASP.NET> |
| • | 建立具有最小權限的資料庫帳戶 (請參閱第 12 單元<資料存取安全性>) |
| • | 在網頁伺服器上設定 SSL (請參閱本手冊中的<How To:在網頁伺服器上設定 SSL> |
| • | 設定 IPSec (請參閱本手冊中的<How To:使用 IPSec 在兩部伺服器間進行安全通訊> |
| • | 設定通過防火牆的 IPSec (請參閱 Microsoft® 知識庫文件 Q233256<How to Enable IPSec Traffic Through a Firewall (英文)>。 |
| • | 使用 SSL 呼叫 Web 服務 (請參閱本手冊中的<How To:使用 SSL 呼叫 Web 服務>);在合作公司內需要這種解決技術 |
| • | 憑證管理及基礎結構不在本主題討論的範圍之內,若需相關資訊,請在 Microsoft TechNet 上搜尋<Certificates and Authenticode (英文)>。 |
本單元並不準備詳細說明夥伴應用程式及其安全性設定。然而,需要考量下列幾點,以支援夥伴應用程式和 Web 服務間的通訊:
| • | 合作公司的 Web 應用程式可以選擇一種驗證機制,以驗證和授權其內部的使用者。這些使用者不會傳送到 Web 服務做進一步驗證。 |
| • | 合作公司的 Web 應用程式會代替其使用者呼叫 Web 服務。使用者不可直接呼叫 Web 服務。 |
| • | 合作公司的 Web 應用程式會使用用戶端憑證,向 Web 服務證明其身分識別。 |
| • | 如果夥伴應用程式是一種 ASP.NET Web 應用程式,則它必須使用中繼跨處理序元件 (Enterprise Services 應用程式或 Windows 服務),載入憑證並將之轉送到 Web 服務。 |
| 設定 IIS | |
| 步驟 | 其他資訊 |
停用 Web 服務虛擬根目錄的「匿名」存取
| 若要進行 IIS 驗證設定,請使用 IIS MMC 嵌入式管理單元。選取應用程式的虛擬目錄,並在其上按一下滑鼠右鍵後,再按 [內容]。 請參閱本手冊中的<How To:在網頁伺服器上設定 SSL>。 |
| 設定 Active Directory (外部網路) | |
| 步驟 | 其他資訊 |
設定 Active Directory 帳戶來代表合作公司 | 使用個別的外部網路 Active Directory。這個目錄屬於其自己的樹系,完全與公司的 Active Directory 分開。 |
設定憑證對應 | 請參閱 Microsoft 知識庫文件 Q313070<HOW TO:Configure Client Certificate Mappings in IIS 5.0 (英文)>。 |
| 設定 ASP.NET (Web 服務) | ||
| 步驟 | 其他資訊 | |
設定 ASP.NET Web 服務使用 Windows 驗證 | 編輯 Web 服務虛擬根目錄中的 Web.config <authentication mode="Windows" /> | |
將 ASPNET 帳戶 (用於執行 ASP.NET) 的密碼重設為已知的增強式密碼 | 執行此作業可讓您在資料庫伺服器上,建立重複的本機帳戶 (使用相同的使用者名稱和密碼)。若要讓 ASPNET 帳戶在使用 Windows 驗證連接時,可以回應資料庫伺服器的網路驗證質詢,則需要進行此作業。 另一個方法是使用最小權限的網域帳戶 (如果允許通過防火牆進行 Windows 驗證)。若需相關資訊,請參閱第 8 單元<ASP.NET 安全性>中的<ASP.NET 的處理序身分識別>。 編輯位於 %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 公用程式已用於將加密密碼儲存在登錄中。 | |
| 步驟 | 其他資訊 |
在執行 Microsoft SQL Server 的電腦上,建立一個與用於執行 Web 服務之 ASP.NET 處理序帳戶相符的 Windows 帳戶 (預設為 ASPNET) | 使用者名稱和密碼必須符合 ASP.NET 處理序帳戶。 將下列權限授與帳戶: |
將 SQL Server 設定為使用 Windows 驗證 |
|
為 ASPNET 帳戶建立 SQL Server 登入 | 這會授與存取 SQL Server 的權限。 |
建立新的資料庫使用者,並將其登入名稱對應到資料庫使用者 | 這會授與存取指定資料庫的權限。 |
在資料庫中建立一個使用者定義的新資料庫角色,然後將資料庫使用者放入角色中 |
|
建立資料庫角色的資料庫使用權限 | 授與最小權限 |
| 步驟 | 其他資訊 |
在網頁伺服器上將網站設定為使用 SSL | 請參閱本手冊中的<How To:在網頁伺服器上設定 SSL>。 |
在網頁伺服器和資料庫伺服器間設定為使用 IPSec | 請參閱本手冊中的<How To:使用 IPSec 在兩部伺服器間進行安全通訊>。 |
| • | 網頁伺服器上的 ASP.NET 是以最小權限的本機帳戶 (預設 ASPNET 帳戶) 執行,因此可減輕攻擊的潛在破壞。 |
| • | 合作公司的 ASP.NET Web 應用程式使用「Windows 整合式」驗證並執行授權,以決定可存取 Web 服務的人員。 |
| • | 合作公司的 ASP.NET Web 應用程式使用中繼 Enterprise Services 應用程式擷取用戶端憑證,並呼叫 Web 服務。 |
| • | 出版公司使用夥伴組織名稱 (包含在憑證內),在 IIS 中執行憑證對應的工作。 |
| • | Web 服務使用對應的 Active Directory 帳戶,來執行以 PrincipalPermission 要求及 .NET 角色檢查的授權。 |
| • | 對 SQL Server 執行 Windows 驗證,表示您不用在網頁伺服器上儲存憑證,也不用透過內部網路將憑證傳送到 SQL Server 電腦。如果使用 SQL 驗證,則在應用程式中以及在網路上傳送時,確保連接字串 (包含使用者名稱和密碼) 的安全非常重要。在 Web 服務及資料庫之間傳送連接字串時,請使用 DPAPI 或第 12 單元<資料存取安全性>中所討論的其中一種替代安全儲存策略,儲存連線字串,並使用 IPSec 保護連接字串 (以及機密應用程式資料)。 |
| • | 合作公司和 Web 服務間的 SSL 能保護在網際網路上傳送的資料。 |
| • | Web 服務和資料庫間的 IPSec 能保護在公司網路上資料庫間來回傳送的資料。在夥伴和出版商經由私人網路通訊的案例中,除了安全通訊外,還可能會使用 IPSec 進行電腦驗證。 |
| • | 在資料庫伺服器上使用重複的本機 Windows 帳戶 (在 IIS 上與 ASP.NET 處理序帳戶相符的帳戶),會增加管理負擔。密碼必須定期執行手動同步更新。 |
| • | 由於 .NET 角色安全性是以 Windows 群組成員資格為基礎,所以這個方案有賴於在正確的細微層次上設定 Windows 群組,以符合存取應用程式的使用者 (共用相同安全性權限) 類別。在本案例中,Active Directory 帳戶必須是「夥伴」群組中的成員。 |
| • | 資料庫不知道誰是原始呼叫者。要如何才可以建立稽核追蹤? |
出版公司可能會發行一些像雜誌、報紙暫時複本這樣的非機密資料。在這個案例中,出版商可以提供唯一的使用者名稱和密碼,供每個夥伴使用來連接並擷取 Web 服務中的資料。
在這個相關案例中,會將出版商的網站設定為使用「基本」驗證來驗證使用者。夥伴應用程式會使用使用者名稱和密碼,明確地設定 Web 服務 Proxy 的憑證。
其他資訊
若需設定 Web 服務 Proxy 的相關資訊,請參閱第 10 單元<Web 服務安全性>。
在這個案例中,出版公司會授與其夥伴經由網際網路存取其應用程式的專有權限,並提供夥伴入口應用程式。例如,銷售服務、讓夥伴隨時獲得最新的產品資訊,以及提供線上合作等。這個案例如圖 6.3 所示。

圖 6.3
夥伴入口網站案例
這個案例具有下列特性:
| • | 夥伴 Web 應用程式會接受以「表單」登入網頁提供的憑證,或使用 IIS「基本」驗證之登入對話方塊提供的憑證。 |
| • | 針對外部網路之周邊網路 (亦稱為 DMZ、非軍事區域和過濾子網路) 中的個別 Active Directory,對憑證進行驗證。外部網路 Active Directory 在單獨的樹系中,它提供個別的信任界限。 |
| • | 以對應到 ASP.NET Web 應用程式處理序身分識別的單一受信任連線存取資料庫。 |
| • | Web 應用程式授權是根據 GenericPrincipal 物件 (建立為「表單」驗證處理程序的一部份) 或 WindowsPrincipal 物件 (如果使用「基本」驗證) 而定。 |
| • | 從 Web 應用程式擷取的資料是機密的,必須確保其在傳輸 (在出版公司內部或在網際網路上進行外部傳送) 時的安全。 |
因為兩家公司經由網際網路傳送機密性資料,所以在傳輸時必須使用 SSL 確保其安全。
使用只允許從外部網路合作公司 IP 位址傳來之輸入連線的防火牆,可避免其他未授權的網際網路使用者開啟網頁伺服器的網路連線。
表 6.2:安全性措施
| 類別 | 詳細資料 | ||||
驗證 |
| ||||
授權 |
| ||||
安全通訊 |
|
圖 6.4 顯示針對這個案例的建議安全性設定。

圖 6.4
針對夥伴入口網站案例所建議的安全性設定
| 設定 IIS | |
| 步驟 | 其他資訊 |
若要使用「表單」驗證,請啟用 Web 應用程式虛擬根目錄的「匿名」存取 |
|
| 設定 Active Directory (外部網路) | |
| 步驟 | 其他資訊 |
設定 Active Directory 帳戶來代表夥伴使用者 | 使用個別的外部網路 Active Directory。這個目錄屬於其自己的樹系,完全與公司的 Active Directory 分開。 |
| 設定 ASP.NET | |
| 步驟 | 其他資訊 |
設定 ASP.NET Web 應用程式使用 Windows 驗證 (用於 IIS「基本」驗證) | 編輯 Web 服務虛擬根目錄中的 Web.config <authentication mode="Windows" /> - or - <authentication mode="Forms" /> |
將 ASPNET 帳戶 (用於執行 ASP.NET) 的密碼重設為已知的增強式密碼 | 執行此作業可讓您在資料庫伺服器上,建立重複的本機帳戶 (使用相同的使用者名稱和密碼)。若要讓 ASPNET 帳戶在使用 Windows 驗證連接時,可以回應資料庫伺服器的網路驗證質詢,則需要進行此作業。 另一個方法是使用最小權限的網域帳戶 (如果允許通過防火牆進行 Windows 驗證)。 若需相關資訊,請參閱第 8 單元<ASP.NET 安全性>中的<ASP.NET 的處理序身分識別>。編輯位於 %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 公用程式已用於將加密密碼儲存在登錄中。 |
| 步驟 | 其他資訊 |
在 SQL Server 電腦上,建立一個與用於執行 Web 服務之 ASP.NET 處理序帳戶相符的 Windows 帳戶 (預設為 ASPNET) | 使用者名稱和密碼必須符合 ASP.NET 處理序帳戶。 將下列權限授與帳戶: |
將 SQL Server 設定為使用 Windows 驗證 |
|
為 ASPNET 帳戶建立 SQL Server 登入 | 這會授與存取 SQL Server 的權限。 |
建立新的資料庫使用者,並將其登入名稱對應到資料庫使用者 | 這會授與存取指定資料庫的權限。 |
在資料庫中建立一個使用者定義的新資料庫角色,然後將資料庫使用者放入角色中 |
|
建立資料庫角色的資料庫使用權限 | 授與最小權限 |
| 步驟 | 其他資訊 |
在網頁伺服器上將網站設定為使用 SSL | 請參閱本手冊中的<How To:在網頁伺服器上設定 SSL>。 |
在網頁伺服器和資料庫伺服器間設定為使用 IPSec | 請參閱本手冊中的<How To:使用 IPSec 在兩部伺服器間進行安全通訊>。 |
| • | 網頁伺服器上的 ASP.NET 是以最小權限的本機帳戶 (預設 ASPNET 帳戶) 執行,因此可減輕攻擊的潛在破壞。 |
| • | SSL 用於瀏覽器和 Web 應用程式之間,以保護「表單」驗證或「基本」驗證的憑證 (雖然「基本」驗證使用 Base64 編碼,但兩者都以純文字傳送)。SSL 也會保護從 Web 應用程式傳回之應用程式特定的資料。 |
| • | 對於「表單」驗證,所有網頁 (不僅只有登入網頁) 都使用 SSL,以在初始驗證後,保護所有後續 Web 要求所傳送的驗證 Cookie。 |
| • | 如果 SSL 只用在初始登入網頁上加密傳送的驗證憑證,則您應確定「表單」驗證票證 (包含在 Cookie 中) 有受到保護,因為在每個後續 Web 要求中,票證都會在用戶端和伺服器之間傳送。若要加密「表單」驗證票證,請依下列所示設定 <forms> 項目的 protection 屬性,並使用 FormsAuthentication 類別的 Encrypt 方法加密票證。 <authentication mode="Forms">
<forms name="MyAppFormsAuth"
loginUrl="login.aspx"
protection="All"
timeout="20"
path="/" >
</forms>
</authentication>
protection="All" 屬性會指定當應用程式呼叫 FormsAuthentication.Encrypt 時,是否應驗證 (檢查完整性) 及加密票證。建立驗證票證時,請呼叫這個方法,一般是在應用程式的 Login 按鈕事件處理常式之中。 string encryptedTicket = FormsAuthentication.Encrypt(authTicket); 若需「表單」驗證及票證加密的相關資訊,請參閱第 8 單元<ASP.NET 安全性>。 |
| • | 同樣地,因為所有網頁要求上都會傳送「基本」驗證的憑證,而不是只有在使用者提供「基本」驗證憑證的初始網頁上,所以對於「基本」驗證,所有網頁也都使用 SSL。 |
| • | 若為「基本」驗證,ASP.NET 會自動建立 WindowsPrincipal 物件,來代表經過驗證的呼叫者,並將之與目前的 Web 要求 (HttpContext.User) 建立關聯,此時該物件由 .NET 授權 (包括 PrincipalPermission 要求及 .NET 角色) 使用。 |
| • | 若為「表單」驗證,您必須開發程式碼,針對 Active Directory 驗證所提供的憑證,並建構 GenericPrincipal,來代表經過驗證的使用者。 |
| • | 對 SQL Server 執行 Windows 驗證,表示您不用在網頁伺服器上儲存憑證,也不用透過內部網路將憑證傳送到 SQL Server 電腦。 |
| • | Web 服務和資料庫間的 IPSec 能保護在公司網路上資料庫間來回傳送的資料。 |
| • | 在資料庫伺服器上使用重複的本機 Windows 帳戶 (在 IIS 上與 ASP.NET 處理序帳戶相符的帳戶),會增加管理負擔。密碼必須定期執行手動同步更新。 |
| • | 「基本」驗證會導致在瀏覽器中出現快顯對話方塊。若要提供更順暢的登入,請使用「表單」驗證。 |
外部網路和公司網路沒有連線
若要增加額外的安全性,可以建置不需要連接回公司網路的外部網路應用程式。在這個案例中:
| • | 外部網路上有一個個別的 SQL Server 資料庫,資料是從內部資料庫複寫到外部網路資料庫。 |
| • | 路由器用於拒絕從外部網路到公司網路的連線。建立連線的另一種方式就是使用特定的高連接埠。 |
| • | 建立從公司網路到外部網路的連線,應透過具有增強式稽核及記錄功能的專用伺服器進行,且在存取外部網路之前必須先透過該伺服器驗證使用者。 |
其他資訊
| • | 請參閱下列 Microsoft TechNet 文件:
| ||||
| • | 若需對 Active Directory 使用「表單」驗證的相關資訊,請參閱本手冊中的<How To:對 Active Directory 使用表單驗證>。 |
本單元已描述了如何確保兩個常見外部網路應用程式案例的安全。
若需內部網路及網際網路應用程式案例的相關資訊,請參閱第 5 單元<內部網路安全性>及第 7 單元<網際網路安全性>。