AWS KMS 鑰匙圈 - AWS 資料庫加密 SDK

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

AWS KMS 鑰匙圈

我們的用戶端加密程式庫已重新命名為 AWS 資料庫加密 SDK。此開發人員指南仍會提供 DynamoDB Encryption Client 的相關資訊。

AWS KMS Keyring 使用對稱加密或非對稱 RSA AWS KMS keys來產生、加密和解密資料金鑰。 AWS Key Management Service (AWS KMS) 會保護您的 KMS 金鑰,並在 FIPS 邊界內執行密碼編譯操作。我們建議您盡可能使用具有類似安全屬性的 AWS KMS keyring 或 keyring。

您也可以在 AWS KMS keyring 中使用對稱多區域 KMS 金鑰。如需使用多區域的詳細資訊和範例 AWS KMS keys,請參閱使用多區域 AWS KMS keys。如需多區域金鑰的相關資訊,請參閱《 AWS Key Management Service 開發人員指南》中的使用多區域金鑰

AWS KMS keyring 可以包含兩種類型的包裝金鑰:

  • 產生器金鑰:產生純文字資料金鑰並將其加密。加密資料的 keyring 必須有一個產生器金鑰。

  • 其他金鑰:加密產生器金鑰產生的純文字資料金鑰。 AWS KMS keyrings 可以有零個或多個其他金鑰。

您必須擁有產生器金鑰才能加密記錄。當 AWS KMS keyring 只有一個 AWS KMS 金鑰時,該金鑰會用來產生和加密資料金鑰。

與所有 keyring 一樣, AWS KMS keyring 可以獨立使用,也可以與相同或不同類型的其他 keyring 多重 keyring搭配使用。

AWS KMS keyring 的必要許可

AWS Database Encryption SDK 不需要 , AWS 帳戶 也不依賴任何 AWS 服務。不過,若要使用 AWS KMS keyring,您需要 keyring AWS KMS keys 中 的 AWS 帳戶 和下列最低許可。

  • 若要使用 AWS KMS keyring 加密,您需要產生器金鑰上的 kms:GenerateDataKey 許可。您需要 AWS KMS keyring 中所有其他金鑰的 kms:Encrypt 許可。

  • 若要使用 AWS KMS keyring 解密,您需要 AWS KMS 在 keyring 中至少一個金鑰上的 kms:Decrypt 許可。

  • 若要使用包含 AWS KMS keyring 的多金鑰環加密,您需要產生器 keyring 中產生器金鑰的 kms:GenerateDataKey 許可。您需要所有其他 AWS KMS keyring 中所有其他金鑰的 kms:Encrypt 許可。

  • 若要使用非對稱 RSA AWS KMS keyring 加密,您不需要 kms:GenerateDataKeykms:Encrypt,因為您必須在建立 keyring 時指定要用於加密的公有金鑰材料。使用此 keyring 加密時不會進行任何 AWS KMS 呼叫。若要使用非對稱 RSA AWS KMS keyring 解密,您需要 kms:Decrypt 許可。

如需 許可的詳細資訊 AWS KMS keys,請參閱《 AWS Key Management Service 開發人員指南》中的身分驗證和存取控制

在 AWS KMS keyring AWS KMS keys 中識別

AWS KMS Keyring 可以包含一或多個 AWS KMS keys。若要在 AWS KMS keyring 中指定 AWS KMS key ,請使用支援的 AWS KMS 金鑰識別符。您可用來識別 keyring AWS KMS key 中 的金鑰識別符會因 操作和語言實作而有所不同。如需 金鑰識別符的詳細資訊 AWS KMS key,請參閱《 AWS Key Management Service 開發人員指南》中的金鑰識別符

