在(zài)這(zhè)個(gè)軟件安全系列的(de)第2部分中,我們探讨了(le/liǎo)DevOps是(shì)如何在(zài)軟件安全防護上(shàng)發揮關鍵作用的(de)。雖然安裝會費一(yī / yì /yí)些時(shí)間,但自動化的(de)過程提供的(de)投入産出(chū)比是(shì)非常可觀的(de)。将員工的(de)雙手從重複性的(de)勞動中解放出(chū)來(lái),您就(jiù)可以(yǐ)獲得一(yī / yì /yí)緻、安全、可靠的(de)結果。現在(zài)我們來(lái)了(le/liǎo)解一(yī / yì /yí)下什麽樣的(de)手段能夠保證您的(de)應用程序在(zài)安全的(de)環境中運行。

一(yī / yì /yí)言以(yǐ)蔽之(zhī),環境就(jiù)是(shì)您運行軟件應用的(de)地(dì / de)方。您可能将主機軟件放在(zài)辦公室裏,或者更可能的(de)是(shì)放在(zài)雲端。不(bù)論是(shì)哪一(yī / yì /yí)種情況,配置底層設備和(hé / huò)網絡時(shí)都要(yào / yāo)将安全銘記于(yú)心,這(zhè)一(yī / yì /yí)點很重要(yào / yāo)。

在(zài)本文中,我們會從宏觀的(de)角度出(chū)發,逐漸深入探讨各個(gè)細節。首先是(shì)整體網絡和(hé / huò)分離環境的(de)辦法,然後了(le/liǎo)解在(zài)VM層面應該做些什麽。這(zhè)個(gè)系列中有一(yī / yì /yí)個(gè)反複提及的(de)主體,那就(jiù)是(shì)安全在(zài)整個(gè)過程中的(de)重要(yào / yāo)性。哪怕是(shì)一(yī / yì /yí)個(gè)錯誤也(yě)可能讓您的(de)努力付諸東流。

防火牆與安全策略

網絡安全的(de)第一(yī / yì /yí)道(dào)防線是(shì)防火牆,它可以(yǐ)讓您控制和(hé / huò)監控出(chū)入您的(de)網絡的(de)數據。防火牆常常伴随着一(yī / yì /yí)套安全策略,這(zhè)些安全策略可以(yǐ)很簡單,例如隻讓HTTP/HTTPS端口的(de)流量進入您的(de)網絡,這(zhè)麽做可以(yǐ)防止他(tā)人(rén)通過其他(tā)端口訪問網絡,他(tā)們的(de)請求也(yě)會被拒絕。簡單的(de)策略也(yě)可以(yǐ)擴展到(dào)更多用途中,例如拒絕不(bù)含UserAgent字符串的(de)請求——這(zhè)是(shì)機器人(rén)嘗試訪問網絡時(shí)的(de)常見簽名。另一(yī / yì /yí)方面,配置不(bù)當的(de)防火牆可導緻數據被竊,美國(guó)第一(yī / yì /yí)資本金融公司就(jiù)在(zài)這(zhè)方面付出(chū)了(le/liǎo)血的(de)教訓。

複雜的(de)防火牆可以(yǐ)檢測惡意攻擊(比如單一(yī / yì /yí)來(lái)源的(de)多次請求),并在(zài)它們抵達您的(de)内部網絡以(yǐ)前将其拒之(zhī)門外。複雜的(de)防火牆甚至還能利用AI技術監控流量模式,并根據這(zhè)些數據對規則進行動态更新。例如,大(dà)流量請求的(de)源位置發生顯著變化可能是(shì)一(yī / yì /yí)次攻擊的(de)信号,于(yú)是(shì)您就(jiù)可以(yǐ)采取主動措施躲過這(zhè)次攻擊。

維持網絡的(de)安全性與封閉性

您的(de)應用程序是(shì)在(zài)網絡中運行的(de),并且您需要(yào / yāo)确定這(zhè)個(gè)應用具體在(zài)網絡中的(de)哪一(yī / yì /yí)個(gè)位置運行。那麽能不(bù)能是(shì)可公開訪問的(de)位置?爲(wéi / wèi)什麽?若您的(de)應用無需觸及互聯網,又爲(wéi / wèi)何要(yào / yāo)給予其互聯網的(de)訪問權限?例如,您的(de)數據庫所在(zài)的(de)設備應該基本斷絕一(yī / yì /yí)切公開訪問。這(zhè)台設備應該放在(zài)專用的(de)子(zǐ)網絡中,需要(yào / yāo)訪問這(zhè)台設備的(de)應用服務器應該擁有該子(zǐ)網絡的(de)訪問權限。

出(chū)于(yú)同樣的(de)理由,應用程序應該隻能在(zài)“需要(yào / yāo)”時(shí)與其他(tā)應用通信。通過減少網絡中暴露點的(de)數量,當某個(gè)部分發生安全問題時(shí),您就(jiù)可以(yǐ)把您的(de)環境部分隔離出(chū)來(lái)。換句話說(shuō),攻擊者侵入網絡的(de)途徑會極其有限。

隔離生産環境和(hé / huò)測試環境

