Web安全系列選題之 敏捷開發(fā)需事先內(nèi)置
云計算等新型應(yīng)用模式的出現(xiàn),促使更多的應(yīng)用程序運行著互聯(lián)網(wǎng)上,基于web應(yīng)用程序可謂是隨處可見。這無疑對應(yīng)用程序的安全性是個巨大考驗。
敏捷(Agile)開發(fā)日漸流行,很多開發(fā)者都采用安全功能事后補充是這種開發(fā)方式,無疑為未來的應(yīng)用程序埋下了安全隱患。安全性必須是應(yīng)用程序開發(fā)方法當(dāng)中一個不可或缺的部分,敏捷開發(fā)流程也不例外。
應(yīng)用程序安全性已成為所有軟件開發(fā)項目的一個關(guān)鍵部分。它包括在整個軟件開發(fā)生命周期中采取的所有措施,旨在防止程序缺陷被人利用。在應(yīng)用程序的需求征集、設(shè)計、開發(fā)、部署、升級或維護等階段逐漸出現(xiàn)的眾多缺陷成了網(wǎng)絡(luò)攻擊的基礎(chǔ)。
由于應(yīng)用程序缺乏固有的安全性,加上編程方法很糟糕,應(yīng)用程序經(jīng)常被黑客們鉆空子,并且?guī)椭鷮?dǎo)致了數(shù)據(jù)泄密及知識產(chǎn)權(quán)失竊引起的重大經(jīng)濟損失。這就是為什么安全性必須是應(yīng)用程序開發(fā)方法當(dāng)中一個不可或缺的部分,敏捷(Agile)開發(fā)流程也不例外。
據(jù)說敏捷開發(fā)流程早在2001年11月就問世了。近些年來,這種軟件開發(fā)方法日漸流行。敏捷開發(fā)流程致力于把程序開發(fā)與客戶需求和公司目標(biāo)統(tǒng)一起來的迭代發(fā)現(xiàn)和開發(fā)。
盡管如此,筆者還是發(fā)現(xiàn),敏捷開發(fā)的基本特點往往決定了直到業(yè)務(wù)功能建成后才考慮安全問題。許多時候,安全不是事先添加到最初發(fā)布的功能中,因而使敏捷應(yīng)用程序的安全功能成了事后擴充(bolted on)的,而不是事先內(nèi)置(built in)的。
我在分析應(yīng)用程序安全問題時,往往把它們分成兩類:業(yè)務(wù)邏輯缺陷和技術(shù)安全漏洞。大家已認(rèn)識到,安全必須事先內(nèi)置到應(yīng)用程序當(dāng)中,而不是最后擴充上去。如果使用敏捷開發(fā)方法,這就帶來了難題。
這還引發(fā)了頗有意義的爭論:敏捷開發(fā)是否適用于涉及敏感安全信息的應(yīng)用程序?或者是否適用于為進入其他系統(tǒng)提供秘密通道(即后門)的應(yīng)用程序?
與許多人一樣,筆者也認(rèn)為敏捷開發(fā)流程并不適用于對安全很敏感的應(yīng)用軟件。這主要是由于敏捷開發(fā)流程具有輕便、非正式、漸進式開發(fā)(build-as-you-go)的特性。安全功能必須事先內(nèi)置,而不是事后擴充;因而,安全功能必須融入到整個敏捷開發(fā)流程當(dāng)中。
項目動工之前就要開始考慮安全了。必須一開始就要制訂安全策略和目標(biāo)。之后及在項目定義步驟期間,必須制訂及記錄重要的安全需求和目標(biāo),并且告知開發(fā)團隊。一旦我們奠定了這些安全基礎(chǔ),必須評估滿足這些目標(biāo)的必要條件。在范圍界定和評估步驟,必須抽出時間來審查不斷變化的需求,從而完善安全需求和目標(biāo)。
界定安全范圍、估計所需工作量后,可以制訂重要的安全計劃。你在制訂這些重要的安全計劃時,必須明確安全協(xié)調(diào)活動,以便評估迭代開發(fā)工作過程中每個階段的安全措施,并且確保這些措施已在考慮之中?,F(xiàn)在基礎(chǔ)打好了,我們就可以探討在迭代開發(fā)周期(sprint,一般最多以30天為一個周期)內(nèi)的安全。
迭代開發(fā)的首要步驟之一就是,為每個迭代開發(fā)周期確立一個主題,這個主題定義了這個開發(fā)階段著重處理哪種類型的功能。明確了每個迭代開發(fā)周期的主題后,就要發(fā)現(xiàn)及記錄預(yù)測的對安全帶來的影響,可能還要在開發(fā)過程中建立樁模塊(stub)。
借助建立樁模塊這種方法,不需要先為完整功能編寫代碼,就可以開發(fā)應(yīng)用程序的某些部分。現(xiàn)在有必要獲取滿足下面這個條件的與安全有關(guān)的場景和細(xì)節(jié):它們要與某個迭代開發(fā)周期的迭代發(fā)現(xiàn)和開發(fā)過程中所定義的功能相一致。
發(fā)現(xiàn)了安全需求后,就必須作出這個決定:現(xiàn)在添加安全功能、為它們建立樁模塊,還是推遲到以后的迭代開發(fā)周期來添加。兩個方面確實影響了把安全添加到迭代開發(fā)周期當(dāng)中的決定。其中對這個決定影響最大的就是,會不會部署及積極使用軟件,以及會不會涉及安全風(fēng)險和敏感信息。
如果軟件要加以部署,就必須事先內(nèi)置安全,并進行測試,這是迭代開發(fā)周期的一部分。不然,建立樁模塊或推遲都是切實可行的選擇。這時候,迭代開發(fā)開始了。軟件開發(fā)好后,通常進行低層測試,還要演示,并讓客戶進行代碼走查(code walkthrough)。這些測試用例和場景必須實際檢驗安全措施。
話雖如此,實際檢驗這一步并不出現(xiàn),這是我的個人經(jīng)驗。所有添加的與安全有關(guān)的功能和特性都必須進行實際檢驗和演示。測試和代碼審查方面必須加大關(guān)注力度,尤其要注意競態(tài)條件、跨站腳本、信息泄漏和SQL注入攻擊。
事實已證明,這四種編碼問題都是Web應(yīng)用程序當(dāng)中最常見的軟件漏洞。一旦完成了基本測試,就可以讓軟件進入到模擬的部署環(huán)境。
作為迭代開發(fā)周期一部分提供的軟件安裝到具有代表性的操作環(huán)境中。十有八九,開發(fā)環(huán)境與操作環(huán)境大不一樣。這會導(dǎo)致軟件操作問題和安全問題。這時就需要部署到模擬生產(chǎn)環(huán)境的環(huán)境中,那樣才能解決這些問題。之前使用的所有測試用例和場景構(gòu)成了回歸測試(regression testing)的基礎(chǔ)。
自動化測試腳本重新運行,確認(rèn)在新環(huán)境下能夠正常操作。另外,建立新的測試腳本和場景,以便從頭到尾全面檢驗軟件;還要進行檢查及測試,查找有無軟件漏洞。一旦所有這些測試都成功通過,軟件可以進入到下一個階段:客戶驗收階段。
在這個階段,作為一個或若干迭代開發(fā)周期的一部分提供的軟件進行演示、評估和驗證,最終由商業(yè)客戶決定驗收或拒收。這一步必須包括對安全進行檢查。正如客戶有商業(yè)驗收標(biāo)準(zhǔn),他們也應(yīng)當(dāng)制訂安全驗證標(biāo)準(zhǔn)。盡管這看似過于絕對化,其實不是這樣。有條件驗收是普遍慣例。
要是某個地方出現(xiàn)了變化,項目發(fā)起人往往只接收某個迭代開發(fā)周期的交付成果。如果確認(rèn)了驗收條件,就要安排時間進行返工。一旦安排了時間,滿足驗收條件所需的返工就必須完成。一旦返工完成,并通過測試,就要審查返工部分,并向商業(yè)客戶進行演示,確保符合有條件驗證的目的。
獲得汲取的教訓(xùn)是指收集、記錄及分析迭代開發(fā)期間所收到反饋的過程。這項工作很關(guān)鍵,那樣隨后的迭代開發(fā)周期就能從中獲益。
這項工作很關(guān)鍵的理由還在于,獲得安全方面汲取的教訓(xùn)讓團隊成員有機會反省迭代開發(fā)周期過程中導(dǎo)致安全缺陷的任務(wù)、事件和活動。另外,獲得汲取的教訓(xùn)需要回過頭去分析一下風(fēng)險管理工具,并記錄優(yōu)點和不足。
迄今為止開發(fā)出來的所有軟件必須整合起來加以驗證。一旦完成了這項工作,就必須加以驗證,以確保功能正常。短期內(nèi)還需要監(jiān)測及跟蹤,確保所有軟件和系統(tǒng)組件能協(xié)同順暢運行,沒有帶來安全漏洞。要站在安全的角度,測試系統(tǒng)之間的相互關(guān)系。必須在這個步驟創(chuàng)建及運用新的安全測試場景。
此外,如前所述,測試和代碼審查方面必須加大關(guān)注力度,尤其要注意跨站腳本、信息泄漏和SQL注入攻擊。一旦各方面可以協(xié)同順暢運行、而且安全,就可以準(zhǔn)備發(fā)布到生產(chǎn)環(huán)境了。軟件發(fā)布管理(RM)是所有軟件開發(fā)方法和項目當(dāng)中比較新的一部分。RM充當(dāng)所有業(yè)務(wù)部門和IT部門之間的連接紐帶,可以保障順利過渡至新系統(tǒng)。
最后,是時候進入到下一個迭代開發(fā)周期了。收尾步驟表明某個迭代開發(fā)周期正式收工。另外,這個步驟帶來了項目工件(artifact),確保為代碼編寫了相應(yīng)文檔,并對代碼作了備份和歸檔。這一步常常需要改變公司所部署的安全監(jiān)控流程和功能。
安全行業(yè)把可怕事件頻發(fā)的2008年稱為“數(shù)據(jù)丟失年”,這是由于這一年發(fā)生了多起敏感信息安全泄密事件。美國國家情報總監(jiān)Dennis C. Blair在國會聽證會中聲稱,去年全球各地的眾多公司因數(shù)據(jù)竊取而丟失的知識產(chǎn)權(quán)價值超過1萬億美元。
軟件漏洞是最主要的根源之一。這應(yīng)該向從事應(yīng)用程序開發(fā)的每個人敲響了警鐘,不管他采用什么方法來開發(fā);這還向敏捷開發(fā)項目發(fā)出了預(yù)警信號:它們需要確保事先加入而不是事后擴充了合理的安全功能。
【編輯推薦】