Skip to content

Commit 982f7c3

Browse files
authored
[AKS] Set CMK property "enabled" to false and remove other CMK properties when "--disable-azure-keyvault-kms" is specified and PMK is enabled (#9339)
1 parent a4866fd commit 982f7c3

File tree

5 files changed

+256
-2
lines changed

5 files changed

+256
-2
lines changed

src/aks-preview/HISTORY.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,13 @@ To release a new version, please select a new version number (usually plus 1 to
1111

1212
Pending
1313
+++++++
14+
15+
19.0.0b7
16+
+++++++
1417
* `az aks create`: Add new parameter `--enable-container-network-logs` to enable container network logs feature for the cluster and deprecate `--enable-retina-flow-logs`.
1518
* `az aks update`: Add new parameter `--enable-container-network-logs` and `--disable-container-network-logs` to enable/disable container network logs feature for the cluster and deprecate `--enable-retina-flow-logs` and `--disable-retina-flow-logs`.
1619
* Support `entraid` for parameter `--ssh-access` to support EntraID feature.
20+
* `az aks update`: Set CMK property "enabled" to false and remove other CMK properties when "--disable-azure-keyvault-kms" is specified
1721

1822
19.0.0b6
1923
+++++++

src/aks-preview/azext_aks_preview/managed_cluster_decorator.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,6 +1382,38 @@ def get_enable_azure_keyvault_kms(self) -> bool:
13821382
"""
13831383
return self._get_enable_azure_keyvault_kms(enable_validation=True)
13841384

1385+
def _get_disable_azure_keyvault_kms(self, enable_validation: bool = False) -> bool:
1386+
"""Internal function to obtain the value of disable_azure_keyvault_kms.
1387+
1388+
This function supports the option of enable_validation. When enabled,
1389+
if both enable_azure_keyvault_kms and disable_azure_keyvault_kms are
1390+
specified, raise a MutuallyExclusiveArgumentError.
1391+
1392+
:return: bool
1393+
"""
1394+
# Read the original value passed by the command.
1395+
disable_azure_keyvault_kms = self.raw_param.get("disable_azure_keyvault_kms")
1396+
1397+
# This option is not supported in create mode, hence we do not read the property value from the `mc` object.
1398+
# This parameter does not need dynamic completion.
1399+
if enable_validation:
1400+
if disable_azure_keyvault_kms and self._get_enable_azure_keyvault_kms(enable_validation=False):
1401+
raise MutuallyExclusiveArgumentError(
1402+
"Cannot specify --enable-azure-keyvault-kms and --disable-azure-keyvault-kms at the same time."
1403+
)
1404+
1405+
return disable_azure_keyvault_kms
1406+
1407+
def get_disable_azure_keyvault_kms(self) -> bool:
1408+
"""Obtain the value of disable_azure_keyvault_kms.
1409+
1410+
This function will verify the parameter by default. If both enable_azure_keyvault_kms and
1411+
disable_azure_keyvault_kms are specified, raise a MutuallyExclusiveArgumentError.
1412+
1413+
:return: bool
1414+
"""
1415+
return self._get_disable_azure_keyvault_kms(enable_validation=True)
1416+
13851417
def _get_azure_keyvault_kms_key_id(self, enable_validation: bool = False) -> Union[str, None]:
13861418
"""Internal function to obtain the value of azure_keyvault_kms_key_id according to the context.
13871419
@@ -6005,6 +6037,13 @@ def update_kms_pmk_cmk(self, mc: ManagedCluster) -> ManagedCluster:
60056037
key_vault_resource_id=self.context.get_azure_keyvault_kms_key_vault_resource_id(),
60066038
)
60076039

6040+
if self.context.get_disable_azure_keyvault_kms():
6041+
if mc.security_profile is None:
6042+
mc.security_profile = self.models.ManagedClusterSecurityProfile()
6043+
mc.security_profile.azure_key_vault_kms = self.models.AzureKeyVaultKms()
6044+
# set enabled to False
6045+
mc.security_profile.azure_key_vault_kms.enabled = False
6046+
60086047
return mc
60096048

60106049
def update_storage_profile(self, mc: ManagedCluster) -> ManagedCluster:

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

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12138,6 +12138,24 @@ def test_aks_create_with_kms_pmk_and_update_cmk(
1213812138
],
1213912139
)
1214012140