生産環境與測試環境之(zhī)間絕對、絕對、絕對不(bù)能相互訪問,這(zhè)一(yī / yì /yí)點是(shì)毫無疑問的(de)。生産環境應該盡可能保證封閉性。将測試環境指向生産數據從來(lái)都不(bù)是(shì)什麽好主意,即使這(zhè)樣做可以(yǐ)降低調試難度。如果需要(yào / yāo)在(zài)下層環境中訪問生産數據,您一(yī / yì /yí)定要(yào / yāo)使用生産數據的(de)拷貝,将其消毒(去除敏感内容)後再放到(dào)測試環境中。

測試環境就(jiù)是(shì)這(zhè)樣。它充斥着未經驗證的(de)代碼和(hé / huò)數據,這(zhè)些代碼和(hé / huò)數據全都還未通過您設置的(de)安全審核機制。若将這(zhè)樣的(de)環境和(hé / huò)生産環境混合在(zài)一(yī / yì /yí)起,就(jiù)會形成額外的(de)風險和(hé / huò)暴露。實際上(shàng),若您是(shì)在(zài)AWS雲上(shàng)運行,那麽爲(wéi / wèi)這(zhè)些環境創建完全獨立的(de)賬戶是(shì)很好的(de)做法。這(zhè)樣雖然會增加管理上(shàng)的(de)複雜度,但卻能夠幫助理解如何避免交叉影響。

最低權限訪問

訪問各個(gè)環境,特别是(shì)生産環境時(shí),應該嚴格遵守按需訪問原則。不(bù)了(le/liǎo)解(或無需了(le/liǎo)解)應用程序如何在(zài)服務器上(shàng)運行的(de)前端開發人(rén)員不(bù)應該擁有服務器的(de)訪問權限。這(zhè)一(yī / yì /yí)方針同樣适用于(yú)安裝和(hé / huò)運行環境的(de)其他(tā)開發人(rén)員或操作人(rén)員——除非需要(yào / yāo),否則不(bù)應該擁有訪問權限。即便擁有訪問權限,訪問權限也(yě)應該擁有明确的(de)有效期,方便相關人(rén)員完成特定任務,并在(zài)此之(zhī)後予以(yǐ)撤銷。市面上(shàng)有一(yī / yì /yí)些工具可以(yǐ)幫助實現這(zhè)一(yī / yì /yí)目的(de)。例如,若在(zài)AWS中,您可以(yǐ)使用STS創建臨時(shí)的(de)認證信息,該認證信息會在(zài)經過指定的(de)時(shí)間後過期,這(zhè)樣您就(jiù)無需時(shí)刻記着在(zài)任務結束後撤銷認證信息。STS還提供一(yī / yì /yí)系列的(de)檢查和(hé / huò)平衡功能,任何人(rén)在(zài)未取得另一(yī / yì /yí)人(rén)的(de)簽名以(yǐ)前都無法獨自執行帶有風險的(de)操作。

輪換密鑰

密鑰應該處于(yú)不(bù)斷輪換的(de)狀态。若訪問密鑰不(bù)斷換入、換出(chū)時(shí),那麽當其中一(yī / yì /yí)把密鑰洩露時(shí),影響也(yě)不(bù)會持續很長時(shí)間。甚至對于(yú)不(bù)暴露在(zài)互聯網中的(de)内部應用,您也(yě)應該讓這(zhè)些應用的(de)通信密鑰保持輪換。不(bù)斷變換的(de)密鑰最難破解的(de)密鑰。如果人(rén)們不(bù)生成密鑰,那就(jiù)不(bù)會洩露密鑰。

定期更新操作系統/軟件

您的(de)軟件運行在(zài)哪一(yī / yì /yí)個(gè)版本的(de)操作系統(OS)上(shàng)?這(zhè)個(gè)版本最近有推出(chū)安全補丁嗎?這(zhè)個(gè)操作系統是(shì)否已經到(dào)了(le/liǎo)産品生命的(de)末期?這(zhè)些都是(shì)您要(yào / yāo)定期問自己的(de)問題。操作系統每天都會有新的(de)漏洞被挖掘出(chū)來(lái),因此生産商會發行安全補丁來(lái)消除這(zhè)些漏洞。根據通用漏洞披露的(de)調查結果,過去5年中,漏洞的(de)數量始終在(zài)穩步增長。如果不(bù)給操作系統打補丁,您就(jiù)會讓自己暴露在(zài)遠程執行、權限升級、信息披露等攻擊中。

這(zhè)也(yě)同樣适用于(yú)您開發應用時(shí)使用的(de)語言和(hé / huò)框架。Java 11發行後,您還在(zài)運行Java 8嗎?爲(wéi / wèi)什麽?您應該時(shí)刻關注應用中的(de)每一(yī / yì /yí)種框架是(shì)否推出(chū)了(le/liǎo)安全更新,并定期安裝這(zhè)些更新。

展望

那麽,現在(zài)我們已經保證了(le/liǎo)應用程序的(de)周邊安全。您的(de)業務流程已經就(jiù)緒,代碼和(hé / huò)部署流水線實現了(le/liǎo)自動化,環境的(de)安全也(yě)得到(dào)了(le/liǎo)保障。還剩下一(yī / yì /yí)件事要(yào / yāo)做——那就(jiù)是(shì)保護應用程序本身的(de)安全。在(zài)這(zhè)個(gè)系列的(de)最後一(yī / yì /yí)個(gè)部分中,我們會探讨各種輸入和(hé / huò)輸出(chū),讓您的(de)應用堅不(bù)可摧。