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