威脅途徑與軟件安(ān)全:保護環境安(ān)全
在這個軟件安(ān)全系列的第2部分(fēn)中(zhōng),我們探讨了DevOps是如何在軟件安(ān)全防護上發揮關鍵作(zuò)用(yòng)的。雖然安(ān)裝(zhuāng)會費一些時間,但自動化的過程提供的投入産(chǎn)出比是非常可(kě)觀的。将員工(gōng)的雙手從重複性的勞動中(zhōng)解放出來,您就可(kě)以獲得一緻、安(ān)全、可(kě)靠的結果。現在我們來了解一下什麽樣的手段能(néng)夠保證您的應用(yòng)程序在安(ān)全的環境中(zhōng)運行。
一言以蔽之,環境就是您運行軟件應用(yòng)的地方。您可(kě)能(néng)将主機軟件放在辦(bàn)公(gōng)室裏,或者更可(kě)能(néng)的是放在雲端。不論是哪一種情況,配置底層設備和網絡時都要将安(ān)全銘記于心,這一點很(hěn)重要。
在本文(wén)中(zhōng),我們會從宏觀的角度出發,逐漸深入探讨各個細節。首先是整體(tǐ)網絡和分(fēn)離環境的辦(bàn)法,然後了解在VM層面應該做些什麽。這個系列中(zhōng)有(yǒu)一個反複提及的主體(tǐ),那就是安(ān)全在整個過程中(zhōng)的重要性。哪怕是一個錯誤也可(kě)能(néng)讓您的努力付諸東流。
防火牆與安(ān)全策略
網絡安(ān)全的第一道防線(xiàn)是防火牆,它可(kě)以讓您控制和監控出入您的網絡的數據。防火牆常常伴随着一套安(ān)全策略,這些安(ān)全策略可(kě)以很(hěn)簡單,例如隻讓HTTP/HTTPS端口的流量進入您的網絡,這麽做可(kě)以防止他(tā)人通過其他(tā)端口訪問網絡,他(tā)們的請求也會被拒絕。簡單的策略也可(kě)以擴展到更多(duō)用(yòng)途中(zhōng),例如拒絕不含UserAgent字符串的請求——這是機器人嘗試訪問網絡時的常見簽名(míng)。另一方面,配置不當的防火牆可(kě)導緻數據被竊,美國(guó)第一資本金融公(gōng)司就在這方面付出了血的教訓。
複雜的防火牆可(kě)以檢測惡意攻擊(比如單一來源的多(duō)次請求),并在它們抵達您的内部網絡以前将其拒之門外。複雜的防火牆甚至還能(néng)利用(yòng)AI技(jì )術監控流量模式,并根據這些數據對規則進行動态更新(xīn)。例如,大流量請求的源位置發生顯著變化可(kě)能(néng)是一次攻擊的信号,于是您就可(kě)以采取主動措施躲過這次攻擊。
維持網絡的安(ān)全性與封閉性
您的應用(yòng)程序是在網絡中(zhōng)運行的,并且您需要确定這個應用(yòng)具(jù)體(tǐ)在網絡中(zhōng)的哪一個位置運行。那麽能(néng)不能(néng)是可(kě)公(gōng)開訪問的位置?為(wèi)什麽?若您的應用(yòng)無需觸及互聯網,又(yòu)為(wèi)何要給予其互聯網的訪問權限?例如,您的數據庫所在的設備應該基本斷絕一切公(gōng)開訪問。這台設備應該放在專用(yòng)的子網絡中(zhōng),需要訪問這台設備的應用(yòng)服務(wù)器應該擁有(yǒu)該子網絡的訪問權限。
出于同樣的理(lǐ)由,應用(yòng)程序應該隻能(néng)在“需要”時與其他(tā)應用(yòng)通信。通過減少網絡中(zhōng)暴露點的數量,當某個部分(fēn)發生安(ān)全問題時,您就可(kě)以把您的環境部分(fēn)隔離出來。換句話說,攻擊者侵入網絡的途徑會極其有(yǒu)限。
隔離生産(chǎn)環境和測試環境
生産(chǎn)環境與測試環境之間絕對、絕對、絕對不能(néng)相互訪問,這一點是毫無疑問的。生産(chǎn)環境應該盡可(kě)能(néng)保證封閉性。将測試環境指向生産(chǎn)數據從來都不是什麽好主意,即使這樣做可(kě)以降低調試難度。如果需要在下層環境中(zhōng)訪問生産(chǎn)數據,您一定要使用(yòng)生産(chǎn)數據的拷貝,将其消毒(去除敏感内容)後再放到測試環境中(zhōng)。
測試環境就是這樣。它充斥着未經驗證的代碼和數據,這些代碼和數據全都還未通過您設置的安(ān)全審核機制。若将這樣的環境和生産(chǎn)環境混合在一起,就會形成額外的風險和暴露。實際上,若您是在AWS雲上運行,那麽為(wèi)這些環境創建完全獨立的賬戶是很(hěn)好的做法。這樣雖然會增加管理(lǐ)上的複雜度,但卻能(néng)夠幫助理(lǐ)解如何避免交叉影響。
最低權限訪問
訪問各個環境,特别是生産(chǎn)環境時,應該嚴格遵守按需訪問原則。不了解(或無需了解)應用(yòng)程序如何在服務(wù)器上運行的前端開發人員不應該擁有(yǒu)服務(wù)器的訪問權限。這一方針同樣适用(yòng)于安(ān)裝(zhuāng)和運行環境的其他(tā)開發人員或操作(zuò)人員——除非需要,否則不應該擁有(yǒu)訪問權限。即便擁有(yǒu)訪問權限,訪問權限也應該擁有(yǒu)明确的有(yǒu)效期,方便相關人員完成特定任務(wù),并在此之後予以撤銷。市面上有(yǒu)一些工(gōng)具(jù)可(kě)以幫助實現這一目的。例如,若在AWS中(zhōng),您可(kě)以使用(yòng)STS創建臨時的認證信息,該認證信息會在經過指定的時間後過期,這樣您就無需時刻記着在任務(wù)結束後撤銷認證信息。STS還提供一系列的檢查和平衡功能(néng),任何人在未取得另一人的簽名(míng)以前都無法獨自執行帶有(yǒu)風險的操作(zuò)。
輪換密鑰
密鑰應該處于不斷輪換的狀态。若訪問密鑰不斷換入、換出時,那麽當其中(zhōng)一把密鑰洩露時,影響也不會持續很(hěn)長(cháng)時間。甚至對于不暴露在互聯網中(zhōng)的内部應用(yòng),您也應該讓這些應用(yòng)的通信密鑰保持輪換。不斷變換的密鑰最難破解的密鑰。如果人們不生成密鑰,那就不會洩露密鑰。
定期更新(xīn)操作(zuò)系統/軟件
您的軟件運行在哪一個版本的操作(zuò)系統(OS)上?這個版本最近有(yǒu)推出安(ān)全補丁嗎?這個操作(zuò)系統是否已經到了産(chǎn)品生命的末期?這些都是您要定期問自己的問題。操作(zuò)系統每天都會有(yǒu)新(xīn)的漏洞被挖掘出來,因此生産(chǎn)商(shāng)會發行安(ān)全補丁來消除這些漏洞。根據通用(yòng)漏洞披露的調查結果,過去5年中(zhōng),漏洞的數量始終在穩步增長(cháng)。如果不給操作(zuò)系統打補丁,您就會讓自己暴露在遠(yuǎn)程執行、權限升級、信息披露等攻擊中(zhōng)。
這也同樣适用(yòng)于您開發應用(yòng)時使用(yòng)的語言和框架。Java 11發行後,您還在運行Java 8嗎?為(wèi)什麽?您應該時刻關注應用(yòng)中(zhōng)的每一種框架是否推出了安(ān)全更新(xīn),并定期安(ān)裝(zhuāng)這些更新(xīn)。
展望
那麽,現在我們已經保證了應用(yòng)程序的周邊安(ān)全。您的業務(wù)流程已經就緒,代碼和部署流水線(xiàn)實現了自動化,環境的安(ān)全也得到了保障。還剩下一件事要做——那就是保護應用(yòng)程序本身的安(ān)全。在這個系列的最後一個部分(fēn)中(zhōng),我們會探讨各種輸入和輸出,讓您的應用(yòng)堅不可(kě)摧。