在云計(jì)算環(huán)境中建立一個(gè)安全的API設(shè)計(jì)是一項(xiàng)具有挑戰(zhàn)性的工作。在本文中,安全研究專家Dejan Lukan介紹了企業(yè)在開發(fā)安全API時(shí)需要記得的若干事項(xiàng)。
一個(gè)應(yīng)用程序編程接口(API)是對(duì)已經(jīng)正常運(yùn)行應(yīng)用程序的一個(gè)簡(jiǎn)單擴(kuò)展,以便于幫助用戶以編程的方式與之進(jìn)行交互。
使用API的原因是各種各樣的,其中包括從數(shù)據(jù)庫(kù)中提取數(shù)據(jù)、將數(shù)據(jù)發(fā)送并保存至數(shù)據(jù)庫(kù),以及推送任務(wù)至隊(duì)列中,但是它們的主要目的是為了幫助用戶通過(guò)使用程序或腳本程序以自動(dòng)化的方式與應(yīng)用程序進(jìn)行交互。當(dāng)在一個(gè)沒(méi)有API支持的虛擬環(huán)境中工作時(shí),每一步的操作都必須由用戶手動(dòng)調(diào)用。如果系統(tǒng)中有著數(shù)以千計(jì)的虛擬機(jī),那么在每一臺(tái)虛擬機(jī)上都必須由用戶手動(dòng)單獨(dú)執(zhí)行每一個(gè)操作的后果是可想而知的。這個(gè)過(guò)程將是緩慢而繁瑣的,這也是API被應(yīng)用于此的價(jià)值所在,即它們可以為用戶提供與應(yīng)用程序的自動(dòng)化交互而不需要執(zhí)行任何的手動(dòng)操作。
在本文中,我們將研究API是如何在云計(jì)算環(huán)境中工作的,其中包括不同的類型、它們的具體角色以及在云計(jì)算中開發(fā)安全API的最佳實(shí)踐的總結(jié)。
API的類型
當(dāng)規(guī)劃設(shè)計(jì)一個(gè)API時(shí),保持一定的大局觀是非常重要的。無(wú)論何時(shí)通過(guò)通訊通道發(fā)送消息時(shí),都需要按照某種協(xié)議(即一組發(fā)送方和接收方均已知曉的規(guī)則)對(duì)消息進(jìn)行正確的處理。為了實(shí)現(xiàn)通過(guò)互聯(lián)網(wǎng)傳送API消息安全性的最大化,我們應(yīng)使用一個(gè)安全的協(xié)議。在通過(guò)網(wǎng)絡(luò)把消息發(fā)送至服務(wù)器端之前,安全協(xié)議會(huì)在客戶端對(duì)待發(fā)送數(shù)據(jù)進(jìn)行加密處理,而當(dāng)消息發(fā)送完畢后,安全協(xié)議則將在服務(wù)器端對(duì)已接收的消息數(shù)據(jù)進(jìn)行解密并執(zhí)行下一步的處理。以下是一些可用于通過(guò)互聯(lián)網(wǎng)安全發(fā)送消息的協(xié)議,如:HTTPS、POPS、IMAPS、SMTPS、LDAPS、XMPPS等等。
因?yàn)榘l(fā)送消息所使用的數(shù)據(jù)格式對(duì)安全性并沒(méi)有什么影響,所以消息中的數(shù)據(jù)可以以多種格式來(lái)表示。通常情況下,消息的數(shù)據(jù)格式為XML、JSON或HTML(而在使用ZAProxy的情況下是上述三種格式),所以最終用戶在與應(yīng)用程序進(jìn)行交互時(shí)可以做一選擇。在API應(yīng)用中,有一點(diǎn)是最為重要的,即它們對(duì)于多種編程語(yǔ)言都是可擴(kuò)展和可用的。所以如果使用了合適的協(xié)議,用戶就可以很容易地使用任意的編程語(yǔ)言來(lái)編寫程序與API進(jìn)行交互。一個(gè)合適的協(xié)議是可以實(shí)現(xiàn)與應(yīng)用程序的輕松交互的,多年以來(lái)它都是得到良好支持并通過(guò)實(shí)際使用驗(yàn)證的。一個(gè)眾所周知的例子就是HTTP協(xié)議。一些常用于互聯(lián)網(wǎng)消息交換的API類型包括REST、SOAP、XML-RPC以及 JSON-RPC等。
開發(fā)一個(gè)新的API
當(dāng)為云計(jì)算應(yīng)用開發(fā)一個(gè)全新的應(yīng)用程序編程接口時(shí),解決以下的問(wèn)題將是當(dāng)務(wù)之急:
身份:服務(wù)器是并不會(huì)自動(dòng)識(shí)別首次使用云計(jì)算服務(wù)的用戶的,因此它會(huì)要求進(jìn)行身份證明。通常情況下,它會(huì)要求用戶提供一個(gè)用戶ID或公鑰來(lái)唯一地標(biāo)識(shí)一個(gè)用戶。不幸的是,用戶所提供的信息是公開的,因此,攻擊者常被歸類為一個(gè)特定的用戶,但是它們將不能夠決定性地證明這一點(diǎn)。
驗(yàn)證:為了證明一個(gè)用戶的身份,服務(wù)器會(huì)自動(dòng)生成一個(gè)驗(yàn)證問(wèn)題。這個(gè)驗(yàn)證問(wèn)題的答案是用戶唯一知道的,它可以是一個(gè)密碼、密鑰、令牌或者其他別的什么。
授權(quán):一旦用戶證明了他或她的身份,特定應(yīng)用程序就會(huì)請(qǐng)求訪問(wèn)權(quán)限。然后在用戶獲得準(zhǔn)入權(quán)之前,這個(gè)應(yīng)用程序會(huì)核對(duì)這個(gè)用戶是否被允許訪問(wèn)所請(qǐng)求的資源或執(zhí)行所請(qǐng)求的操作。
識(shí)別技術(shù)
應(yīng)用程序是可以使用很多技術(shù)來(lái)識(shí)別和驗(yàn)證用戶的身份的:
用戶名和密碼:一對(duì)用戶名和密碼可通過(guò)基本的或摘要式的驗(yàn)證方式來(lái)提供用戶認(rèn)證。在這兩個(gè)所使用的方法中,在HTTP請(qǐng)求中傳送的密碼是非加密格式的,所以如有必要,可使用一個(gè)諸如HTTPS這類的安全通訊通道。
會(huì)話:當(dāng)用戶名和密碼被發(fā)送至應(yīng)用程序時(shí),應(yīng)用程序就會(huì)以一個(gè)cookie作為響應(yīng),之后這個(gè)cookie就會(huì)在所有的后續(xù)識(shí)別請(qǐng)求中被發(fā)送。
證書:可使用一個(gè)公共的或私有的密鑰基礎(chǔ)設(shè)施來(lái)驗(yàn)證用戶身份。這要求服務(wù)器和客戶端都擁有由有效機(jī)構(gòu)簽發(fā)的證書,以用于建立證書的合法性。
開放授權(quán):當(dāng)一個(gè)應(yīng)用程序使用另一個(gè)代表用戶的應(yīng)用程序時(shí),一般會(huì)使用OAuth。例如,一個(gè)應(yīng)用程序有一個(gè)“分享至推特”的按鈕,那么它通常就會(huì)使用OAuth。該方法可授權(quán)應(yīng)用程序訪問(wèn)推特的API,而無(wú)需透露應(yīng)用程序的密碼。
自定義身份驗(yàn)證方案:可使用一個(gè)自定義驗(yàn)證方案通過(guò)一個(gè)專用的協(xié)議來(lái)識(shí)別和驗(yàn)證用戶。一個(gè)專用的協(xié)議通常并不是一個(gè)有利的選擇,因?yàn)樗皇窃谝粋€(gè)應(yīng)用程序中使用。已知的協(xié)議通常都是更好的,因?yàn)橛脩羰煜に鼈儯梢宰畲笙薅葴p少用戶學(xué)習(xí)的時(shí)間。一個(gè)自定義驗(yàn)證方案應(yīng)當(dāng)由一支頂級(jí)的安全團(tuán)隊(duì)來(lái)具體實(shí)施,因?yàn)檫@是一個(gè)復(fù)雜而易出錯(cuò)的過(guò)程。
API密鑰:在首次發(fā)送請(qǐng)求至服務(wù)器且在此之前會(huì)話還未建立時(shí),可在用戶的身份和驗(yàn)證中使用API密鑰。簡(jiǎn)單來(lái)說(shuō),API密鑰就是一個(gè)只被在服務(wù)器端運(yùn)行的應(yīng)用程序所知的唯一的長(zhǎng)令牌,客戶端會(huì)在API請(qǐng)求中發(fā)送這個(gè)API密鑰。API密鑰的方法要比用戶名密碼的方法更好,因?yàn)榍罢叩男畔㈧馗撸軌蚋玫乇Wo(hù)系統(tǒng)免受黑客攻擊以及有限度地泄漏敏感信息。
結(jié)論
這些技術(shù)基礎(chǔ)支撐著安全API的開發(fā),尤其是當(dāng)開發(fā)一個(gè)定制API時(shí)或者甚至當(dāng)使用一個(gè)云計(jì)算供應(yīng)商的API時(shí)。
當(dāng)選擇一家云計(jì)算服務(wù)供應(yīng)商(CSP)時(shí),應(yīng)確定它是否能夠提供API。此后,API將在實(shí)現(xiàn)程序或腳本程序自動(dòng)化的過(guò)程中證明其價(jià)值。CSP應(yīng)當(dāng)擁有合適的文檔和安全測(cè)試結(jié)果,以證明其API設(shè)計(jì)和安全的合法性。
使用定制API,聘請(qǐng)一位安全顧問(wèn)或滲透測(cè)試師來(lái)定期測(cè)試API;在API正式進(jìn)入生產(chǎn)階段以及每次重大代碼發(fā)布之前對(duì)API進(jìn)行測(cè)試是非常關(guān)鍵的。這樣做將有助于消除API被用于惡意攻擊從而對(duì)應(yīng)用程序用戶的安全性造成不利影響的弱點(diǎn)。