最近提供者 - AWS 資料庫加密 SDK

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

最近提供者

注意

我們的客戶端加密庫被重命名為AWS數據庫加密 SDK。下列主題提供有關版本 1 的資訊。 X-2. Java 和版本 1 的動態驗證加密用戶端的 xX — 3. 適用於 Python 的 x 個加密用戶端。如需詳細資訊,請參閱適用於 DynamoDB 版本支援的資AWS料庫加密 SDK

最近提供者是一個密碼編譯資料提供者 (CMP),旨在與提供者存放區搭配使用。它會從提供者存放區取得 CMP,並取得它從 CMP 傳回的密碼編譯資料。其通常會使用各個 CMP 因應多次密碼編譯資料請求。但您也可以使用提供者存放區的功能來控制資料的重複使用程度、決定 CMP 的輪換頻率,甚至在不變更「最近提供者」的情況下變更所使用的 CMP 類型。

注意

與「最新提供者」MostRecentProvider 符號相關聯的程式碼可能會在程序的生命週期內將密碼編譯材料儲存在記憶體中。它可能允許來電者使用他們不再授權使用的金鑰。

MostRecentProvider符號已在舊版受支援的 DynamoDB 加密用戶端中取代,並從 2.0.0 版移除。它由符號所取CachingMostRecentProvider代。如需詳細資訊,請參閱 最新提供者的更新

對於需要盡可能避免呼叫提供者存放區與其密碼編譯來源的應用程式,以及可重複使用部分密碼編譯資料而不會違反安全性需求的應用程式,最近提供者將是理想的選擇。例如,它允許您AWS KMS key在 in AWS Key Management Service(AWS KMS)下保護您的加密材料,而無需AWS KMS每次加密或解密項目時都調用。

您選擇的提供者存放區可決定最近提供者使用的 CMP 類型,以及其取得新 CMP 的頻率。您可以使用任何相容提供者存放區搭配最近提供者,包括您所設計的自訂提供者存放區。

DynamoDB 加密用戶端包含可建立並傳回MetaStore裝材料提供者 (包裝 CMP) 的一個。這會MetaStore將產生的多個版本的已包裝 CMP 儲存在內部 DynamoDB 表格中,並透過 DynamoDB 加密用戶端的內部執行個體透過用戶端加密來保護它們。

您可以設定為使用任何類型的內部 CMP 來保護資料表中的資料,包括產生受您保護的加密資料的 Direct KMS 提供者AWS KMS key、使用您提供的包裝和簽署金鑰的 Wraped CMP,或是您設計的相容自訂 CMP。MetaStore

如需範例程式碼,請參閱:

使用方式

若要建立最近提供者,您必須建立及設定提供者存放區,然後建立可使用該提供者存放區的最近提供者。

下列範例說明如何建立使用其內部 DynamoDB 表格中的版本的最新提供者,MetaStore並使用直接 KMS 提供者的加密資料來保護版本。這些範例使用CachingMostRecentProvider符號。

每個「最近的提供者」都有一個可識別MetaStore表格中 CMP 的名稱、time-to-live(TTL) 設定,以及決定快取可保留多少個項目的快取大小設定。這些範例會將快取大小設定為 1000 個項目,TTL 設定為 60 秒。

Java
// Set the name for MetaStore's internal table final String keyTableName = 'metaStoreTable' // Set the Region and AWS KMS key final String region = 'us-west-2' final String keyArn = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' // Set the TTL and cache size final long ttlInMillis = 60000; final long cacheSize = 1000; // Name that identifies the MetaStore's CMPs in the provider store final String materialName = 'testMRP' // Create an internal DynamoDB client for the MetaStore final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.standard().withRegion(region).build(); // Create an internal Direct KMS Provider for the MetaStore final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build(); final DirectKmsMaterialProvider kmsProv = new DirectKmsMaterialProvider(kms, keyArn); // Create an item encryptor for the MetaStore, // including the Direct KMS Provider final DynamoDBEncryptor keyEncryptor = DynamoDBEncryptor.getInstance(kmsProv); // Create the MetaStore final MetaStore metaStore = new MetaStore(ddb, keyTableName, keyEncryptor); //Create the Most Recent Provider final CachingMostRecentProvider cmp = new CachingMostRecentProvider(metaStore, materialName, ttlInMillis, cacheSize);
Python
# Designate an AWS KMS key kms_key_id = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' # Set the name for MetaStore's internal table meta_table_name = 'metaStoreTable' # Name that identifies the MetaStore's CMPs in the provider store material_name = 'testMRP' # Create an internal DynamoDB table resource for the MetaStore meta_table = boto3.resource('dynamodb').Table(meta_table_name) # Create an internal Direct KMS Provider for the MetaStore kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id) # Create the MetaStore with the Direct KMS Provider meta_store = MetaStore( table=meta_table, materials_provider=kms_cmp ) # Create a Most Recent Provider using the MetaStore # Sets the TTL (in seconds) and cache size (# entries) most_recent_cmp = MostRecentProvider( provider_store=meta_store, material_name=material_name, version_ttl=60.0, cache_size=1000 )

