使用一些 KMS 区域主密钥获取数据密钥,然后再添加两个区域以加密相同的数据密钥

Obtaining Data Keys using some KMS region master keys and then adding two more regions to get the same Data Key encrypted

我正在隐式生成数据加密密钥,如下所示(使用的密钥 ID 仅供参考):

from aws_encryption_sdk import encrypt

# Key provider with only 2 region master keys to begin with
kms_key_provider = KMSMasterKeyProvider(key_ids=[“west-1”, “west-2”])

# encrypt something random only to get the encrypted data keys in the header from those 2 regions

my_ciphertext, encryptor_header = encrypt(source=“somerandomplaintextofnorelevance”, key_provider= kms_key_provider, algorithm=AWSKeyProvider.DEFAULT_ALGORITHM, encryption_context={“somekey”: “some value”})

my_data_keys = []
for dek in encryptor_header.encrypted_data_keys:
    my_data_keys.append(dek.encrypted_data_key)

我在 my_data_keys(比如 DEK_enc_west_1 和 DEK_enc_west_2)中得到两个加密的数据加密密钥 (DEK) 字符串,它们都将解密为单个纯数据加密密钥,比如说,DEK_Plain。现在我可以在任一区域中 encrypt/decrypt 获得 DEK_Plain 以实现冗余。

然后,我继续在区域east-1和east-2激活另外两个万能钥匙。现在我希望在这两个新区域(east-1 和 east-2)主密钥下也对相同的 DEK_Plain 进行加密,以获得两个新的加密数据密钥(例如,DEK_enc_east_1 和 DEK_enc_east_2).

因此,有了新的完全形成的密钥提供程序,例如:

kms_key_provider = KMSMasterKeyProvider(key_ids=[“west-1”, “west-2”, “east-1”, “east-2”])

我可以使用以下 4 个区域中的任何一个获取我的 DEK_Plain:

my_plain_data_key = kms_key_provider.decrypt_data_key_from_list(…..)

基本上,我如何添加额外的区域主密钥以用于先前使用之前存在的一些其他区域主密钥生成和加密的相同数据加密密钥?

环顾 AWS 加密文档,我发现类似以下示例的内容对我的案例有所帮助(尽管如果 KMS 密钥提供程序实施具有数据密钥的此类区域扩展器功能,那将是理想的:)。在下文中,假设 plain_dek 被分配了上述问题中的 DEK_Plain。

new_region_key_id_1 = "arn:aws:kms:us-east-1:XXXXXXXXXX:alias/xyz/master"
new_region_master_key_1 = kms_key_provider.master_key_for_encrypt(new_region_key_id_1)
key_provider_info = {"provider_id": u'aws-kms', "key_info": new_region_key_id_1}
key_provider_info_obj = MasterKeyInfo(**key_provider_info)
plain_dk_raw = RawDataKey(key_provider_info_obj, plain_dek)
encryption_context = {“somekey”: “some value”}
new_encrypted_dek_from_region_new_master_key_1 = new_region_master_key_1.encrypt_data_key(plain_dk_raw, AES_256_GCM_IV12_TAG16_HKDF_SHA384_ECDSA_P384, encryption_context)

这可以在任意数量的新 kms 区域中循环重复,从而扩展现有数据密钥,以便在最近添加了新主密钥的更广泛的 AWS 区域中进行解密。