MSDN 首頁 

安全性的架構及設計檢閱

發佈日期: 2004 年 5 月 28 日
本頁內容
本單元內容本單元內容
目標目標
適用於適用於
如何使用本單元如何使用本單元
架構及設計的檢閱程序架構及設計的檢閱程序
部署與基礎結構的考量部署與基礎結構的考量
輸入驗證輸入驗證
驗證驗證
授權授權
設定管理設定管理
機密資料機密資料
工作階段管理工作階段管理
密碼編譯密碼編譯
參數操作參數操作
例外管理例外管理
稽核和記錄稽核和記錄
總結總結
其他資源其他資源

本單元內容

要建置安全的 Web 應用程式需要有適當的架構及設計。在開發之後再翻新改造安全性所花的成本和努力太高昂了。架構及設計的檢閱可以幫助在開始開發階段之前,驗證應用程式中與安全性相關的設計功能。這使可能的弱點在被利用之前得以被識別和修補,而且可以將修補所需的付出降到最低。

本單元提供對架構設計執行徹底的檢閱時所應該提出的問題。即使您已有現存的應用程式,仍應該閱讀本單元,然後在應用程式設計時,重新造訪使用到的觀念、原理及技術。

回到頁首回到頁首

目標

透過本單元即可:

知道當對架構設計執行徹底的檢閱時應該提出什麼問題。

分析 Web 應用程式架構及設計。

發展及加強現行安全性檢閱辦法。

在設計階段建立一個程序來修補弱點。

識別關鍵應用程式部署及架構安全性考慮事項。

確保順利與安全的 Web 應用程式部署。

回到頁首回到頁首

適用於

Web 應用程式

回到頁首回到頁首

如何使用本單元

若要充分瞭解本單元:

將安全性檢閱整合到架構設計程序中。儘快開始,當設計變更時,使用本單元指定的步驟來檢閱異動。

發展安全性檢閱。本單元提供為加強設計的安全性所提出的問題。若要完成此檢閱程序,也需要加入對您獨特應用程式的特定問題。

瞭解可能的潛在威脅。單元 2<潛在威脅及因應對策>,列出會影響應用程式中不同元件和層級的潛在威脅。必須瞭解這些潛在威脅才能加強檢閱程序的結果。

回到頁首回到頁首

架構及設計的檢閱程序

架構及設計的檢閱程序從安全性的觀點分析架構及設計。如果您剛完成設計,有關的設計文件在您進行此程序時可以提供協助。無論您的設計文件是多麼的齊全,您必須能夠分解您的應用程式並且識別關鍵項目,包括信任界限、資料流程、進入點、和特殊權限程式碼。也必須知道應用程式的實體部署組態。注意對於最通常顯示出弱點的區域所採用的設計方法。本指南把這些稱為「應用程式弱點類別」。

當檢閱應用程式架構及設計時,請考慮下列的觀點:

「部署及架構」。檢視有關於目標部署環境及相關安全性原則的應用程式設計。同時考慮基礎架構層級安全性所加諸的限制。

應用程式結構及設計。檢視應用程式中關鍵區域的方法,包括驗證、授權、輸入驗證、例外管理、和其他區域。可以使用應用程式弱點類別作為藍圖,以確認在檢閱時沒有遺漏任何關鍵區域。

逐層分析。逐步走過應用程式的各個邏輯層,並且檢查 ASP.NET 網頁及控制元、Web 服務、服務元件、Microsoft .NET 遠端服務、資料存取程式碼、和其他的安全性。

[圖 5.1] 顯示檢閱程序的三向同步執行法。

應用程式檢閱

[圖 5.1]
應用程式檢閱

本單元的餘下部分顯示在每一個這些特殊的區域檢閱程序期間關鍵的考慮事項和問題。

回到頁首回到頁首

部署與基礎結構的考量

檢查提供給應用程式的基礎網路及主機架構的安全性設定,並且檢查目標環境可能加諸的限制。同時考慮部署拓樸和在設計上的中間層應用程式伺服器、外圍區域、和內部防火牆的衝擊。

檢閱下列問題以識別可能的部署及架構問題:

網路是否可以提供安全的通訊?

您的部署拓樸是否包括內部的防火牆?

您的部署拓樸是否包括遠端應用程式伺服器?

架構的安全性加諸了什麼限制?

您是否有考慮 Web 伺服器陣列問題?

目標環境支援什麼樣的信任等級?

網路是否可以提供安全的通訊?

當資料在用戶端及伺服器之間,或伺服器到伺服器之間傳輸時是最脆弱的。資料應該多麼隱密?在法律上您是否為客戶資料負責?

應用程式負責在資料傳輸前安全地處理及轉換,而網路負責在資料傳輸時的完整性及隱私性。有需要時使用適當的加密演算法來維持資料的隱私。另外,確認網路裝置是安全的,因為它們維護著網路的完整性。

您的部署拓樸是否包括內部的防火牆?

如果有內部的防火牆將 Web 伺服器與應用程式伺服器或資料庫伺服器隔開,檢閱下列問題以確保設計有容納此:

下游伺服器如何驗證 Web 伺服器?

如果使用網域帳戶及 Windows 驗證,防火牆是否有開啟需要的連接埠?如果不是,或如果 Web 伺服器及下游伺服器是在不同的網域,可以使用鏡像的本機帳戶。例如,可以複裝最小權限本機 ASPNET 帳戶,用來執行在資料庫伺服器上的 Web 應用程式。

您是否使用分散式交易?

如果 Web 伺服器使用 Microsoft 分散式交易協調器 (DTC) 的服務啟始分散式交易,內部的防火牆是否有開啟 DTC 通訊需要的連接埠?

有關使用 DTC 通過防火牆的詳細資料,請參閱 Microsoft 知識庫文件 250367《INFO: Configuring Microsoft Distributed Transaction Coordinator (DTC) to Work Through a Firewall (英文)》網址為:
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q250367

您的部署拓樸是否包括遠端應用程式伺服器?

如果部署拓樸包括實體的遠端中間層,請檢閱下列問題:

您是否有使用 Enterprise Services?
如果有的話,是否有限制 DCOM 連接埠的範圍,以及是否有任何內部的防火牆開啟了這些連接埠?

