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

2018-02-24 15:44 更新

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

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

背景和問(wèn)題

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

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

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

解決方案

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

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

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

圖1 - 模式概述

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

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

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

問(wèn)題和注意事項(xiàng)

在決定如何實(shí)現(xiàn)這個(gè)模式時(shí),請(qǐng)考慮以下幾點(diǎn):

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

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

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

何時(shí)使用這個(gè)模式

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

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

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

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

例子

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

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

注意:欲了解更多信息,請(qǐng)參閱表介紹 SAS(共享訪問(wèn)簽名),隊(duì)列 SAS 和更新的 Blob SAS 在 Azure 存儲(chǔ)團(tuán)隊(duì)博客和共享訪問(wèn)簽名,第 1 部分:了解 SAS 型號(hào) MSDN 上。

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

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)意見(jiàn)提供包含此代碼的完整樣本。在此溶液中 ValetKey.Web 項(xiàng)目包含一個(gè) Web 應(yīng)用程序,包括如上所示的 ValuesController 類(lèi)。使用該 Web 應(yīng)用程序檢索 SAS 鍵,將文件上傳到 Blob 存儲(chǔ)的樣本客戶端應(yīng)用程序是在 ValetKey.Client 項(xiàng)目中可用。

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)