Skip to content

Commit 1a90eb6

Browse files
AbelHubingosummer
authored andcommitted
[AKS] Fix --azure-keyvault-kms-key-vault-network-access parameter not being correctly applied during cluster creation and updates when PMK is enabled
1 parent e7519a9 commit 1a90eb6

File tree

5 files changed

+406
-5
lines changed

5 files changed

+406
-5
lines changed

src/aks-preview/HISTORY.rst

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,17 @@ If there is no rush to release a new version, please just add a description of t
1010
To release a new version, please select a new version number (usually plus 1 to last patch version, X.Y.Z -> Major.Minor.Patch, more details in `\doc <https://semver.org/>`_), and then add a new section named as the new version number in this file, the content should include the new modifications and everything from the *Pending* section. Finally, update the `VERSION` variable in `setup.py` with this new version number.
1111

1212
Pending
13+
14+
19.0.0b10
1315
+++++++
1416
* Vendor new SDK and bump API version to 2025-08-02-preview.
17+
* `az aks update`: Fix `--azure-keyvault-kms-key-vault-network-access` parameter not being correctly applied during cluster creation and updates.
1518

1619
19.0.0b9
1720
+++++++
1821
* `az aks create --enable-hosted-system`: no longer provision default system node pool when creating an automatic cluster with hosted system enabled.
1922
* `az aks machine update`: Add support for updating machine tags, node taints and node labels.
20-
* Fix `az aks bastion` subshell defaulting to cmd on Windows when invoked from PowerShell by implementing grandparent process detection to identify the actual user shell.
23+
* Fix `az aks bastion` subshell defaulting to cmd on Windows when invoked from PowerShell by implementing grandparent process detection to identify the actual user shell.
2124

2225
19.0.0b8
2326
+++++++

src/aks-preview/azext_aks_preview/managed_cluster_decorator.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3998,6 +3998,7 @@ def set_up_kms_pmk_and_cmk(self, mc: ManagedCluster) -> ManagedCluster:
39983998
mc.security_profile.azure_key_vault_kms = self.models.AzureKeyVaultKms(
39993999
enabled=True,
40004000
key_id=key_id,
4001+
key_vault_network_access=self.context.get_azure_keyvault_kms_key_vault_network_access(),
40014002
key_vault_resource_id=self.context.get_azure_keyvault_kms_key_vault_resource_id(),
40024003
)
40034004

@@ -6039,6 +6040,7 @@ def update_kms_pmk_cmk(self, mc: ManagedCluster) -> ManagedCluster:
60396040
mc.security_profile.azure_key_vault_kms = self.models.AzureKeyVaultKms(
60406041
enabled=True,
60416042
key_id=key_id,
6043+
key_vault_network_access=self.context.get_azure_keyvault_kms_key_vault_network_access(),
60426044
key_vault_resource_id=self.context.get_azure_keyvault_kms_key_vault_resource_id(),
60436045
)
60446046

src/aks-preview/azext_aks_preview/tests/latest/test_aks_commands.py

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

0 commit comments

Comments
 (0)