「注意事項」:在一些狀況下,使用中間層 Web 服務做為 Enterprise Services 應用程式的前端是絕佳的設計選擇。使用這個方法,Web 伺服器可以經由連接埠 80 使用簡易物件存取通訊協定 (SOAP) 來和應用程式伺服器彼此通訊。

如需詳細資訊,請參閱下列 Microsoft 知識庫文件:

文件 312960,《PRB: Cannot Set Fixed Endpoint for a COM+ Application (英文)》網址為:http://support.microsoft.com/default.aspx?scid=kb;en-us;Q312960

文件 259011,《SAMPLE: A Simple DCOM Client Server Test Application (英文)》網址為:http://support.microsoft.com/default.aspx?scid=kb;en-us;Q259011

文件 248809,《PRB: DCOM Does Not Work over Network Address Translation-Based Firewall (英文)》網址為:http://support.microsoft.com/default.aspx?scid=kb;en-us;Q248809

文件 154596,《HOWTO: Configure RPC Dynamic Port Allocation to Work with Firewall (英文)》網址為:http://support.microsoft.com/default.aspx?scid=kb;en-us;Q154596

您是否有使用 .NET 遠端服務?
遠端服務是設計來用在受信任的伺服器的狀況下。網路是否支援 IPSec 原則,以確保只有 Web 伺服器可以存取中間層遠端服務元件?ASP.NET 是否主控遠端元件以支援驗證及授權?

您是否有使用 Web 服務?
如果有的話,中間層 Web 服務如何驗證 Web 應用程式?Web 應用程式是否在 Web 服務 proxy 設定憑證,使 Web 服務可以驗證 Web 伺服器?如果不是的話,Web 服務如何識別呼叫者?

架構的安全性加諸了什麼限制?

設計上是否有主機架構安全性限制會失效的任何假設?例如,基於所需要的服務、通訊協定、或帳戶權限的可用性,在設計上必須對安全性限制有所取捨。請檢閱下列問題:

所依靠的服務或通訊協定是否可能會不可用?
在開發及測試環境中可用的服務及通訊協定,在生產環境中不見得可用。和負責架構安全性的小組溝通以瞭解限制及需求。

您是否有依賴機密的帳戶權限?
設計應該使用最小權限程序、服務、和使用者帳戶。是否需要有不被允許的機密權限來執行操作?

例如,應用程式是否需要建立執行緒層級的模擬權杖以建立服務識別身份來存取資源?這需要「充當部分作業系統」的權限,因為與入侵處理程序有關的安全性風險日益增加,因此該權限不應該賦予 Web 伺服器的處理程序。如果需要此項功能,設計上應該區隔化較高的權限,例如,在程序之外的 Enterprise Services 應用程式。

您是否有考慮 Web 伺服器陣列問題?

如果應用程式將被部署在 Web 伺服器陣列,就無法假設陣列中的那一部伺服器會處理用戶端的要求。來自同一用戶端的後續要求可能是由不同的伺服器來提供服務。因此,需要考慮下列的問題:

您如何管理工作階段狀態?
在 Web 伺服器陣列的狀況下,不能在 Web 伺服器上管理工作階段狀態。相反的,在設計上應該在陣列所有 Web 伺服器會共同存取的伺服器上加入遠端狀態存放區。有關更多詳細資訊,請參閱本單元稍後的「工作階段管理」。

您是否有使用機器專屬的加密金鑰?
如果計劃加密共用資料來源中的資料,例如資料庫,在陣列所有機器上的加密及解密金鑰必須相同。檢查設計上沒有要求需要機器相似性的加密機制。

您是否有使用表單驗證或受保護檢視狀態?
如果是的話,您信任 <machine key>設定。在 Web 伺服器陣列的狀況下,必須在所有伺服器上使用通用金鑰。

您是否有使用 Secure Sockets Layer (SSL)?
如果使用 SSL 加密瀏覽器和 Web 伺服器之間的資料傳輸,在何處終止 SSL 連線?可行的選項包括 Web 伺服器、有加速卡的 Web 伺服器、或有加速卡的負載平衡器。在有加速卡的負載平衡器上終止 SSL 工作階段通常會提供最佳的效能,特別是對有大量連線的站台。

如果在負載平衡器上終止 SSL,從負載平衡器到 Web 伺服器之間的網路資料傳輸就沒有加密。這表示攻擊者可以竊聽在負載平衡器和 Web 伺服器之間傳輸的已解密網路資料傳輸。可以確保 Web 伺服器環境中實體設備的安全性,或使用 IPSec 原則提供的傳輸層級加密來保護內部的資料中心連結,以應付這個潛在威脅。

目標環境支援什麼樣的信任等級?

目標環境的程式碼存取安全性信任等級決定了程式碼可以存取的資源及執行的特殊權限作業。檢查目標環境支援的信任等級。如果 Web 應用程式被允許使用完全信任來執行,視作業系統安全性而定,程式碼可以存取任何資源。

如果應用程式必須使用降低信任等級來執行,就會限制資源的類型及程式碼可以執行的特殊權限作業。在不完全信任的狀況下,設計上必須沙箱特殊權限程式碼。也應該使用不同的組件來隔離特殊權限程式碼。會這樣做,讓特殊權限程式碼可以從其餘的應用程式分開被設定,並獲得需要的額外程式碼存取權限。

有關更多詳細資訊,請參閱單元 9<配合 ASP.NET 使用程式碼存取安全性>。

「注意事項」:如果計劃在共用伺服器上部署應用程式,或由主機代管公司來執行應用程式時,信任等級通常會是一個問題。在這些例子,檢查安全性原則並找出它對 Web 應用程式委予的信任等級。

回到頁首回到頁首

輸入驗證

檢查應用程式如何驗證輸入,因為許多 Web 應用程式攻擊就是使用蓄意的畸形輸入。SQL 注入、跨網站指令碼 (XSS)、緩衝區溢位、程式碼注入、和許多其他的拒絕服務攻擊及權限提升攻擊都會利用不良的輸入驗證。[表 5.1] 指出最常見的輸入驗證弱點。

