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