威脅途徑與軟件安全:保護環境安全
在這個軟(ruan)件安全(quan)(quan)系列的(de)(de)第2部(bu)分中(zhong),我們探討了DevOps是如何在軟(ruan)件安全(quan)(quan)防(fang)護上發揮關(guan)鍵作用的(de)(de)。雖然安裝會費一(yi)(yi)些時間,但自動化的(de)(de)過程提供的(de)(de)投入產(chan)出(chu)比(bi)是非(fei)常可觀的(de)(de)。將員工(gong)的(de)(de)雙手從(cong)重復性的(de)(de)勞動中(zhong)解放出(chu)來(lai),您就(jiu)可以獲得一(yi)(yi)致、安全(quan)(quan)、可靠的(de)(de)結果。現在我們來(lai)了解一(yi)(yi)下什(shen)么(me)樣的(de)(de)手段能夠保證(zheng)您的(de)(de)應用程序在安全(quan)(quan)的(de)(de)環境中(zhong)運行。
一言以蔽(bi)之,環境就是(shi)您運行軟(ruan)件(jian)應用(yong)的(de)地(di)方。您可(ke)能(neng)將主機軟(ruan)件(jian)放(fang)在(zai)辦公(gong)室(shi)里,或者更(geng)可(ke)能(neng)的(de)是(shi)放(fang)在(zai)云端。不論是(shi)哪一種情況,配置底層設備和網(wang)絡時(shi)都要將安全銘記(ji)于(yu)心,這一點(dian)很重(zhong)要。
在本文中,我們(men)會從宏(hong)觀的(de)角度(du)出(chu)發,逐漸深(shen)入探(tan)討(tao)各個(ge)細節。首先是(shi)整體網絡和分離環境的(de)辦(ban)法(fa),然后了解在VM層(ceng)面應(ying)該做些(xie)什么(me)。這個(ge)系列中有一個(ge)反復提及的(de)主體,那就是(shi)安全在整個(ge)過程中的(de)重要性。哪怕是(shi)一個(ge)錯誤也(ye)可能(neng)讓您的(de)努力付諸東流。
防火墻與安全策略
網(wang)絡(luo)(luo)(luo)安全的(de)第一(yi)道防(fang)(fang)(fang)線是防(fang)(fang)(fang)火(huo)墻,它(ta)可(ke)(ke)以(yi)(yi)(yi)讓您(nin)控制和監控出(chu)入(ru)您(nin)的(de)網(wang)絡(luo)(luo)(luo)的(de)數據。防(fang)(fang)(fang)火(huo)墻常常伴隨著一(yi)套安全策略,這些安全策略可(ke)(ke)以(yi)(yi)(yi)很簡單(dan),例如只讓HTTP/HTTPS端(duan)口的(de)流量進入(ru)您(nin)的(de)網(wang)絡(luo)(luo)(luo),這么做可(ke)(ke)以(yi)(yi)(yi)防(fang)(fang)(fang)止他人(ren)通過其(qi)他端(duan)口訪問(wen)網(wang)絡(luo)(luo)(luo),他們(men)的(de)請(qing)求也會被拒絕(jue)。簡單(dan)的(de)策略也可(ke)(ke)以(yi)(yi)(yi)擴展到更(geng)多用途中,例如拒絕(jue)不(bu)含UserAgent字符串(chuan)的(de)請(qing)求——這是機器人(ren)嘗(chang)試訪問(wen)網(wang)絡(luo)(luo)(luo)時的(de)常見(jian)簽名。另一(yi)方(fang)面,配置不(bu)當的(de)防(fang)(fang)(fang)火(huo)墻可(ke)(ke)導(dao)致數據被竊,美國第一(yi)資本金融(rong)公(gong)司就(jiu)在這方(fang)面付出(chu)了血的(de)教訓。
復(fu)雜(za)的(de)防火墻可以檢測惡意(yi)攻擊(比如(ru)單(dan)一來源的(de)多次(ci)(ci)請(qing)求(qiu)),并在它們抵達您(nin)(nin)的(de)內部(bu)網絡以前將其拒(ju)之門(men)外(wai)。復(fu)雜(za)的(de)防火墻甚至還能(neng)利用AI技術(shu)監控(kong)流量(liang)模式,并根據(ju)這些數(shu)據(ju)對規則進行動態更新。例如(ru),大流量(liang)請(qing)求(qiu)的(de)源位置發生顯著變化可能(neng)是(shi)(shi)一次(ci)(ci)攻擊的(de)信號,于是(shi)(shi)您(nin)(nin)就可以采取主動措(cuo)施(shi)躲過(guo)這次(ci)(ci)攻擊。
維持網絡的安全性與封閉性
您(nin)的(de)(de)(de)應(ying)(ying)用(yong)程序(xu)是在(zai)網(wang)(wang)絡(luo)中運行的(de)(de)(de),并(bing)且您(nin)需(xu)要(yao)(yao)確定這個應(ying)(ying)用(yong)具體在(zai)網(wang)(wang)絡(luo)中的(de)(de)(de)哪一個位置運行。那么能不能是可公開(kai)訪(fang)(fang)(fang)問(wen)的(de)(de)(de)位置?為(wei)(wei)什么?若您(nin)的(de)(de)(de)應(ying)(ying)用(yong)無(wu)需(xu)觸及互(hu)聯網(wang)(wang),又(you)為(wei)(wei)何要(yao)(yao)給予其(qi)互(hu)聯網(wang)(wang)的(de)(de)(de)訪(fang)(fang)(fang)問(wen)權限?例如(ru),您(nin)的(de)(de)(de)數(shu)據庫(ku)所在(zai)的(de)(de)(de)設備(bei)應(ying)(ying)該(gai)基(ji)本斷絕(jue)一切公開(kai)訪(fang)(fang)(fang)問(wen)。這臺設備(bei)應(ying)(ying)該(gai)放在(zai)專用(yong)的(de)(de)(de)子(zi)網(wang)(wang)絡(luo)中,需(xu)要(yao)(yao)訪(fang)(fang)(fang)問(wen)這臺設備(bei)的(de)(de)(de)應(ying)(ying)用(yong)服務(wu)器應(ying)(ying)該(gai)擁(yong)有該(gai)子(zi)網(wang)(wang)絡(luo)的(de)(de)(de)訪(fang)(fang)(fang)問(wen)權限。
出于同樣的(de)理由,應用(yong)程(cheng)序應該只能在(zai)“需要”時(shi)與其他(ta)應用(yong)通信。通過減(jian)少網絡中(zhong)暴露點的(de)數(shu)量,當(dang)某(mou)個部(bu)分(fen)發(fa)生(sheng)安全問題時(shi),您(nin)就可以把您(nin)的(de)環境部(bu)分(fen)隔離出來。換(huan)句話說(shuo),攻擊者侵入(ru)網絡的(de)途(tu)徑會極其有限。
隔離生產環境和測試環境
生(sheng)(sheng)產(chan)(chan)環(huan)(huan)境(jing)(jing)與測試環(huan)(huan)境(jing)(jing)之間絕對、絕對、絕對不能(neng)相互(hu)訪問,這(zhe)一點是(shi)毫(hao)無疑問的。生(sheng)(sheng)產(chan)(chan)環(huan)(huan)境(jing)(jing)應(ying)該(gai)盡可能(neng)保證封(feng)閉性。將測試環(huan)(huan)境(jing)(jing)指向生(sheng)(sheng)產(chan)(chan)數據(ju)(ju)從(cong)來都不是(shi)什么好主意(yi),即使這(zhe)樣做(zuo)可以(yi)降低調試難度(du)。如(ru)果需(xu)要在下層(ceng)環(huan)(huan)境(jing)(jing)中(zhong)訪問生(sheng)(sheng)產(chan)(chan)數據(ju)(ju),您一定(ding)要使用(yong)生(sheng)(sheng)產(chan)(chan)數據(ju)(ju)的拷(kao)貝,將其消毒(去除敏(min)感(gan)內容)后再(zai)放到(dao)測試環(huan)(huan)境(jing)(jing)中(zhong)。
測試環境(jing)(jing)就(jiu)是(shi)這樣(yang)。它(ta)充斥著未經驗證的(de)(de)代(dai)碼(ma)和數(shu)(shu)據(ju),這些代(dai)碼(ma)和數(shu)(shu)據(ju)全都還未通(tong)過(guo)您(nin)設置的(de)(de)安全審核機制。若將這樣(yang)的(de)(de)環境(jing)(jing)和生產環境(jing)(jing)混合(he)在一起,就(jiu)會形成(cheng)額(e)外的(de)(de)風險和暴露(lu)。實際上(shang),若您(nin)是(shi)在AWS云上(shang)運行,那么為這些環境(jing)(jing)創建完全獨立的(de)(de)賬戶是(shi)很好的(de)(de)做法。這樣(yang)雖然會增加管理上(shang)的(de)(de)復(fu)雜(za)度(du),但(dan)卻能夠幫助理解(jie)如何避免交(jiao)叉影響。
最低權限訪問
訪(fang)問(wen)(wen)各個環(huan)境,特別是(shi)生產環(huan)境時(shi),應(ying)該(gai)(gai)(gai)(gai)嚴格遵守按(an)需訪(fang)問(wen)(wen)原則。不了解(jie)(或無(wu)(wu)需了解(jie))應(ying)用程(cheng)序如(ru)何(he)在(zai)服(fu)務(wu)器上運行(xing)的(de)前端開發人(ren)(ren)員(yuan)(yuan)不應(ying)該(gai)(gai)(gai)(gai)擁(yong)有(you)服(fu)務(wu)器的(de)訪(fang)問(wen)(wen)權(quan)限。這一(yi)方針(zhen)同(tong)樣適用于(yu)安裝和運行(xing)環(huan)境的(de)其他(ta)開發人(ren)(ren)員(yuan)(yuan)或操(cao)作人(ren)(ren)員(yuan)(yuan)——除非需要,否則不應(ying)該(gai)(gai)(gai)(gai)擁(yong)有(you)訪(fang)問(wen)(wen)權(quan)限。即便擁(yong)有(you)訪(fang)問(wen)(wen)權(quan)限,訪(fang)問(wen)(wen)權(quan)限也應(ying)該(gai)(gai)(gai)(gai)擁(yong)有(you)明(ming)確(que)的(de)有(you)效期,方便相關人(ren)(ren)員(yuan)(yuan)完成特定任務(wu),并在(zai)此之后(hou)予(yu)以撤銷。市面上有(you)一(yi)些(xie)工具可(ke)以幫助實現這一(yi)目的(de)。例如(ru),若在(zai)AWS中,您(nin)可(ke)以使用STS創建臨時(shi)的(de)認證(zheng)信息,該(gai)(gai)(gai)(gai)認證(zheng)信息會(hui)在(zai)經過(guo)指定的(de)時(shi)間后(hou)過(guo)期,這樣您(nin)就無(wu)(wu)需時(shi)刻記(ji)著(zhu)在(zai)任務(wu)結(jie)束后(hou)撤銷認證(zheng)信息。STS還(huan)提供一(yi)系列的(de)檢查和平衡功能,任何(he)人(ren)(ren)在(zai)未(wei)取(qu)得(de)另(ling)一(yi)人(ren)(ren)的(de)簽名以前都無(wu)(wu)法(fa)獨(du)自執行(xing)帶有(you)風險的(de)操(cao)作。
輪換密鑰
密(mi)鑰應(ying)該(gai)處于不(bu)(bu)斷(duan)輪換的(de)狀態。若訪問(wen)密(mi)鑰不(bu)(bu)斷(duan)換入、換出時(shi),那么當其中一把(ba)密(mi)鑰泄露時(shi),影響也(ye)不(bu)(bu)會(hui)持(chi)續很長時(shi)間。甚至對于不(bu)(bu)暴露在互聯(lian)網中的(de)內部應(ying)用,您也(ye)應(ying)該(gai)讓這些應(ying)用的(de)通(tong)信(xin)密(mi)鑰保持(chi)輪換。不(bu)(bu)斷(duan)變換的(de)密(mi)鑰最難破解的(de)密(mi)鑰。如果(guo)人們不(bu)(bu)生成密(mi)鑰,那就不(bu)(bu)會(hui)泄露密(mi)鑰。
定期更新操作系統/軟件
您的(de)(de)(de)軟件運行在(zai)哪一個(ge)版本(ben)(ben)的(de)(de)(de)操作(zuo)系統(OS)上(shang)?這(zhe)個(ge)版本(ben)(ben)最近有推出(chu)安全(quan)補(bu)(bu)丁(ding)嗎?這(zhe)個(ge)操作(zuo)系統是否(fou)已經到了(le)產品生命的(de)(de)(de)末(mo)期(qi)?這(zhe)些都是您要定期(qi)問(wen)自(zi)己的(de)(de)(de)問(wen)題(ti)。操作(zuo)系統每天都會(hui)有新的(de)(de)(de)漏洞被挖掘出(chu)來,因(yin)此生產商(shang)會(hui)發(fa)行安全(quan)補(bu)(bu)丁(ding)來消除這(zhe)些漏洞。根據通用漏洞披(pi)露(lu)的(de)(de)(de)調(diao)查結果,過去(qu)5年(nian)中,漏洞的(de)(de)(de)數量(liang)始終在(zai)穩步(bu)增長。如果不給操作(zuo)系統打補(bu)(bu)丁(ding),您就會(hui)讓自(zi)己暴露(lu)在(zai)遠程(cheng)執(zhi)行、權限升級、信(xin)息披(pi)露(lu)等攻擊(ji)中。
這也同樣(yang)適用(yong)于您開發(fa)應(ying)用(yong)時使(shi)用(yong)的語言和框(kuang)架(jia)。Java 11發(fa)行后,您還在運行Java 8嗎?為(wei)什么?您應(ying)該時刻(ke)關注應(ying)用(yong)中的每一種框(kuang)架(jia)是否推出(chu)了(le)安全更新,并定(ding)期安裝(zhuang)這些更新。
展望
那么,現在我們已經保證了(le)應(ying)用程(cheng)序的(de)周邊安全。您的(de)業(ye)務流程(cheng)已經就(jiu)緒,代碼和部署流水(shui)線實(shi)現了(le)自動化,環境的(de)安全也得到了(le)保障。還剩下一(yi)(yi)件事要做——那就(jiu)是保護應(ying)用程(cheng)序本(ben)身的(de)安全。在這(zhe)個系列的(de)最后一(yi)(yi)個部分中,我們會(hui)探討各種輸(shu)入和輸(shu)出,讓您的(de)應(ying)用堅(jian)不(bu)可摧。