最佳實務是使用最適用於您任務的特定金鑰識別符。

  • 若要使用 AWS KMS keyring 加密,您可以使用金鑰 ID金鑰 ARN別名名稱別名 ARN 來加密資料。

    注意

    如果您在加密 keyring 中為 KMS 金鑰指定別名名稱或別名 ARN,加密操作會將目前與別名相關聯的金鑰 ARN 儲存在加密資料金鑰的中繼資料中。它不會儲存別名。別名的變更不會影響用來解密加密資料金鑰的 KMS 金鑰。

  • 若要使用 AWS KMS keyring 解密,您必須使用金鑰 ARN 來識別 AWS KMS keys。如需詳細資訊,請參閱 選取包裝金鑰

  • 在用於加密和解密的 keyring 中,您必須使用金鑰 ARN 來識別 AWS KMS keys。

解密時, AWS 資料庫加密 SDK 會搜尋 AWS KMS keyring AWS KMS key ,尋找可解密其中一個加密資料金鑰的 。具體而言, AWS 資料庫加密 SDK 會對材料描述中的每個加密資料金鑰使用下列模式。

  • AWS Database Encryption SDK 會從材料描述的中繼資料取得 AWS KMS key 加密資料金鑰的 金鑰 ARN。

  • AWS Database Encryption SDK 會搜尋 AWS KMS key 具有相符金鑰 ARN 的 解密 keyring。

  • 如果在 keyring 中找到 AWS KMS key 具有相符金鑰 ARN 的 ,則 AWS Database Encryption SDK AWS KMS 會要求使用 KMS 金鑰來解密加密的資料金鑰。

  • 否則會跳到下一個加密的資料金鑰 (如果有)。

建立 AWS KMS keyring

您可以使用相同 AWS KMS key 或不同 AWS 帳戶 和 AWS KMS keys 中的單一或多個 來設定每個 AWS KMS keyring AWS 區域。 AWS KMS key 必須是對稱加密金鑰 (SYMMETRIC_DEFAULT) 或非對稱 RSA KMS 金鑰。您也可以使用對稱加密多區域 KMS 金鑰。您可以在多 AWS KMS 鍵環中使用一或多個鍵環

您可以建立加密和解密資料的 AWS KMS keyring,也可以建立專門用於加密或解密的 AWS KMS keyring。當您建立 AWS KMS keyring 來加密資料時,必須指定產生器金鑰,這是用來產生純文字資料金鑰並進行加密 AWS KMS key 的 。資料金鑰在數學上與 KMS 金鑰無關。然後,如果您選擇,您可以指定其他 AWS KMS keys 來加密相同的純文字資料金鑰。若要解密受此 keyring 保護的加密欄位,您使用的解密 keyring 必須包含至少一個在 keyring 中 AWS KMS keys 定義的 或 no AWS KMS keys。(沒有 的 AWS KMS keyring AWS KMS keys 稱為AWS KMS 探索 keyring。)

加密 keyring 或多 keyring 中的所有包裝金鑰都必須能夠加密資料金鑰。如果任何包裝金鑰無法加密,加密方法會失敗。因此,呼叫者必須擁有 keyring 中所有金鑰的必要許可。如果您使用探索 keyring 來加密資料,無論是單獨使用或在多 keyring 中,加密操作會失敗。

下列範例使用 CreateAwsKmsMrkMultiKeyring方法建立具有對稱加密 KMS 金鑰的 AWS KMS keyring。CreateAwsKmsMrkMultiKeyring 方法會自動建立 AWS KMS 用戶端,並確保 keyring 將正確處理單一區域和多區域金鑰。這些範例使用金鑰 ARNs 來識別 KMS 金鑰。如需詳細資訊,請參閱在 AWS KMS keyring AWS KMS keys 中識別

Java
final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder() .generator(kmsKeyArn) .build(); final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
C# / .NET
var matProv = new MaterialProviders(new MaterialProvidersConfig()); var createAwsKmsMrkMultiKeyringInput = new CreateAwsKmsMrkMultiKeyringInput { Generator = kmsKeyArn }; var awsKmsMrkMultiKeyring = matProv.CreateAwsKmsMrkMultiKeyring(createAwsKmsMrkMultiKeyringInput);
Rust
let provider_config = MaterialProvidersConfig::builder().build()?; let mat_prov = client::Client::from_conf(provider_config)?; let kms_keyring = mat_prov .create_aws_kms_mrk_multi_keyring() .generator(kms_key_id) .send() .await?;

