(二十四)—— 仆人鍵模式

2018-02-24 15:44 更新

云計算設計模式(二十四)——仆人鍵模式

使用一個令牌或密鑰,向客戶提供受限制的直接訪問特定的資源或服務,以便由應用程序代碼卸載數(shù)據(jù)傳輸操作。這個模式是在使用云托管的存儲系統(tǒng)或隊列的應用中特別有用,并且可以最大限度地降低成本,最大限度地提高可擴展性和性能。

背景和問題

客戶端程序和網(wǎng)絡瀏覽器經(jīng)常需要讀取和寫入文件或數(shù)據(jù)流,并從一個應用程序的存儲空間。通常,應用程序將處理的運動數(shù)據(jù),或者通過從存儲讀取它,并將其傳輸?shù)娇蛻舳?,或通過從客戶機讀取該載流并將其存儲在數(shù)據(jù)存儲中。然而,這種方法吸收了寶貴的資源,如計算,存儲和帶寬。

數(shù)據(jù)存儲要處理的上載和直接數(shù)據(jù)的下載,而不需要對應用程序執(zhí)行任何處理移動至該數(shù)據(jù)的能力,但是這通常需要在客戶端能夠訪問該存儲區(qū)中的安全憑證。雖然這可能是一種有用的技術來減少數(shù)據(jù)傳送費用的要求進行擴展的應用,并以最大化性能,這意味著應用程序不再能夠管理的數(shù)據(jù)的安全性。一旦客戶端已到數(shù)據(jù)存儲器進行直接訪問的連接,應用程序不能充當看門人。它不再是在該方法的控制,并且不能防止隨后上載或下載的數(shù)據(jù)存儲中。

這不是,可能需要使用不受信任的客戶的現(xiàn)代分布式系統(tǒng)實事求是的態(tài)度。相反,應用程序必須能安全地控制對數(shù)據(jù)的訪問是粒狀的方法,但仍然通過設置此連接,然后使客戶端能夠直接與數(shù)據(jù)存儲來執(zhí)行所需的讀或寫操作的通信降低服務器上的負載。

解決方案

要解決控制訪問的數(shù)據(jù)存儲在那里的商店本身無法管理身份驗證和客戶授權的問題,一個典型的解決方案是限制訪問的數(shù)據(jù)存儲的公共連接,并提供客戶端用鑰匙或令牌數(shù)據(jù)存儲本身可以驗證。

這個密鑰或令牌通常被稱為仆人鍵。它提供了對特定資源的時間限制的訪問中,僅允許預定的操作,例如讀取和寫入到存儲或隊列,或上載和下載的Web瀏覽器。應用程序可以創(chuàng)建和發(fā)行代客鍵客戶快速,方便地設備和網(wǎng)絡瀏覽器,允許客戶端,而無需應用程序直接處理數(shù)據(jù)傳送執(zhí)行所需的操作。這消除了處理開銷,并且在性能和可擴展性所造成的影響,從該應用程序和該服務器。

客戶端使用該令牌來訪問特定資源中的數(shù)據(jù)存儲為只有特定的時期,并與訪問權限的特定的限制,如示于圖1中指定的時間后,將鍵變?yōu)闊o效并且不會允許后續(xù)訪問該資源。

圖1 - 模式概述

另外,也可以配置具有其他依賴關系,如該數(shù)據(jù)的位置的范圍的一個關鍵。例如,根據(jù)不同的數(shù)據(jù)存儲能力,所述鍵可在數(shù)據(jù)存儲區(qū)指定一個完整的表格,或在表中僅特定的行。在云存儲系統(tǒng)中的密鑰可以指定一個容器,或只是一個特定項目的容器內(nèi)。

鍵,也可以由應用程序無效。這是一種有用的方法,如果客戶端通知該數(shù)據(jù)傳送操作完成的服務器。然后,服務器可以是無效鍵,以防止將其用于任何后續(xù)訪問的數(shù)據(jù)存儲中。