運作方式

最近提供者會從提供者存放區取得 CMP。然後,它會使用 CMP 來產生密碼編譯資料並將其傳回給項目加密程式。

關於最近提供者

最新的供應商會從供應商商店取得加密材料提供 (CMP)。然後,它會使用 CMP 來產生可傳回的密碼編譯資料。每個最近提供者都會與一個提供者存放區相關聯,但提供者存放區可以將 CMP 提供給多部主機上的多個提供者。

最近提供者可與任何提供者存放區中的任何相容 CMP 搭配使用。它要求從 CMP 加密或解密材料,並將輸出返回到項目加密器。並不會執行任何密碼編譯操作。

若要向提供者存取區請求 CMP,最近提供者可提供其資料名稱以及想要使用的現有 CMP 版本。針對加密資料,最近提供者一律會請求最大 (「最近」) 版本。針對解密資料,其將請求用來建立加密資料的 CMP 版本 (如下圖所示)。

最近提供者

最近提供者會將提供者存放區傳回的 CMP 版本儲存於記憶體中的本機最久未使用 (LRU) 快取。此快取可讓最近提供者取得它所需的 CMP,而不需針對每個項目呼叫提供者存放區。您可以隨需清除此快取。

「最新的提供者」使用可設定的time-to-live值,您可以根據應用程式的特性進行調整。

關於 MetaStore

您可以使用最近提供者搭配任何提供者存放區,包括相容的自訂提供者存放區。DynamoDB 加密用戶端包含MetaStore可設定和自訂的安全實作。

A MetaStore是一個提供者存放區,可建立並傳回使用包裝 CMP 所需的包裝金鑰、解包金鑰和簽章金鑰設定的包裝 CMP。A MetaStore 是最新提供者的安全選項,因為包裝的 CMP 一律會為每個項目產生唯一的項目加密金鑰。只有可保護項目加密金鑰的包裝金鑰以及簽署金鑰能重複使用。

下圖顯示的元件,以MetaStore及它如何與最新的提供者互動。

A MetaStore

會MetaStore產生已包裝的 CMP,然後將它們 (以加密格式) 儲存在內部 DynamoDB 表格中。分割索引鍵是「最新提供者」資料的名稱;排序索引鍵的版本號碼。表格中的資料受到內部 DynamoDB 加密用戶端的保護,包括項目加密器和內部加密材料提供者 (CMP)。

您可以在您的中使用任何類型的內部 CMPMetaStore,包括直接 KMS 提供商,包含您提供的加密材料的包裝 CMP,或兼容的自定義 CMP。如果您的內部 CMP MetaStore 是直接 KMS 提供者,則您可重複使用的包裝和簽署金鑰會受到 AWS KMS keyin AWS Key Management Service(AWS KMS) 保護。AWS KMS每次將新的 CMP 版本添加到其內部表或從其內部表中獲取 CMP 版本時MetaStore調用。

設置一個time-to-live值

您可以為您建立的每個最新提供者設定 time-to-live (TTL) 值。一般而言,請使用適合您應用程式的最低 TTL 值。

TTL 值的使用會在「最近的提供者」的CachingMostRecentProvider符號中變更。

注意

最新提供者的MostRecentProvider符號已在舊版受支援的 DynamoDB 加密用戶端中取代,並從 2.0.0 版移除。它由符號所取CachingMostRecentProvider代。我們建議您盡快更新程式碼。如需詳細資訊,請參閱 最新提供者的更新

CachingMostRecentProvider

CachingMostRecentProvider會以兩種不同的方式使用 TTL 值。

  • TTL 會決定最新的提供者檢查提供者儲存區是否有新版 CMP 的頻率。如果有新版本可用,則「最新的提供者」會取代其 CMP 並重新整理其加密資料。否則,它將繼續使用其當前的 CMP 和密碼材料。

  • TTL 決定可以使用快取記憶體中 CMP 的時間長度。在使用快取的 CMP 進行加密之前,「最新的提供者」會評估其在快取中的時間。如果 CMP 快取時間超過 TTL,則會從快取中逐出 CMP,而「最新的提供者」會從其提供者存放區取得新的最新版本 CMP。

