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