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

2018-02-24 15:44 更新

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

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

背景和問題

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

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

這不是,可能需要使用不受信任的客戶的現(xiàn)代分布式系統(tǒng)實事求是的態(tài)度。相反,應(yīng)用程序必須能安全地控制對數(shù)據(jù)的訪問是粒狀的方法,但仍然通過設(shè)置此連接,然后使客戶端能夠直接與數(shù)據(jù)存儲來執(zhí)行所需的讀或?qū)懖僮鞯耐ㄐ沤档头?wù)器上的負載。

解決方案

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

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

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

圖1 - 模式概述

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

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

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

問題和注意事項

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

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

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

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

何時使用這個模式

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

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

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

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

例子

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

天青 SAS 還支持可與特定資源相關(guān)聯(lián),如表或斑點服務(wù)器存儲訪問策略。這個特征提供了額外的控制和靈活性相比,應(yīng)用程序生成的 SAS 令牌,并且應(yīng)該盡可能使用。在服務(wù)器中存儲策略中定義的設(shè)置可以在不發(fā)出新的令牌來改變,并反映在無需將發(fā)行新令牌的令牌,但在令牌本身定義的設(shè)置不能被改變。這種方法還使得有可能撤銷有效的 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 解決方案提供下載本指導(dǎo)意見提供包含此代碼的完整樣本。在此溶液中 ValetKey.Web 項目包含一個 Web 應(yīng)用程序,包括如上所示的 ValuesController 類。使用該 Web 應(yīng)用程序檢索 SAS 鍵,將文件上傳到 Blob 存儲的樣本客戶端應(yīng)用程序是在 ValetKey.Client 項目中可用。

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號