Сценарий PowerShell для удаления секретов Key Vault с ошибками 409 Conflict
Я написал сценарий PowerShell 5.1, который удаляет секреты из хранилища ключей Azure, в котором включено мягкое удаление. Я узнал, что для успешного удаления секретов из такого хранилища ключей вам необходимо:
- Удалите секрет.
- Удалите секрет еще раз, на этот раз указав параметр -InRemovedState.
Мой сценарий:
[CmdletBinding()]
Param(
[Parameter(Mandatory = $True)]
[string]$keyvaultName
)
#Remove assorted security items from Key Vault
# Shut up blather about deprecated features
Set-Item -Path Env:\SuppressAzurePowerShellBreakingChangeWarnings -Value 'true'
Write-Output "Starting Removal"
### Remove Secrets
$secrets = Get-AzKeyVaultSecret -VaultName $keyvaultName
### Delete the secrets
foreach ($secret in $secrets) {
Write-Output "Removing $($secret.Name)"
Remove-AzKeyVaultSecret -VaultName $keyvaultName -Name $secret.Name -Force | Wait-Process
if($?) {
Write-Host "Removal of $($secret.Name) succeeded."
}
else {
Write-Host "Removal of $($secret.Name) $vaultName failed."
}
}
### Go back around and purge the secrets
foreach ($secret in $secrets) {
Write-Output "Purging $($secret.Name)"
Remove-AzKeyVaultSecret -VaultName $keyvaultName -Name $secret.Name -InRemovedState -Force | Wait-Process
if($?) {
Write-Host "Purge of $($secret.Name) succeeded."
}
else {
Write-Host "Purge of $($secret.Name) $vaultName failed."
}
}
Write-Output "Remove Complete"
Однако при запуске скрипта иногда возникают ошибки "Конфликт". Количество появляющихся ошибок варьируется. Я также получаю сертификат, который появляется из ниоткуда, что, как я подозреваю, связано с каким-то видом повреждения в моем Key Vault. Вот результат, где скрипт
test-run.ps1
вызывает мой код сценария очистки, показанный выше:
> .\test-run
Starting Removal
Removing QA-testing-certificate
Remove-AzKeyVaultSecret : Operation returned an invalid status code 'Forbidden'
At C:\Users\SESA280186\Desktop\OData\DevOps\Security\Key-Vault-material\keyvault-prototyping\remove-items2.ps1:25
char:4
+ Remove-AzKeyVaultSecret -VaultName $keyvaultName -Name $secret.Nam ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : CloseError: (:) [Remove-AzKeyVaultSecret], KeyVaultErrorException
+ FullyQualifiedErrorId : Microsoft.Azure.Commands.KeyVault.RemoveAzureKeyVaultSecret
Removal of QA-testing-certificate failed.
Removing QA-testing-secret
Removal of QA-testing-secret succeeded.
Removing QA-testing-secrets2
Removal of QA-testing-secrets2 succeeded.
Removing QA-testing-secrets3
Removal of QA-testing-secrets3 succeeded.
Purging QA-testing-certificate
Remove-AzKeyVaultSecret : Operation returned an invalid status code 'Forbidden'
At C:\Users\SESA280186\Desktop\OData\DevOps\Security\Key-Vault-material\keyvault-prototyping\remove-items2.ps1:39
char:4
+ Remove-AzKeyVaultSecret -VaultName $keyvaultName -Name $secret.Nam ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : CloseError: (:) [Remove-AzKeyVaultSecret], KeyVaultErrorException
+ FullyQualifiedErrorId : Microsoft.Azure.Commands.KeyVault.RemoveAzureKeyVaultSecret
Purge of QA-testing-certificate failed.
Purging QA-testing-secret
Remove-AzKeyVaultSecret : Operation returned an invalid status code 'Conflict'
At C:\Users\SESA280186\Desktop\OData\DevOps\Security\Key-Vault-material\keyvault-prototyping\remove-items2.ps1:39
char:4
+ Remove-AzKeyVaultSecret -VaultName $keyvaultName -Name $secret.Nam ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : CloseError: (:) [Remove-AzKeyVaultSecret], KeyVaultErrorException
+ FullyQualifiedErrorId : Microsoft.Azure.Commands.KeyVault.RemoveAzureKeyVaultSecret
Purge of QA-testing-secret failed.
Purging QA-testing-secrets2
Remove-AzKeyVaultSecret : Operation returned an invalid status code 'Conflict'
At C:\Users\SESA280186\Desktop\OData\DevOps\Security\Key-Vault-material\keyvault-prototyping\remove-items2.ps1:39
char:4
+ Remove-AzKeyVaultSecret -VaultName $keyvaultName -Name $secret.Nam ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : CloseError: (:) [Remove-AzKeyVaultSecret], KeyVaultErrorException
+ FullyQualifiedErrorId : Microsoft.Azure.Commands.KeyVault.RemoveAzureKeyVaultSecret
Purge of QA-testing-secrets2 failed.
Purging QA-testing-secrets3
Purge of QA-testing-secrets3 succeeded.
Remove Complete
Кто-нибудь может дать совет о том, что происходит, пожалуйста? Что я упустил из виду?
2 ответа
Вот почему вы видите конфликты с некоторыми сертификатами.
Под капотом хранилища ключей хранится закрытый ключ сертификата как скрытый секретный объект с тем же именем.
Например, если я создаю сертификат с именем "cert1" в моем хранилище ключей, хранилище ключей создает скрытый секрет с именем "cert1". Хотя этот скрытый секрет не виден вам на портале Azure, он отображается при использовании powershell / CLI.
Скорее всего, вы пытаетесь удалить / очистить секрет, с которым все еще связан сертификат, что приводит к ошибке конфликта.
Похоже, вы используете цикл for для перебора всех секретов, что, вероятно, является причиной этого.
Спасибо всем за помощь. Оказывается, настоящая проблема - это состояние гонки. Вы должны дать Azure время для фактического завершения удаления, прежде чем вводить ту же команду удаления с
-InRemovedState
набор параметров. Я добавил
Start-Sleep
команда с пятнадцатисекундной задержкой между командами, и это решило проблему. Мой последний рабочий код:
[CmdletBinding()]
Param(
[Parameter(Mandatory = $True)]
[string]$keyvaultName,
)
#Remove assorted security items from Key Vault
# Shut up blather about deprecated features
Set-Item -Path Env:\SuppressAzurePowerShellBreakingChangeWarnings -Value 'true'
Write-Output "Starting Removal"
### Remove Secrets
$secrets = Get-AzKeyVaultSecret -VaultName $keyvaultName
### Delete the secrets
foreach ($secret in $secrets) {
Write-Output "Removing $($secret.Name)"
Remove-AzKeyVaultSecret -VaultName $keyvaultName -Name $secret.Name -Force
if($?) {
Write-Host "Removal of $($secret.Name) succeeded."
}
else {
Write-Host "Removal of $($secret.Name) $vaultName failed."
}
}
### Wait for changes to settle
Start-Sleep -s 15
### Go back around and purge the secrets
foreach ($secret in $secrets) {
Write-Output "Purging $($secret.Name)"
Remove-AzKeyVaultSecret -VaultName $keyvaultName -Name $secret.Name -InRemovedState -Force
if($?) {
Write-Host "Purge of $($secret.Name) succeeded."
}
else {
Write-Host "Purge of $($secret.Name) $vaultName failed."
}
}
Write-Output "Remove Complete"
Спасибо всем, кто ответил.