本文中的“安全掃描”是指開(kāi)發(fā)團(tuán)隊(duì)在距離產(chǎn)品上線日期比較近的時(shí)候,通過(guò)公司里的安全團(tuán)隊(duì)或者外部第三方安全公司對(duì)產(chǎn)品進(jìn)行安全掃描,團(tuán)隊(duì)基于安全掃描報(bào)告,對(duì)產(chǎn)品中存在的安全漏洞進(jìn)行修復(fù)的過(guò)程。不同的公司,不同的開(kāi)發(fā)團(tuán)隊(duì)對(duì)它的稱呼可能不一樣,有人把它叫做滲透測(cè)試,也有人把它叫做安全審查、安全評(píng)估、安全檢查等等。
如果不做安全掃描會(huì)怎樣?
想象一下,你所在的開(kāi)發(fā)團(tuán)隊(duì)正在開(kāi)發(fā)一款互聯(lián)網(wǎng)金融產(chǎn)品,所有的核心業(yè)務(wù)功能基本開(kāi)發(fā)完畢。此時(shí)此刻,離計(jì)劃中的上線日期只有不到三周時(shí)間。通常而言,這時(shí)候安全掃描就會(huì)介入進(jìn)來(lái),掃出一堆問(wèn)題扔給團(tuán)隊(duì)修復(fù)。

不過(guò)這次不一樣,如果我提議,不必給產(chǎn)品做安全掃描,就這樣直接上線可好?我想,絕大多數(shù)人的反應(yīng)會(huì)是下面這樣的:
“神馬?!不做安全掃描?那我怎么知道產(chǎn)品安不安全?萬(wàn)一出問(wèn)題了怎么辦?”
“我知道我們產(chǎn)品中一定會(huì)有安全問(wèn)題,安全掃描正好可以幫助我們把這些問(wèn)題暴露出來(lái),將其修復(fù)之后再上線才是萬(wàn)無(wú)一失的選擇?!?/p>
“雖然每次安全掃描都會(huì)掃出一堆問(wèn)題來(lái),搞得團(tuán)隊(duì)壓力山大,但如果不做掃描,我們到是輕松了,可產(chǎn)品的安全性卻又是個(gè)問(wèn)題。”
“安全掃描可是我們安全團(tuán)隊(duì)的殺手锏,不讓我們給開(kāi)發(fā)團(tuán)隊(duì)做掃描,那我們的價(jià)值怎么體現(xiàn)出來(lái)?”
“公司規(guī)范里說(shuō)了,不做安全掃描不準(zhǔn)上線?!?/p>
“年少輕狂的年輕人,我以過(guò)來(lái)人的經(jīng)驗(yàn)告訴你,這么做是要付出代價(jià)的?!?/p>
反應(yīng)越是激烈,說(shuō)明團(tuán)隊(duì)越是依賴安全掃描。甚至可以說(shuō),安全掃描在你的團(tuán)隊(duì)里,是保證產(chǎn)品安全的最后一道屏障,也是唯一的手段。
安全掃描是陳舊落后的手段
有人會(huì)說(shuō),最后一道屏障又怎樣,唯一的手段又如何,不管紅貓黑貓,抓到耗子的都是好貓。