[表 5.1] 常見的輸入驗證弱點

弱點含意

在超本文標記語言 (HTML) 輸出串流中的未檢驗輸入

應用程式容易受到 XSS 攻擊的影響。

未檢驗的輸入慣於產生 SQL 查詢

應用程式容易受到 SQL 注入攻擊的影響。

信任用戶端的驗證

用戶端的驗證很容易被跳過。

使用輸入檔案名稱、URL、或使用者名稱來做安全性的決定

應用程式容易受到標準化錯誤的影響,而導致安全性的問題。

針對惡意輸入的應用程式專用篩選器

這幾乎不可能做到正確,因為可能的惡意輸入範圍太大了。應用程式應該對輸入加以限制、拒絕、和安全性過濾。

檢閱下列問題以幫助識別可能的輸入驗證安全性問題:

您如何驗證輸入資料?

您如何處理輸入資料?

您如何驗證輸入資料?

設計上指定什麼方法來驗證輸入?首先,設計應該佈局策略。應用程式應該對所有收到的輸入加以限制、拒絕、和安全性過濾。限制輸入是最好的方法,因為從已知正確的類型、模式和範圍來驗證資料,遠比尋找已知的錯誤字元來驗證資料容易的多了。使用潛在防衛策略,應該也要拒絕已知的錯誤輸入和安全性過濾輸入。

下列問題可以幫助識別可能的弱點:

您是否知道您的進入點?
確認設計上有識別應用程式的進入點,如此才能追蹤個別輸入欄位發生了什麼。考慮網頁輸入、輸入到元件及 Web 服務、和來自資料庫的輸入。

您是否知道您的信任界限?
如果輸入是來自在信任界限之內的受信任來源就不一定要驗證輸入,但是如果輸入是來自非信任的來源就要強迫驗證。

您是否有驗證網頁輸入?
不要認為一般使用者是資料的受信任來源。確認有驗證標準和隱藏的表單欄位、查詢字串、及 Cookie。

您是否有驗證傳到元件或 Web 服務的引數?
唯一不這樣做而安全的例子是資料來自現行的信任界限之內。然而,在潛在防衛策略下,建議使用多層驗證。

您是否驗證擷取自資料庫的資料?
如果有別的應用程式也寫入到這個資料庫的話,應該也要驗證這種形式的輸入。不要假設其他的應用程式已經做了徹底的輸入驗證。

您是否使用集中式的方法?
對輸入欄位的一般類型,檢查是否使用一般驗證和篩選程式庫以確保執行一致的驗證規則。

您是否倚賴用戶端的驗證?
請不要。用戶端驗證可用來減少到伺服器的來回次數,但是因為它很容易被跳過,所以不能倚賴做為安全性的依靠。驗證伺服器上所有的輸入。

您如何處理輸入資料?

檢查應用程式如何處理輸入,因為不同類型的處理程序會導致不同類型的弱點。例如,如果在 SQL 查詢中使用輸入,應用程式就可能受到 SQL 注入的影響。

檢閱下列的問題來幫助識別可能的弱點:

您的應用程式是否容易受到標準化問題的影響?
檢查應用程式是否使用基於輸入的名稱來做安全性的決定。例如,應用程式是否接受使用者姓名、檔案名稱、或 URL?標準化問題的惡名昭彰,因為一個名稱可以用許多方式來表示。如果應用程式接受名稱做為輸入,在進一步處理之前請檢查它們已經過驗證並轉換成標準的表示法。

您的應用程式是否容易受到 SQL 注入的影響?
請密切注意用來組成 SQL 資料庫查詢的任何輸入欄位。檢查這些欄位已適當地驗證類型、格式、長度、和範圍。同時也檢查這些查詢是如何產生的。如果使用參數化的預存程序,輸入參數會被視為文字而非可執行的程式碼。這可以有效的減輕風險。

您的應用程式是否容易受到 XSS 攻擊的影響?
如果在 HTML 輸出串流中包含輸入欄位,就容易受到 XSS 的影響。檢查輸入是否有經過驗證以及輸出是否有編碼。密切注意接受一個範圍 HTML 字元的輸入欄位被如何處理。

回到頁首回到頁首

驗證

檢查應用程式如何驗證其呼叫者、在何處使用驗證、以及當在儲存和在網路上傳送時如何確認憑證仍然安全。在驗證的弱點會使應用程式容易受到欺騙攻擊、字典攻擊、連線劫持、和其他攻擊的影響。[表 5.2] 指出最常見的驗證弱點。

[表 5.2] 常見的驗證弱點

弱點含意

安全性不足的密碼

增加密碼破解和字典攻擊的風險。

組態檔案中的透明 (無加密) 文字認證資料

可以存取伺服器的內部人員或利用主機弱點下載組態檔案的攻擊者,會立即存取到認證資料。

在網路上傳送透明 (無加密) 文字認證資料

攻擊者可以監測網路來偷竊驗證憑證並偽造識別身份。

權限過高的帳戶

處理序或帳戶遭到入侵時相關的風險會增加。

冗長的工作階段

連線劫持相關的風險會增加。

混合個人化和驗證

個人化資料適用於永續性的 cookie。驗證 Cookie 不應該被永續留存。

檢閱下列問題來識別在應用程式執行驗證的方式上可能的弱點:

您是否有隔離公共和限制存取?

您是否有識別服務帳戶的需求?

您如何驗證呼叫者?

您如何使用資料庫驗證?

您是否有強制實施增強式帳戶管理實作?

您是否有隔離公共和限制存取?

如果應用程式提供不需驗證的公共區域和需要驗證的限制區域,檢查在設計上站台如何區別兩者。對於限制的網頁和資源應該使用分開的子資料夾,然後在網際網路資訊服務 (IIS) 設定它們需要 SSL 來保護那些資料夾。這個方法容許對資密資料提供安全性,並在站台需要的區域使用 SSL 來驗證 Cookie。避免在整個站台使用 SSL 所造成效能的減低。

您是否有識別服務帳戶的需求?

