身份管理的15個安全開發(fā)實踐
應(yīng)用或服務(wù)的安全編碼很重要,但若事關(guān)處理個人數(shù)據(jù)的系統(tǒng),那就不僅僅是重要,而是至關(guān)重要了。
軟件分析公司CAST分析了1380個軟件應(yīng)用,在代碼中發(fā)現(xiàn)了驚人的130萬個漏洞。
有點網(wǎng)絡(luò)安全常識的人都知道,軟件漏洞就是向網(wǎng)絡(luò)罪犯敞開的大門。
身份管理可以說是所有技術(shù)門類中風(fēng)險最大的服務(wù)。身份盜竊事件常伴我們左右。咨詢公司 Javelin Research 從事身份盜竊事件研究多年,其《2018身份欺詐》報告將2017年身份盜竊統(tǒng)計數(shù)據(jù)描述為“歷史新高”,揭示身份盜竊繼續(xù)困擾著這個行業(yè)。
身份管理中我們常會談及所謂“武器化身份”的概念,也就是強化系統(tǒng)中的接入點和用戶與服務(wù)交互的位置。然而,武器化過程需分層實施,而其中一層就是代碼層。
身份管理安全編碼
數(shù)字身份平臺可能會非常復(fù)雜,因為這些平臺往往得依賴外部數(shù)據(jù)源,并與第三方API集成。消費級身份與訪問管理(IAM)甚至更為復(fù)雜。這類平臺需要擴展功能來上傳、存儲和共享文檔與圖片。很多身份服務(wù)還融入移動設(shè)備App,或者說完全基于移動App。依靠身份生態(tài)系統(tǒng)各組件間通信所用協(xié)議的固有安全是不夠的。此類生態(tài)系統(tǒng)的底層代碼必須盡可能安全,同時又不能對其功能造成影響。
開發(fā)身份平臺時可以采用如下幾種最佳安全編碼實踐:
1. 使用良好資源
從安全編碼入門經(jīng)典資源開始。開放網(wǎng)絡(luò)應(yīng)用安全計劃(OWASP)是安全編碼實際上的入門資源。其安全編碼“快速參考指南”是個極好的起始點,可作為開發(fā)過程中的復(fù)核工具使用。放心充分利用他們的資源。
2. 采用防御性編程技巧
這么做可以一定程度上避免出現(xiàn)可利用漏洞。其中一招是等價比較:把常量放到比較語句的前端。常量前置的話,如果不小心把比較操作符(兩個等號“==”)誤敲成賦值操作符(一個等號“=”),在編譯或運行時階段就會報錯。舉個例子:
- 不良編碼習(xí)慣:變量在前
- if ($result == 'SUCCESS') {
- if ('SUCCESS' == $result) {
3. 清洗數(shù)據(jù)
數(shù)字身份,尤其是消費級數(shù)字身份系統(tǒng),往往會調(diào)用外部數(shù)據(jù)源。來自外部源或由用戶提供的所有數(shù)據(jù)都應(yīng)該被當(dāng)成不可信的。對Web客戶端來說,這些數(shù)據(jù)包括從查詢字符串或散列參數(shù)、cookie、本地存儲等等獲取的數(shù)據(jù);對服務(wù)器端應(yīng)用來說,這些數(shù)據(jù)包含通過POST、GET、cookie等等提交的數(shù)據(jù)。原生應(yīng)用常會讀取配置文件,而這些配置文件有可能被故意篡改。
無論如何,第一道防線都是數(shù)據(jù)清洗:確保數(shù)據(jù)中僅含有經(jīng)允許的字符/格式。其中一個重點是檢查最大數(shù)據(jù)域長度,避免緩沖區(qū)溢出攻擊。
數(shù)字身份平臺安全檢查的另一個重要領(lǐng)域是圖片上傳。隨著證件照片的存儲和共享越來越廣泛,IAM和CIAM服務(wù)也變得越來越重要。用戶上傳照片之類的文件上傳行為可能會特別危險,必須嚴格檢查以確保文件真的只是單純的圖片而沒有隱藏的可執(zhí)行內(nèi)容。
4. 篩查
文檔和其他文件存儲是數(shù)字身份生態(tài)系統(tǒng)的重要部分。放到存儲中的所有數(shù)據(jù)都必須經(jīng)過可執(zhí)行內(nèi)容篩查。篩查過程無關(guān)底層數(shù)據(jù)庫技術(shù)。比如說,雖然非SQL數(shù)據(jù)庫對SQL注入攻擊免疫,但仍有自身弱點,仍然要經(jīng)過篩查。
5. 過濾
類似的,不應(yīng)直接接受外部命令字符串。應(yīng)設(shè)置過濾器,總是檢查命令是否有效且適用于相應(yīng)上下文。
6. 防止未經(jīng)驗證的代碼執(zhí)行
避免使用eval()類函數(shù),因為此類函數(shù)允許未經(jīng)驗證的代碼執(zhí)行。內(nèi)嵌eval()函數(shù)的函數(shù)也不應(yīng)采用,比如JavaScript的SetTimer()。
7. 彈性為王
開發(fā)面向消費者的數(shù)字身份服務(wù)往往意味著需要覆蓋大量用戶。你得允許各種各樣的值。應(yīng)用開發(fā)編程的時候要考慮彈性,這樣才能在外部數(shù)據(jù)值超出預(yù)期范圍或類型時不會發(fā)生故障或允許代碼注入。良好的單元測試或功能測試通常能檢測出此類問題。
8. 謹慎使用開源代碼
產(chǎn)品中引入最新版開源代碼有可能同時引入了惡意軟件。使用開源代碼包時,最好在包管理器中設(shè)置特定版本號,以免誤用未經(jīng)驗證的版本。編譯過程應(yīng)包含對所有外部文件的散列檢查。
9. 錯誤響應(yīng)
錯誤響應(yīng)是數(shù)字身份服務(wù)的關(guān)鍵部分,因為可以告知用戶問題點并改善可用性。然而,這一功能也可能被惡意黑客用于摸清系統(tǒng)行為。要確保錯誤響應(yīng)動作不會向攻擊者泄露信息??蛻舳?服務(wù)器錯誤響應(yīng)應(yīng)僅包含知會用戶的最少信息,而不是協(xié)助攻擊者窺探應(yīng)用。
10. 審計日志
如果攻擊確實發(fā)生了,你會想要知道到底結(jié)果如何以及確保攻擊事件可以復(fù)現(xiàn)。但日志記錄需有效,用無意義的審計數(shù)據(jù)填充日志可能會適得其反。
11. 數(shù)字簽名
盡可能采用數(shù)字簽名來驗證數(shù)據(jù)完整性。散列消息驗證碼(HMAC)是經(jīng)濟實惠且有效的驗證方式。類似的,如果數(shù)據(jù)十分敏感,比如包含PII,那么需要確保數(shù)據(jù)存儲和傳輸過程中加密。通過公共或私人網(wǎng)絡(luò)傳送任何東西都應(yīng)使用TLS。
12. 使用令牌進行安全通信
進程間通信可以考慮使用令牌而不是口令進行身份驗證。
13. 移動應(yīng)用
移動設(shè)備應(yīng)用越來越多地被用于數(shù)字身份證明和交易。最好假定設(shè)備是可以被越獄的。仔細檢查你處理的數(shù)據(jù)并評估所涉風(fēng)險。在可能的情況下引入越獄檢測代碼。
14. 漏洞檢查
每次新升級完成都要做漏洞檢查。有很多專業(yè)公司提供這項服務(wù)。CheckMarx或CAST之類的公司提供獨立源代碼分析器服務(wù)。此類解決方案是安全編碼實踐的重要組成部分,盡管它們不應(yīng)被當(dāng)做人工代碼檢查的替代品,而應(yīng)作為附加檢查完成。
15. 最重要的
緊跟最新漏洞。嚴重漏洞總會出現(xiàn)在 CVE Details 上。必須注意到新威脅并采取行動,確保自己的代碼中不存在這些漏洞。
應(yīng)用或服務(wù)的安全編碼很重要,但若事關(guān)處理個人數(shù)據(jù)的系統(tǒng),那就不僅僅是重要,而是至關(guān)重要了。如果你設(shè)計或開發(fā)數(shù)字身份系統(tǒng),安全和可用性總會成為難以平衡的兩難選擇。但良好的安全編碼習(xí)慣可助你在管理網(wǎng)絡(luò)攻擊威脅的同時確保消費者身份系統(tǒng)的復(fù)雜功能不受影響。
- CAST軟件應(yīng)用分析報告:https://www.castsoftware.com/news-events/press-release/press-releases/download/cast-research-on-the-state-of-software-security-reveals-riskiest-applications
- Javelin《2018身份欺詐》報告:https://www.javelinstrategy.com/coverage-area/2018-identity-fraud-fraud-enters-new-era-complexity
- OWASP《安全編碼實踐快速參考指南》:https://www.owasp.org/index.php/OWASP_Secure_Coding_Practices_-_Quick_Reference_Guide
- CVE Details:https://www.cvedetails.com/browse-by-date.php
【本文是51CTO專欄作者“李少鵬”的原創(chuàng)文章,轉(zhuǎn)載請通過安全牛(微信公眾號id:gooann-sectv)獲取授權(quán)】