Skip to content

Commit 2a880dd

Browse files
committed
Merge pull request #2 from moisesac/mocardev
Azure disk encryption updates
2 parents 8307e2f + 7cf05cc commit 2a880dd

13 files changed

+4298
-2080
lines changed

src/ResourceManager/Compute/Commands.Compute.Test/ScenarioTests/VirtualMachineExtensionTests.ps1

Lines changed: 95 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -923,15 +923,15 @@ function Test-AzureDiskEncryptionExtension
923923
{
924924
# This test should be run in Live mode only not in Playback mode
925925
#Pre-requisites to be filled in before running this test. The AAD app should belong to the directory as the user running the test.
926-
$aadClientID = "";
927-
$aadClientSecret = "";
928-
#Fill in VM admin user and password
929-
$adminUser = "";
930-
$adminPassword = "";
931-
926+
$aadAppName = "detestaadapp";
927+
932928
#Resource group variables
933-
$rgName = "detestrg";
934-
$loc = "South Central US";
929+
$rgName = Get-ComputeTestResourceName;
930+
$loc = Get-ComputeVMLocation;
931+
932+
#Fill in VM admin user and password
933+
$adminUser = "Foo12";
934+
$adminPassword = "BaR@123" + $rgName;
935935

936936
#KeyVault config variables
937937
$vaultName = "detestvault";
@@ -951,30 +951,54 @@ function Test-AzureDiskEncryptionExtension
951951
$osDiskName = 'osdisk' + $vmName;
952952
$dataDiskName = 'datadisk' + $vmName;
953953
$osDiskCaching = 'ReadWrite';
954+
$extraDataDiskName1 = $dataDiskName + '1';
955+
$extraDataDiskName2 = $dataDiskName + '2';
954956

955957
#Network config variables
956958
$vnetName = "detestvnet";
957959
$subnetName = "detestsubnet";
958960
$publicIpName = 'pubip' + $vmName;
959961
$nicName = 'nic' + $vmName;
960-
961-
962+
962963
#Disk encryption variables
963964
$keyEncryptionAlgorithm = "RSA-OAEP";
964965
$volumeType = "All";
965966

966967
try
967968
{
968-
Login-AzureRmAccount;
969-
# Create new resource group
970-
New-AzureRmResourceGroup -Name $rgname -Location $loc -Force;
969+
# Create new resource group
970+
New-AzureRmResourceGroup -Name $rgName -Location $loc -Force;
971+
972+
#Check if AAD app was already created
973+
$SvcPrincipals = (Get-AzureRmADServicePrincipal -SearchString $aadAppName);
974+
if(-not $SvcPrincipals)
975+
{
976+
# Create a new AD application if not created before
977+
$identifierUri = [string]::Format("http://localhost:8080/{0}", $rgname);
978+
$defaultHomePage = 'http://contoso.com';
979+
$now = [System.DateTime]::Now;
980+
$oneYearFromNow = $now.AddYears(1);
981+
$aadClientSecret = Get-ResourceName;
982+
$ADApp = New-AzureRmADApplication -DisplayName $aadAppName -HomePage $defaultHomePage -IdentifierUris $identifierUri -StartDate $now -EndDate $oneYearFromNow -Password $aadClientSecret;
983+
Assert-NotNull $ADApp;
984+
$servicePrincipal = New-AzureRmADServicePrincipal -ApplicationId $ADApp.ApplicationId;
985+
$SvcPrincipals = (Get-AzureRmADServicePrincipal -SearchString $aadAppName);
986+
# Was AAD app created?
987+
Assert-NotNull $SvcPrincipals;
988+
$aadClientID = $servicePrincipal.ApplicationId;
989+
}
990+
else
991+
{
992+
# Was AAD app already created?
993+
Assert-NotNull $aadClientSecret;
994+
$aadClientID = $SvcPrincipals[0].ApplicationId;
995+
}
971996

972997
# Create new KeyVault
973998
$keyVault = New-AzureRmKeyVault -VaultName $vaultName -ResourceGroupName $rgname -Location $loc -Sku standard;
974999
$keyVault = Get-AzureRmKeyVault -VaultName $vaultName -ResourceGroupName $rgname
9751000
#set enabledForDiskEncryption
976-
Write-Host 'Press go to https://resources.azure.com and set enabledForDiskEncryption flag on KeyVault. [ENTER] to continue or [CTRL-C] to abort...'
977-
Read-Host
1001+
Set-AzureRmKeyVaultAccessPolicy -VaultName $vaultName -ResourceGroupName $rgname -EnabledForDiskEncryption;
9781002
#set permissions to AAD app to write secrets and keys
9791003
Set-AzureRmKeyVaultAccessPolicy -VaultName $vaultName -ServicePrincipalName $aadClientID -PermissionsToKeys all -PermissionsToSecrets all
9801004
#create a key in KeyVault to use as Kek
@@ -1019,17 +1043,69 @@ function Test-AzureDiskEncryptionExtension
10191043

10201044
$p = Set-AzureRmVMOperatingSystem -VM $p -Windows -ComputerName $computerName -Credential $cred -ProvisionVMAgent;
10211045
$p = Set-AzureRmVMSourceImage -VM $p -PublisherName $imagePublisher -Offer $imageOffer -Skus $imageSku -Version "latest";
1022-
1023-
1046+
10241047
# Virtual Machine
10251048
New-AzureRmVM -ResourceGroupName $rgname -Location $loc -VM $p;
10261049

10271050
#Enable encryption on the VM
10281051
Set-AzureRmVMDiskEncryptionExtension -ResourceGroupName $rgname -VMName $vmName -AadClientID $aadClientID -AadClientSecret $aadClientSecret -DiskEncryptionKeyVaultUrl $diskEncryptionKeyVaultUrl -DiskEncryptionKeyVaultId $keyVaultResourceId -KeyEncryptionKeyUrl $keyEncryptionKeyUrl -KeyEncryptionKeyVaultId $keyVaultResourceId -Force;
10291052
#Get encryption status
10301053
$encryptionStatus = Get-AzureRmVmDiskEncryptionStatus -ResourceGroupName $rgname -VMName $vmName;
1054+
#Verify encryption is enabled on OS volume and data volumes
1055+
$OsVolumeEncryptionSettings = $encryptionStatus.OsVolumeEncryptionSettings;
1056+
Assert-AreEqual $encryptionStatus.OsVolumeEncrypted $true;
1057+
Assert-AreEqual $encryptionStatus.DataVolumesEncrypted $true;
1058+
#verify diskencryption keyvault url & kek url are not null
1059+
Assert-NotNull $OsVolumeEncryptionSettings;
1060+
Assert-NotNull $OsVolumeEncryptionSettings.DiskEncryptionKey.SecretUrl;
1061+
Assert-NotNull $OsVolumeEncryptionSettings.DiskEncryptionKey.SourceVault;
1062+
1063+
#Add a couple of data volumes to encrypt them
1064+
$p = Add-AzureRmVMDataDisk -VM $p -Name $extraDataDiskName1 -Caching 'ReadOnly' -DiskSizeInGB 2 -Lun 1 -VhdUri $dataDiskVhdUri -CreateOption Empty;
1065+
$p = Add-AzureRmVMDataDisk -VM $p -Name $extraDataDiskName2 -Caching 'ReadOnly' -DiskSizeInGB 2 -Lun 1 -VhdUri $dataDiskVhdUri -CreateOption Empty;
1066+
#Enable encryption on the VM
1067+
Set-AzureRmVMDiskEncryptionExtension -ResourceGroupName $rgname -VMName $vmName -AadClientID $aadClientID -AadClientSecret $aadClientSecret -DiskEncryptionKeyVaultUrl $diskEncryptionKeyVaultUrl -DiskEncryptionKeyVaultId $keyVaultResourceId -KeyEncryptionKeyUrl $keyEncryptionKeyUrl -KeyEncryptionKeyVaultId $keyVaultResourceId -Force;
1068+
#Get encryption status
1069+
$encryptionStatus = Get-AzureRmVmDiskEncryptionStatus -ResourceGroupName $rgname -VMName $vmName;
1070+
#Verify encryption is enabled on OS volume and data volumes
1071+
$OsVolumeEncryptionSettings = $encryptionStatus.OsVolumeEncryptionSettings;
1072+
Assert-AreEqual $encryptionStatus.OsVolumeEncrypted $true;
1073+
Assert-AreEqual $encryptionStatus.DataVolumesEncrypted $true;
1074+
#verify diskencryption keyvault url & kek url are not null
1075+
Assert-NotNull $OsVolumeEncryptionSettings;
1076+
Assert-NotNull $OsVolumeEncryptionSettings.DiskEncryptionKey.SecretUrl;
1077+
Assert-NotNull $OsVolumeEncryptionSettings.DiskEncryptionKey.SourceVault;
1078+
1079+
#Disable encryption on the VM
1080+
Disable-AzureRmVMDiskEncryption -ResourceGroupName $rgname -VMName $vmName;
1081+
#Get encryption status
1082+
$encryptionStatus = Get-AzureRmVmDiskEncryptionStatus -ResourceGroupName $rgname -VMName $p.StorageProfile.OSDisk.Name;
1083+
#Verify encryption is disabled on OS volume and data volumes
1084+
$OsVolumeEncryptionSettings = $encryptionStatus.OsVolumeEncryptionSettings;
1085+
Assert-AreEqual $encryptionStatus.OsVolumeEncrypted $false;
1086+
Assert-AreEqual $encryptionStatus.DataVolumesEncrypted $false;
1087+
10311088
#Remove AzureDiskEncryption extension
10321089
Remove-AzureRmVMDiskEncryptionExtension -ResourceGroupName $rgname -VMName $vmName;
1090+
#Get encryption status again to make sure it's the same as before when the extension was installed
1091+
$encryptionStatus = Get-AzureRmVmDiskEncryptionStatus -ResourceGroupName $rgname -VMName $vmName;
1092+
#Verify encryption is disabled on OS volume and data volumes
1093+
$OsVolumeEncryptionSettings = $encryptionStatus.OsVolumeEncryptionSettings;
1094+
Assert-AreEqual $encryptionStatus.OsVolumeEncrypted $false;
1095+
Assert-AreEqual $encryptionStatus.DataVolumesEncrypted $false;
1096+
1097+
#Enable encryption on the VM
1098+
Set-AzureRmVMDiskEncryptionExtension -ResourceGroupName $rgname -VMName $vmName -AadClientID $aadClientID -AadClientSecret $aadClientSecret -DiskEncryptionKeyVaultUrl $diskEncryptionKeyVaultUrl -DiskEncryptionKeyVaultId $keyVaultResourceId -KeyEncryptionKeyUrl $keyEncryptionKeyUrl -KeyEncryptionKeyVaultId $keyVaultResourceId -Force;
1099+
#Get encryption status
1100+
$encryptionStatus = Get-AzureRmVmDiskEncryptionStatus -ResourceGroupName $rgname -VMName $vmName;
1101+
#Verify encryption is enabled on OS volume and data volumes
1102+
$OsVolumeEncryptionSettings = $encryptionStatus.OsVolumeEncryptionSettings;
1103+
Assert-AreEqual $encryptionStatus.OsVolumeEncrypted $true;
1104+
Assert-AreEqual $encryptionStatus.DataVolumesEncrypted $true;
1105+
#verify diskencryption keyvault url & kek url are not null
1106+
Assert-NotNull $OsVolumeEncryptionSettings;
1107+
Assert-NotNull $OsVolumeEncryptionSettings.DiskEncryptionKey.SecretUrl;
1108+
Assert-NotNull $OsVolumeEncryptionSettings.DiskEncryptionKey.SourceVault;
10331109

10341110
#Remove the VM
10351111
Remove-AzureRmVm -ResourceGroupName $rgname -Name $vmName -Force;
@@ -1041,12 +1117,12 @@ function Test-AzureDiskEncryptionExtension
10411117
$p = Set-AzureRmVMOSDisk -VM $p -Name $p.StorageProfile.OSDisk.Name -VhdUri $p.StorageProfile.OSDisk.Vhd.Uri -Caching ReadWrite -CreateOption attach -DiskEncryptionKeyUrl $encryptionStatus.OsVolumeEncryptionSettings.DiskEncryptionKey.SecretUrl -DiskEncryptionKeyVaultId $encryptionStatus.OsVolumeEncryptionSettings.DiskEncryptionKey.SourceVault.Id -Windows;
10421118

10431119
New-AzureRmVM -ResourceGroupName $rgname -Location $loc -VM $p;
1044-
10451120
}
10461121
finally
10471122
{
10481123
# Cleanup
1049-
Remove-AzureRmResourceGroup -Name $rgname -Force;
1124+
Clean-ResourceGroup $rgname;
1125+
#Remove-AzureRmADApplication -ApplicationObjectId $ADApp.ApplicationId -Force;
10501126
}
10511127
}
10521128