設計應該識別所需要的服務帳戶範圍以連接到不同資源,包括資料庫、目錄服務、和其他類型的遠端網路資源。確認在設計上不需要單一的、有足夠權限的高特殊權限帳戶來連接到不同資源類型的範圍。

設計是否需要最小權限帳戶?
是否已識別哪個資源和操作需要哪個權限?檢查設計精確地識別每一個帳戶執行它特定的功能所需要的權限,以及在所有的狀況下都使用最小權限帳戶。

應用程式是否需要維護服務帳戶憑證?
如果是的話,確認憑證有加密並保存在限制的位置,例如有限制存取控制清單 (ACL) 的登錄機碼。

如何驗證呼叫者?

檢閱驗證呼叫者的以下各層面。使用的觀點視設計使用的驗證類型而定。

您是否有在網路連線上傳遞純文字憑證?
如果使用表單或基本驗證,或如果使用 Web 服務且在 SOAP 標頭傳遞憑證,請確認在傳送時使用 SSL 來保護憑證。

您是否有實施自已的使用者存放區?
如果是的話,檢查使用者憑證會儲存在何處以及如何儲存。一般的錯誤是在使用者存放區儲存純文字或加密密碼。相反的,應該儲存用來做確認的密碼雜湊。

如果驗證 SQL Server 使用者存放區中的憑證,請密切注意輸入的使用者名稱和密碼。檢查 SQL 字元的惡意注入。

您是否有使用表單驗證?
如果有的話,除了使用 SSL 來保護憑證外,使用 SSL 來保護驗證 Cookie。同時也檢查在設計上使用限制工作階段存留期以反制 Cookie 重新執行攻擊的潛在威脅,並且檢查 Cookie 有加密。

有關表單驗證的更多詳細資訊,請參閱單元 10<建置安全的 ASP.NET 網頁和控制項>及單元 19<保障 ASP.NET 應用程式及 Web 服務的安全>。

您如何使用資料庫驗證?

當應用程式連結到資料庫時,檢查使用什麼驗證機制、計劃使用那個或那些帳戶、以及如何在資料庫中授權應用程式。

下列問題幫助檢閱資料庫驗證的方法:

您是否有使用 SQL 驗證?
在理想狀況下,設計使用 Windows 驗證來連結到 SQL Server,因為這是一個原本就比較安全的方法。如果使用 SQL 驗證,檢查計劃如何在網路上及在資料庫連結字串中保障憑證的安全。

如果網路架構不提供 IPSec 加密通道,確認在提供自動 SQL 憑證加密的資料庫上安裝了伺服器憑證。同時也檢查計劃如何保障資料庫連結字串的安全,因為這些字串中包含了 SQL 帳戶使用者名稱和密碼。

您是否有使用處理程序帳戶?
如果使用應用程式的處理程序帳戶並使用 Windows 驗證連結到 SQL Server,確認設計上採用最小權限帳戶。本機 ASPNET 帳戶就是為這個目的所提供的,雖然使用本機帳戶,仍需要在資料庫伺服器上建立複製帳戶。

如果計劃使用網域帳戶,確認其為最小權限帳戶並檢查所有在中間的防火牆有開啟相關的連接埠來支援 Windows 驗證。

您是否有使用服務帳戶?
如果在設計上需要有多重的識別身份來支援資料庫中更多漸進等級的授權,檢查計劃如何儲存帳戶憑證 (理想狀況下是使用 Data Protection API (DPAPI) 加密並保存在安全的登錄機碼內) 和將如何使用服務識別身份。

同時也檢查那一個處理程序會被用來使用服務帳戶建立模擬安全性內容。這不應該由 Microsoft Windows 2000 上的 ASP.NET 應用程式處理程序來完成,因為它會強迫增加處理程序帳戶的權限並且賦予「充當部分作業系統」的權限。這應該被避免因為會大幅增加風險的因素。

您是否有考慮使用匿名 Internet 使用者識別身份?
對於使用表單或 Passport 驗證的應用程式,可以針對每一個應用程式設定不同的匿名使用者帳戶。接下來,可以啟用模擬然後使用匿名識別身份來存取資料庫。這個方法適用於在相同 Web 伺服器上不同應用程式的分開授權和識別身份追蹤。

您是否有使用原始使用者的識別身份?
如果設計上要求模擬原始呼叫者,需要考慮到方法在連結集區無效時是否可提供足夠的擴充性。替代方案是將原始呼叫者的識別身份透過受信任的查詢參數保留至應用程式層級。

您如何儲存資料庫連結字串?
如果資料庫連結字串是硬式編碼或以純文字儲存在組態檔案或 COM+ 目錄中,會容易受到攻擊。相反的,應該將其加密或限制到加密資料的存取。

有關連結到 SQL Server 的不同選項和安全地儲存資料庫連結字串的更多詳細資料,請參閱單元 14<建置安全的資料存取>。

您是否有強制實施增強式帳戶管理實作?

如果應用程式使用 Windows 驗證,可透過 Windows 安全性原則來強制實施增強式密碼的使用、限制登入嘗試次數、及其他最佳實務帳戶管理原則。此外,這是由應用程式層在負責的。檢閱下列應用程式帳戶管理的觀點:

您的應用程式是否強制實施增強式密碼?
例如,ASP.NET 網頁是否使用規則運算式來確認密碼複雜性規則?

您是否有限制失敗登入嘗試的次數?
如此做可以幫助反制字典攻擊的潛在威脅。

您在失敗事件中是否洩露了太多的資訊?
請確認沒有顯示類似「不正確的密碼 (Incorrect password)」的訊息,因為這會告訴有惡意的使用者「使用者名稱」是正確的。這會使得他們將努力集中在破解密碼。

您是否有強制實施定期變更密碼?
建議如此做,否則很有可能使用者不會變更他們的密碼,而容易受到攻擊。

您是否能夠在入侵事件時快速地停用帳戶」?
如果帳戶被入侵,是否可很容易地停用該帳戶以防止攻擊者繼續利用?

您的應用程式是否有記錄登入的嘗試?
記錄失敗的登入嘗試是偵測嘗試闖入的攻擊者的有效方法。

回到頁首回到頁首

授權