先不談這樣做是好是壞,我們先來(lái)?yè)Q個(gè)角度思考一下,如果把“安全問(wèn)題”這幾個(gè)字換成“功能缺陷”或者“Bug”,你還會(huì)認(rèn)同這種在臨近產(chǎn)品上線之前做一次性的、運(yùn)動(dòng)式的大檢查,然后期待著開(kāi)發(fā)團(tuán)隊(duì)在所剩無(wú)幾的時(shí)間里快速修復(fù)掉所有Bug,還不能引入新Bug的做法嗎?
答案顯然是否定的。大家都明白,功能缺陷越早發(fā)現(xiàn)越好,否則修復(fù)成本將會(huì)非常高,越往后拖越對(duì)團(tuán)隊(duì)不利。
現(xiàn)如今,還有哪個(gè)開(kāi)發(fā)團(tuán)隊(duì)敢說(shuō),在開(kāi)發(fā)過(guò)程中不需要對(duì)軟件做測(cè)試,等到最后上線前做一次集中式的測(cè)試就夠了?開(kāi)發(fā)團(tuán)隊(duì)也是極盡所能的快速響應(yīng)軟件質(zhì)量問(wèn)題,例如進(jìn)行測(cè)試驅(qū)動(dòng)開(kāi)發(fā),編寫大量的自動(dòng)化測(cè)試并且通過(guò)CI持續(xù)的對(duì)軟件質(zhì)量進(jìn)行監(jiān)控。
安全問(wèn)題是如此的重要,它也是軟件質(zhì)量的一部分,只不過(guò)換了個(gè)名字,變了種表現(xiàn)形式而已,而我們卻用如此落后的方式來(lái)對(duì)待它,顯然不合理。
提前做安全掃描可能是空中樓閣
又有人說(shuō),安全掃描不就是太晚了一點(diǎn)嘛,我們把掃描時(shí)間點(diǎn)往前提一些不就好了嗎?
思路是對(duì)的,但很可惜,要做到這一點(diǎn)卻幾乎是不可能的。因?yàn)榘踩珤呙栌幸欢ㄇ疤釛l件,它只能對(duì)已經(jīng)開(kāi)發(fā)完成了的功能進(jìn)行掃描,這也就意味著,那些還處于開(kāi)發(fā)過(guò)程中的功能是覆蓋不到的。而且隨著開(kāi)發(fā)的進(jìn)行,軟件功能會(huì)有所調(diào)整,之前做過(guò)的安全掃描很可能會(huì)失去意義,最終還是得等到所有功能都開(kāi)發(fā)完畢了,在上線之前再做一次最終的安全掃描。于是這又回到了上面那個(gè)問(wèn)題。
安全掃描的短板不止一處
安全掃描除了上面講到的時(shí)間太晚的問(wèn)題之外,還有不少短板。首當(dāng)其沖的就是速度太慢,跟不上開(kāi)發(fā)團(tuán)隊(duì)的節(jié)奏。盡管有自動(dòng)化工具的幫助,但是一次全面、細(xì)致、深入的安全掃描,往往需要好幾天,甚至更長(zhǎng)時(shí)間。在如今追求快速開(kāi)發(fā)上線,迅速調(diào)整以響應(yīng)市場(chǎng)變化的環(huán)境下,開(kāi)發(fā)團(tuán)隊(duì)沒(méi)有這么多時(shí)間和耐心來(lái)等待掃描結(jié)果。
某些采用敏捷或者精益開(kāi)發(fā)方式的團(tuán)隊(duì),每個(gè)迭代甚至每天都有新功能上線和舊功能調(diào)整、問(wèn)題修復(fù)等等,而等到幾天甚至幾周后,團(tuán)隊(duì)拿到安全掃描報(bào)告的時(shí)候,被掃描的功能可能早就被廢棄了,這么做簡(jiǎn)直是在浪費(fèi)資源。
其次,留給安全掃描的時(shí)間窗口十分有限,它往往只能在產(chǎn)品功能完成之后,最終上線之前才能進(jìn)行,在這種情況下,往往只有一次機(jī)會(huì)進(jìn)行掃描,也只能給團(tuán)隊(duì)提供一次性的安全反饋。但實(shí)際情況卻是,業(yè)務(wù)需求在不斷發(fā)展和變化,開(kāi)發(fā)團(tuán)隊(duì)也在持續(xù)對(duì)產(chǎn)品功能做出調(diào)整,除非每次產(chǎn)品功能發(fā)生變化之后立即進(jìn)行一次安全掃描,否則以現(xiàn)有的模式,是沒(méi)有辦法及時(shí)給開(kāi)發(fā)團(tuán)隊(duì)提供安全性反饋的。
最后,安全掃描的成本也是不得不考慮的因素。購(gòu)買外部安全公司的安全掃描服務(wù)到是很方便,可是動(dòng)不動(dòng)就是幾十萬(wàn)的支出不是任何團(tuán)隊(duì)都能承受得起的。通過(guò)自有安全團(tuán)隊(duì)做安全掃描看上去可能更加經(jīng)濟(jì)實(shí)惠,畢竟是公司內(nèi)部資源,但是別忘了,自建安全團(tuán)隊(duì)也是有成本的,而且要招到杰出的安全工程師也不是件容易的事情。
既然安全掃描有這么多缺點(diǎn),那為什么還有如此多的團(tuán)隊(duì)在用它?
拋開(kāi)安全問(wèn)題暴露出來(lái)之后,解決起來(lái)是如何痛苦這件事情不談,其實(shí)安全掃描也并非一無(wú)是處。
盡管安全掃描在時(shí)間上晚了一些,速度上慢了一點(diǎn),還不可持續(xù),但由于軟件開(kāi)發(fā)本身是個(gè)復(fù)雜的過(guò)程,開(kāi)發(fā)團(tuán)隊(duì)在產(chǎn)品安全性上總有疏忽大意的時(shí)候,只要進(jìn)行安全掃描,大多數(shù)時(shí)候都會(huì)有所“收獲”。這樣的話,一方面安全掃描幫開(kāi)發(fā)團(tuán)隊(duì)發(fā)現(xiàn)了問(wèn)題,另一方面安全團(tuán)隊(duì)也體現(xiàn)出了自身價(jià)值,正是在這樣的背景下,安全掃描無(wú)論是對(duì)于開(kāi)發(fā)團(tuán)隊(duì)還是安全團(tuán)隊(duì)而言,都具有難以抗拒的誘惑力。
此外,有時(shí)候做安全掃描也是一種無(wú)奈之舉,因?yàn)橛行╅_(kāi)發(fā)團(tuán)隊(duì)不見(jiàn)黃河不死心,除非你把安全問(wèn)題明確的擺在他們面前,否則他們意識(shí)不到問(wèn)題的嚴(yán)重性,不會(huì)輕易的主動(dòng)去關(guān)注安全問(wèn)題。
除了安全掃描,還有別的什么辦法?
既然安全問(wèn)題這么重要,安全掃描又是如此的低效,那我們?cè)撛趺醋霾拍芨玫慕鉀Q這個(gè)問(wèn)題呢?答案其實(shí)早就擺在眼前了,軟件的安全性是軟件質(zhì)量的一部分,為何不嘗試一下把它和功能需求一樣,都當(dāng)做頭等公民來(lái)看待呢?那些用于保證軟件質(zhì)量的最佳實(shí)踐對(duì)于軟件安全性同樣適用。
更具效率的做法是,在產(chǎn)品開(kāi)發(fā)的全生命周期里,直接植入安全最佳實(shí)踐,我們把它叫做Build Security In(簡(jiǎn)稱BSI)。例如,在分析業(yè)務(wù)需求的時(shí)候,主動(dòng)去分析安全需求,給用戶故事建立安全驗(yàn)收標(biāo)準(zhǔn);在開(kāi)發(fā)過(guò)程中時(shí)刻關(guān)注安全,通過(guò)自動(dòng)化的安全測(cè)試持續(xù)性的關(guān)注產(chǎn)品安全;在測(cè)試過(guò)程中,不僅測(cè)試產(chǎn)品看其是否滿足了業(yè)務(wù)需求,還基于安全驗(yàn)收標(biāo)準(zhǔn)設(shè)計(jì)并執(zhí)行安全測(cè)試用例。
傳統(tǒng)的安全掃描是從后外前推,倒逼著開(kāi)發(fā)團(tuán)隊(duì)做改變,而B(niǎo)SI的做法則是從前往后梳理,融入到日常的開(kāi)發(fā)過(guò)程中。正是因?yàn)樘崆安⑶页掷m(xù)性的關(guān)注產(chǎn)品安全,所以在后續(xù)的開(kāi)發(fā)中,團(tuán)隊(duì)才會(huì)有意識(shí)的去做安全防御,使得最后開(kāi)發(fā)出來(lái)的軟件默認(rèn)就已經(jīng)具備了不錯(cuò)的安全性,給團(tuán)隊(duì)帶來(lái)的沖擊和壓力也是最小的。
邁出改變的第一步
安全掃描已經(jīng)深深的烙在了很多開(kāi)發(fā)團(tuán)隊(duì)的骨髓里,突然之間要改變這一切勢(shì)必不容易,但是我們還是可以做很多嘗試來(lái)逐漸改變這個(gè)現(xiàn)狀。在這里我推薦一些比較好的切入點(diǎn),開(kāi)發(fā)團(tuán)隊(duì)可以作為參考,邁出改變的第一步。
每當(dāng)在創(chuàng)建用戶故事的時(shí)候,多問(wèn)幾個(gè)和安全相關(guān)的問(wèn)題,比如:
- 這個(gè)業(yè)務(wù)需求面臨著哪些威脅?
- 和這個(gè)業(yè)務(wù)需求相關(guān)聯(lián)的安全需求是什么?
- 有沒(méi)有什么東西是應(yīng)該被保護(hù)起來(lái)的?
- 應(yīng)該提前做些什么以應(yīng)對(duì)可能的黑客攻擊?
然后,團(tuán)隊(duì)共同給這個(gè)用戶故事設(shè)定安全相關(guān)的驗(yàn)收標(biāo)準(zhǔn)。
開(kāi)發(fā)人員在每日代碼審查的時(shí)候,多問(wèn)一下:“這樣設(shè)計(jì),或者代碼這么寫,有沒(méi)有什么安全風(fēng)險(xiǎn)?安全驗(yàn)收標(biāo)準(zhǔn)滿足了嗎?”
每當(dāng)測(cè)試人員拿到一張用戶故事對(duì)其進(jìn)行測(cè)試的時(shí)候,也問(wèn)問(wèn)自己:“除了測(cè)試產(chǎn)品看其是否正確實(shí)現(xiàn)了業(yè)務(wù)需求之外,還需要基于安全驗(yàn)收標(biāo)準(zhǔn)設(shè)計(jì)并執(zhí)行哪些安全測(cè)試用例?”
上面這些提問(wèn)看似簡(jiǎn)單,但是當(dāng)你在團(tuán)隊(duì)里問(wèn)出這些問(wèn)題的時(shí)候,你一定會(huì)驚訝于它們帶來(lái)的影響力。試試唄。
更多精彩洞見(jiàn),請(qǐng)關(guān)注微信公眾號(hào):ThoughtWorks