保護(hù) xml web 服務(wù)免受黑客攻擊, []第一部分] [第二部分] matt powell microsoft corporation 2001 年 9 月 19 日 在上一篇文章中,我們討論了不同種類的攻擊,以及如何進(jìn)行配置以免受到攻擊。本文中,我們將集中討論如何進(jìn)行設(shè)計和開發(fā),以免受到攻擊。 首先,我想介紹兩個非常好的新工具,它們是 microsoft® 開發(fā)的,可使您的 web 服務(wù)器獲得最大的安全性。iis lockdown tool(英文)可以最大限度地防止可能的攻擊者對您的 microsoft® internet information server (iis) 進(jìn)行訪問。鎖定工具還提供了“advanced”選項(xiàng),您可以在其中選擇所需設(shè)置。此外還提供了“rollback changes”選項(xiàng)。當(dāng)您對所做更改不滿意時可選擇該選項(xiàng)。請嘗試該工具。 另一個重要工具是用于 iis 5.0 的 hotfix checking tool(英文)。該工具會查詢由 microsoft 發(fā)布的所有可用安全性修補(bǔ)程序的 xml 文檔(該文檔是不斷更新的),然后將此文檔與本機(jī)安裝的文檔進(jìn)行比較并報告其差異。使用該工具可以更輕松地管理單個 web 服務(wù)器或大型 web 領(lǐng)域的安全修補(bǔ)程序。
設(shè)計問題
設(shè)計 web 服務(wù)時必須認(rèn)真考慮安全問題,以及如何能夠使遭受攻擊的危險性降到最低。許多在試圖防止攻擊時可能起作用的因素都可以在設(shè)計時予以考慮。例如考慮如何進(jìn)行身份驗(yàn)證,或希望返回哪類錯誤等問題。
確定安全需求
在 xml web 服務(wù)設(shè)計的早期,您需要確定所需的安全級別。某些 xml web 服務(wù)根本不需要身份驗(yàn)證,而其他服務(wù)對于確定使用該服務(wù)的用戶有非常嚴(yán)格的要求。由 xml web 服務(wù)接收和發(fā)送的數(shù)據(jù)需要何種隱私級別?如果某個 xml web 服務(wù)用戶聲明他們未請求您記錄中所指明的服務(wù),則在工時、處理能力或法律費(fèi)用方面可能要花費(fèi)哪些成本? 首先,讓我們來看一下身份驗(yàn)證。某些種類的身份驗(yàn)證會比其他身份驗(yàn)證更容易遭受攻擊。在低端,如果您使用“http 基本身份驗(yàn)證”,則可以看到網(wǎng)絡(luò)上的數(shù)據(jù)包的所有用戶都能看到您的用戶名和密碼。如果通過 internet 發(fā)送請求,則您無法控制能看到您的數(shù)據(jù)包的用戶。在身份驗(yàn)證級別的高端,您可以考慮使用 ssl 客戶端證書進(jìn)行身份驗(yàn)證,該證書提供了一個編碼的通道,并使數(shù)據(jù)包的惡意攻擊者很難進(jìn)行攻擊。有關(guān)身份驗(yàn)證選項(xiàng)的詳細(xì)討論,請參閱 at your service 專欄中 mary kirtland 的 authentication and authorization(英文)。 我們已經(jīng)間接提到了身份驗(yàn)證過程中的隱私問題,當(dāng)涉及到電子欺騙時您應(yīng)考慮此問題。您還需要知道與所有從 xml web 服務(wù)發(fā)送和接收的數(shù)據(jù)有關(guān)的隱私問題,而不僅僅是用戶名和密碼。例如,您可能會為通過身份驗(yàn)證的用戶生成一個會話密鑰,該用戶將此密鑰隨每個請求一起發(fā)送以標(biāo)識自身。如果此密鑰未加密發(fā)送,則數(shù)據(jù)包的惡意攻擊者可以看到此密鑰,并用它向您的 web 服務(wù)發(fā)送自己的請求,這樣您的 web 服務(wù)會將其看作是原來那個合法用戶。 另一個隱私問題是由 web 服務(wù)發(fā)送和接收的簡單數(shù)據(jù)。該數(shù)據(jù)是否因其敏感性強(qiáng)而需要加密?ssl 加密的代價是 web 服務(wù)會發(fā)送和接收整個加密的通道,從而降低性能。您或許可以只加密請求中的敏感項(xiàng),但您隨后可能需要在客戶端上安裝自定義編寫的軟件以啟用加密/解密。使用 ssl 加密整個通道的一個優(yōu)點(diǎn)是:目前大多數(shù)客戶端平臺都支持基本 ssl 通信,而不需要針對應(yīng)用程序編寫特定代碼。 就基本安全性設(shè)計而言,還必須考慮否認(rèn)的概念,即一個用戶可以拒絕承認(rèn)其通過 xml web 服務(wù)執(zhí)行的操作。例如,如果您提供股票交易服務(wù),而某些人聲稱他們沒有要求您的系統(tǒng)為其出售股票,并且要否認(rèn)此出售命令。很明顯,與其他服務(wù)相比,某些 xml web 服務(wù)對這種問題可能會更為關(guān)心,但是您應(yīng)該確定您的服務(wù)可能會遇到的危險,以及在方案中應(yīng)采取什么樣的有效措施。 使用安全的身份驗(yàn)證系統(tǒng)肯定是避免出現(xiàn)這類危險的首要步驟。例如,使用 http 基本身份驗(yàn)證可能是不安全的,但是通過使用 ssl 的加密通道來使用此身份驗(yàn)證則是安全的。如果用戶使用空密碼或容易猜到的密碼,即使具有安全的身份驗(yàn)證系統(tǒng)也是沒有用的。強(qiáng)制使用強(qiáng)加密密碼是防止出現(xiàn)此類問題的重要步驟。總之,用戶和服務(wù)執(zhí)行者都有責(zé)任防止密碼泄露。 最后,如果不審核通過服務(wù)發(fā)生的事件,當(dāng)出現(xiàn)否認(rèn)情況時,安全的身份驗(yàn)證和強(qiáng)加密密碼都是毫無意義的。當(dāng)事務(wù)中存在否認(rèn)威脅時,應(yīng)記錄這些事務(wù)及其用戶、時間、日期等足夠多的信息以標(biāo)識事務(wù)的詳細(xì)信息。否則,當(dāng)出現(xiàn)爭論時,您可能缺少足夠的證據(jù)以證實(shí)您的觀點(diǎn)。
審核、報告和監(jiān)視
審核對減少否認(rèn)危險程度起著重要的作用;在識別其他種類的攻擊過程中,也起著關(guān)鍵作用。例如,如果不是您的審核記錄中的統(tǒng)計數(shù)據(jù)表明您的服務(wù)存在異常使用情況,您可能根本意識不到您的服務(wù)正在遭受攻擊。例如,您是否注意到某個人正在對登錄方式進(jìn)行字典攻擊?所以,我們將講述在審核、報告和監(jiān)視時需要考慮的問題,以保護(hù) xml web 服務(wù)免受攻擊。 審核的概念就是記錄所發(fā)生的每個事件的所有信息。但是,當(dāng)通過 xml web 服務(wù)的數(shù)據(jù)量很大時,此想法可能是不切實(shí)際的。審核記錄至少應(yīng)包括所有請求的時間、日期和 ip 地址。如果 xml web 服務(wù)經(jīng)過身份驗(yàn)證,您需要在每個審核記錄中包括用戶名。如果您的服務(wù)支持多種方法或消息格式,您需要標(biāo)識調(diào)用的是哪一個。最后,您需要包括足夠的信息以滿足您標(biāo)識調(diào)用詳細(xì)信息的需要。例如,如果 xml web 服務(wù)使用了一種方法,您可能希望記錄傳遞給該方法的所有參數(shù)。 您還需要考慮其他需要,例如當(dāng)站點(diǎn)遭到攻擊時您可能需要回滾事務(wù)。而且,您的審核記錄往往是某些報告的最佳信息源。由于審核記錄可能相當(dāng)大,您需要協(xié)調(diào)審核設(shè)計和備份策略。 審核處理的是通過您的服務(wù)同時發(fā)生的所有事件的記錄,報告則是向用戶、操作員和管理員匯報系統(tǒng)的使用信息。報告是保護(hù) xml web 服務(wù)免受攻擊的一個重要部分,因?yàn)橥ㄟ^它可以觀察服務(wù)的使用情況。一種主要的報告類型是報告發(fā)生的錯誤。報告 xml web 服務(wù)所遇到的錯誤的能力是最重要的。同樣,您還需要報告那些可能指出惡意客戶端企圖的錯誤。例如,如果所接收請求中的某個參數(shù)是一個異常的長字符串,則您需要以一種容易引人注意的方式來報告該錯誤。對于這種類型的錯誤,您應(yīng)該在應(yīng)用程序事件日志中創(chuàng)建事件,這樣可以相應(yīng)地對它們進(jìn)行監(jiān)視。有關(guān)如何將事件寫入事件日志的詳細(xì)信息,請參閱操作系統(tǒng)平臺 sdk 中的 event logging(英文)。 另一種對您的服務(wù)至關(guān)重要的報告類型是匯總服務(wù)使用情況的報告。它應(yīng)該有兩種形式:首先,創(chuàng)建供您個人進(jìn)行分析的全局報告,您可以使用該報告檢測使用級別或異常模式。應(yīng)該對正常報告的外觀具有足夠的了解,這樣您才能夠發(fā)現(xiàn)異常使用的情況。其次,需要為您的用戶提供報告。您的用戶還應(yīng)能夠監(jiān)視他們對服務(wù)的使用情況。很有可能出現(xiàn)這樣的情況:在全局報告中未記錄攻擊行為,而個別用戶卻能立即在其各自的報告中發(fā)現(xiàn)問題。 如果 xml web 服務(wù)正在 internet information server (iis) 上運(yùn)行,那么我們就有必要提及一種能免費(fèi)得到的非常有用的報告類型。即,為所有傳入的 http 請求(包括對您服務(wù)的請求)進(jìn)行的 iis 日志記錄。您可以使用 iis 日志中提供的信息來改進(jìn)自己的報告。 ' 最后,實(shí)施了審核及適當(dāng)?shù)膱蟾娣椒ê螅枰褂媚撤N機(jī)制以發(fā)現(xiàn)所報告的問題。這就是監(jiān)視。 可以以不同級別進(jìn)行監(jiān)視。當(dāng)然,定期手動查看報告是監(jiān)視 xml web 服務(wù)的使用情況的一種方式,但是還應(yīng)檢查事件日志中已報告的錯誤,使用性能監(jiān)視日志,并利用可以監(jiān)視 web 服務(wù)器停機(jī)時間的多種工具中的一種。性能監(jiān)視對于檢測攻擊可能是非常關(guān)鍵的。幸好,與 iis 關(guān)聯(lián)的大量性能計數(shù)器可以為檢測問題提供許多重要的統(tǒng)計數(shù)據(jù)。 您可能還希望為 xml web 服務(wù)創(chuàng)建自己的性能計數(shù)器。有關(guān)創(chuàng)建您自己的性能計數(shù)器的詳細(xì)信息,請參閱 performance monitoring(英文)。為了確保引起您對異常情況的特殊關(guān)注,應(yīng)以某種形式通知您正在發(fā)生的事件,這點(diǎn)是非常重要的。可以在異常事件發(fā)生時,利用性能監(jiān)視警報發(fā)送彈出式消息,或運(yùn)行某個程序。圖 1 顯示的性能監(jiān)視警報會監(jiān)視未完成的 iis isapi 請求的數(shù)量,以及當(dāng)前隊(duì)列中的 asp 請求的數(shù)量。 圖 1:創(chuàng)建性能監(jiān)視警報 如果不對可能發(fā)生的問題采取一些措施,則對濫用的操作進(jìn)行審核、報告和監(jiān)視不會有任何用處。拒絕服務(wù)攻擊可能會被定義到特定的 ip 地址,這意味著您可能需要在路由器中過濾來自該地址的請求。但是,拒絕服務(wù)攻擊或電子欺騙攻擊可能與 xml web 服務(wù)的特定用戶相關(guān)。您必須能夠在這種問題發(fā)生時禁用帳戶。完成此操作可能僅需在 microsoft® active directory™ 中禁用 windows 用戶帳戶。或者,如果使用的是自己設(shè)計的身份驗(yàn)證方式,則意味著必須在用戶記錄中添加一個可以表示禁用帳戶的狀態(tài)字段。您還應(yīng)確認(rèn) xml web 服務(wù)的用戶同意“服務(wù)條款”文檔,該文檔指明在何種情況下您可以刪除或禁用他們的帳戶。
定義接口
與其他 web 應(yīng)用程序相比,xml web 服務(wù)器應(yīng)用程序的一個主要優(yōu)點(diǎn)就是很好地定義了傳遞到您的應(yīng)用程序的整個 xml 架構(gòu)。對于應(yīng)用程序設(shè)計人員和開發(fā)人員來說,這意味著您已經(jīng)知道 xml web 服務(wù)所必須處理的數(shù)據(jù)具有有效的格式。如果接收的數(shù)據(jù)格式不正確,那么 microsoft® soap toolkit 2.0 或 .net 框架之類的工具將過濾出該請求,這樣您就不必為此擔(dān)心了。 例如,您不必分析日期輸入的語法是否有效。日期必須具有有效的 xsd 格式,否則該請求會被丟棄。您可能需要利用結(jié)構(gòu)驗(yàn)證,因此不要隱藏字符串變量中的結(jié)構(gòu)。利用 xml 的能力和靈活性可以全面描述發(fā)送和接收的數(shù)據(jù)。
不可見的服務(wù)器
黑客攻擊您的系統(tǒng)時,首先尋找的是信息。此 web 站點(diǎn)是駐留在 windows 中還是駐留在其他系統(tǒng)中?是否正在運(yùn)行 active server pages?是否安裝了 index server?是否安裝了已知的易受攻擊的組件?是否安裝了已知的易受攻擊的 cgi 應(yīng)用程序?主機(jī)是否正在運(yùn)行 microsoft® sql server?我是否可以對此服務(wù)器進(jìn)行分布式 com (dcom) 調(diào)用? 對于不希望受到攻擊的站點(diǎn),即使非常聰明的 internet 用戶也應(yīng)該無法回答上述任何問題。黑客對您的系統(tǒng)了解得越少,對平臺的了解也越少,就越難在您的服務(wù)器上找到問題。 例如,試想一下,如果黑客只知道 xml web 服務(wù)的 url 為“http://www.coldrooster.com/ssf/account.asp”,他們能了解什么呢。由于此 url 的擴(kuò)展名為 .asp,他們可以假設(shè)這是一臺運(yùn)行了 active server pages 的 windows 計算機(jī)。根據(jù)黑客對 internet information server 的默認(rèn)配置的了解,他們已具有足夠的信息對大量的未正確配置的弱點(diǎn)進(jìn)行攻擊。他們可對配置方法進(jìn)行大量的、很可能有效的假設(shè),并用這些假設(shè)來刺探計算機(jī)。 如果 url 為“http://www.coldrooster.com/ssf/account/”,情況又會怎樣呢?在這種情況下,黑客得不到任何服務(wù)器所用操作系統(tǒng)的信息,也無從假設(shè)系統(tǒng)的配置。將虛擬目錄級的請求映射到某個特定的 asp 頁是一個非常小的配置選項(xiàng),但能為服務(wù)器提供很多保護(hù)。 熟悉基本 http 協(xié)議的用戶可能注意到 http 標(biāo)頭特別指明了正在使用的 web 服務(wù)器類型。是的,這是另一種確定計算機(jī)上操作系統(tǒng)的更為復(fù)雜的方法,但是也可以編寫 isapi 過濾器來刪除或替換此標(biāo)頭。有關(guān)如何進(jìn)行這種操作的信息,請參閱 developing isapi filters(英文),以及 iis 程序員指南中的 sf_notify_send_response(英文)通知。服務(wù)器上運(yùn)行的基礎(chǔ)系統(tǒng)越難辨認(rèn),黑客編寫的用于在 internet 上查找某種類型計算機(jī)的腳本失敗的可能性就越大。 但是操作系統(tǒng)本身并不是唯一的弱點(diǎn)。您創(chuàng)建的 asp 頁在后端執(zhí)行 sql 查詢并拋出異常時,會執(zhí)行什么操作?您是否將異常信息返回給用戶瀏覽器?這樣不僅指出了 web 服務(wù)器平臺,還指出了數(shù)據(jù)庫平臺。除此之外,它還可以使用戶了解您正在進(jìn)行的特定 sql 查詢,并為他們提供信息,使其了解如何更改要輸入到窗體中的內(nèi)容以得到他們不應(yīng)有權(quán)訪問的信息。 出現(xiàn)其他 com 異常情況怎么辦?如果將異常信息傳播給用戶,黑客將會知道您的計算機(jī)上安裝了哪些 com 組件。如果此 com 對象是第三方 dll,則黑客可以得到它的一個副本,并竭盡全力搜索可能存在的所有弱點(diǎn)。這至少使黑客有機(jī)會了解服務(wù)器上可能存在的問題。 同樣,黑客可能會利用觸發(fā) com 異常這一事實(shí)來阻塞服務(wù)器。黑客意識到多數(shù)異常代碼路徑未經(jīng)充分測試,且常常是資源泄露或變得更糟的起因。要避免出現(xiàn)這種情況,服務(wù)器上的代碼應(yīng)能捕獲所有異常情況,并且應(yīng)該只返回普遍性的錯誤。對于 xml web 服務(wù),您應(yīng)返回幾乎不帶有平臺信息的 soap 錯誤。您可能希望以某種方式將數(shù)據(jù)連同 id 一起返回給用戶以便將錯誤與審核日志中的記錄進(jìn)行比較,但是,請將錯誤詳細(xì)信息放在審核日志中而不是放在返回的 soap 錯誤中。建議應(yīng)用程序設(shè)計人員創(chuàng)建自己的應(yīng)用程序的 soap 錯誤架構(gòu),同時提供一個非常短的選項(xiàng)列表,并且僅返回此列表上的錯誤。調(diào)用 xml web 服務(wù)的客戶端不必知道有關(guān) sql 查詢異常的詳細(xì)信息,他們只需要知道出現(xiàn)了 soap 服務(wù)器錯誤。 如果正在使用 microsoft® soap toolkit 2.0,可以在 com 對象上實(shí)現(xiàn) isoaperror 接口以返回您希望返回的確切的 soap 錯誤,而不是一般的工具包錯誤。一般的工具包錯誤可以提供大量的、有關(guān)錯誤出現(xiàn)時在服務(wù)器上所發(fā)生情況的信息。在開發(fā)階段,工具包錯誤對于調(diào)試來說是很有用的,但是它們在產(chǎn)品服務(wù)器上不應(yīng)出現(xiàn)。他們可以為黑客提供大量的、具有潛在破壞性的信息。 xml web 服務(wù)的用戶需要知道您的服務(wù)所發(fā)送和接收的 soap 消息的格式,以及您的服務(wù)的終點(diǎn)位置。這就足夠了。任何其他信息都只會為潛在的黑客提供攻擊手段以毀壞您的系統(tǒng)。要進(jìn)行自我保護(hù),應(yīng)限制返回與平臺有關(guān)的信息,并消除計算機(jī)上的多余內(nèi)容,包括刪除任何有助于他人識別您的系統(tǒng)的默認(rèn)虛擬目錄或腳本映射。
開發(fā)問題
對黑客來說,服務(wù)器的脆弱性與服務(wù)器上運(yùn)行的代碼質(zhì)量是成反比的。它包括基礎(chǔ)系統(tǒng)(操作系統(tǒng)、web 服務(wù)器和正在使用的 soap 工具)的質(zhì)量,以及為特定應(yīng)用程序編寫的代碼的質(zhì)量。還可能包括服務(wù)器上運(yùn)行的所有其他代碼,即使該代碼不是應(yīng)用程序的一部分。但是從開發(fā)人員的角度而言,我們希望考慮我們能控制的問題,以及能執(zhí)行哪些特殊的操作以保證代碼的高質(zhì)量,避免增加 xml web 服務(wù)和服務(wù)器上正在運(yùn)行的其他所有應(yīng)用程序的脆弱性。
檢查所有調(diào)用函數(shù)的返回代碼。如果正在調(diào)用 win32 api,請確保調(diào)用已成功完成。如果正在分配內(nèi)存,請確保未返回 null 值。如果正在進(jìn)行 com 調(diào)用,特別是正在使用 microsoft® visual basic® 進(jìn)行調(diào)用并且已指定“on error resume next”語句,請確保未出現(xiàn)異常。同樣,不要對這類調(diào)用的結(jié)果做任何假設(shè)。 如果正在調(diào)用 win32 安全函數(shù),應(yīng)特別小心。例如,如果正在調(diào)用 impersonateloggedonuser,應(yīng)檢查返回代碼是否存在錯誤,否則將難以為用戶提供較高的安全環(huán)境。當(dāng)您的 web 應(yīng)用程序配置為在 iis 上以“進(jìn)程內(nèi)”方式運(yùn)行時要格外注意這一點(diǎn),因?yàn)榇a可能以本地系統(tǒng)帳戶運(yùn)行,這在本地計算機(jī)上幾乎沒有限制。還應(yīng)注意某些交叉的 com 調(diào)用同樣可能在具有較高權(quán)限的線程中運(yùn)行。
盡早、盡快地驗(yàn)證輸入
xml web 服務(wù)接收請求時,您應(yīng)做的第一件事就是驗(yàn)證提交的數(shù)據(jù)。根據(jù)架構(gòu)進(jìn)行 web 服務(wù)說明語言 (wsdl) 驗(yàn)證將會捕獲許多錯誤,但是您應(yīng)立即執(zhí)行所需的任何應(yīng)用程序級的驗(yàn)證。包括檢查特殊字符、檢查特定范圍內(nèi)的數(shù)值、檢查字符串長度,等等。即使認(rèn)為所有請求必須來自特定的應(yīng)用程序,也應(yīng)在進(jìn)行證明之前假定傳入數(shù)據(jù)是無效的。事實(shí)是對 xml web 服務(wù)的請求可以來自任何地方。如果對數(shù)據(jù)進(jìn)行假設(shè),應(yīng)假定數(shù)據(jù)可能來自某個惡意用戶。 參數(shù)驗(yàn)證代碼能夠快速地完成也是很重要的。識別無效請求的速度越快越好。否則 xml web 服務(wù)容易遭受拒絕服務(wù)攻擊。如果您的服務(wù)器處理非法請求的時間較長,則很可能不能為合法請求提供服務(wù)。始終應(yīng)用與專用數(shù)據(jù)同等的安全級別來對待消耗時間和資源的操作。如果必須執(zhí)行耗時的 sql 查詢,或者某個操作要求具有很強(qiáng)的處理能力,則首先要確保請求的合法性。用戶是否是合法用戶?對請求進(jìn)行身份驗(yàn)證不僅能防止無效用戶使用您服務(wù)器上的資源,并且提供了跟蹤審核日志中的錯誤使用情況的能力,使您可以發(fā)現(xiàn)特定用戶非法使用資源的情況。如果正在驗(yàn)證輸入,應(yīng)首先驗(yàn)證用戶的憑據(jù)。如果使用普通 http 身份驗(yàn)證機(jī)制,則在代碼調(diào)用之前就會為您進(jìn)行用戶身份驗(yàn)證。