下列範例使用 CreateAwsKmsRsaKeyring方法建立具有非對稱 RSA KMS 金鑰的 AWS KMS keyring。若要建立非對稱 RSA AWS KMS keyring,請提供下列值。

  • kmsClient:建立新的 AWS KMS 用戶端

  • kmsKeyID:識別非對稱 RSA KMS 金鑰的金鑰 ARN

  • publicKey:UTF-8 編碼 PEM 檔案的 ByteBuffer,代表您傳遞給 之金鑰的公有金鑰 kmsKeyID

  • encryptionAlgorithm:加密演算法必須為 RSAES_OAEP_SHA_256RSAES_OAEP_SHA_1

Java
final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); final CreateAwsKmsRsaKeyringInput createAwsKmsRsaKeyringInput = CreateAwsKmsRsaKeyringInput.builder() .kmsClient(KmsClient.create()) .kmsKeyId(rsaKMSKeyArn) .publicKey(publicKey) .encryptionAlgorithm(EncryptionAlgorithmSpec.RSAES_OAEP_SHA_256) .build(); IKeyring awsKmsRsaKeyring = matProv.CreateAwsKmsRsaKeyring(createAwsKmsRsaKeyringInput);
C# / .NET
var matProv = new MaterialProviders(new MaterialProvidersConfig()); var createAwsKmsRsaKeyringInput = new CreateAwsKmsRsaKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(), KmsKeyId = rsaKMSKeyArn, PublicKey = publicKey, EncryptionAlgorithm = EncryptionAlgorithmSpec.RSAES_OAEP_SHA_256 }; IKeyring awsKmsRsaKeyring = matProv.CreateAwsKmsRsaKeyring(createAwsKmsRsaKeyringInput);
Rust
let mpl_config = MaterialProvidersConfig::builder().build()?; let mpl = mpl_client::Client::from_conf(mpl_config)?; let sdk_config = aws_config::load_defaults(aws_config::BehaviorVersion::latest()).await; let kms_rsa_keyring = mpl .create_aws_kms_rsa_keyring() .kms_key_id(rsa_kms_key_arn) .public_key(public_key) .encryption_algorithm(aws_sdk_kms::types::EncryptionAlgorithmSpec::RsaesOaepSha256) .kms_client(aws_sdk_kms::Client::new(&sdk_config)) .send() .await?;

使用多區域 AWS KMS keys

您可以在 AWS 資料庫加密 SDK 中使用多區域 AWS KMS keys 做為包裝金鑰。如果您使用多區域金鑰進行加密 AWS 區域,則可以使用不同 中的相關多區域金鑰進行解密 AWS 區域。

多區域 KMS 金鑰是一組不同 AWS KMS keys 中的 AWS 區域 ,具有相同的金鑰材料和金鑰 ID。您可以使用這些相關金鑰,就像它們在不同區域中是相同的金鑰一樣。多區域金鑰支援常見的災難復原和備份案例,這些案例需要在一個區域中加密,並在不同區域中解密,而無需進行跨區域呼叫 AWS KMS。如需多區域金鑰的相關資訊,請參閱《 AWS Key Management Service 開發人員指南》中的使用多區域金鑰

為了支援多區域金鑰, AWS 資料庫加密 SDK AWS KMS multi-Region-aware keyring。此CreateAwsKmsMrkMultiKeyring方法支援單一區域和多區域金鑰。

  • 對於單一區域索引鍵,multi-Region-aware符號的運作方式與單一區域 AWS KMS 索引鍵環相同。它只會嘗試使用加密資料的單一區域金鑰來解密加密文字。為了簡化您的 AWS KMS keyring 體驗,我們建議您每當您使用對稱加密 KMS 金鑰時,使用 CreateAwsKmsMrkMultiKeyring方法。

  • 對於多區域金鑰,multi-Region-aware符號會嘗試使用與加密資料相同的多區域金鑰,或在您指定的區域中使用相關的多區域金鑰來解密加密文字。