使用這種模式可以簡化管理對資源的訪問,因為沒有要求創(chuàng)建和驗證用戶,授予權限,然后再刪除用戶。它也可以很容易地限制的位置,允許,和有效期,所有通過簡單地產(chǎn)生一個合適的鍵在運行時。的重要因素是限制的有效期,以及資源的特別的位置,盡可能緊,以使接收方可以將其用于僅在預定的目的。

問題和注意事項

在決定如何實現(xiàn)這個模式時,請考慮以下幾點:

  • 管理密鑰的有效性狀態(tài)和時期。最關鍵的是不記名票據(jù),如果泄露或泄露,有效地解除鎖定目標項目,并使其可用于在有效期內(nèi)惡意使用。一鍵通??沙蜂N或無效,這取決于它是如何發(fā)出的。服務器端的策略可以被改變,或者在最終的情況下,服務器鍵入其用可被無效簽名。指定一個短有效期,盡量減少使后續(xù)的無端操作來發(fā)生對數(shù)據(jù)存儲的風險。然而,如果在有效期太短時,客戶端可能無法在密鑰過期之前完成該操作。允許授權用戶如果多次訪問所需的受保護資源的有效期間過期之前更新的關鍵。
  • 訪問控制的關鍵將提供的水平。典型地,該鍵應允許用戶執(zhí)行僅需要完成操作的行動,諸如只讀訪問,如果客戶端不應該能夠將數(shù)據(jù)上傳到數(shù)據(jù)存儲器。文件上傳時,通常指定一個鍵,它提供只寫權限,以及位置和有效期。至關重要的是要精確地指定資源或資源集到的關鍵應用。
  • 考慮如何控制用戶的行為。實施這種模式是指控制一定的損失轉移到哪些用戶有權訪問的資源??刂频目墒┘拥碾娖绞怯煽捎糜谠摲栈蚰繕藬?shù)據(jù)存儲區(qū)中的策略和許可的能力的限制。例如,它通常是不可能創(chuàng)建密鑰,限制數(shù)據(jù)的大小將被寫入到存儲,或者次數(shù)的密鑰可用于訪問文件的數(shù)目。這可導致由預期客戶所使用,即使和可能是由在可能會導致重復上載或下載的代碼的錯誤將導致數(shù)據(jù)傳輸巨大意想不到的成本。限制次數(shù)的文件可以被上載或下載的,可能有必要在可能情況下的數(shù)量,能夠強制客戶端,當一個操作完成后,通知該應用程序。例如,某些數(shù)據(jù)存儲引發(fā)事件的應用程序代碼,可用于監(jiān)視操作和控制的用戶行為。然而,它可能是很難執(zhí)行對個人用戶的配額在多租戶場景,其中相同的密鑰從一個租戶使用的所有用戶。
  • 驗證和可選消毒,所有上傳的數(shù)據(jù)。該收益的關鍵訪問一個惡意用戶可以上傳,旨在進一步降低了系統(tǒng)的數(shù)據(jù)??商鎿Q地,授權用戶可上載的數(shù)據(jù)是無效的,并在處理時,可能會導致錯誤或系統(tǒng)故障。為了防止這一點,確保所有上傳的數(shù)據(jù)進行驗證,并檢查使用前惡意內(nèi)容。
  • 審核所有操作。許多基于密鑰的機制可以登錄的操作,如上傳,下載,和失敗。這些日志通??梢圆⑷胍粋€審核過程,并且還用于計費,如果基于文件大小或數(shù)據(jù)量的用戶被收取費用。使用日志來檢測可能是由與鍵提供的一個存儲的訪問策略,或者意外移開問題導致驗證失敗。
  • 提供關鍵安全。它可以被嵌入在用戶激活在web頁面的URL,或者可以在一個服務器重定向操作中使用,以便自動進行下載。始終使用HTTPS傳送的關鍵在一個安全通道。
  • 保護敏感數(shù)據(jù)在傳輸過程中。通過應用程序發(fā)送的敏感數(shù)據(jù)通常會發(fā)生使用SSL或TLS,這應該被強制執(zhí)行的客戶端直接訪問數(shù)據(jù)存儲。

