Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions src/azure-cli/azure/cli/command_modules/sql/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -4809,17 +4809,29 @@ def _get_server_key_name_from_uri(uri):
'''
import re

match = re.match(r'https://(.)+\.(managedhsm.azure.net|managedhsm-preview.azure.net|vault.azure.net|vault-int.azure-int.net|vault.azure.cn|managedhsm.azure.cn|vault.usgovcloudapi.net|managedhsm.usgovcloudapi.net|vault.microsoftazure.de|managedhsm.microsoftazure.de|vault.cloudapi.eaglex.ic.gov|vault.cloudapi.microsoft.scloud)(:443)?\/keys/[^\/]+\/[0-9a-zA-Z]+$', uri)
match = re.match(r'^https://(?!.*\.\.)[a-zA-Z0-9][a-zA-Z0-9.-]+[a-zA-Z0-9]\.(managedhsm.azure.net|managedhsm-preview.azure.net|vault.azure.net|vault-int.azure-int.net|vault.azure.cn|managedhsm.azure.cn|vault.usgovcloudapi.net|managedhsm.usgovcloudapi.net|vault.microsoftazure.de|managedhsm.microsoftazure.de|vault.cloudapi.eaglex.ic.gov|vault.cloudapi.microsoft.scloud|mdep.azure.net)(:443)?\/keys/[^\/]+(\/[0-9a-zA-Z]+|\/|)$', uri)
Comment thread
viparek marked this conversation as resolved.

if match is None:
raise CLIError('The provided uri is invalid. Please provide a valid Azure Key Vault key id. For example: '
'"https://YourVaultName.vault.azure.net/keys/YourKeyName/01234567890123456789012345678901" '
'or "https://YourManagedHsmRegion.YourManagedHsmName.managedhsm.azure.net/keys/YourKeyName/01234567890123456789012345678901"')
'or "https://YourManagedHsmRegion.YourManagedHsmName.managedhsm.azure.net/keys/YourKeyName/01234567890123456789012345678901" '
'for versioned key or "https://YourVaultName.vault.azure.net/keys/YourKeyName" for a versionless key.')

vault = uri.split('.')[0].split('/')[-1]
key = uri.split('/')[-2]
version = uri.split('/')[-1]
Comment thread
viparek marked this conversation as resolved.
return '{}_{}_{}'.format(vault, key, version)

# The AKV segments is an array of the uri components.
# For AKV uri "https://someVault.vault.azure.net/keys/someKey/01234567890123456789012345678901", the segment contents are as follows:
# Segments = ["/", "keys/", "someKey/", "01234567890123456789012345678901"]
# Therefore, a versionless key uri will have a segment array of length 3 and a versioned key uri will have a segment array of length 4.
#
isVersionlessKeyId = uri.Segments.Length == 3
Comment thread
viparek marked this conversation as resolved.
Outdated
Comment thread
viparek marked this conversation as resolved.
Outdated

if isVersionlessKeyId:
Comment thread
viparek marked this conversation as resolved.
Outdated
return '{}_{}'.format(vault, key)
else:
return '{}_{}_{}'.format(vault, key, version)


#####
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4628,6 +4628,67 @@ def test_sql_tdebyok(self, resource_group, server, key_vault):
.format(resource_group, server),
checks=[JMESPathCheck('length(@)', 1)])

# create a versionless key
versionless_key_name = self.create_random_name(resource_prefix + 'vless', 32)
versionless_key_resp = self.cmd('keyvault key create -n {} -p software --vault-name {}'
.format(versionless_key_name, key_vault)).get_output_in_json()
versioned_kid = versionless_key_resp['key']['kid']

# extract versionless key identifier (remove the version part)
# kid format: https://{vault}.vault.azure.net/keys/{keyname}/{version}
versionless_kid = '/'.join(versioned_kid.split('/')[:-1])
Comment thread
viparek marked this conversation as resolved.
Outdated

# add versionless server key
versionless_server_key_resp = self.cmd('sql server key create -g {} -s {} -k {}'
.format(resource_group, server, versionless_kid),
checks=[
JMESPathCheck('uri', versionless_kid),
JMESPathCheck('serverKeyType', 'AzureKeyVault')])
versionless_server_key_name = versionless_server_key_resp.get_output_in_json()['name']

# validate show versionless key
self.cmd('sql server key show -g {} -s {} -k {}'
.format(resource_group, server, versionless_kid),
checks=[
JMESPathCheck('uri', versionless_kid),
JMESPathCheck('serverKeyType', 'AzureKeyVault'),
JMESPathCheck('name', versionless_server_key_name)])

# update encryption protector to versionless akv key
self.cmd('sql server tde-key set -g {} -s {} -t AzureKeyVault -k {} --auto-rotation-enabled'
.format(resource_group, server, versionless_kid),
checks=[
JMESPathCheck('serverKeyType', 'AzureKeyVault'),
JMESPathCheck('serverKeyName', versionless_server_key_name),
JMESPathCheck('uri', versionless_kid)])

# validate encryption protector is using versionless key via show
self.cmd('sql server tde-key show -g {} -s {}'
.format(resource_group, server),
checks=[
JMESPathCheck('serverKeyType', 'AzureKeyVault'),
JMESPathCheck('serverKeyName', versionless_server_key_name),
JMESPathCheck('uri', versionless_kid)])

# update encryption protector back to service managed
self.cmd('sql server tde-key set -g {} -s {} -t ServiceManaged'
.format(resource_group, server),
checks=[
JMESPathCheck('serverKeyType', 'ServiceManaged'),
JMESPathCheck('serverKeyName', 'ServiceManaged')])

# delete versionless server key
self.cmd('sql server key delete -g {} -s {} -k {}'
.format(resource_group, server, versionless_kid))

# wait for key to be deleted
time.sleep(10)

# validate deleted versionless server key via list (should return 1 item)
self.cmd('sql server key list -g {} -s {}'
.format(resource_group, server),
checks=[JMESPathCheck('length(@)', 1)])


class SqlServerIdentityTest(ScenarioTest):

Expand Down
2 changes: 1 addition & 1 deletion src/azure-cli/requirements.py3.Darwin.txt
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ azure-mgmt-servicebus==10.0.0b1
azure-mgmt-servicefabric==2.1.0
azure-mgmt-servicefabricmanagedclusters==2.1.0b1
azure-mgmt-servicelinker==1.2.0b3
azure-mgmt-sql==4.0.0b22
azure-mgmt-sql==4.0.0b23
azure-mgmt-signalr==2.0.0b2
azure-mgmt-sqlvirtualmachine==1.0.0b5
azure-mgmt-storage==24.0.0
Expand Down
2 changes: 1 addition & 1 deletion src/azure-cli/requirements.py3.Linux.txt
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ azure-mgmt-servicebus==10.0.0b1
azure-mgmt-servicefabric==2.1.0
azure-mgmt-servicefabricmanagedclusters==2.1.0b1
azure-mgmt-servicelinker==1.2.0b3
azure-mgmt-sql==4.0.0b22
azure-mgmt-sql==4.0.0b23
azure-mgmt-signalr==2.0.0b2
azure-mgmt-sqlvirtualmachine==1.0.0b5
azure-mgmt-storage==24.0.0
Expand Down
2 changes: 1 addition & 1 deletion src/azure-cli/requirements.py3.windows.txt
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ azure-mgmt-servicebus==10.0.0b1
azure-mgmt-servicefabric==2.1.0
azure-mgmt-servicefabricmanagedclusters==2.1.0b1
azure-mgmt-servicelinker==1.2.0b3
azure-mgmt-sql==4.0.0b22
azure-mgmt-sql==4.0.0b23
azure-mgmt-signalr==2.0.0b2
azure-mgmt-sqlvirtualmachine==1.0.0b5
azure-mgmt-storage==24.0.0
Expand Down
Loading