在需要多個 KMS 金鑰的multi-Region-aware keyring 中,您可以指定多個單一區域和多區域金鑰。不過,您只能從一組相關的多區域金鑰中指定一個金鑰。如果您指定多個具有相同金鑰 ID 的金鑰識別符,建構器呼叫會失敗。

下列範例使用多區域 KMS 金鑰建立 AWS KMS keyring。範例指定多區域金鑰做為產生器金鑰,而單一區域金鑰做為子金鑰。

Java
final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); final CreateAwsKmsMrkMultiKeyringInput createAwsKmsMrkMultiKeyringInput = CreateAwsKmsMrkMultiKeyringInput.builder() .generator(multiRegionKeyArn) .kmsKeyIds(Collections.singletonList(kmsKeyArn)) .build(); IKeyring awsKmsMrkMultiKeyring = matProv.CreateAwsKmsMrkMultiKeyring(createAwsKmsMrkMultiKeyringInput);
C# / .NET
var matProv = new MaterialProviders(new MaterialProvidersConfig()); var createAwsKmsMrkMultiKeyringInput = new CreateAwsKmsMrkMultiKeyringInput { Generator = multiRegionKeyArn, KmsKeyIds = new List<String> { kmsKeyArn } }; var awsKmsMrkMultiKeyring = matProv.CreateAwsKmsMrkMultiKeyring(createAwsKmsMrkMultiKeyringInput);
Rust
let mpl_config = MaterialProvidersConfig::builder().build()?; let mpl = mpl_client::Client::from_conf(mpl_config)?; let aws_kms_mrk_multi_keyring = mpl .create_aws_kms_mrk_multi_keyring() .generator(multiRegion_key_arn) .kms_key_ids(vec![key_arn.to_string()]) .send() .await?;

當您使用多區域 AWS KMS keyring 時,您可以在嚴格模式下解密加密文字或探索模式。若要以嚴格模式解密加密文字,請在您要解密加密文字的區域中,使用相關多區域金鑰的金鑰 ARN 來執行個體化多區域multi-Region-aware符號。如果您在不同的區域 (例如,記錄加密的區域) 中指定相關多區域金鑰的金鑰 ARN,multi-Region-aware符號會為此發出跨區域呼叫 AWS KMS key。

在嚴格模式下解密時,multi-Region-aware符號需要金鑰 ARN。它只接受一組相關多區域金鑰中的一個金鑰 ARN。

您也可以使用 AWS KMS 多區域金鑰在探索模式中解密。在探索模式中解密時,您不會指定任何 AWS KMS keys。(如需單一區域 AWS KMS 探索 keyring 的資訊,請參閱 使用 AWS KMS 探索 keyring。)

如果您使用多區域金鑰加密,探索模式中的multi-Region-aware符號會嘗試使用本機區域中的相關多區域金鑰來解密。如果不存在,呼叫會失敗。在探索模式中, AWS 資料庫加密 SDK 不會嘗試對用於加密的多區域金鑰進行跨區域呼叫。

使用 AWS KMS 探索 keyring

解密時,最佳實務是指定 AWS 資料庫加密 SDK 可以使用的包裝金鑰。若要遵循此最佳實務,請使用 AWS KMS 解密 keyring,將 AWS KMS 包裝金鑰限制為您指定的金鑰。不過,您也可以建立AWS KMS 探索 keyring,也就是未指定任何包裝金鑰的 AWS KMS keyring。

AWS Database Encryption SDK 為 AWS KMS 多區域金鑰提供標準 AWS KMS 探索 keyring 和探索 keyring。如需有關搭配 AWS 資料庫加密 SDK 使用多區域金鑰的資訊,請參閱 使用多區域 AWS KMS keys