檢查應用程式如何授權給它的使用者。同樣也檢查在資料庫內如何授權應用程式以及到系統層級資源的存取如何控制。授權弱點會導致資料公開、資料竄改、和權限提升。潛在防衛策略是可以套用到應用程式授權策略的關鍵性安全性原則。[表 5.3] 指出最常見的授權弱點。

[表 5.3] 常見的授權弱點

弱點含意

信任單一閘道管理

如果該閘道管理被跳過或設定不正確,使用者會獲得未授權存取。

未能針對應用程式識別身份鎖定系統資源

攻擊者可以強迫應用程式存取受限制的系統資源。

未能對特定的預存程序限制資料庫存取

攻擊者掛上 SQL 注入攻擊來擷取、操作、或破壞資料。

不適當的權限分隔

沒有說明能力或執行每一使用者授權的能力。

檢閱下列問題來幫助驗證應用程式設計的授權策略:

您如何授與權限給一般使用者?

您如何授與權限給資料庫中的應用程式?

您如何限制對系統層級資源的存取?

您如何授與權限給一般使用者?

在設計時期應該從兩個觀點來考慮授權。首先,考慮一般使用者授權。哪個使用者可以存取哪個資源及執行哪個操作?其次,如何預防惡意使用者使用應用程式來存取系統層級的資源?檢閱下列問題來驗證應用程式的授權策略:

您是否有使用潛在防衛策略?
確認設計上沒有依賴單一的閘道管理來強制實施存取控制。考慮如果閘道管理失敗或攻擊跳過它的時候會發生什麼。

您有使用哪些閘道管理?
可行的選項包括 IIS Web 權限、NTFS 權限、ASP.NET 檔案授權 (僅適用於 Windows 驗證)、URL 授權、和主要權限要求。如果沒有使用某些類型,確認原因為何。

您是否有使用以角色為主的方法」?
如果是的話,如何維護角色清單以及管理介面要做到多麼安全?

您的角色是否提供足夠的權限分隔?
設計是否提供足夠的細微性,讓獨特使用者角色的相關權限足以區分?避免只為了滿足某些使用者的需求而對角色賦予高存取權限的狀況。考慮用增加新角色來取代。

您如何授與權限給資料庫中的應用程式?

應用程式用來連結到資料庫的帳戶應該有應用程式所需要足夠的受限制能力,但也僅止於此。

應用程式是否有使用預存程序存取資料庫?
建議使用,因為應用程式的登入只能被授予存取特定預存程序的權限。登入可以被限制對資料庫執行直接建立/讀取/更新/刪除 (CRUD) 的作業。

這對安全性有利,同時對效能和未來的可維護性也有益處。有關資料庫授權方法的更多詳細資料,請參閱單元 14<建置安全的資料存取>。

您如何限制對系統層級資源的存取?

當設計應用程式時,考慮藉由應用程式所能存取的系統層級資源所加諸於應用程式的限制。應用程式應該只能被賦予存取到最少的所需資源。這是一個減輕風險的策略,如果應用程式被入侵時可以限制所造成的損害。考慮下列的問題:

您的設計是否有使用程式碼存取安全性?
程式碼存取安全性提供資源限制模型,可以防止程式碼 (及 Web 應用程式) 存取特定類型的系統層級資源。當使用程式碼存取安全性時,難免會影響到設計。識別是否要在設計計劃中納入程式碼存取安全性,然後設計隨著隔離及沙箱特殊權限程式碼,並將資源存取程式碼置入其各自分別的組件中。

您的應用程式使用什麼識別身份?
設計應該識別應用程式所使用的所有識別身份,包括處理序識別身份,以及任何的模擬識別身份,包括匿名 Internet 使用者帳戶和服務識別身份。設計應該也要指出這些識別身份需要存取哪些資源。

在部署時期,可以在系統層級資源設定適當的 ACL,以確保應用程式的識別身份只能存取到所需的資源。

有關程式碼存取安全性設計的更多詳細資訊,請參閱單元 9<配合 ASP.NET 使用程式碼存取安全性>。

回到頁首回到頁首

設定管理

如果應用程式提供可被設定的管理介面,檢查如何保障管理介面的安全。同樣也檢查如何保障機密組態資料的安全。[表 5.4] 顯示最常見的設定管理弱點。

[表 5.4] 常見的設定管理弱點

弱點含意

不安全的管理
介面

未授權的使用者可以重新設定應用程式以及
存取機密資料。

不安全的組態存放區

未授權的使用者可以存取組態存放區以及
取得機密,例如帳戶名稱和密碼、以及
資料庫連結詳細資料。

純文字組態資料

任何可以登入到伺服器的人就可以看到機密的
組態資料。

系統管理員太多

這造成難以稽核和檢查系統管理員。

權限過高的處理序帳戶
和服務帳戶

這會容許權限提升攻擊。

檢閱下列問題來幫助驗證應用程式設計的設定管理方法:

您是否有支援遠端管理?

您是否有保障組態存放區的安全?

您是否有區分系統管理員權限?

您是否有支援遠端管理?

如果設計指定遠端管理,因為作業的機密本質以及管理介面上的資料是可存取的,所以必須保障管理介面和組態存放區的安全。檢閱下列遠端管理設計的觀點:

您是否有使用增強式的驗證?
管理介面的所有使用者都需要驗證。使用增強式驗證,例如 Windows 或用戶端憑證驗證。

您是否有加密網路資料傳輸?
使用加密的通訊通道,例如由 IPSec 或虛擬私人網路 (VPN) 連線所提供的。不要在不安全的通道上支援遠端管理。IPSec 容許限制管理伺服器的識別身份和用戶端機器的數量。

您是否有保障組態存放區的安全?

識別應用程式的組態存放區,然後檢查限制存取存放區以及保障存放區內資料的方法。

您的組態存放區是否在 Web 空間?
組態資料檔案如果是放在 Web 空間內被認為是較放在 Web 空間外不安全。主機組態錯誤或未被發現的問題,可能容許攻擊者在 HTTP 上擷取並下載組態檔案。

在組態存放區中的資料安全嗎?
確認組態資料的關鍵項目,例如資料庫連結字串、加密金鑰、和服務帳戶憑證在存放區中有加密。

