?譯者 | 劉濤
審校 | 重樓
云計算(Cloud)技術是近年來計算機科學的一個重要突破。大多數組織已經通過將自己的應用程序移入云平臺而獲益。不過,如何保證應用程序在第三方服務器上的安全性,是一項艱巨的挑戰。
在本文中,我們將重點討論Java,提供一些可以幫助我們保護云計算環境下的Java應用程序的有效措施和工具。
一、在云環境中保護Java應用程序
安全性是軟件開發中最復雜、最廣泛和最關鍵的方面之一。然而,軟件安全性通常被忽視,或者在開發周期結束時僅僅做一些簡單調整。重大數據安全漏洞列表每年總計暴露30億條記錄,其中包括一些大公司。如果這種事能發生在他們身上,也能發生在你身上。
由于云計算的分布特性,以及第三方的參與,導致應用程序向云計算平臺遷移過程中存在的安全隱患日益增多。但是,我們可以采取一些措施來保證云環境下應用程序的安全性,最大限度地減少攻擊。
值得慶幸的是, Java已經存在很長時間,并且有許多內置的安全機制,是開發基于云平臺上應用程序的最流行的編程語言之一。Java安全組件經歷了嚴格的模擬真實環境測試,并定期更新,以解決新出現的安全漏洞。Java生態系統中還包含了各種各樣的工具來分析和報告安全性問題。
然而,即使在可靠的開發環境中,也必須保持謹慎。在復雜的應用程序開發過程中,漏洞可能潛伏在后臺。在云計算環境下為Java應用提供安全保障是一件非常復雜的事情,它要求對各種安全風險進行認真地考慮,并采用最有效的措施和工具。
二、在云環境下保護Java應用程序的最佳措施
下面,我們將介紹如何在云計算中創建安全的Java應用程序。
1.清潔代碼
我們建議在不喪失實用性的情況下盡量簡化代碼,因為在復雜的環境下經常會出現漏洞。用最少的信息量寫代碼。實現細節的隱藏使得代碼更加安全和易于維護。在編寫安全Java代碼時,我們建議您牢記以下幾點:
(1)使用Java的訪問修飾符(Access Modifiers)以獲得優勢。如果您知道如何為類、方法及其屬性指定各種訪問級別,那么您的代碼將得到更好地保護。凡事應密盡密。
(2)應始終定義最小API和接口表面。通過將組件彼此解耦,使組件在最小可行區域上進行交互。避免即使違規行為只影響了應用程序的一部分,其他應用程序也會受到影響。
2.避免暴露源代碼中的敏感信息
開發人員應避免在源代碼中對密碼或API密鑰等敏感信息進行硬編碼,而是使用配置文件、環境變量或密鑰存儲來存儲和管理這些信息。所有個人身份信息,如信用卡、社會安全號碼等,均受上述密碼政策的約束。您的應用程序在處理已提供給它的任何個人信息時應格外小心。
3.實現身份驗證和授權
身份驗證和授權是保護Java應用程序免受未經授權訪問的重要安全機制。開發人員應該實施強大的身份驗證和授權機制,以驗證與應用程序交互的用戶、服務和系統的身份。為了實現這一點,可以采取多因素身份驗證、密碼策略、訪問控制列表和基于角色的訪問控制。
4.執行輸入驗證
輸入驗證是一項重要的安全措施,有助于防止SQL注入和跨網站腳本等攻擊。開發人員應驗證所有從用戶和其他系統接收的輸入數據,然后再處理它,以確保它符合預期的格式,不包含惡意代碼或字符。這一點尤其適用于其他工具和系統。例如,某些字符有可能成為操作系統命令行的參數!
SQL注入:當程序員建立一個動態的數據庫查詢以接收用戶的輸入時,將會帶來 SQL注入的風險。攻擊者可以在任何屏幕的輸入欄將SQL指令插入到輸入數據中。然后,由于代碼中的缺陷,該程序在數據庫中會執行惡意SQL語句。因此,不要使用動態SQL,而是使用準備好的語句(帶有參數化查詢)。否則,永遠不要連接參數來創建SQL語句,這樣會增加發生 SQL注入攻擊的可能性。更好的做法是使用已保存過的語句,并始終驗證白名單上的輸入。
跨站點腳本:當攻擊者使用Web應用程序向其他用戶分發惡意代碼時,通常會以瀏覽器端腳本的形式發生跨站點腳本(XSS)攻擊。
為了防止這種情況,請使用經過驗證的庫對HTML上下文的輸出進行HTML編碼,并使用白名單允許字符過濾輸入,以確保Java代碼應用程序的安全。對JavaScript使用JavaScript Unicode轉義。
5.避免序列化
對于Java來說,序列化就是把一個對象轉換成一個二進制字節流,以便它能夠在Java虛擬機之間進行移植,然后再用一個反序列化來重建它。序列化為Java類建立了一個接口,它避免了常用的字段存取控制技術,如構造器和存取修飾器。這樣,遠程輸入就能被轉換成全功能的對象。
因此,避免序列化是至關重要的,尤其是在處理安全敏感的類時。這樣,所有類字段都可以被訪問,因為序列化一個類會產生一個公共接口。在使用序列化之前,一定要考慮哪些字段是可訪問的,因為它對應用程序來說可能本質上是不安全的。據說重載特定的構造函數和方法會影響代碼。盡量避免這種情況。
6.實現加密和哈希算法(hash)
加密與哈希算法是一種重要的安全手段,可以有效地保護數據的傳輸與休眠。開發人員應使用如AES或RSA等強加密算法對傳輸中的數據進行加密,并使用如SHA-256或SHA-512等安全哈希算法對密碼和其他敏感數據進行加密,然后再將其存儲在數據庫或其他存儲系統中。
7.避免通過錯誤消息暴露實現
生成錯誤消息可能會為攻擊者提供大量數據。特別是堆棧跟蹤,可以披露有關您正在運行的軟件以及如何使用它的詳細信息。應對最終用戶隱藏堆棧跟蹤。例如,失敗登錄嘗試的警告,錯誤消息應為"登錄失敗”,而不是“找不到該用戶”或“密碼不正確”,否則用戶將得到一些關于基礎技術堆棧和處理的提示信息。請確保您的信息盡量保密。
8.實施監控和日志記錄
監控和日志記錄是實時檢測和響應安全事件的重要安全措施。開發人員應該實施有力的監控和日志記錄機制,以跟蹤應用程序活動、檢測異常情況,并在發生安全事件時生成警報。要做到這一點,可以使用諸如Log4j、Logback或者 Splunk之類的工具收集并分析應用程序日志。
三、用于保護云計算環境中Java應用程序安全的工具
以下工具可用于有效地保護云計算環境中的應用程序:
1.身份和訪問管理(IAM)
IAM是一種云計算服務,它為保護云計算資源提供了認證與授權機制。IAM有助于管理用戶身份、角色和權限,使開發人員能夠控制對數據庫、存儲系統和API等云資源的訪問。AWS IAM和Google Cloud IAM是用于保護云中Java應用程序的流行IAM服務。
2.Web應用防火墻(WAF)
WAF是一種安全工具,用于保護Web應用程序免受SQL注入和跨站點腳本等常見攻擊。WAF位于應用程序和用戶之間,檢查進入流量并阻止惡意請求。在云計算環境下,為 Java應用程序提供安全保護的常用WA包括AWS WAF, Azure WAF,以及谷歌的Cloud Armor。
3.漏洞掃描程序
漏洞掃描程序是掃描應用程序和基礎設施以查找安全漏洞的工具。漏洞掃描程序可識別安全漏洞并提供修復建議。在云計算環境下,常用的漏洞掃描器包括 Qualys,Tenable以及OpenVAS。
4.代碼分析工具
代碼分析工具可以分析源代碼以識別安全漏洞和編碼錯誤。代碼分析工具使用靜態代碼分析和動態代碼分析技術來識別安全缺陷,如緩沖區溢出、SQL注入和跨站點腳本。在云計算環境下,常用的代碼分析工具有Checkmarx,Fortify,Veracode等。
5.DevSecOps工具
DevSecOps工具可以將安全性集成到軟件開發的生命周期。DevSecOps工具自動化了安全測試、代碼分析和漏洞管理,使開發人員能夠在開發過程的早期識別和修復安全缺陷。在云計算環境下,一些常用的保護Java應用程序的DevSecOps工具包括Jenkins、GitLab和CircleCI。
6.加密和密鑰管理工具
加密和密鑰管理工具可以使開發人員能夠對傳輸中和靜止中的數據進行加密并管理加密密鑰。加密和密鑰管理工具為加密密鑰提供安全存儲,并確保只有授權用戶才能訪問這些密鑰。在云計算環境下,保護Java應用程序的常用加密和密鑰管理工具包括AWS KMS、Azure密鑰庫和谷歌云KMS。
7.容器安全工具
容器安全工具可以為容器化應用程序提供安全性。容器安全工具監視容器活動,識別漏洞,并為容器提供運行時保護。在云計算環境下,為Java應用程序提供安全防護的幾種常見的容器安全工具有Aquasecurity,Sysdig以及Twistlock。
四、結論
保護云計算環境下的Java應用程序,需要對不同類型的安全風險和最佳措施工具的實現進行充分考慮。開發人員應該關注以下方面:
編寫代碼封裝實現并對網絡隱藏敏感信息。加密應該用于通過網絡或其他方式分享敏感信息不可避免的情況。應正確實施身份驗證和授權,以確保合法訪問者能夠獲得正確的信息。
對輸入數據進行驗證,避免序列化處理,以保證外部輸入不會注入惡意代碼,從而接管系統。這包括阻止SQL注入和跨站腳本。
監控和記錄應用程序活動,以便實時檢測安全漏洞。
在云計算環境下,可以使用多種工具對Java應用進行安全防護,包括IAM、WAF、漏洞掃描、代碼分析、 DevSecOps、加密密鑰管理以及容器安全工具等。
通過遵循最佳措施并使用合適的工具,開發人員可以在云計算環境中構建安全的Java應用程序,并抵御安全威脅。
原文鏈接:https://hackernoon.com/securing-java-applications-in-the-cloud-best-practices-and-tools
譯者介紹
劉濤,51CTO社區編輯,某大型央企系統上線檢測管控負責人。?