@@ -12223,6 +12223,7 @@ def test_aks_create_with_kms_pmk_and_update_cmk(
1222312223 update_cmd = (
1222412224 "aks update --resource-group={resource_group} --name={name} "
1222512225 "--enable-azure-keyvault-kms --azure-keyvault-kms-key-id={key_id} "
12226+ "--azure-keyvault-kms-key-vault-network-access=Public "
1222612227 "--azure-keyvault-kms-key-vault-resource-id={kv_resource_id} "
1222712228 "-o json"
1222812229 )
@@ -12366,6 +12367,175 @@ def test_aks_create_with_kms_pmk_and_cmk_and_disable_cmk(
1236612367 "aks create --resource-group={resource_group} --name={name} "
1236712368 "--assign-identity {identity_id} "
1236812369 "--enable-azure-keyvault-kms --azure-keyvault-kms-key-id={key_id} "
12370+ "--azure-keyvault-kms-key-vault-network-access=Public "
12371+ "--azure-keyvault-kms-key-vault-resource-id={kv_resource_id} "
12372+ "--kms-infrastructure-encryption=Enabled "
12373+ "--kubernetes-version={k8s_version} "
12374+ "--ssh-key-value={ssh_key_value} "
12375+ "--aks-custom-headers AKSHTTPCustomFeatures=Microsoft.ContainerService/KMSPMKPreview "
12376+ "-o json"
12377+ )
12378+ self.cmd(
12379+ create_cmd,
12380+ checks=[
12381+ self.check("provisioningState", "Succeeded"),
12382+ self.check("securityProfile.azureKeyVaultKms.enabled", True),
12383+ self.check("securityProfile.azureKeyVaultKms.keyId", key_id_versionless),
12384+ self.check(
12385+ "securityProfile.kubernetesResourceObjectEncryptionProfile.infrastructureEncryption",
12386+ "Enabled"
12387+ ),
12388+ ],
12389+ )
12390+
12391+ # disable CMK
12392+ update_cmd = (
12393+ "aks update --resource-group={resource_group} --name={name} "
12394+ "--disable-azure-keyvault-kms "
12395+ "-o json"
12396+ )
12397+ self.cmd(
12398+ update_cmd,
12399+ checks=[
12400+ self.check("provisioningState", "Succeeded"),
12401+ self.check("securityProfile.azureKeyVaultKms.enabled", False),
12402+ self.check(
12403+ "securityProfile.kubernetesResourceObjectEncryptionProfile.infrastructureEncryption",
12404+ "Enabled"
12405+ ),
12406+ ],
12407+ )
12408+
12409+ # delete
12410+ cmd = (
12411+ "aks delete --resource-group={resource_group} --name={name} --yes --no-wait"
12412+ )
12413+ self.cmd(
12414+ cmd,
12415+ checks=[
12416+ self.is_empty(),
12417+ ],
12418+ )
12419+
12420+ @live_only()
12421+ @AllowLargeResponse()
12422+ @AKSCustomResourceGroupPreparer(
12423+ random_name_length=17,
12424+ name_prefix="clitest",
12425+ location="eastus2euap",
12426+ )
12427+ def test_aks_create_with_kms_pmk_and_cmk_and_disable_cmk_private(
12428+ self, resource_group, resource_group_location
12429+ ):
12430+ """Test PMK-enabled cluster creation with versionless key ID"""
12431+ aks_name = self.create_random_name("cliakstest", 16)
12432+ kv_name = self.create_random_name("cliakstestkv", 16)
12433+ identity_name = self.create_random_name("cliakstestidentity", 24)
12434+ k8s_version = self._get_version_in_range(location=resource_group_location, min_version="1.33.0", max_version="1.34.0")
12435+ self.kwargs.update(
12436+ {
12437+ "resource_group": resource_group,
12438+ "name": aks_name,
12439+ "kv_name": kv_name,
12440+ "identity_name": identity_name,
12441+ "ssh_key_value": self.generate_ssh_keys(),
12442+ "k8s_version": k8s_version,
12443+ }
12444+ )
12445+
12446+ # create user-assigned identity
12447+ identity_id = self._get_user_assigned_identity(resource_group)
12448+ identity_object_id = self._get_principal_id_of_user_assigned_identity(identity_id)
12449+ assert identity_id is not None
12450+ assert identity_object_id is not None
12451+ self.kwargs.update(
12452+ {
12453+ "identity_id": identity_id,
12454+ "identity_object_id": identity_object_id,
12455+ }
12456+ )
12457+
12458+ # create key vault and key
12459+ create_keyvault = (
12460+ "keyvault create --resource-group={resource_group} --name={kv_name} --enable-rbac-authorization=false --no-self-perms -o json"
12461+ )
12462+ self.cmd(
12463+ create_keyvault,
12464+ checks=[self.check("properties.provisioningState", "Succeeded")],
12465+ )
12466+
12467+ # set access policy for test identity
12468+ test_identity_object_id = self._get_test_identity_object_id()
12469+ test_identity_access_policy = 'keyvault set-policy --resource-group={resource_group} --name={kv_name} ' \
12470+ '--key-permissions all --object-id ' + test_identity_object_id
12471+ self.cmd(test_identity_access_policy, checks=[
12472+ self.check('properties.provisioningState', 'Succeeded')
12473+ ])
12474+
12475+ # create key and extract versionless key ID
12476+ create_key = "keyvault key create -n kms --vault-name {kv_name} -o json"
12477+ key = self.cmd(
12478+ create_key, checks=[self.check("attributes.enabled", True)]
12479+ ).get_output_in_json()
12480+ key_id_versioned = key["key"]["kid"]
12481+ # Extract versionless key ID (remove version part)
12482+ # Format: https://{vault}.vault.azure.net/keys/{name}/{version}
12483+ # We want: https://{vault}.vault.azure.net/keys/{name}
12484+ key_id_parts = key_id_versioned.rsplit('/', 1)
12485+ key_id_versionless = key_id_parts[0]
12486+
12487+ assert key_id_versionless is not None
12488+ self.kwargs.update(
12489+ {
12490+ "key_id": key_id_versionless,
12491+ }
12492+ )
12493+
12494+ # Get key vault resource ID
12495+ kv_resource_id = self.cmd(
12496+ "keyvault show --resource-group={resource_group} --name={kv_name} --query id -o tsv"
12497+ ).output.strip()
12498+ self.kwargs.update(
12499+ {
12500+ "kv_resource_id": kv_resource_id,
12501+ }
12502+ )
12503+
12504+ # assign access policy
12505+ set_policy = (
12506+ "keyvault set-policy --resource-group={resource_group} --name={kv_name} "
12507+ "--object-id {identity_object_id} --key-permissions encrypt decrypt -o json"
12508+ )
12509+ self.cmd(
12510+ set_policy, checks=[self.check("properties.provisioningState", "Succeeded")]
12511+ )
12512+
12513+ # update key vault to disable public network access and enable trusted service
12514+ disable_public_network_access = (
12515+ "keyvault update --resource-group={resource_group} --name={kv_name} "
12516+ "--public-network-access Disabled "
12517+ "--bypass AzureServices --default-action Deny "
12518+ "-o json"
12519+ )
12520+ self.cmd(
12521+ disable_public_network_access,
12522+ checks=[self.check("properties.provisioningState", "Succeeded")],
12523+ )
12524+
12525+ # add "Key Vault Reader" role to the identity
12526+ create_role_assignment = (
12527+ "role assignment create --role 21090545-7ca7-4776-b22c-e363652d74d2 "
12528+ '--assignee-object-id {identity_object_id} --assignee-principal-type "ServicePrincipal" '
12529+ "--scope {kv_resource_id}"
12530+ )
12531+ self.cmd(create_role_assignment)
12532+
12533+ # create cluster with PMK enabled and versionless key ID
12534+ create_cmd = (
12535+ "aks create --resource-group={resource_group} --name={name} "
12536+ "--assign-identity {identity_id} "
12537+ "--enable-azure-keyvault-kms --azure-keyvault-kms-key-id={key_id} "
12538+ "--azure-keyvault-kms-key-vault-network-access=Private "
1236912539 "--azure-keyvault-kms-key-vault-resource-id={kv_resource_id} "
1237012540 "--kms-infrastructure-encryption=Enabled "
1237112541 "--kubernetes-version={k8s_version} "
0 commit comments