其他問題要注意實現(xiàn)這個模式的時候是:

  • 如果客戶端沒有,或者無法通知操作完成的服務器,唯一的限制是關鍵的到期期限,該應用程序將無法執(zhí)行審計業(yè)務,如計算上載或下載的數(shù)量,或防止多個上傳或下載。
  • 可以生成可能是有限的關鍵策略的靈活性。例如,一些機制可以允許只使用一種定時期滿期。其他人可能無法以指定讀/寫權限的足夠的粒度。
  • 如果指定的開始時間的鍵或令牌有效期限,確保它是比當前的服務器時間,以允許客戶端時鐘,可能會稍微超出同步早一點。如果沒有指定,則默認通常是當前服務器時間。
  • 包含密鑰的URL將被記錄在服務器日志文件中。而鍵通常已過期的日志文件進行分析之前,請確保您限制對它們的訪問。如果日志數(shù)據(jù)發(fā)送到監(jiān)控系統(tǒng)或存儲在另一位置中,需要考慮的延遲,以防止密鑰的泄漏,直至經(jīng)過其有效期限已經(jīng)過期。
  • 如果客戶端代碼,在Web瀏覽器中運行,瀏覽器可能需要支持跨域資源共享(CORS),使Web瀏覽器中執(zhí)行訪問的數(shù)據(jù)從該服務的網(wǎng)頁源域不同的域代碼。一些舊的瀏覽器和一些數(shù)據(jù)存儲不支持CORS,和代碼運行在這些瀏覽器可能無法使用仆人鍵,提供對數(shù)據(jù)的訪問在不同的領域,比如云存儲帳戶。

何時使用這個模式

這種模式非常適合于以下幾種情況:

  • 為了最大限度地減少資源負荷,最大限度地提高性能和可擴展性。使用仆人鍵不要求資源被鎖定,沒有遠程服務器呼叫是必需的,有對可發(fā)出仆人鍵的數(shù)目沒有限制,并且其避免了單點,將出現(xiàn)從執(zhí)行數(shù)據(jù)失敗的傳送通過應用程序代碼。創(chuàng)建仆人鍵通常是簽訂一個字符串鍵的簡單加密操作。
  • 為了最大限度地降低運營成本。支持直接訪問存儲和隊列是資源與成本效率,可以導致更少的網(wǎng)絡往返,并且可以允許在所需的計算資源的數(shù)量的減少。
  • 當客戶定期上載或下載數(shù)據(jù),特別是在有一個大的體積,或當每個操作涉及大量的文件。
  • 當應用程序具有有限的計算資源可用,或者是由于托管限制或成本的考慮。在這種情況下,該模式是更有利的,如果有很多并發(fā)的數(shù)據(jù)上傳或下載,因為它會減輕,從處理數(shù)據(jù)傳輸?shù)膽谩?/li>
  • 當數(shù)據(jù)被存儲在遠程數(shù)據(jù)存儲裝置或不同的數(shù)據(jù)中心。如果該應用程序被要求作為一個看門者,有可能是因為數(shù)據(jù)中心之間傳送數(shù)據(jù)的額外的帶寬,或通過客戶端和應用程序之間的公共或專用網(wǎng)絡的電荷,然后將應用程序和數(shù)據(jù)存儲之間。