src/ResourceManager/Compute/Commands.Compute/Commands.Compute.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,11 @@
218218
<Compile Include="Extension\AEM\RemoveAzureRmVMAEMExtension.cs" />
219219
<Compile Include="Extension\AEM\SetAzureRmVMAEMExtension.cs" />
220220
<Compile Include="Extension\AEM\TestAzureRmVMAEMExtension.cs" />
221+
<Compile Include="Extension\AzureDiskEncryption\AzureDiskEncryptionExtensionConstants.cs" />
221222
<Compile Include="Extension\AzureDiskEncryption\AzureDiskEncryptionExtensionContext.cs" />
222223
<Compile Include="Extension\AzureDiskEncryption\AzureDiskEncryptionExtensionProtectedSettings.cs" />
223224
<Compile Include="Extension\AzureDiskEncryption\AzureDiskEncryptionExtensionPublicSettings.cs" />
225+
<Compile Include="Extension\AzureDiskEncryption\DisableAzureDiskEncryption.cs" />
224226
<Compile Include="Extension\AzureDiskEncryption\GetAzureDiskEncryptionStatus.cs" />
225227
<Compile Include="Extension\AzureDiskEncryption\RemoveAzureDiskEncryptionExtension.cs" />
226228
<Compile Include="Extension\AzureDiskEncryption\SetAzureDiskEncryptionExtension.cs" />

