雲端計算設計模式(二十四)——僕人鍵模式
雲端計算設計模式(二十四)——僕人鍵模式
使用一個令牌或金鑰,向客戶提供受限制的直接訪問特定的資源或服務,以便由應用程式程式碼解除安裝資料傳輸操作。這個模式是在使用雲託管的儲存系統或佇列的應用中特別有用,並且可以最大限度地降低成本,最大限度地提高可擴充套件性和效能。
背景和問題
客戶端程式和網路瀏覽器經常需要讀取和寫入檔案或資料流,並從一個應用程式的儲存空間。通常,應用程式將處理的運動資料,或者通過從儲存讀取它,並將其傳輸到客戶端,或通過從客戶機讀取該載流並將其儲存在資料儲存中。然而,這種方法吸收了寶貴的資源,如計算,儲存和頻寬。
資料儲存要處理的上載和直接資料的下載,而不需要對應用程式執行任何處理移動至
這不是,可能需要使用不受信任的客戶的現代分散式系統實事求是的態度。相反,應用程式必須能安全地控制對資料的訪問是粒狀的方法,但仍然通過設定此連線,然後使客戶端能夠直接與資料儲存來執行所需的讀或寫操作的通訊降低伺服器上的負載。
解決方案
要解決控制訪問的資料儲存在那裡的商店本身無法管理
這個金鑰或令牌通常被稱為僕人鍵。它提供了對特定資源的時間限制的訪問中,僅允許預定的操作,例如讀取和寫入到儲存或佇列,或上載和下載的Web瀏覽器。應用程式可以建立和發行代客鍵客戶快速,方便地裝置和網路瀏覽器,允許客戶端,而無需應用程式直接處理資料傳送執行所需的操作。這消除了處理開銷,並且在效能和可擴充套件性所造成的影響,從該應用程式和該伺服器。
客戶端使用該令牌來訪問特定資源中的資料儲存為只有特定的時期,並與訪問許可權的特定的限制,如示於圖1中指定的時間後,將鍵變為無效並且不會允許
圖1 - 模式概述
另外,也可以配置具有其他依賴關係,如該資料的位置的範圍的一個關鍵。例如,根據不同的資料儲存能力,所述鍵可在資料儲存區指定一個完整的表格,或在表中僅特定的行。在雲端儲存系統中的金鑰可以指定一個容器,或只是一個特定專案的容器內。
鍵,也可以由應用程式無效。這是一種有用的方法,如果客戶端通知該資料傳送操作完成的伺服器。然後,伺服器可以是無效鍵,以防止將其用於任何後續訪問的資料儲存中。
使用這種模式可以簡化管理對資源的訪問,因為沒有要求建立和驗證使用者,授予許可權,然後再刪除使用者。它也可以很容易地限制的位置,允許,和有效期,所有通過簡單地產生一個合適的鍵在執行時。的重要因素是限制的有效期,以及資源的特別的位置,儘可能緊,以使接收方可以將其用於僅在預定的目的。
問題和注意事項
在決定如何實現這個模式時,請考慮以下幾點:
•管理金鑰的有效性狀態和時期。最關鍵的是不記名票據,如果洩露或洩露,有效地解除鎖定目標專案,並使其可用於在有效期內惡意使用。一鍵通常可撤銷或無效,這取決於它是如何發出的。伺服器端的策略可以被改變,或者在最終的情況下,伺服器鍵入其用可被無效簽名。指定一個短有效期,儘量減少使後續的無端操作來發生對資料儲存的風險。然而,如果在有效期太短時,客戶端可能無法在金鑰過期之前完成該操作。允許授權使用者如果多次訪問所需的受保護資源的有效期間過期之前更新的關鍵。
•訪問控制的關鍵將提供的水平。典型地,該鍵應允許使用者執行僅需要完成操作的行動,諸如只讀訪問,如果客戶端不應該能夠將資料上傳到資料儲存器。檔案上傳時,通常指定一個鍵,它提供只寫許可權,以及位置和有效期。至關重要的是要精確地指定資源或資源集到的關鍵應用。
•考慮如何控制使用者的行為。實施這種模式是指控制一定的損失轉移到哪些使用者有權訪問的資源。控制的可施加的電平是由可用於該服務或目標資料儲存區中的策略和許可的能力的限制。例如,它通常是不可能建立金鑰,限制資料的大小將被寫入到儲存,或者次數的金鑰可用於訪問檔案的數目。這可導致由預期客戶所使用,即使和可能是由在可能會導致重複上載或下載的程式碼的錯誤將導致資料傳輸巨大意想不到的成本。限制次數的檔案可以被上載或下載的,可能有必要在可能情況下的數量,能夠強制客戶端,當一個操作完成後,通知該應用程式。例如,某些資料儲存引發事件的應用程式程式碼,可用於監視操作和控制的使用者行為。然而,它可能是很難執行對個人使用者的配額在多租戶場景,其中相同的金鑰從一個租戶使用的所有使用者。
•驗證和可選消毒,所有上傳的資料。該收益的關鍵訪問一個惡意使用者可以上傳,旨在進一步降低了系統的資料。可替換地,授權使用者可上載的資料是無效的,並在處理時,可能會導致錯誤或系統故障。為了防止這一點,確保所有上傳的資料進行驗證,並檢查使用前惡意內容。
•稽核所有操作。許多基於金鑰的機制可以登入的操作,如上傳,下載,和失敗。這些日誌通常可以併入一個稽核過程,並且還用於計費,如果基於檔案大小或資料量的使用者被收取費用。使用日誌來檢測可能是由與鍵提供的一個儲存的訪問策略,或者意外移開問題導致驗證失敗。
•提供關鍵安全。它可以被嵌入在使用者啟用在web頁面的URL,或者可以在一個伺服器重定向操作中使用,以便自動進行下載。始終使用HTTPS傳送的關鍵在一個安全通道。
•保護敏感資料在傳輸過程中。通過應用程式傳送的敏感資料通常會發生使用SSL或TLS,這應該被強制執行的客戶端直接訪問資料儲存。
其他問題要注意實現這個模式的時候是:
•如果客戶端沒有,或者無法通知操作完成的伺服器,唯一的限制是關鍵的到期期限,該應用程式將無法執行審計業務,如計算上載或下載的數量,或防止多個上傳或下載。
•可以生成可能是有限的關鍵策略的靈活性。例如,一些機制可以允許只使用一種定時期滿期。其他人可能無法以指定讀/寫許可權的足夠的粒度。
•如果指定的開始時間的鍵或令牌有效期限,確保它是比當前的伺服器時間,以允許客戶端時鐘,可能會稍微超出同步早一點。如果沒有指定,則預設通常是當前伺服器時間。
•包含金鑰的URL將被記錄在伺服器日誌檔案中。而鍵通常已過期的日誌檔案進行分析之前,請確保您限制對它們的訪問。如果日誌資料傳送到監控系統或儲存在另一位置中,需要考慮的延遲,以防止金鑰的洩漏,直至經過其有效期限已經過期。
•如果客戶端程式碼,在Web瀏覽器中執行,瀏覽器可能需要支援跨域資源共享(CORS),使Web瀏覽器中執行訪問的資料從該服務的網頁源域不同的域程式碼。一些舊的瀏覽器和一些資料儲存不支援CORS,和程式碼執行在這些瀏覽器可能無法使用僕人鍵,提供對資料的訪問在不同的領域,比如雲端儲存帳戶。
何時使用這個模式
這種模式非常適合於以下幾種情況:
•為了最大限度地減少資源負荷,最大限度地提高效能和可擴充套件性。使用僕人鍵不要求資源被鎖定,沒有遠端伺服器呼叫是必需的,有對可發出僕人鍵的數目沒有限制,並且其避免了單點,將出現從執行資料失敗的傳送通過應用程式程式碼。建立僕人鍵通常是簽訂一個字串鍵的簡單加密操作。
•為了最大限度地降低運營成本。支援直接訪問儲存和佇列是資源與成本效率,可以導致更少的網路往返,並且可以允許在所需的計算資源的數量的減少。
•當客戶定期上載或下載資料,特別是在有一個大的體積,或當每個操作涉及大量的檔案。
•當應用程式具有有限的計算資源可用,或者是由於託管限制或成本的考慮。在這種情況下,該模式是更有利的,如果有很多併發的資料上傳或下載,因為它會減輕,從處理資料傳輸的應用。
•當資料被儲存在遠端資料儲存裝置或不同的資料中心。如果該應用程式被要求作為一個看門者,有可能是因為資料中心之間傳送資料的額外的頻寬,或通過客戶端和應用程式之間的公共或專用網路的電荷,然後將應用程式和資料儲存之間。
這種模式可能不適合於下列情況:
•如果應用程式必須對資料執行一些任務之前將其儲存或將其傳送到客戶端之前。例如,應用程式可能需要執行驗證,登入訪問成功,或者對資料進行變換。然而,一些資料儲存和客戶端都能夠進行談判,並進行簡單的變換,如壓縮和解壓(例如,Web瀏覽器通常可以處理gzip等格式)。
•如果現有的應用程式的設計和實施,使得它難以和昂貴的工具。使用這種模式通常需要用於傳送和接收資料的一個不同的體系結構方法。
•如果有必要保持稽核跟蹤或控制的執行資料傳送操作的次數,並在使用代客關鍵機制不支援該伺服器可用於管理這些操作的通知。
•如果有必要,以限制該資料的大小,特別是在上載操作。唯一的解決方法是為應用程式來檢查資料的尺寸後,在操作完成後,或在指定時間或按計劃檢查上傳的大小。
例子
微軟Azure支援共享訪問簽名(SAS)對Azure儲存的細粒度的訪問控制,資料的blob,表和佇列,併為服務匯流排佇列和主題。一個SAS令牌可配置為提供特定的訪問許可權,如讀,寫,更新和刪除特定表;一個鍵範圍的表內;佇列;一個blob;或BLOB容器。有效期可以是一個指定的時間段,或沒有時間限制。
天青SAS還支援可與特定資源相關聯,如表或斑點伺服器儲存訪問策略。這個特徵提供了額外的控制和靈活性相比,應用程式生成的SAS令牌,並且應該儘可能使用。在伺服器中儲存策略中定義的設定可以在不發出新的令牌來改變,並反映在無需將發行新令牌的令牌,但在令牌本身定義的設定不能被改變。這種方法還使得有可能撤銷有效的SAS令牌之前它已經過期。
注意:
欲瞭解更多資訊,請參閱表介紹SAS(共享訪問簽名),佇列SAS和更新的Blob SAS在Azure儲存團隊部落格和共享訪問簽名,第1部分:瞭解SAS型號MSDN上。
下面的程式碼演示瞭如何建立一個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專案中可用。