您如何限制到組態存放區的存取?
檢查管理介面有提供必要的授權以確保只有已驗證的系統管理員才能存取和操作資料。

您是否有區分系統管理員權限?

如果管理介面支援不同的功能 - 例如,站台內容更新、服務帳戶重新組態、及資料庫連結詳細資料 - 確認管理介面有支援以角色為主的授權,以區分內容開發人員和操作員或系統管理員。例如,負責更新靜態網站內容的人員不需要被容許改變客戶的信用額度或重設資料庫連結字串。

回到頁首回到頁首

機密資料

檢查應用程式如何處理在存放區中、在應用程式記憶體、和當在網路上傳輸時的機密資料。[表 5.5] 顯示最常見的有關處理機密資料的弱點。

[表 5.5] 常見的有關處理機密資料的弱點

弱點含意

當不需要的時候仍然儲存機密

相對於沒有在第一時間內儲存機密,這會大大的增加安全性的風險。

儲存程式碼中的機密

如果程式碼是在伺服器上,攻擊者可能能夠將其下載。在二進位的組件中機密是看得到的。

以純文字儲存機密

任何可以登入到伺服器的人就可以看到機密的資料。

在網路上以純文字傳送機密資料

竊聽者可以監控網路來洩露和竄改資料。

使用下列問題來幫助驗證應用程式對機密資料的處理:

您是否有儲存機密?

您如何儲存機密資料?

您是否有在網路上傳送機密資料?

您是否有記錄機密資料?

您是否有儲存機密?

機密包括應用程式組態資料、例如帳戶密碼和加密金鑰。如果可能的話,識別可以不儲存機密的替代設計方案。如果您負責處理機密,盡可能讓平台來處理機密以減輕應用程式的負荷。如果必須儲存機密,請檢閱下列問題:

您是否可避免儲存機密?
如果使用替代實作技術,可以移除儲存機密的需求。例如,如果要做的是確認使用者知道密碼,並不需要儲存密碼。儲存單向密碼雜湊來代替。

同樣的,如果使用 Windows 驗證,可以使用嵌入憑證避免儲存連結字串。

您如何儲存機密?
如果使用加密,如何保障加密金鑰的安全?考慮使用平台提供的 DPAPI 加密來負責金鑰管理。

您將機密儲存在何處?
檢查應用程式如何儲存加密資料。針對最高安全性,應該使用 Windows ACL 來限制加密資料的存取。檢查應用程式沒有以純文字或在原程式碼中儲存機密。

如果使用「本機安全性註冊 (LSA)」,程式碼必須執行系統管理員的權限才能擷取機密,因而增加風險。不需要延伸權限的替代方案是使用 DPAPI。

您如何處理機密?
檢查應用程式如何存取機密,以及純文字形態的機密在記憶體中會保留多久。通常應該根據需要來擷取機密,盡可能在最短的時間內使用它,然後馬上丟棄。

您是否在 Cookie 中儲存機密?
如果是的話,確認 Cookie 有加密而且不是存留在用戶端的電腦中。

您如何儲存機密資料?

如果儲存機密應用程式資料,例如客戶信用卡詳細資料,檢查如何保護資料。

您使用什麼加密演算法?應該使用有大型金鑰的增強式加密演算法來加密資料,例如 Triple DES。

您如何保障加密金鑰的安全?只有加密金鑰安全時資料才安全,檢查如何保障金鑰的安全。在理想狀況下,使用 DPAPI 來加密金鑰並將其安全的保存於受限制的位置,例如,登錄機碼。

您是否有在網路上傳送機密資料?

如果在網路上傳送機密資料,檢查資料是否有用應用程式來加密或僅在加密的通訊連結上傳送。

是否有記錄機密資料?

檢查應用程式 (或主機) 是否有以純文字的記錄檔案記錄機密資料,例如使用者帳戶密碼。通常應該要避免這樣。確保應用程式沒有在查詢字串中傳送機密資料,因為會被記錄而且在用戶端瀏覽器的位址列中會被清楚地看到。

回到頁首回到頁首

工作階段管理

因為 Web 應用程式是建立在無狀態的 HTTP 通訊協定之上,所以工作階段管理是應用程式層級的責任。檢查應用程式對工作階段管理的方法,因為這直接影響到應用程式整體的安全性。[表 5.6] 顯示最常見的工作階段管理弱點。

[表 5.6] 常見的工作階段管理弱點

弱點含意

在未加密的通道上傳送工作階段識別元

攻擊者可以擷取工作階段識別元進而偽造識別身份。

延長工作階段存留期

這會增加連線劫持和重新執行攻擊的風險。

不安全的工作階段狀態存放區

攻擊者可以存取使用者的私人工作階段資料。

查詢字串中的工作階段識別元

在用戶端的工作階段識別元可被輕易地修改,進而偽造識別身份並假裝為另一使用者來存取應用程式。

使用下列問題來幫助驗證應用程式對機密資料的處理:

工作階段識別元如何進行交換?

您是否有限制工作階段的存留期?

您如何保障工作階段狀態存放區的安全?

工作階段識別元如何進行交換?

檢查應用程式用來管理使用者工作階段的工作階段識別元,以及這些工作階段識別元如何進行交換。請考慮下面的狀況:

您是否有在未加密的通道上傳送工作階段識別元?
如果使用工作階段識別元來追蹤工作階段狀態 - 例如,包含在 cookie 中的權杖 - 檢查識別元或 Cookie 僅在加密的通道上進行傳遞,例如 SSL。

您是否有加密工作階段 Cookie?
如果使用表單加密,請確認應用程式使用 <forms>元素上的「protection="All"」屬性來加密驗證 Cookie。除了 SSL 之外,建議使用這個實作來減輕 XSS 攻擊偷取使用者驗證 Cookie 的風險。

您是否有在查詢字串中傳送工作階段識別元」?
確認應用程式沒有在查詢字串中傳送工作階段識別元。在用戶端可以很容易地修改這些字串,而容許使用者以另一使用者的身份存取應用程式、存取其他使用者的私人資料、和可能提升權限。

您是否有限制工作階段存留期?