MostRecentProvider

在中MostRecentProvider,TTL 決定最新的提供者檢查提供者存放區是否有新版 CMP 的頻率。如果有新版本可用,則「最新的提供者」會取代其 CMP 並重新整理其加密資料。否則,它將繼續使用其當前的 CMP 和密碼材料。

TTL 不會決定建立新 CMP 版本的頻率。您可以透過旋轉加密材料來建立新的 CMP 版本。

理想的 TTL 值會隨應用程式及其延遲和可用性目標而有所不同。較低的 TTL 可以減少加密材料儲存在記憶體中的時間,從而改善您的安全性設定檔。此外,較低的 TTL 會更頻繁地重新整理重要資訊。例如,如果您的內部 CMP 是直接 KMS 提供者,它會更頻繁地驗證呼叫者是否仍有權使用. AWS KMS key

但是,如果 TTL 過於短暫,頻繁撥打給提供者商店的電話可能會增加您的成本,並導致供應商商店限制來自您的應用程式以及共用您服務帳戶的其他應用程式的要求。您也可以從 TTL 與旋轉加密材料的速率協調中受益。

在測試期間,請在不同的工作負載下變更 TTL 和快取大小,直到找到適用於應用程式和安全性和效能標準的組態為止。

輪換密碼編譯資料

當最新的供應商需要加密材料時,它始終使用其知道的最新版本的 CMP。它檢查較新版本的頻率取決於您在設定最新提供者時設定的 time-to-live(TTL) 值。

當 TTL 到期時,最新的提供者會檢查提供者存放區是否有較新版本的 CMP。如果有可用的話,最新的提供者會取得它,並取代其快取中的 CMP。它使用此 CMP 及其加密材料,直到發現提供商商店具有更新的版本為止。

若要告知提供者存放區為最近提供者建立新的 CMP 版本,請以最近提供者的資料名稱呼叫提供者存放區的「建立新提供者」操作。提供者存放區會建立新的 CMP,並且在其內部儲存體中使用較大版本號碼儲存已加密的複本。(它也會傳回 CMP,但您可予以捨棄。) 因此,下次「最新的提供者」查詢提供者存放區中其 CMP 的最大版本號時,它會取得新的較大版本號碼,並在後續對存放區的要求中使用它,以查看是否已建立新版本的 CMP。

您可以根據時間、處理的項目或屬性數目,或是對您應用程式有意義的任何其他度量,為您的「建立新提供者」呼叫進行排程。

取得加密資料

最近提供者會使用下列程序 (如下圖所示),取得它傳回給項目加密程式的加密資料。輸出取決於提供者存放區所傳回的 CMP 類型。最新的提供者可以使用任何相容的提供者存放區,包括 DynamoDB 加密MetaStore用戶端中包含的提供者存放區。

DynamoDB 加密用戶端中最新提供者的輸入、處理和輸出

使用CachingMostRecentProvider符號建立最新的提供者時,您可以指定提供者存放區、最近提供者的名稱以及 time-to-live(TTL) 值。您也可以選擇性地指定快取大小,以決定快取記憶體中可存在的最大密碼編譯資料數目。

當項目加密程式向最近提供者詢問加密資料時,最近提供者會開始搜尋其快取中的 CMP 最新版本。

  • 如果它在快取中找到最新版本的 CMP,且 CMP 未超過 TTL 值,則「最新的供應商」會使用 CMP 來產生加密材料。接著,它會將加密資料傳回給項目加密程式。此作業不需要呼叫提供者存放區。

  • 如果 CMP 的最新版本不在其快取中,或者它位於快取中但已超過其 TTL 值,則最新版本的提供者會從其提供者存放區要求 CMP。此請求包括最近提供者資料名稱及其所知的最大版本號碼。

    1. 提供者存放區會從其持久性儲存體傳回 CMP。如果提供者存放區是MetaStore,則會使用最新的提供者材料名稱作為分區索引鍵,並使用版本號碼做為排序索引鍵,從其內部 DynamoDB 表格取得加密的「包裝的 CMP」。MetaStore使用其內部項目加密器和內部 CMP 來解密包裝的 CMP。接著,它會將純文字 CMP 傳回給最近提供者。如果內部 CMP 是直接 KMS 提供者,這個步驟就包括對 AWS Key Management Service (AWS KMS) 的呼叫。

    2. CMP 會將 amzn-ddb-meta-id 欄位新增至實際資料描述。其值為資料名稱與其內部資料表中的 CMP 版本。提供者存放區會將 CMP 傳回給最近提供者。

    3. 最近提供者會快取記憶體中的 CMP。

    4. 最近提供者會使用 CMP 來產生加密資料。接著,它會將加密資料傳回給項目加密程式。

