|
1 |
| -function Set-AzDataProtectionMSIPermission { |
| 1 | +function Get-VaultIdentity { |
| 2 | + |
| 3 | + [Microsoft.Azure.PowerShell.Cmdlets.DataProtection.DoNotExportAttribute()] |
| 4 | + param ( |
| 5 | + [Parameter(Mandatory=$true)] |
| 6 | + [System.Object] $vault, |
| 7 | + |
| 8 | + [Parameter(Mandatory=$false)] |
| 9 | + [System.String] $UserAssignedIdentityARMId |
| 10 | + ) |
| 11 | + |
| 12 | + #Determine the vault MSI to be used |
| 13 | + $vaultIdentity = $null |
| 14 | + if ($UserAssignedIdentityARMId) { |
| 15 | + $vaultIdentity = $vault.Identity.UserAssignedIdentity[$UserAssignedIdentityARMId].PrincipalID |
| 16 | + Write-Host "Using Vault UAMI with ARMId: $UserAssignedIdentityARMId with Principal ID: $vaultIdentity" |
| 17 | + } else { |
| 18 | + $vaultIdentity = $vault.Identity.PrincipalId |
| 19 | + Write-Host "Using system-assigned identity with Principal ID: $vaultIdentity" |
| 20 | + } |
| 21 | + |
| 22 | + if (-not $vaultIdentity) { |
| 23 | + throw "Vault identity could not be determined. Please check the UserAssignedIdentityARMId or the vault configuration." |
| 24 | + } |
| 25 | + |
| 26 | + return $vaultIdentity |
| 27 | +} |
| 28 | + |
| 29 | +function Set-AzDataProtectionMSIPermission { |
2 | 30 | [OutputType('System.Object')]
|
3 | 31 | [CmdletBinding(PositionalBinding=$false, SupportsShouldProcess, ConfirmImpact = 'High')]
|
4 | 32 | [Microsoft.Azure.PowerShell.Cmdlets.DataProtection.Description('Grants required permissions to the backup vault and other resources for configure backup and restore scenarios')]
|
|
46 | 74 |
|
47 | 75 | [Parameter(ParameterSetName="SetPermissionsForRestore", Mandatory=$false, HelpMessage='Target storage account ARM Id. Use this parameter for DatasourceType AzureDatabaseForMySQL, AzureDatabaseForPGFlexServer.')]
|
48 | 76 | [System.String]
|
49 |
| - ${StorageAccountARMId} |
| 77 | + ${StorageAccountARMId}, |
| 78 | + |
| 79 | + [Parameter(Mandatory=$false, HelpMessage='User Assigned Identity ARM ID of the backup vault to be used for assigning permissions')] |
| 80 | + [Alias('AssignUserIdentity')] |
| 81 | + [System.String] |
| 82 | + ${UserAssignedIdentityARMId} |
50 | 83 | )
|
51 | 84 |
|
52 | 85 | process {
|
|
95 | 128 | $manifest = LoadManifest -DatasourceType $DatasourceTypeInternal.ToString()
|
96 | 129 |
|
97 | 130 | $vault = Az.DataProtection\Get-AzDataProtectionBackupVault -VaultName $VaultName -ResourceGroupName $VaultResourceGroup -SubscriptionId $subscriptionIdInternal
|
98 |
| - |
| 131 | + $vaultIdentity = Get-VaultIdentity -vault $vault -UserAssignedIdentityARMId $UserAssignedIdentityARMId |
| 132 | + |
99 | 133 | if(-not $manifest.supportRestoreGrantPermission){
|
100 | 134 | $err = "Set permissions for restore is currently not supported for given DataSourceType"
|
101 | 135 | throw $err
|
|
152 | 186 |
|
153 | 187 | foreach($Permission in $manifest.snapshotRGPermissions)
|
154 | 188 | {
|
155 |
| - $AllRoles = Az.Resources\Get-AzRoleAssignment -ObjectId $vault.Identity.PrincipalId |
| 189 | + $AllRoles = Az.Resources\Get-AzRoleAssignment -ObjectId $vaultIdentity |
156 | 190 |
|
157 | 191 | # CSR: $SubscriptionName might be different when we add cross subscription restore
|
158 | 192 | $CheckPermission = $AllRoles | Where-Object { ($_.Scope -eq $SnapshotResourceGroupId -or $_.Scope -eq $SubscriptionName) -and $_.RoleDefinitionName -eq $Permission}
|
|
166 | 200 | {
|
167 | 201 | $MissingRolesInitially = $true
|
168 | 202 |
|
169 |
| - AssignMissingRoles -ObjectId $vault.Identity.PrincipalId -Permission $Permission -PermissionsScope $PermissionsScope -Resource $SnapshotResourceGroupId -ResourceGroup $SnapshotResourceGroupId -Subscription $SubscriptionName |
| 203 | + AssignMissingRoles -ObjectId $vaultIdentity -Permission $Permission -PermissionsScope $PermissionsScope -Resource $SnapshotResourceGroupId -ResourceGroup $SnapshotResourceGroupId -Subscription $SubscriptionName |
170 | 204 |
|
171 | 205 | Write-Host "Assigned $($Permission) permission to the backup vault over snapshot resource group with Id $($SnapshotResourceGroupId)"
|
172 | 206 | }
|
|
176 | 210 | foreach($Permission in $manifest.datasourcePermissionsForRestore)
|
177 | 211 | {
|
178 | 212 | # set context to the subscription where ObjectId is present
|
179 |
| - $AllRoles = Az.Resources\Get-AzRoleAssignment -ObjectId $vault.Identity.PrincipalId |
| 213 | + $AllRoles = Az.Resources\Get-AzRoleAssignment -ObjectId $vaultIdentity |
180 | 214 |
|
181 | 215 | $CheckPermission = $AllRoles | Where-Object { ($_.Scope -eq $DataSourceId -or $_.Scope -eq $ResourceRG -or $_.Scope -eq $SubscriptionName) -and $_.RoleDefinitionName -eq $Permission}
|
182 | 216 |
|
|
189 | 223 | {
|
190 | 224 | $MissingRolesInitially = $true
|
191 | 225 |
|
192 |
| - AssignMissingRoles -ObjectId $vault.Identity.PrincipalId -Permission $Permission -PermissionsScope $PermissionsScope -Resource $DataSourceId -ResourceGroup $ResourceRG -Subscription $SubscriptionName |
| 226 | + AssignMissingRoles -ObjectId $vaultIdentity -Permission $Permission -PermissionsScope $PermissionsScope -Resource $DataSourceId -ResourceGroup $ResourceRG -Subscription $SubscriptionName |
193 | 227 |
|
194 | 228 | Write-Host "Assigned $($Permission) permission to the backup vault over DataSource with Id $($DataSourceId)"
|
195 | 229 | }
|
|
198 | 232 | foreach($Permission in $manifest.storageAccountPermissionsForRestore)
|
199 | 233 | {
|
200 | 234 | # set context to the subscription where ObjectId is present
|
201 |
| - $AllRoles = Az.Resources\Get-AzRoleAssignment -ObjectId $vault.Identity.PrincipalId |
| 235 | + $AllRoles = Az.Resources\Get-AzRoleAssignment -ObjectId $vaultIdentity |
202 | 236 |
|
203 | 237 | $targetResourceArmId = $restoreRequest.RestoreTargetInfo.TargetDetail.TargetResourceArmId
|
204 | 238 |
|
|
237 | 271 | {
|
238 | 272 | $MissingRolesInitially = $true
|
239 | 273 |
|
240 |
| - AssignMissingRoles -ObjectId $vault.Identity.PrincipalId -Permission $Permission -PermissionsScope $PermissionsScope -Resource $storageAccId -ResourceGroup $storageAccResourceGroupId -Subscription $storageAccountSubId |
| 274 | + AssignMissingRoles -ObjectId $vaultIdentity -Permission $Permission -PermissionsScope $PermissionsScope -Resource $storageAccId -ResourceGroup $storageAccResourceGroupId -Subscription $storageAccountSubId |
241 | 275 |
|
242 | 276 | Write-Host "Assigned $($Permission) permission to the backup vault over storage account with Id $($storageAccId)"
|
243 | 277 | }
|
|
255 | 289 | $subscriptionId = $ResourceArray[2]
|
256 | 290 |
|
257 | 291 | $vault = Az.DataProtection\Get-AzDataProtectionBackupVault -VaultName $VaultName -ResourceGroupName $VaultResourceGroup -SubscriptionId $ResourceArray[2]
|
258 |
| - |
259 |
| - $AllRoles = Az.Resources\Get-AzRoleAssignment -ObjectId $vault.Identity.PrincipalId |
| 292 | + $vaultIdentity = Get-VaultIdentity -vault $vault -UserAssignedIdentityARMId $UserAssignedIdentityARMId |
| 293 | + |
| 294 | + $AllRoles = Az.Resources\Get-AzRoleAssignment -ObjectId $vaultIdentity |
260 | 295 |
|
261 | 296 | # If more DataSourceTypes support this then we can make it manifest driven
|
262 | 297 | if($DatasourceType -eq "AzureDatabaseForPostgreSQL")
|
|
341 | 376 | $KeyVault = Get-AzKeyVault -VaultName $KeyvaultName
|
342 | 377 | $KeyVaultAccessPolicies = $KeyVault.AccessPolicies
|
343 | 378 |
|
344 |
| - $KeyVaultAccessPolicy = $KeyVaultAccessPolicies | Where-Object {$_.ObjectID -eq $vault.Identity.PrincipalId} |
| 379 | + $KeyVaultAccessPolicy = $KeyVaultAccessPolicies | Where-Object {$_.ObjectID -eq $vaultIdentity} |
345 | 380 |
|
346 | 381 | if($KeyVaultAccessPolicy -eq $null)
|
347 | 382 | {
|
348 |
| - Set-AzKeyVaultAccessPolicy -VaultName $KeyvaultName -ObjectId $vault.Identity.PrincipalId -PermissionsToSecrets Get,List -Confirm:$False |
| 383 | + Set-AzKeyVaultAccessPolicy -VaultName $KeyvaultName -ObjectId $vaultIdentity -PermissionsToSecrets Get,List -Confirm:$False |
349 | 384 | break
|
350 | 385 | }
|
351 | 386 |
|
|
355 | 390 | [String[]]$FinalKeyvaultAccessPolicyPermissions = $KeyvaultAccessPolicyPermissions
|
356 | 391 | $FinalKeyvaultAccessPolicyPermissions = $FinalKeyvaultAccessPolicyPermissions | select -uniq
|
357 | 392 |
|
358 |
| - Set-AzKeyVaultAccessPolicy -VaultName $KeyvaultName -ObjectId $vault.Identity.PrincipalId -PermissionsToSecrets $FinalKeyvaultAccessPolicyPermissions -Confirm:$False |
| 393 | + Set-AzKeyVaultAccessPolicy -VaultName $KeyvaultName -ObjectId $vaultIdentity -PermissionsToSecrets $FinalKeyvaultAccessPolicyPermissions -Confirm:$False |
359 | 394 | }
|
360 | 395 | catch{
|
361 | 396 | $err = $_
|
|
376 | 411 | {
|
377 | 412 | $MissingRolesInitially = $true
|
378 | 413 |
|
379 |
| - AssignMissingRoles -ObjectId $vault.Identity.PrincipalId -Permission $Permission -PermissionsScope $PermissionsScope -Resource $KeyVaultId -ResourceGroup $KeyvaultRG -Subscription $KeyvaultSubscriptionName |
| 414 | + AssignMissingRoles -ObjectId $vaultIdentity -Permission $Permission -PermissionsScope $PermissionsScope -Resource $KeyVaultId -ResourceGroup $KeyvaultRG -Subscription $KeyvaultSubscriptionName |
380 | 415 |
|
381 | 416 | Write-Host "Assigned $($Permission) permission to the backup vault over key vault with Id $($KeyVaultId)"
|
382 | 417 | }
|
|
435 | 470 | $SnapshotResourceGroupId = $BackupInstance.Property.PolicyInfo.PolicyParameter.DataStoreParametersList[0].ResourceGroupId
|
436 | 471 |
|
437 | 472 | # CSR: $SubscriptionName might be different when we add cross subscription restore
|
438 |
| - $AllRoles = Az.Resources\Get-AzRoleAssignment -ObjectId $vault.Identity.PrincipalId |
| 473 | + $AllRoles = Az.Resources\Get-AzRoleAssignment -ObjectId $vaultIdentity |
439 | 474 | $CheckPermission = $AllRoles | Where-Object { ($_.Scope -eq $SnapshotResourceGroupId -or $_.Scope -eq $SubscriptionName) -and $_.RoleDefinitionName -eq $Permission}
|
440 | 475 |
|
441 | 476 | if($CheckPermission -ne $null)
|
|
447 | 482 | {
|
448 | 483 | $MissingRolesInitially = $true
|
449 | 484 |
|
450 |
| - AssignMissingRoles -ObjectId $vault.Identity.PrincipalId -Permission $Permission -PermissionsScope $PermissionsScope -Resource $SnapshotResourceGroupId -ResourceGroup $SnapshotResourceGroupId -Subscription $SubscriptionName |
| 485 | + AssignMissingRoles -ObjectId $vaultIdentity -Permission $Permission -PermissionsScope $PermissionsScope -Resource $SnapshotResourceGroupId -ResourceGroup $SnapshotResourceGroupId -Subscription $SubscriptionName |
451 | 486 |
|
452 | 487 | Write-Host "Assigned $($Permission) permission to the backup vault over snapshot resource group with Id $($SnapshotResourceGroupId)"
|
453 | 488 | }
|
454 | 489 | }
|
455 | 490 |
|
456 | 491 | foreach($Permission in $manifest.datasourcePermissions)
|
457 | 492 | {
|
458 |
| - $AllRoles = Az.Resources\Get-AzRoleAssignment -ObjectId $vault.Identity.PrincipalId |
| 493 | + $AllRoles = Az.Resources\Get-AzRoleAssignment -ObjectId $vaultIdentity |
459 | 494 | $CheckPermission = $AllRoles | Where-Object { ($_.Scope -eq $DataSourceId -or $_.Scope -eq $ResourceRG -or $_.Scope -eq $SubscriptionName) -and $_.RoleDefinitionName -eq $Permission}
|
460 | 495 |
|
461 | 496 | if($CheckPermission -ne $null)
|
|
467 | 502 | {
|
468 | 503 | $MissingRolesInitially = $true
|
469 | 504 |
|
470 |
| - AssignMissingRoles -ObjectId $vault.Identity.PrincipalId -Permission $Permission -PermissionsScope $PermissionsScope -Resource $DataSourceId -ResourceGroup $ResourceRG -Subscription $SubscriptionName |
| 505 | + AssignMissingRoles -ObjectId $vaultIdentity -Permission $Permission -PermissionsScope $PermissionsScope -Resource $DataSourceId -ResourceGroup $ResourceRG -Subscription $SubscriptionName |
471 | 506 |
|
472 | 507 | Write-Host "Assigned $($Permission) permission to the backup vault over DataSource with Id $($DataSourceId)"
|
473 | 508 | }
|
474 | 509 | }
|
475 | 510 |
|
476 | 511 | foreach($Permission in $manifest.datasourceRGPermissions)
|
477 | 512 | {
|
478 |
| - $AllRoles = Az.Resources\Get-AzRoleAssignment -ObjectId $vault.Identity.PrincipalId |
| 513 | + $AllRoles = Az.Resources\Get-AzRoleAssignment -ObjectId $vaultIdentity |
479 | 514 | $CheckPermission = $AllRoles | Where-Object { ($_.Scope -eq $ResourceRG -or $_.Scope -eq $SubscriptionName) -and $_.RoleDefinitionName -eq $Permission}
|
480 | 515 |
|
481 | 516 | if($CheckPermission -ne $null)
|
|
493 | 528 | $DatasourceRGScope = "ResourceGroup"
|
494 | 529 | }
|
495 | 530 |
|
496 |
| - AssignMissingRoles -ObjectId $vault.Identity.PrincipalId -Permission $Permission -PermissionsScope $DatasourceRGScope -Resource $DataSourceId -ResourceGroup $ResourceRG -Subscription $SubscriptionName |
| 531 | + AssignMissingRoles -ObjectId $vaultIdentity -Permission $Permission -PermissionsScope $DatasourceRGScope -Resource $DataSourceId -ResourceGroup $ResourceRG -Subscription $SubscriptionName |
497 | 532 |
|
498 | 533 | Write-Host "Assigned $($Permission) permission to the backup vault over DataSource resource group with name $($ResourceRG)"
|
499 | 534 | }
|
|
0 commit comments