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