src/ResourceManager/Compute/Commands.Compute/Common/ConstantStringTypes.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ public static class ProfileNouns
126126
//AzureDiskEncryption
127127
public const string AzureDiskEncryptionExtension = "AzureRmVMDiskEncryptionExtension";
128128
public const string AzureDiskEncryptionStatus = "AzureRmVMDiskEncryptionStatus";
129+
public const string AzureDiskEncryption = "AzureRmVMDiskEncryption";
129130

130131
//AzureVMBackup
131132
public const string AzureVMBackup = "AzureRmVMBackup";
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// ----------------------------------------------------------------------------------
2+
//
3+
// Copyright Microsoft Corporation
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
// ----------------------------------------------------------------------------------
14+
15+
namespace Microsoft.Azure.Commands.Compute.Extension.AzureDiskEncryption
16+
{
17+
/// <summary>
18+
/// This class includes contant values used in AzureDiskEncryption
19+
/// </summary>
20+
public static class AzureDiskEncryptionExtensionConstants
21+
{
22+
public const string aadClientCertParameterSet = "AAD Client Cert Parameters";
23+
public const string aadClientSecretParameterSet = "AAD Client Secret Parameters";
24+
public const string enableEncryptionOperation = "EnableEncryption";
25+
public const string disableEncryptionOperation = "DisableEncryption";
26+
public const string aadClientIDKey = "AADClientID";
27+
public const string aadClientSecretKey = "AADClientSecret";
28+
public const string aadClientCertThumbprintKey = "AADClientCertThumbprint";
29+
public const string keyVaultUrlKey = "KeyVaultURL";
30+
public const string keyEncryptionKeyUrlKey = "KeyEncryptionKeyURL";
31+
public const string keyEncryptionAlgorithmKey = "KeyEncryptionAlgorithm";
32+
public const string volumeTypeKey = "VolumeType";
33+
public const string encryptionOperationKey = "EncryptionOperation";
34+
public const string sequenceVersionKey = "SequenceVersion";
35+
public const string passphraseKey = "Passphrase";
36+
public const string osTypeLinux = "Linux";
37+
public const string osTypeWindows = "Windows";
38+
}
39+
}