取得解密資料

當項目加密程式向最近提供者詢問解密資料時,最近提供者會使用下列程序來取得和傳回解密資料。

  1. 最近提供者會向提供者存放區詢問用來加密項目的密碼編譯資料版本號碼。其將從項目的資料描述屬性傳入實際資料描述。

  2. 提供者存放區會從實際資料描述中的 amzn-ddb-meta-id 欄位取得加密 CMP 版本號碼,並將它傳回給最近提供者。

  3. 最近提供者會在其快取中搜尋用來加密和簽署項目的 CMP 版本。

  • 如果發現 CMP 的相符版本位於其快取中,且 CMP 未超過 time-to-live(TTL) 值,則「最新提供者」會使用 CMP 來產生解密資料。接著,它會將解密資料傳回給項目加密程式。此操作不需要呼叫提供者存放區或任何其他 CMP。

  • 如果 CMP 的相符版本不在其快取中,或者快取AWS KMS key已超過其 TTL 值,則最新的提供者會從其提供者存放區要求 CMP。其會在請求中傳送資料名稱與加密 CMP 版本號碼。

    1. 提供者存放區會使用最近提供者名稱作為分割區索引鍵並使用版本號碼作為排序索引鍵,在其持久性儲存體中搜尋 CMP。

      • 如果其持久性儲存體中沒有此名稱和版本號碼,則提供者存放區會擲出例外狀況。如果提供者存放區用來產生 CMP,則 CMP 應存放在其持久性儲存體中 (除非它遭到故意刪除)。

      • 如果提供者存放區的持久性儲存體中有具備相符名稱和版本號碼的 CMP,則提供者存放區會將指定的 CMP 傳回給最近提供者。

        如果提供者存放區是一個MetaStore,則會從其 DynamoDB 表格取得加密的 CMP。然後,它會先使用其內部 CMP 提供的密碼編譯資料、將已加密的 CMP 解密,再將 CMP 傳回給最近提供者。如果內部 CMP 是直接 KMS 提供者,這個步驟就包括對 AWS Key Management Service (AWS KMS) 的呼叫。

    2. 最近提供者會快取記憶體中的 CMP。

    3. 最近提供者會使用 CMP 來產生解密資料。接著,它會將解密資料傳回給項目加密程式。

最新提供者的更新

「最近提供者」的符號會從變更MostRecentProviderCachingMostRecentProvider

注意

代表最新提供者的MostRecentProvider符號已在適用於 Java 的 DynamoDB 加密用戶端 1.15 版和 Python 的 DynamoDB 加密用戶端 1.3 版中取代,並在這兩種語言實作中從 DynamoDB 加密用戶端 2.0.0 版中移除。相反地,請使用CachingMostRecentProvider.

CachingMostRecentProvider實作下列變更:

  • 當加密材料在記憶體中的時間超過設定的 time-to-live(TTL) 值時,會CachingMostRecentProvider定期移除記憶體中的加密材料。

    在過程的生命週期內,MostRecentProvider可能會將加密材料存儲在內存中。因此,最新的提供者可能不知道授權變更。在來電者使用它們的權限被撤銷後,它可能會使用加密金鑰。

    如果您無法更新到此新版本,則可以通過定期調用緩存上的clear()方法來獲得類似的效果。此方法會手動清除快取內容,並要求「最新的提供者」要求新的 CMP 和新的密碼編譯材料。

  • CachingMostRecentProvider也包含快取大小設定,可讓您更好地控制快取。

若要更新為CachingMostRecentProvider,您必須變更程式碼中的符號名稱。在所有其他方面,與MostRecentProvider. CachingMostRecentProvider 您不需要重新加密任何資料表項目。

不過,CachingMostRecentProvider會產生更多對基礎金鑰基礎結構的呼叫。它會在每個 time-to-live (TTL) 間隔中呼叫提供者儲存區至少一次。具有許多作用中 CMP 的應用程式 (由於頻繁旋轉) 或具有大型叢集的應用程式很可能對此變更很敏感。

在發行更新的程式碼之前,請徹底測試它,以確保更頻繁的呼叫不會損害您的應用程式,也不會因為提供者所依賴的服務造成限制,例如 AWS Key Management Service (AWS KMS) 或 Amazon DynamoDB。若要緩解任何效能問題,請CachingMostRecentProvider根據您觀察到time-to-live的效能特性調整快取大小和的大小。如需準則,請參閱設置一個time-to-live值