檢查應用程式認為工作階段識別元的有效時間是多久。應用程式應該限制該有效時間以減輕連線劫持和重新執行攻擊的潛在威脅。

您如何保障工作階段狀態存放區的安全?

檢查應用程式如何儲存工作階段狀態。工作階段狀態可以儲存在 Web 應用程式處理程序、ASP.NET 工作階段狀態服務、或 SQL Server 狀態存放區中。如果使用遠端狀態存放區,確認從 Web 伺服器到遠端存放區之間的連結有使用 IPSec 或 SSL 加密以保護網路連線上的資料。

有關保護 ASP.NET 工作階段狀態的更多詳細資訊,請參閱單元 19<保障 ASP.NET 應用程式及 Web 服務的安全>中的「工作階段狀態」。

回到頁首回到頁首

密碼編譯

如果應用程式使用密碼編譯來提供安全性,檢查為什麼使用以及使用什麼方法。[表 5.7] 顯示最常見的有關密碼編譯的弱點。

[表 5.7] 常見的密碼編譯弱點

弱點含意

使用自訂密碼編譯

這幾乎可以確定比使用平台提供經過嘗試和測試的密碼編譯方法不安全。

使用錯誤的演算法或太小的金鑰大小

較新的演算法會增加安全性。較大的金鑰大小會增加安全性。

無法保障加密金鑰的安全

只有在加密金鑰安全時加密的資料才安全。

在延長時期使用相同的金鑰

在一段時間之後靜態金鑰比較可能被發現。

檢閱下列問題來幫助驗證應用程式對機密資料的處理:

您為何使用特別的演算法?

您如何保障加密金鑰的安全?

您如何使用特定的演算法?

只有在正確的使用密碼編譯,以及針對工作用對演算法時,密碼編譯才能提供真正的安全性。演算法的強度也是很重要的。檢閱下列的問題來檢視對加密演算法的使用:

您是否有開發自己的密碼編譯?
請不要。密碼編譯演算法和常式難以開發成功和做正確是有名的。自訂的實作經常會導致安全性不足的保護,而且幾乎都比已證明的平台提供服務不安全。

您是否有使用適當金鑰大小的正確演算法?
檢查應用程式使用什麼演算法以及為什麼目的而用。大型金鑰會增強安全性,但是效能會受損。在延長時間內,增強式加密演算法對於保留在資料存放區中的持續性資料是最重要的。

關於選擇正確的演算法和金鑰大小的更多詳細資訊,請參閱單元 4<設計安全 Web 應用程式的指導方針>中的「密碼編譯」章節。

您如何保障加密金鑰的安全?

只有在金鑰安全時加密的資料才安全。若要譯解加密的資料,攻擊者必須能夠取得金鑰和密碼文字。因此,檢查設計以確認加密金鑰和加密資料有受到保護。考慮下列的檢閱問題:

您如何保障加密金鑰的安全?
如果使用 DPAPI,平台會為您管理金鑰。否則,應用程式會負責管理金鑰。檢查應用程式如何保護加密金鑰。一個好的方法是使用 DPAPI 來加密其他形式加密所需的加密金鑰。然後安全地儲存加密金鑰,例如,將其放在設定有限制 ACL 的登錄機碼之下。

金鑰多久會回收重複使用?
不要濫用金鑰。使用相同金鑰的時間越長,就越可能被發現。設計是否有考慮如何和多久回收金鑰,以及如何散發金鑰和安裝在伺服器上?

回到頁首回到頁首

參數操作

檢查應用程式如何使用參數。這些參數包括在用戶端和伺服器之間傳送的表單欄位、查詢字串、Cookie、HTTP 標頭、和檢視狀態。如果使用參數例如查詢字串來傳送機密資料,例如工作階段識別元,有惡意的用戶端可以使用簡單的參數操作輕易地跳過伺服器端的檢查。[表 5.8] 顯示最常見的參數操作弱點。

[表 5.8] 常見的參數操作弱點

弱點含意

無法驗證所有的輸入參數

應用程式會容易受到拒絕服務攻擊和程式碼注入攻擊的影響,包括 SQL 注入和 XSS。

資密資料放在未加密的 Cookie 中

用戶端可以改變 Cookie 資料,或者在網路上傳送時 Cookie 資料也會被擷取和改變。

機密資料在查詢字串和表單欄位中

這在用戶端很容易被變更。

信任 HTTP 標頭資訊

這在用戶端很容易被變更。

未受保護的檢視狀態

這在用戶端很容易被變更。

檢查下列問題來幫助確認設計不會容易受到參數操作攻擊的影響:

您是否有驗證所有的輸入參數?

您是否有在參數中傳送機密資料?

您是否有將 HTTP 標頭資料使用於安全性?

您是否有驗證所有的輸入參數?

檢查應用程式是否驗證所有的輸入參數,包括標準和隱藏的表單欄位、查詢字串、及 Cookie。

您是否有在參數中傳送機密資料?

如果應用程式在參數中傳送機密資料,例如查詢字串或表單欄位,檢查為什麼在許多更安全的傳送工作階段識別元的方法中 (例如,在加密的 Cookie 中),應用程式選用這個方法。使用此資訊將工作階段與維護在伺服器狀態存放區的使用者狀態結合起來。考慮下列的檢閱重點:

您是否為有機密資料的 Cookie 加密?
如果應用程式使用的 Cookie 中含有機密資料,例如使用者名稱或角色清單,確認有將其加密。

您是否有在查詢字串或表單欄位中傳送機密資料?
不建議如此做,因為防止查詢字串或表單欄位中的資料被操作並不簡單。相反的,考慮使用加密工作階段識別元以及在伺服器的工作階段狀態存放區儲存機密資料。

您是否有保護檢視狀態?
如果網頁或控制元使用檢視狀態來維護 HTTP 要求之間的狀態,檢查有將檢視狀態加密並使用訊息驗證碼 (MAC) 來檢查完整性。這個可以在機器層級或在逐頁的基礎加以設定。

是否將 HTTP 標頭資料使用於安全性?