因為它未指定任何包裝金鑰,探索 keyring 無法加密資料。如果您使用探索 keyring 來加密資料,無論是單獨加密或在多 keyring 中加密,加密操作會失敗。

解密時,探索 keyring 可讓 AWS Database Encryption SDK 使用加密的資料金鑰 AWS KMS 來要求解密 AWS KMS key 任何加密的資料金鑰,無論誰擁有或有權存取該金鑰 AWS KMS key。只有在呼叫者擁有 的kms:Decrypt許可時,呼叫才會成功 AWS KMS key。

重要

如果您在解密的多金鑰集中包含 AWS KMS 探索 keyring,則探索 keyring 會覆寫多金鑰集中其他 keyring 指定的所有 KMS 金鑰限制。 多重 keyring多鍵控的行為與其限制最少的鍵控一樣。如果您使用探索 keyring 來加密資料,無論是單獨使用或在多 keyring 中,加密操作會失敗

AWS Database Encryption SDK 提供 AWS KMS 探索 keyring,方便使用。不過,基於下列原因,建議您在可能時使用較具限制的 keyring。

  • 真實性 – 探索 AWS KMS keyring 可以使用用於加密材料描述中資料金鑰的任何 AWS KMS key ,只要發起人具有使用該金鑰 AWS KMS key 解密的許可。這可能不是發起 AWS KMS key 人打算使用的 。例如,其中一個加密的資料金鑰可能已在安全性較低的情況下加密 AWS KMS key ,任何人都可以使用。

  • 延遲和效能 – 探索 AWS KMS keyring 可能比其他 keyring 更慢,因為 AWS Database Encryption SDK 會嘗試解密所有加密的資料金鑰,包括 AWS KMS keys 其他 AWS 帳戶 和 區域中加密的資料金鑰,而且 AWS KMS keys 發起人無權使用 進行解密。

如果您使用探索 keyring,我們建議您使用探索篩選條件來限制 KMS 金鑰,這些金鑰可用於指定 AWS 帳戶 和 分割區中的金鑰。如需尋找帳戶 ID 和分割區的說明,請參閱 中的您的 AWS 帳戶 識別符ARN 格式AWS 一般參考

下列程式碼範例會使用 AWS KMS 探索篩選條件來執行個體化探索 keyring,以限制 AWS 資料庫加密 SDK 可用於aws分割區和111122223333範例帳戶中的 KMS 金鑰。

使用此程式碼之前,請將範例 AWS 帳戶 和分割區值取代為 AWS 帳戶 和分割區的有效值。如果您的 KMS 金鑰位於中國區域,請使用aws-cn分割區值。如果您的 KMS 金鑰位於 中 AWS GovCloud (US) Regions,請使用aws-us-gov分割區值。對於所有其他 AWS 區域,請使用aws分割區值。

Java
// Create discovery filter DiscoveryFilter discoveryFilter = DiscoveryFilter.builder() .partition("aws") .accountIds(111122223333) .build(); // Create the discovery keyring CreateAwsKmsMrkDiscoveryMultiKeyringInput createAwsKmsMrkDiscoveryMultiKeyringInput = CreateAwsKmsMrkDiscoveryMultiKeyringInput.builder() .discoveryFilter(discoveryFilter) .build(); IKeyring decryptKeyring = matProv.CreateAwsKmsMrkDiscoveryMultiKeyring(createAwsKmsMrkDiscoveryMultiKeyringInput);
C# / .NET
// Create discovery filter var discoveryFilter = new DiscoveryFilter { Partition = "aws", AccountIds = 111122223333 }; // Create the discovery keyring var createAwsKmsMrkDiscoveryMultiKeyringInput = new CreateAwsKmsMrkDiscoveryMultiKeyringInput { DiscoveryFilter = discoveryFilter }; var decryptKeyring = matProv.CreateAwsKmsMrkDiscoveryMultiKeyring(createAwsKmsMrkDiscoveryMultiKeyringInput);
Rust
// Create discovery filter let discovery_filter = DiscoveryFilter::builder() .partition("aws") .account_ids(111122223333) .build()?; // Create the discovery keyring let decrypt_keyring = mpl .create_aws_kms_mrk_discovery_multi_keyring() .discovery_filter(discovery_filter) .send() .await?;