12141+
# disable CMK
12142+
update_cmd = (
12143+
"aks update --resource-group={resource_group} --name={name} "
12144+
"--disable-azure-keyvault-kms "
12145+
"-o json"
12146+
)
12147+
self.cmd(
12148+
update_cmd,
12149+
checks=[
12150+
self.check("provisioningState", "Succeeded"),
12151+
self.check("securityProfile.azureKeyVaultKms.enabled", False),
12152+
self.check(
12153+
"securityProfile.kubernetesResourceObjectEncryptionProfile.infrastructureEncryption",
12154+
"Enabled"
12155+
),
12156+
],
12157+
)
12158+
1214112159
# delete
1214212160
cmd = (
1214312161
"aks delete --resource-group={resource_group} --name={name} --yes --no-wait"
@@ -12156,7 +12174,7 @@ def test_aks_create_with_kms_pmk_and_update_cmk(
1215612174
name_prefix="clitest",
1215712175
location="eastus2euap",
1215812176
)
12159-
def test_aks_create_with_kms_pmk_and_cmk(
12177+
def test_aks_create_with_kms_pmk_and_cmk_and_disable_cmk(
1216012178
self, resource_group, resource_group_location
1216112179
):
1216212180
"""Test PMK-enabled cluster creation with versionless key ID"""
@@ -12267,6 +12285,24 @@ def test_aks_create_with_kms_pmk_and_cmk(
1226712285
],
1226812286
)
1226912287

12288+
# disable CMK
12289+
update_cmd = (
12290+
"aks update --resource-group={resource_group} --name={name} "
12291+
"--disable-azure-keyvault-kms "
12292+
"-o json"
12293+
)
12294+
self.cmd(
12295+
update_cmd,
12296+
checks=[
12297+
self.check("provisioningState", "Succeeded"),
12298+
self.check("securityProfile.azureKeyVaultKms.enabled", False),
12299+
self.check(
12300+
"securityProfile.kubernetesResourceObjectEncryptionProfile.infrastructureEncryption",
12301+
"Enabled"
12302+
),
12303+
],
12304+
)
12305+
1227012306
# delete
1227112307
cmd = (
1227212308
"aks delete --resource-group={resource_group} --name={name} --yes --no-wait"

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

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8562,6 +8562,181 @@ def test_update_kms_pmk_cmk(self):
85628562
)
85638563
self.assertEqual(dec_mc_5, ground_truth_mc_5)
85648564

8565+
# test enable Azure Key Vault KMS with key ID
8566+
dec_6 = AKSPreviewManagedClusterUpdateDecorator(
8567+
self.cmd,
8568+
self.client,
8569+
{
8570+
"kms_infrastructure_encryption": "Enabled",
8571+
"enable_azure_keyvault_kms": True,
8572+
"azure_keyvault_kms_key_id": "https://test-keyvault.vault.azure.net/keys/test-key",
8573+
"azure_keyvault_kms_key_vault_resource_id": "/subscriptions/test-sub/resourceGroups/test-rg/providers/Microsoft.KeyVault/vaults/test-keyvault",
8574+
},
8575+
CUSTOM_MGMT_AKS_PREVIEW,
8576+
)
8577+
mc_6 = self.models.ManagedCluster(location="test_location")
8578+
dec_6.context.attach_mc(mc_6)
8579+
dec_mc_6 = dec_6.update_kms_pmk_cmk(mc_6)
8580+
8581+
# expected security profile with Azure Key Vault KMS
8582+
ground_truth_azure_key_vault_kms_6 = self.models.AzureKeyVaultKms(
8583+
enabled=True,
8584+
key_id="https://test-keyvault.vault.azure.net/keys/test-key",
8585+
key_vault_network_access="Public",
8586+
key_vault_resource_id="/subscriptions/test-sub/resourceGroups/test-rg/providers/Microsoft.KeyVault/vaults/test-keyvault",
8587+
)
8588+
ground_truth_kube_resource_encryption_profile_6 = self.models.KubernetesResourceObjectEncryptionProfile(
8589+
infrastructure_encryption="Enabled"
8590+
)
8591+
ground_truth_security_profile_6 = self.models.ManagedClusterSecurityProfile(
8592+
azure_key_vault_kms=ground_truth_azure_key_vault_kms_6,
8593+
kubernetes_resource_object_encryption_profile=ground_truth_kube_resource_encryption_profile_6,
8594+
)
8595+
ground_truth_mc_6 = self.models.ManagedCluster(
8596+
location="test_location",
8597+
security_profile=ground_truth_security_profile_6,
8598+
)
8599+
self.assertEqual(dec_mc_6, ground_truth_mc_6)
8600+
8601+
# test enable Azure Key Vault KMS on cluster with existing security profile
8602+
dec_7 = AKSPreviewManagedClusterUpdateDecorator(
8603+
self.cmd,
8604+
self.client,
8605+
{
8606+
"kms_infrastructure_encryption": "Enabled",
8607+
"enable_azure_keyvault_kms": True,
8608+
"azure_keyvault_kms_key_id": "https://test-keyvault.vault.azure.net/keys/test-key",
8609+
"azure_keyvault_kms_key_vault_network_access": "Public",
8610+
"azure_keyvault_kms_key_vault_resource_id": "/subscriptions/test-sub/resourceGroups/test-rg/providers/Microsoft.KeyVault/vaults/test-keyvault",
8611+
},
8612+
CUSTOM_MGMT_AKS_PREVIEW,
8613+
)
8614+
existing_security_profile = self.models.ManagedClusterSecurityProfile()
8615+
mc_7 = self.models.ManagedCluster(
8616+
location="test_location",
8617+
security_profile=existing_security_profile,
8618+
)
8619+
dec_7.context.attach_mc(mc_7)
8620+
dec_mc_7 = dec_7.update_kms_pmk_cmk(mc_7)
8621+
8622+
# should add to existing security profile
8623+
ground_truth_azure_key_vault_kms_7 = self.models.AzureKeyVaultKms(
8624+
enabled=True,
8625+
key_id="https://test-keyvault.vault.azure.net/keys/test-key",
8626+
key_vault_network_access="Public",
8627+
key_vault_resource_id="/subscriptions/test-sub/resourceGroups/test-rg/providers/Microsoft.KeyVault/vaults/test-keyvault",
8628+
)
8629+
ground_truth_kube_resource_encryption_profile_7 = self.models.KubernetesResourceObjectEncryptionProfile(
8630+
infrastructure_encryption="Enabled"
8631+
)
8632+
ground_truth_security_profile_7 = self.models.ManagedClusterSecurityProfile(
8633+
azure_key_vault_kms=ground_truth_azure_key_vault_kms_7,
8634+
kubernetes_resource_object_encryption_profile=ground_truth_kube_resource_encryption_profile_7,
8635+
)
8636+
ground_truth_mc_7 = self.models.ManagedCluster(
8637+
location="test_location",
8638+
security_profile=ground_truth_security_profile_7,
8639+
)
8640+
self.assertEqual(dec_mc_7, ground_truth_mc_7)
8641+
8642+
# test disable Azure Key Vault KMS
8643+
dec_8 = AKSPreviewManagedClusterUpdateDecorator(
8644+
self.cmd,
8645+
self.client,
8646+
{
8647+
"disable_azure_keyvault_kms": True,
8648+
},
8649+
CUSTOM_MGMT_AKS_PREVIEW,
8650+
)
8651+
mc_8 = self.models.ManagedCluster(location="test_location")
8652+
dec_8.context.attach_mc(mc_8)
8653+
dec_mc_8 = dec_8.update_kms_pmk_cmk(mc_8)
8654+
8655+
# expected security profile with disabled Azure Key Vault KMS
8656+
ground_truth_mc_8 = self.models.ManagedCluster(
8657+
location="test_location",
8658+
security_profile=None,
8659+
)
8660+
self.assertEqual(dec_mc_8, ground_truth_mc_8)
8661+
8662+
# test disable Azure Key Vault KMS on cluster with existing security profile
8663+
dec_9 = AKSPreviewManagedClusterUpdateDecorator(
8664+
self.cmd,
8665+
self.client,
8666+
{
8667+
"disable_azure_keyvault_kms": True,
8668+
},
8669+
CUSTOM_MGMT_AKS_PREVIEW,
8670+
)
8671+
existing_security_profile = self.models.ManagedClusterSecurityProfile(
8672+
azure_key_vault_kms=self.models.AzureKeyVaultKms(
8673+
enabled=True,
8674+
key_id="https://test-keyvault.vault.azure.net/keys/test-key",
8675+
key_vault_network_access="Public",
8676+
key_vault_resource_id="/subscriptions/test-sub/resourceGroups/test-rg/providers/Microsoft.KeyVault/vaults/test-keyvault",
8677+
),
8678+
kubernetes_resource_object_encryption_profile=self.models.KubernetesResourceObjectEncryptionProfile(
8679+
infrastructure_encryption="Enabled"
8680+
),
8681+
)
8682+
mc_9 = self.models.ManagedCluster(
8683+
location="test_location",
8684+
security_profile=existing_security_profile,
8685+
)
8686+
dec_9.context.attach_mc(mc_9)
8687+
dec_mc_9 = dec_9.update_kms_pmk_cmk(mc_9)
8688+
8689+
# should disable existing Azure Key Vault KMS
8690+
ground_truth_azure_key_vault_kms_9 = self.models.AzureKeyVaultKms()
8691+
ground_truth_azure_key_vault_kms_9.enabled = False
8692+
ground_truth_kube_resource_encryption_profile_9 = self.models.KubernetesResourceObjectEncryptionProfile(
8693+
infrastructure_encryption="Enabled"
8694+
)
8695+
ground_truth_security_profile_9 = self.models.ManagedClusterSecurityProfile(
8696+
azure_key_vault_kms=ground_truth_azure_key_vault_kms_9,
8697+
kubernetes_resource_object_encryption_profile=ground_truth_kube_resource_encryption_profile_9,
8698+
)
8699+
ground_truth_mc_9 = self.models.ManagedCluster(
8700+
location="test_location",
8701+
security_profile=ground_truth_security_profile_9,
8702+
)
8703+
self.assertEqual(dec_mc_9, ground_truth_mc_9)
8704+
8705+
# test combined infrastructure encryption and Azure Key Vault KMS enable
8706+
dec_10 = AKSPreviewManagedClusterUpdateDecorator(
8707+
self.cmd,
8708+
self.client,
8709+
{
8710+
"kms_infrastructure_encryption": "Enabled",
8711+
"enable_azure_keyvault_kms": True,
8712+
"azure_keyvault_kms_key_id": "https://test-keyvault.vault.azure.net/keys/test-key",
8713+
"azure_keyvault_kms_key_vault_resource_id": "/subscriptions/test-sub/resourceGroups/test-rg/providers/Microsoft.KeyVault/vaults/test-keyvault",
8714+
},
8715+
CUSTOM_MGMT_AKS_PREVIEW,
8716+
)
8717+
mc_10 = self.models.ManagedCluster(location="test_location")
8718+
dec_10.context.attach_mc(mc_10)
8719+
dec_mc_10 = dec_10.update_kms_pmk_cmk(mc_10)
8720+
8721+
# expected security profile with both infrastructure encryption and Azure Key Vault KMS
8722+
ground_truth_kube_resource_encryption_profile_10 = self.models.KubernetesResourceObjectEncryptionProfile(
8723+
infrastructure_encryption="Enabled"
8724+
)
8725+
ground_truth_azure_key_vault_kms_10 = self.models.AzureKeyVaultKms(
8726+
enabled=True,
8727+
key_id="https://test-keyvault.vault.azure.net/keys/test-key",
8728+
key_vault_resource_id="/subscriptions/test-sub/resourceGroups/test-rg/providers/Microsoft.KeyVault/vaults/test-keyvault",
8729+
)
8730+
ground_truth_security_profile_10 = self.models.ManagedClusterSecurityProfile(
8731+
kubernetes_resource_object_encryption_profile=ground_truth_kube_resource_encryption_profile_10,
8732+
azure_key_vault_kms=ground_truth_azure_key_vault_kms_10,
8733+
)
8734+
ground_truth_mc_10 = self.models.ManagedCluster(
8735+
location="test_location",
8736+
security_profile=ground_truth_security_profile_10,
8737+
)
8738+
self.assertEqual(dec_mc_10, ground_truth_mc_10)
8739+
85658740
def test_update_workload_auto_scaler_profile(self):
85668741
# Throws exception when incorrect mc object is passed.
85678742
dec_1 = AKSPreviewManagedClusterUpdateDecorator(

src/aks-preview/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from setuptools import find_packages, setup
1111

12-
VERSION = "19.0.0b6"
12+
VERSION = "19.0.0b7"
1313

1414
CLASSIFIERS = [
1515
"Development Status :: 4 - Beta",

0 commit comments

Comments
 (0)