這種模式可能不適合于下列情況:

  • 如果應用程序必須對數(shù)據(jù)執(zhí)行一些任務之前將其存儲或將其發(fā)送到客戶端之前。例如,應用程序可能需要執(zhí)行驗證,登錄訪問成功,或者對數(shù)據(jù)進行變換。然而,一些數(shù)據(jù)存儲和客戶端都能夠進行談判,并進行簡單的變換,如壓縮和解壓(例如,Web 瀏覽器通??梢蕴幚?gzip 等格式)。
  • 如果現(xiàn)有的應用程序的設計和實施,使得它難以和昂貴的工具。使用這種模式通常需要用于傳送和接收數(shù)據(jù)的一個不同的體系結構方法。
  • 如果有必要保持審核跟蹤或控制的執(zhí)行數(shù)據(jù)傳送操作的次數(shù),并在使用代客關鍵機制不支持該服務器可用于管理這些操作的通知。
  • 如果有必要,以限制該數(shù)據(jù)的大小,特別是在上載操作。唯一的解決方法是為應用程序來檢查數(shù)據(jù)的尺寸后,在操作完成后,或在指定時間或按計劃檢查上傳的大小。

例子

微軟 Azure 支持共享訪問簽名(SAS)對 Azure 存儲的細粒度的訪問控制,數(shù)據(jù)的blob,表和隊列,并為服務總線隊列和主題。一個 SAS 令牌可配置為提供特定的訪問權限,如讀,寫,更新和刪除特定表;一個鍵范圍的表內(nèi);隊列;一個 blob;或 BLOB 容器。有效期可以是一個指定的時間段,或沒有時間限制。

天青 SAS 還支持可與特定資源相關聯(lián),如表或斑點服務器存儲訪問策略。這個特征提供了額外的控制和靈活性相比,應用程序生成的 SAS 令牌,并且應該盡可能使用。在服務器中存儲策略中定義的設置可以在不發(fā)出新的令牌來改變,并反映在無需將發(fā)行新令牌的令牌,但在令牌本身定義的設置不能被改變。這種方法還使得有可能撤銷有效的 SAS 令牌之前它已經(jīng)過期。

注意:欲了解更多信息,請參閱表介紹 SAS(共享訪問簽名),隊列 SAS 和更新的 Blob SAS 在 Azure 存儲團隊博客和共享訪問簽名,第 1 部分:了解 SAS 型號 MSDN 上。

下面的代碼演示了如何創(chuàng)建一個 SAS 的有效期為 5 分鐘。該 GetSharedAccessReferenceForUpload 方法返回一個SAS可用于將文件上傳到 Azure 的 Blob 存儲。

public class ValuesController : ApiController  
{  
  private readonly CloudStorageAccount account;  
  private readonly string blobContainer;  
  ...  
  /// <summary>  
  /// Return a limited access key that allows the caller to upload a file   
  /// to this specific destination for a defined period of time.  
  /// </summary>  
  private StorageEntitySas GetSharedAccessReferenceForUpload(string blobName)  
  {  
    var blobClient = this.account.CreateCloudBlobClient();  
    var container = blobClient.GetContainerReference(this.blobContainer);  
?
    var blob = container.GetBlockBlobReference(blobName);  
?
    var policy = new SharedAccessBlobPolicy  
    {  
      Permissions = SharedAccessBlobPermissions.Write,  
?
      // Specify a start time five minutes earlier to allow for client clock skew.  
      SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5),  
?
      // Specify a validity period of five minutes starting from now.   
      SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(5)  
    };  
?
    // Create the signature.   
    var sas = blob.GetSharedAccessSignature(policy);  
?
    return new StorageEntitySas  
    {  
      BlobUri = blob.Uri,  
      Credentials = sas,  
      Name = blobName  
    };  
  }  
?
  public struct StorageEntitySas  
  {  
    public string Credentials;  
    public Uri BlobUri;  
    public string Name;  
  }  
}

注意:

在 ValetKey 解決方案提供下載本指導意見提供包含此代碼的完整樣本。在此溶液中 ValetKey.Web 項目包含一個 Web 應用程序,包括如上所示的 ValuesController 類。使用該 Web 應用程序檢索 SAS 鍵,將文件上傳到 Blob 存儲的樣本客戶端應用程序是在 ValetKey.Client 項目中可用。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號