使用 AWS KMS 區域探索 keyring

AWS KMS 區域探索 keyring 是未指定 KMS 金鑰 ARNs keyring。反之,它允許 AWS 資料庫加密 SDK 僅使用 KMS 金鑰來解密 AWS 區域。

使用 AWS KMS 區域探索 keyring 解密時, AWS 資料庫加密 SDK 會解密在指定 AWS KMS key 中以 加密的任何加密資料金鑰 AWS 區域。若要成功,呼叫者必須至少擁有 AWS KMS keys 中其中一個 的kms:Decrypt許可 AWS 區域 ,該 指定加密資料金鑰。

與其他探索 keyring 一樣,區域探索 keyring 不會影響加密。只有在解密加密的欄位時才有效。如果您在用於加密和解密的多金鑰集中使用區域探索 keyring,則只有在解密時才有效。如果您使用多區域探索 keyring 來加密資料,無論是單獨加密或在多 keyring 中加密,加密操作會失敗。

重要

如果您在解密多金鑰集中包含 AWS KMS 區域探索 keyring,區域探索 keyring 會覆寫多金鑰集中其他 keyring 指定的所有 KMS 金鑰限制。 多重 keyring多鍵控的行為與其限制最少的鍵控一樣。探索 AWS KMS keyring 本身或多 keyring 使用時,不會影響加密。

AWS Database Encryption SDK 中的區域探索 keyring 嘗試僅使用指定區域中的 KMS 金鑰進行解密。當您使用探索 keyring 時,您可以在 AWS KMS 用戶端上設定 區域。這些 AWS 資料庫加密 SDK 實作不會依區域篩選 KMS 金鑰,但 AWS KMS 會失敗指定區域外 KMS 金鑰的解密請求。

如果您使用探索 keyring,我們建議您使用探索篩選條件,將解密中使用的 KMS 金鑰限制為指定 AWS 帳戶 和 分割區中的金鑰。

例如,下列程式碼會使用探索篩選條件建立 AWS KMS 區域探索 keyring。此 keyring 將 AWS 資料庫加密 SDK 限制在美國西部 (奧勒岡) 區域 (us-west-2) 的帳戶 111122223333 中的 KMS 金鑰。

Java
// Create the discovery filter DiscoveryFilter discoveryFilter = DiscoveryFilter.builder() .partition("aws") .accountIds(111122223333) .build(); // Create the discovery keyring CreateAwsKmsMrkDiscoveryMultiKeyringInput createAwsKmsMrkDiscoveryMultiKeyringInput = CreateAwsKmsMrkDiscoveryMultiKeyringInput.builder() .discoveryFilter(discoveryFilter) .regions("us-west-2") .build(); IKeyring decryptKeyring = matProv.CreateAwsKmsMrkDiscoveryMultiKeyring(createAwsKmsMrkDiscoveryMultiKeyringInput);
C# / .NET
// Create discovery filter var discoveryFilter = new DiscoveryFilter { Partition = "aws", AccountIds = 111122223333 }; // Create the discovery keyring var createAwsKmsMrkDiscoveryMultiKeyringInput = new CreateAwsKmsMrkDiscoveryMultiKeyringInput { DiscoveryFilter = discoveryFilter, Regions = us-west-2 }; var decryptKeyring = matProv.CreateAwsKmsMrkDiscoveryMultiKeyring(createAwsKmsMrkDiscoveryMultiKeyringInput);
Rust
// Create discovery filter let discovery_filter = DiscoveryFilter::builder() .partition("aws") .account_ids(111122223333) .build()?; // Create the discovery keyring let decrypt_keyring = mpl .create_aws_kms_mrk_discovery_multi_keyring() .discovery_filter(discovery_filter) .regions(us-west-2) .send() .await?;