隨著安全得到越來(lái)越多的關(guān)注,一些跟安全相關(guān)的理論(比如<u>BSI</u>)脫穎而出宠进,盡管這些理論提出來(lái)已經(jīng)有一段時(shí)間炒瘸,卻很少看到其在開(kāi)發(fā)團(tuán)隊(duì)被成功地應(yīng)用昌妹。我們知道微軟曾在十多年前就提出了<u>SDL</u>,卻沒(méi)能在業(yè)界推廣開(kāi)來(lái)稀拐,并不是人們不認(rèn)可微軟這種“從軟件生命周期保障安全”的理念火邓,而是考慮到其落地實(shí)施的難度,很多企業(yè)知難而退钩蚊,那么這些安全理論對(duì)我們的軟件安全真的有幫助嗎贡翘?安全實(shí)踐能落地嗎?
很幸運(yùn)地砰逻,我有機(jī)會(huì)在一個(gè)成熟的敏捷開(kāi)發(fā)交付小組中經(jīng)歷了“從完全沒(méi)有安全實(shí)踐到BSI”的過(guò)程鸣驱,我們也曾遇到過(guò)很多困難,但最終得到了客戶的認(rèn)可蝠咆,并成功把安全實(shí)踐推廣到了整個(gè)團(tuán)隊(duì)踊东,所以想跟大家分享一下我們是如何將安全在敏捷團(tuán)隊(duì)落地的北滥,希望能給大家一些幫助。文中會(huì)拿Web系統(tǒng)舉例闸翅,但一些落地的實(shí)踐同樣適用于非Web系統(tǒng)再芋。
為什么安全理論很難落地?
結(jié)合對(duì)一些團(tuán)隊(duì)的了解,原因大多來(lái)自以下三個(gè)方面:
認(rèn)為安全不重要
認(rèn)為安全太難坚冀,需要很廣很深的領(lǐng)域知識(shí)济赎,只有專業(yè)人員才能做到
不知道應(yīng)該用什么樣的流程來(lái)做安全
那么針對(duì)第一點(diǎn),因?yàn)槲冶旧硪彩墙桓秷F(tuán)隊(duì)的一員记某,我觀察到的大多數(shù)軟件開(kāi)發(fā)團(tuán)隊(duì)司训,不管是業(yè)務(wù)分析師、開(kāi)發(fā)人員液南、測(cè)試人員壳猜、體驗(yàn)設(shè)計(jì)師還是項(xiàng)目經(jīng)理,都很少有人真正把“安全”作為非常重要的一件事情滑凉,尤其是在交付壓力比較大的情況下统扳,我們都會(huì)舍棄對(duì)于安全的投入,而花時(shí)間在更容易可視化出來(lái)的用戶功能上畅姊。安全咒钟,很多時(shí)候就像滅火器,如果不發(fā)生火災(zāi)涡匀,我們甚至都感覺(jué)不到它的存在盯腌。那么,安全陨瘩,真的重要嗎腕够?
換位思考一下,如果我們是用戶舌劳,面對(duì)以下兩種選擇帚湘,我們會(huì)選擇哪一種?
- 系統(tǒng)A:設(shè)計(jì)非常完美甚淡,功能缺陷幾乎沒(méi)有大诸,性能也很棒,但是沒(méi)有做任何跟安全相關(guān)的防護(hù)贯卦,用戶的敏感信息很容易泄露资柔;
- 系統(tǒng)B:設(shè)計(jì)比較差,有一些功能缺陷撵割,性能也差一點(diǎn)點(diǎn)贿堰,但是采取了特別多的安全措施,能夠保障用戶的數(shù)據(jù)安全性啡彬;
相信幾乎所有人都會(huì)毫不猶豫選擇B系統(tǒng)羹与,除非這是一個(gè)完全沒(méi)有用戶敏感數(shù)據(jù)故硅、完全不需要安全保障的系統(tǒng)(那這樣的系統(tǒng)又有什么用?)纵搁,所以只要我們把自己放在產(chǎn)品使用者的角度吃衅,而不是產(chǎn)品制造者的角度,就能很容易地理解和認(rèn)可安全對(duì)于軟件系統(tǒng)來(lái)說(shuō)是比功能更重要的一個(gè)因素腾誉,安全是軟件的靈魂徘层。
那么對(duì)于很多已經(jīng)深刻認(rèn)識(shí)到安全重要性的團(tuán)隊(duì),為什么依然很難將安全理論落地呢妄辩?原因大多來(lái)自前面提到的第二點(diǎn)和第三點(diǎn)惑灵,一是從技術(shù)上認(rèn)為安全是一個(gè)很難的領(lǐng)域,需要專業(yè)的安全人士眼耀;二是從流程上不知道該如何開(kāi)展;從這兩個(gè)角度出發(fā)佩憾,“安全”需要巨大的投入哮伟,所以很多團(tuán)隊(duì)望而卻步。那么安全真的這么難落地嗎? 接下來(lái)我會(huì)簡(jiǎn)單介紹一些Web安全知識(shí)妄帘,然后通過(guò)我所在團(tuán)隊(duì)的落地過(guò)程給大家一個(gè)答案楞黄。
如何讓安全在敏捷團(tuán)隊(duì)落地
什么是Web安全?
所謂Web安全問(wèn)題抡驼,就是攻擊者可以通過(guò)非正常的手段鬼廓,獲得Web系統(tǒng)訪問(wèn)權(quán)限,從而破壞網(wǎng)站行為致盟,盜取甚至修改用戶數(shù)據(jù)的一系列問(wèn)題碎税。
那么為什么攻擊者可以獲得Web系統(tǒng)權(quán)限呢?這種幾率到底有多大呢馏锡?如果可能性非常小雷蹂,我們是不是不必花費(fèi)太多精力在安全上面呢?
我們來(lái)看一下Web系統(tǒng)的組成杯道,一個(gè)最簡(jiǎn)單的系統(tǒng)都至少有這么幾個(gè)部分:
如上圖匪煌,瀏覽器發(fā)送請(qǐng)求到服務(wù)器,服務(wù)器給瀏覽器響應(yīng)党巾,服務(wù)器會(huì)查詢數(shù)據(jù)庫(kù)萎庭,數(shù)據(jù)庫(kù)返回結(jié)果。在這個(gè)過(guò)程中齿拂,我們開(kāi)發(fā)的Web程序不可避免的存在安全漏洞驳规,甚至我們開(kāi)發(fā)系統(tǒng)所使用的編程語(yǔ)言也會(huì)有安全問(wèn)題。在開(kāi)發(fā)時(shí)创肥,我們常常會(huì)引用一些第三方的工具达舒、組件值朋,而第三方的安全性也沒(méi)有辦法保障,甚至數(shù)據(jù)傳輸過(guò)程中使用的協(xié)議巩搏、操作系統(tǒng)本身也會(huì)有安全問(wèn)題昨登。所以可以想象一下,如果我們不做任何的安全防范贯底,那么每一個(gè)軟件都是一個(gè)非常脆弱的系統(tǒng)丰辣,很容易出現(xiàn)安全問(wèn)題。
常見(jiàn)的Web安全問(wèn)題
既然這么多環(huán)節(jié)都有潛在的安全風(fēng)險(xiǎn)禽捆,那么該如何著手呢笙什?可以參考<u>OWASP TOP 10</u>,以便對(duì)最嚴(yán)重的Web應(yīng)用程序安全問(wèn)題有個(gè)大致的了解胚想。
敏捷開(kāi)發(fā)模式現(xiàn)狀
我們是一個(gè)已經(jīng)實(shí)施敏捷開(kāi)發(fā)七年的團(tuán)隊(duì)琐凭,一共有五十多人,劃分成不同的Feature小組進(jìn)行日常的工作浊服,其敏捷開(kāi)發(fā)模式已經(jīng)非常成熟统屈,我所在的Feature小組有6個(gè)開(kāi)發(fā)人員,1個(gè)業(yè)務(wù)分析師牙躺,1個(gè)QA愁憔,我們每個(gè)小組的交付模式都是這樣的:
如上圖,以<u>用戶故事</u>為單元孽拷,所有的用戶故事都會(huì)經(jīng)歷一個(gè)從分析到最后給客戶演示的生命周期吨掌,多個(gè)用戶故事組成一個(gè)Feature,然后我們會(huì)進(jìn)行Feature的功能測(cè)試脓恕,給客戶展示整個(gè)功能膜宋,最后在發(fā)布之前,客戶會(huì)邀請(qǐng)第三方的專業(yè)安全公司做滲透測(cè)試进肯,然后找我們的開(kāi)發(fā)團(tuán)隊(duì)修復(fù)安全缺陷激蹲。
那么這種方式有什么問(wèn)題呢?
守門(mén)員模式江掩,安全測(cè)試非常滯后
安全問(wèn)題的修復(fù)時(shí)間非常有限
只有少數(shù)人關(guān)注和了解安全
依賴獨(dú)立的滲透測(cè)試
所謂守門(mén)員模式学辱,指的就是把所有的問(wèn)題和風(fēng)險(xiǎn)都留在最后,靠少數(shù)人來(lái)保障环形,在當(dāng)時(shí)的開(kāi)發(fā)模式下策泣,第三方的安全公司就是我們系統(tǒng)的安全守門(mén)員,可想而知抬吟,如果我們的團(tuán)隊(duì)對(duì)安全沒(méi)有任何了解萨咕,在用戶故事的開(kāi)發(fā)階段引入的安全問(wèn)題要等到發(fā)布之前才能夠被發(fā)現(xiàn),安全測(cè)試是非常滯后的火本,反饋周期特別長(zhǎng)危队。
另外當(dāng)?shù)谌降陌踩景l(fā)現(xiàn)問(wèn)題聪建,留給我們團(tuán)隊(duì)修復(fù)問(wèn)題的時(shí)間特別有限,因?yàn)闈B透測(cè)試是發(fā)布前的最后一個(gè)階段茫陆,長(zhǎng)時(shí)間的修復(fù)又會(huì)導(dǎo)致發(fā)布延期金麸,所以經(jīng)常會(huì)導(dǎo)致安全修復(fù)以補(bǔ)丁的方式發(fā)布。
而且除了少數(shù)修復(fù)過(guò)安全缺陷的開(kāi)發(fā)人員對(duì)安全有一點(diǎn)點(diǎn)了解之外簿盅,團(tuán)隊(duì)內(nèi)是沒(méi)有人關(guān)心安全的挥下。
最大的問(wèn)題是,所有的安全防范都依賴于最后的獨(dú)立滲透測(cè)試桨醋。雖然因?yàn)閳?zhí)行滲透測(cè)試的是專業(yè)的第三方安全公司棚瘟,他們有專業(yè)的安全知識(shí),可以發(fā)現(xiàn)很多公共的安全問(wèn)題喜最,也可以提供專業(yè)的極具權(quán)威性的安全報(bào)告偎蘸,但這種方式的滲透測(cè)試有個(gè)致命的弱點(diǎn),他們對(duì)業(yè)務(wù)知識(shí)了解不夠瞬内,很難發(fā)現(xiàn)跟業(yè)務(wù)相關(guān)的安全問(wèn)題禀苦,而這一類的安全問(wèn)題又占了相當(dāng)大的比重。
可以看到遂鹊,這種敏捷開(kāi)發(fā)模式的現(xiàn)狀就是:試圖將安全注入一個(gè)已經(jīng)成型的系統(tǒng)中。
安全落地嘗試
那么了解了之前開(kāi)發(fā)模式存在的問(wèn)題蔗包,安全又這么重要秉扑,客戶和團(tuán)隊(duì)都希望可以改變這種現(xiàn)狀,提高安全質(zhì)量调限,減少補(bǔ)丁舟陆,讓每一個(gè)人都關(guān)心安全,但是我們都擔(dān)心安全需要巨大的投入耻矮,會(huì)影響功能的發(fā)布秦躯,所以我們決定選擇一個(gè)Feature小組做為安全試點(diǎn),目標(biāo)周期為一個(gè)月(我們的發(fā)布周期)裆装,觀察投入產(chǎn)出比踱承,然后決定是否要在整個(gè)團(tuán)隊(duì)實(shí)行。
首先我們小組開(kāi)始學(xué)習(xí)BSI哨免,我們認(rèn)為它所傳遞的是這樣一些理念:
將安全融入整個(gè)軟件開(kāi)發(fā)過(guò)程中
所有團(tuán)隊(duì)成員一起為安全負(fù)責(zé)
安全的設(shè)計(jì)和實(shí)施一個(gè)持續(xù)進(jìn)行的過(guò)程
那么在一個(gè)幾乎沒(méi)有安全知識(shí)儲(chǔ)備的團(tuán)隊(duì)中茎活,如何將以上理念在團(tuán)隊(duì)?wèi)?yīng)用呢?我們遇到了很多的困難琢唾,比如:
不知道怎么把安全和日常開(kāi)發(fā)結(jié)合起來(lái)
不知道如何編寫(xiě)安全需求载荔,怎么做安全測(cè)試
接受了很多安全培訓(xùn),不知道如何下手
對(duì)安全缺乏專業(yè)的認(rèn)知,對(duì)安全開(kāi)發(fā)和測(cè)試沒(méi)有信心
不知道如何滿足客戶期望
分析這些困難采桃,我們開(kāi)始邁出了艱難的第一步懒熙。
首先丘损,召集團(tuán)隊(duì)的核心成員(包括了業(yè)務(wù)分析師,開(kāi)發(fā)人員工扎,測(cè)試人員徘钥,技術(shù)主管),同時(shí)我們邀請(qǐng)了公司的一位安全專家?guī)臀覀兘獯痣y題定庵,大家<u>頭腦風(fēng)暴</u>吏饿,參考OWASP TOP 10, 結(jié)合曾經(jīng)項(xiàng)目上出現(xiàn)過(guò)的安全問(wèn)題以及對(duì)于業(yè)務(wù)領(lǐng)域的深入了解蔬浙,嘗試總結(jié)屬于我們自己的安全問(wèn)題項(xiàng)目并且和OWASP TOP 10進(jìn)行關(guān)聯(lián)猪落,比如我們討論后的成果是這樣的:
可以看到,我們總結(jié)出來(lái)的這十項(xiàng)并不是將OWASP TOP 10調(diào)換順序這么簡(jiǎn)單畴博,我們是針對(duì)業(yè)務(wù)需求笨忌,有針對(duì)性地進(jìn)行了重新整理和組織,比如其中的<u>Sensitive Data Exposure</u>俱病,我們就結(jié)合項(xiàng)目將它劃分成了四類(1.Authentication官疲,2.Error Handling,3.Code Leak亮隙,4.Cookie Management)途凫,之所以會(huì)劃分的這么具體,是因?yàn)槲覀冏约旱腡OP10更貼近實(shí)現(xiàn)溢吻。另外我們還針對(duì)每一項(xiàng)添加了項(xiàng)目上的例子作為參考维费,讓團(tuán)隊(duì)每一個(gè)人都清楚地知道我們自己的TOP 10都是什么樣的以及業(yè)務(wù)場(chǎng)景下可能出現(xiàn)的安全問(wèn)題。
然后我們將項(xiàng)目專屬TOP 10作為模板加入到了每個(gè)用戶故事中促王,這么做有兩個(gè)好處:
- 第一犀盟,業(yè)務(wù)分析師在寫(xiě)用戶故事的時(shí)候,可以將其作為參考來(lái)編寫(xiě)安全驗(yàn)收標(biāo)準(zhǔn)蝇狼;
- 第二阅畴,如果業(yè)務(wù)分析師在缺乏安全知識(shí)的情況下很難編寫(xiě)安全需求,我們可以將其直接作為安全需求以防遺漏迅耘。
當(dāng)然這還遠(yuǎn)遠(yuǎn)不夠贱枣,更理想的情況是在需求分析階段、業(yè)務(wù)分析師和客戶在討論需求的過(guò)程中盡量參考一些基本的原則豹障,比如最小權(quán)限原則冯事,來(lái)確定和編寫(xiě)更加準(zhǔn)確的安全驗(yàn)收標(biāo)準(zhǔn)。如下圖血公。還可以讓更多的人參與到需求分析階段昵仅,通過(guò)<u>威脅建模</u>等手段分析出更全面的安全需求。當(dāng)然這就需要我們的業(yè)務(wù)分析師增加安全相關(guān)的知識(shí)儲(chǔ)備,我們也在向這個(gè)方向努力摔笤。
然后在用戶故事的啟動(dòng)階段够滑,業(yè)務(wù)分析師、QA和開(kāi)發(fā)人員會(huì)一起針對(duì)用戶故事模板中我們自己的TOP 10進(jìn)行篩選吕世,將和用戶故事相關(guān)的內(nèi)容標(biāo)識(shí)出來(lái)作為安全驗(yàn)收標(biāo)準(zhǔn)彰触。如果在故事分析階段,業(yè)務(wù)分析師已經(jīng)遵循一些原則細(xì)化了安全驗(yàn)收標(biāo)準(zhǔn)命辖,在這個(gè)階段况毅,也可以多個(gè)角色針對(duì)這些安全驗(yàn)收標(biāo)準(zhǔn)進(jìn)行探討,確保大家理解一致尔艇。
到了用戶故事的開(kāi)發(fā)階段尔许,通常開(kāi)發(fā)人員都會(huì)按照驗(yàn)收標(biāo)準(zhǔn)來(lái)編寫(xiě)代碼和測(cè)試,基于我們已經(jīng)有了足夠的安全驗(yàn)收標(biāo)準(zhǔn)终娃,相應(yīng)地味廊,開(kāi)發(fā)人員也會(huì)編碼來(lái)實(shí)現(xiàn)這些安全條件并且添加相應(yīng)的自動(dòng)化測(cè)試保障,當(dāng)然棠耕,除了滿足安全驗(yàn)收標(biāo)準(zhǔn)之外余佛,我們也會(huì)做一些靜態(tài)代碼的掃描和第三方依賴的掃描,雙重保障窍荧。
用戶故事的驗(yàn)收階段非常重要辉巡,因?yàn)槿绻谶@個(gè)階段發(fā)現(xiàn)缺陷可以快速修復(fù),我們一般是QA蕊退、開(kāi)發(fā)人員和業(yè)務(wù)分析師一起红氯,逐個(gè)驗(yàn)收我們之前制定的安全驗(yàn)收標(biāo)準(zhǔn)。當(dāng)然咕痛,除了簡(jiǎn)單地從前端進(jìn)行驗(yàn)證,針對(duì)安全驗(yàn)收我們需要借助一些工具(如<u>Burp Suite</u>)喇嘱,繞過(guò)前端修改請(qǐng)求茉贡,檢查是否后端接口也作了相應(yīng)的防范,如果發(fā)現(xiàn)安全問(wèn)題者铜,會(huì)在這個(gè)階段及時(shí)修復(fù)并且增加相關(guān)的測(cè)試保障腔丧。
到了用戶故事的測(cè)試階段,QA會(huì)做跟安全相關(guān)的探索性測(cè)試作烟,在這個(gè)階段愉粤,需要QA從一個(gè)全新的視角來(lái)做測(cè)試,之前我們的模式是從正常用戶的角度來(lái)測(cè)試功能拿撩,而針對(duì)安全的探索性測(cè)試則截然不同衣厘,我們要用攻擊者的角度來(lái)思考問(wèn)題,嘗試各種看似不可能的手段,尋找安全漏洞影暴。另外错邦,在這個(gè)階段,我們也會(huì)借助一些自動(dòng)掃描工具(比如<u>ZAP</u>)型宙,來(lái)檢測(cè)是否有一些通用的安全問(wèn)題撬呢。
安全的演示階段比較有挑戰(zhàn)性,前面提到過(guò)妆兑,它不像功能需求那么可見(jiàn)魂拦,所以我們采用了一種全新的方式去展示,通常功能演示我們是給客戶展示用戶界面搁嗓,如何使用系統(tǒng)等芯勘,而對(duì)于安全,我們嘗試了展示安全缺陷以及我們的缺陷分布分析谱姓。比如在這一個(gè)月里借尿,我們發(fā)現(xiàn)了六個(gè)安全問(wèn)題,其中兩個(gè)是通過(guò)ZAP掃描出來(lái)的共通的安全問(wèn)題屉来,另外四個(gè)是和業(yè)務(wù)強(qiáng)相關(guān)的安全問(wèn)題(比如賬戶A可以通過(guò)特殊手段修改其本來(lái)沒(méi)有權(quán)限的數(shù)據(jù)路翻,屬于我們自己的TOP 10的Authentication那一類)。
回顧整個(gè)過(guò)程茄靠,其實(shí)我們?cè)谟脩艄适碌拿總€(gè)階段都增加了和安全相關(guān)的實(shí)踐茂契,并且讓團(tuán)隊(duì)所有人員都參與了進(jìn)去,將安全融入到日常的工作中慨绳,不斷改進(jìn)掉冶,持續(xù)關(guān)注,而這些正是BSI所傳達(dá)的理念脐雪。
客戶看到我們的安全成果展示后非常滿意厌小,進(jìn)而在我們整個(gè)團(tuán)隊(duì)開(kāi)展了這樣的安全實(shí)踐。
在維持這樣的安全模式幾個(gè)發(fā)布周期之后战秋,我驚喜地發(fā)現(xiàn)我們的開(kāi)發(fā)人員開(kāi)始有了安全的意識(shí)璧亚,比如前不久我們有一個(gè)用戶故事需要實(shí)現(xiàn)一個(gè)郵件模板,系統(tǒng)要求能夠接受用戶定制化的html脂信,功能實(shí)現(xiàn)非常簡(jiǎn)單癣蟋,可是開(kāi)發(fā)人員一籌莫展,接到用戶故事后馬上找到我狰闪,探討如何讓我們的系統(tǒng)允許接受html后還可以避免script攻擊疯搅,這讓我深刻感受到,BSI(Build Security in our DNA)這個(gè)理念的精確含義埋泵,我們不是為了讓大家遵循實(shí)踐而去實(shí)踐幔欧,而是讓每個(gè)人都有安全的意識(shí),每當(dāng)我們接觸到一個(gè)新的功能,馬上會(huì)想到可能有哪些安全問(wèn)題琐馆,而不是急于實(shí)現(xiàn)功能规阀,長(zhǎng)此以往,安全就真的進(jìn)入了團(tuán)隊(duì)的DNA瘦麸。
總結(jié)
回想之前我們想要開(kāi)始在團(tuán)隊(duì)實(shí)施安全時(shí)的恐懼以及止步不前谁撼,到最后我們成功將安全實(shí)踐落地并且推廣,這個(gè)過(guò)程讓我體會(huì)到滋饲,從一個(gè)小組開(kāi)始嘗試厉碟,觀察投入產(chǎn)出比,再推廣到整個(gè)大的團(tuán)隊(duì)是個(gè)很好的實(shí)踐屠缭。
另外箍鼓,不要期望一步到位、迅速成為安全專家呵曹,安全的設(shè)計(jì)和實(shí)施是一個(gè)持續(xù)進(jìn)行的過(guò)程款咖,可以從日常工作中的點(diǎn)滴做起,從保障每一個(gè)安全需求做起奄喂,想象一下铐殃,如果我們每一個(gè)用戶故事都注入了和安全相關(guān)的實(shí)踐,那么feature就會(huì)是這些安全的用戶故事的結(jié)合跨新,系統(tǒng)就會(huì)變成一個(gè)充滿安全投入的整體富腊。
和之前“靠最后的滲透測(cè)試來(lái)補(bǔ)救安全問(wèn)題”的方式相比,這種從源頭就將安全滲透進(jìn)軟件系統(tǒng)的方式更能保障我們軟件的安全域帐。
更多精彩洞見(jiàn)赘被,請(qǐng)關(guān)注微信公眾號(hào):ThoughtWorks