確認 Web 應用程式沒有根據 HTTP 標頭中的資訊來做安全性決定,因為攻擊者可以輕易地操作標頭。不要依賴 HTTP「參照者 (referer)」欄位的值來檢查要求是否源自您的 Web 伺服器所產生的網頁 - 這會產生弱點。這樣做原本就不安全,因為用戶端可以輕易地變更「參照者 (referer)」欄位。

回到頁首回到頁首

例外管理

檢查應用程式處理錯誤狀況的方法。建議一致地使用結構化的例外處理。同樣的,檢查在例外發生時應用程式沒有洩露太多資訊。[表 5.9] 顯示兩個主要的例外管理弱點。

[表 5.9] 常見的例外管理弱點

弱點含意

無法使用結構化的例外處理

應用程式更容易受到拒絕服務攻擊和邏輯瑕疵的影響,而暴露出安全性弱點。

洩露太多資訊給用戶端

攻擊者可以使用這些資訊來幫助計劃以及調整後續的攻擊。

檢閱下列問題來幫助確認設計不會容易受到例外管理安全性弱點的影響:

您是否有使用結構化的例外處理?

您是否有洩露太多資訊給用戶端?

您是否有使用結構化的例外處理?

檢查應用程式如何使用結構化的例外處理。在設計上應該命令整個應用程式從頭到尾一致地使用結構化的例外處理。這會建立更強大的應用程式,而且應用程式比較不會被遺留在不一致的狀態而洩露出安全性弱點。

您是否有洩露太多資訊給用戶端?

確認惡意使用者不能利用錯誤訊息中包含的過度詳細資訊。檢閱下列各點:

您是否有在伺服器上捕捉、處理、和記錄例外?
確認應用程式沒有讓內部的例外狀況傳播到應用程式界限之外。應該在伺服器上捕捉和記錄例外,如果需要,一般性的錯誤訊息應該回覆給用戶端。

您是否有使用集中式的例外管理系統?
在整個應用程式中一致性地處理和記錄例外的最佳方法,是使用正式化的例外管理系統。也可以將這個系統連接到監測系統,供作業小組用來監控狀態及效能。

您是否有定義一組自訂錯誤訊息?
設計上應該定義自訂錯誤訊息,以供應用程式發生嚴重錯誤時使用。確認其中沒有包括任何可被惡意使用者利用的機密資料項目。

有關設計及實作 .NET 應用程式的例外管理架構,請參閱 MSDN 文章,《Exception Management Architecture Guide (英文)》網址為:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/exceptdotnet.asp

回到頁首回到頁首

稽核和記錄

檢查應用程式如何使用稽核和記錄。除了預防否認的問題,定期分析記錄檔案可以幫助識別入侵的徵兆。[表 5.10] 顯示最常見的稽核和記錄弱點。

[表 5.10] 常見的稽核和記錄弱點

弱點含意

無法稽核失敗的登入

嘗試非法侵入沒有被發現。

無法保障稽核檔案的安全

攻擊者可以掩蓋形跡。

無法跨不同應用程式層進行稽核

否認的潛在威脅增加。

檢閱下列問題來幫助驗證應用程式稽核和記錄的方法:

您是否有對識別金鑰活動進行稽核?

您是否有考慮如何保留原始呼叫者識別身份?

您是否有考慮安全的記錄檔案管理原則?

您是否有對識別金鑰活動進行稽核?

設計上應該定義哪些活動需要被稽核。請考慮下面的狀況:

您是否有稽核失敗的登入嘗試?
這容許您偵測非法入侵和密碼破解的嘗試。

您是否有稽核其他的金鑰作業?
檢查有稽核其他金鑰事件,包括資料擷取、網路通訊、和管理功能 (例如啟用和停用記錄)。

您是否有考慮如何保留原始呼叫者識別身份?

設計上應該確認跨不同應用程式層的活動有被稽核。若要如此做,原始呼叫者的識別身份必須在每一層都有效。

您是否有跨不同應用程式層進行稽核?
檢查是否每一層的稽核活動都正常進行。

您如何同步處理多個記錄?
記錄檔案需要有合法的程序來證明個體所做的壞事,或解決否認的案件。如果稽核是在資源存取的時間而且是經由存取資源的相同常式所產生的,通常稽核被認為是最可靠的。確認在記錄檔案中的應用程式設計因素有同步,並且記錄某些要求識別元格式以確認不同記錄檔案的項目互相關聯而且相關回溯到同一要求。

您如何保留原始呼叫者識別身份?
如果不在作業系統層級保留原始呼叫者識別身份,例如,因為方法擴充性的限制,請識別應用程式如何保留原始呼叫者識別身份。對跨層的稽核這是必要的 (對授權可能也是)。

同樣的,如果多個使用者對應到同一個應用程式角色,檢查應用程式有記錄原始呼叫者的識別身份。

您是否有考慮安全的記錄檔案管理原則?

檢查應用程式設計是否分析出記錄檔案如何備份、保存、和分析。記錄檔案應該定期備份以確保不會被填滿或開始循環,而且應該定期分析以偵查入侵的徵兆。同樣請確認使用最小權限帳戶執行備份,而且對純粹因為備份目的而暴露的任何其他通訊通道有加以保護。

回到頁首回到頁首

總結

經由花費時間和努力來分析及檢閱應用程式架構及設計,可以消弭設計相關的弱點進而增強整體安全性。在設計時期修補弱點比稍後在開發週期才進行修補容易的多而且成本較低。

經由考慮設計相關的目標部署環境以及環境所定義的安全性原則,可以幫助確保順利與安全的應用程式部署。

如果已經有建立應用程式,架構及設計檢閱仍然是安全性評估程序的重要部分,有助於修補弱點及增強未來的設計。

回到頁首回到頁首

其他資源

有關其他詳細資訊,請參閱下列資源:

如需設計、建置及設定驗證、授權及在分散式 Web 應用程式各層間安全通訊的詳細資料,請參閱《建置安全的 ASP.NET 應用程式: 驗證、授權和安全通訊》網址為:http://www.microsoft.com/taiwan/msdn/books/ataglance/secnetlpMSDN.htm>。

如需可列印的檢查清單,請參閱本指南<檢查清單>章節中的<檢查清單:架構及設計檢閱>。


回到頁首回到頁首