src/ResourceManager/Compute/Commands.Compute/Extension/AzureDiskEncryption/AzureDiskEncryptionExtensionContext.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
// limitations under the License.
1313
// ----------------------------------------------------------------------------------
1414

15+
using Microsoft.Azure.Commands.Compute.Models;
1516
using Newtonsoft.Json;
1617
using System.Security;
17-
using Microsoft.Azure.Commands.Compute.Models;
1818

1919
namespace Microsoft.Azure.Commands.Compute.Extension.AzureDiskEncryption
2020
{
@@ -28,8 +28,11 @@ public class AzureDiskEncryptionExtensionContext : PSVirtualMachineExtension
2828
public const string LinuxExtensionDefaultVersion = "0.1";
2929

3030
public const string ExtensionDefaultPublisher = "Microsoft.Azure.Security";
31-
public const string ExtensionDefaultName = "AzureDiskEncryption";
32-
public const string ExtensionDefaultVersion = "1.0";
31+
// TODO: Uncomment these and remove ADETest/version strings once testing is completed
32+
//public const string ExtensionDefaultName = "AzureDiskEncryption";
33+
public const string ExtensionDefaultName = "ADETest";
34+
//public const string ExtensionDefaultVersion = "1.0";
35+
public const string ExtensionDefaultVersion = "1.4";
3336
public const string VolumeTypeOS = "OS";
3437
public const string VolumeTypeData = "Data";
3538
public const string VolumeTypeAll = "All";
@@ -44,7 +47,8 @@ public class AzureDiskEncryptionExtensionContext : PSVirtualMachineExtension
4447
public string VolumeType { get; set; }
4548
public string AadClientCertThumbprint { get; set; }
4649
public string SequenceVersion { get; set; }
47-
public SecureString Passphrase { get; set; }
50+
public string EncryptionOperation { get; set; }
51+
public SecureString Passphrase { get; set; }
4852

4953
private static SecureString ConvertStringToSecureString(string str)
5054
{
@@ -74,6 +78,7 @@ private void InitializeAzureDiskEncryptionMembers(PSVirtualMachineExtension psEx
7478
VolumeType = (publicSettings == null) ? null : publicSettings.VolumeType;
7579
AadClientCertThumbprint = (publicSettings == null) ? null : publicSettings.AadClientCertThumbprint;
7680
SequenceVersion = (publicSettings == null) ? null : publicSettings.SequenceVersion;
81+
EncryptionOperation = (publicSettings == null) ? null : publicSettings.EncryptionOperation;
7782
AadClientSecret = (protectedSettings == null) ? null : ConvertStringToSecureString(protectedSettings.AadClientSecret);
7883
Passphrase = (protectedSettings == null) ? null : ConvertStringToSecureString(protectedSettings.Passphrase);
7984
}

src/ResourceManager/Compute/Commands.Compute/Extension/AzureDiskEncryption/AzureDiskEncryptionExtensionPublicSettings.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,6 @@ public class AzureDiskEncryptionExtensionPublicSettings
2424
public string VolumeType { get; set; }
2525
public string AadClientCertThumbprint { get; set; }
2626
public string SequenceVersion { get; set; }
27+
public string EncryptionOperation { get; set; }
2728
}
2829
}

0 commit comments

Comments
 (0)