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