Powershell을 사용하여 한 Azure Keyvault에서 다른 Keyvault로 모든 비밀을 복사하는 방법
최근에는 하나의 Azure KeyVault에서 새로 생성된 모든 암호(이름 및 값)를 복사해야 했습니다.백업에서 비밀을 복원하는 방법을 찾았지만 백업이 없었습니다.소스 볼트의 모든 이름/값 조합을 반복하여 대상 볼트에 복사할 수 있는 Powershell 스크립트가 있습니까?
이것은 너무 자극적입니다. (공격하지 마십시오.) 여기 더 "파워셸" 버전이 있습니다.
Param(
[Parameter(Mandatory)]
[string]$sourceVaultName,
[Parameter(Mandatory)]
[string]$destVaultName
)
Connect-AzAccount
$secretNames = (Get-AzKeyVaultSecret -VaultName $sourceVaultName).Name
$secretNames.foreach{
Set-AzKeyVaultSecret -VaultName $destVaultName -Name $_ `
-SecretValue (Get-AzKeyVaultSecret -VaultName $sourceVaultName -Name $_).SecretValue
}
요약하자면:
이 변경 사항에서는 매개 변수가 필수이며 탭에서 매개 변수를 완료할 수 있으므로 어떤 매개 변수가 먼저인지 기억할 필요가 없습니다.
사용.foreach사용하는 것보다 조금 더 깨끗합니다.do\while(인지적 노력을 덜 함).
텍스트에 값을 캐스팅하고 다시 암호화할 필요가 없습니다. 암호화된 값을 사용하여 새 암호에 할당할 수 있습니다.
이 스크립트는 az.cli의 새로운 쿨로 번역될 수 있습니다.
Param(
[Parameter(Mandatory)]
[string]$sourceVaultName,
[Parameter(Mandatory=$false)]
[string]$sourceSubscription,
[Parameter(Mandatory)]
[string]$destVaultName,
[Parameter(Mandatory=$false)]
[string]$descriptionSubscription
)
# az login
if($sourceSubscription){
az account set --subscription $sourceSubscription
}
Write-Host 'Reading secrets ids from' $sourceVaultName
$secretNames = az keyvault secret list --vault-name $sourceVaultName -o json --query "[].name" | ConvertFrom-Json
Write-Host 'Reading secrets values'
$secrets = $secretNames | % {
$secret = az keyvault secret show --name $_ --vault-name $sourceVaultName -o json | ConvertFrom-Json
[PSCustomObject]@{
name = $_;
value = $secret.value;
}
}
Write-Host 'writing secrets'
if($descriptionSubscription){
az account set --subscription $descriptionSubscription
}
$secrets.foreach{
az keyvault secret set --vault-name $destVaultName --name $_.name --value $_.value
}
지금 있습니다!
import-module AzureRM.keyvault
$sourceVaultName = $args[0]
$destVaultName = $args[1]
Connect-AzureRmAccount
#unfortunately you can only access secret values one at a time, by name. so this gets the names first
$names = (Get-AzureKeyVaultSecret -VaultName $sourceVaultName | select Name)
$i=0
do {
$rawSecret = (Get-AzureKeyVaultSecret -VaultName $sourceVaultName -Name $names[$i].Name).SecretValueText
$AKVsecret = ConvertTo-SecureString $rawSecret -AsPlainText -Force
Set-AzureKeyVaultSecret -VaultName $destVaultName -Name $names[$i].Name -SecretValue $AKVsecret
$i++
} while($i -lt $names.length)
를 사용하여 호출할 수 있습니다.
script.ps1 source-keyvault-name dest-keyvault-name
이것은 파이썬 솔루션을 찾고 있는 사람들을 위한 것입니다.
from azure.keyvault.secrets import SecretClient # pip install azure-keyvault-secrets
from azure.identity import DefaultAzureCredential # pip install azure-identity
source_vault_url = "https://sourcevault.vault.azure.net"
destination_vault_url = "https://destvault.vault.azure.net/"
credential = DefaultAzureCredential(
exclude_cli_credential=False
, exclude_environment_credential=True
, exclude_managed_identity_credential=True
, exclude_visual_studio_code_credential=True
, exclude_shared_token_cache_credential=True
, exclude_interactive_browser_credential=True
)
source_client = SecretClient(vault_url=source_vault_url, credential=credential)
destination_client = SecretClient(vault_url=destination_vault_url, credential=credential)
key_list = ['key1', 'key2', 'key3']
# Get secrets from the source key vault
credentials = {}
for key in key_list :
credentials[key] = source_client.get_secret(key).value
# Set secrets in the destination key vault
for key, value in credentials.items():
print(f"Creating a secret called '{key}' with the value '{value}' ...")
destination_client.set_secret(key, value)
저는 @4c74356b41의 답변으로 시작했지만, 몇 가지 변경을 했습니다.인증서가 제대로 작동하지 않기 때문에 인증서를 복사하고 싶지 않았습니다(비밀로 복사하고 모든 지역에서 작동하지 않습니다). 그리고 내용을 보존하고 싶었습니다.속성도 입력합니다.
$sourceVaultName = "<source vault>"
$destVaultName = "<dest vault>"
$secrets = Get-AzKeyVaultSecret -VaultName $sourceVaultName
$secrets | ? { $_.ContentType -ne "application/x-pkcs12" } | % {
$secret = Get-AzKeyVaultSecret -VaultName $sourceVaultName -Name $_.Name
Set-AzKeyVaultSecret -VaultName $destVaultName -Name $secret.Name -SecretValue $secret.SecretValue -ContentType $secret.ContentType
}
한 구독에서 다른 구독으로 키 볼트를 복제하기 위한 일련의 powershell 스크립트를 작성했습니다.도움이 되길 바랍니다.
볼트 간에 암호를 복사하는 매우 간단한 스크립트:
Param(
[Parameter(Mandatory)]
[string]$oldKeyVault,
[Parameter(Mandatory)]
[string]$newKeyVault
)
#Display Secrets in New Key Vault
Write-Host 'Secrets in New Key Vault BEFORE Sync'
$newSecrets = Get-AzKeyVaultSecret -VaultName $newKeyVault
foreach($newSecret in $newSecrets)
{
$newSecretDetails = Get-AzKeyVaultSecret -VaultName $newKeyVault -Name $newSecret.Name
Write-Host 'New Secret: Name='$newSecretDetails.Name
#Uncomment below if you need to check values
#Write-Host 'New Secret: Name='$newSecretDetails.Name ': Value=' $newSecretDetails.SecretValueText
}
Write-Host ''
Write-Host ''
#Display Secrets in New Old Vault
Write-Host 'Secrets in Old Key Vault before Sync'
$oldSecrets = Get-AzKeyVaultSecret -VaultName $oldKeyVault
foreach($oldSecret in $oldSecrets)
{
$oldSecretDetails = Get-AzKeyVaultSecret -VaultName $oldKeyVault -Name $oldSecret.Name
Write-Host 'Old Secret: Name='$oldSecretDetails.Name
#Uncomment below if you need to check values
#Write-Host 'Old Secret: Name='$oldSecretDetails.Name ': Value=' $oldSecretDetails.SecretValueText
}
Write-Host ''
Write-Host ''
#Sync Key Vault
Write-Host 'Syncing Vaults'
$oldSecrets = Get-AzKeyVaultSecret -VaultName $oldKeyVault
foreach($oldSecret in $oldSecrets)
{
$oldSecretDetails = Get-AzKeyVaultSecret -VaultName $oldKeyVault -Name $oldSecret.Name
$secureStringKey = ConvertTo-SecureString -String $oldSecretDetails.SecretValueText -AsPlainText -Force
Set-AzKeyVaultSecret -VaultName $newKeyVault -Name $oldSecretDetails.Name -SecretValue $secureStringKey
Write-Host 'Secret Copied to New Key Vault: Name = ' $oldSecretDetails.Name
}
Write-Host ''
Write-Host ''
#Display Secrets in New Key Vault
Write-Host 'Secrets in New Key Vault AFTER Sync'
$newSecrets = Get-AzKeyVaultSecret -VaultName $newKeyVault
foreach($newSecret in $newSecrets)
{
$newSecretDetails = Get-AzKeyVaultSecret -VaultName $newKeyVault -Name $newSecret.Name
Write-Host 'New Secret: Name='$newSecretDetails.Name
#Uncomment below if you need to check values
#Write-Host 'New Secret: Name='$newSecretDetails.Name ': Value=' $newSecretDetails.SecretValueText
}
언급URL : https://stackoverflow.com/questions/55617951/how-do-i-copy-over-all-secrets-from-one-azure-keyvault-to-another-using-powershe
'programing' 카테고리의 다른 글
| 'async' 및 'wait'를 사용하는 방법 및 시기 (0) | 2023.05.12 |
|---|---|
| .gitignore 파일은 어디에 속합니까? (0) | 2023.05.12 |
| 스위프트 3, 스위프트 4 등에서 어떻게 sync, dispatch_async, dispatch_after 등을 디스패치합니까? (0) | 2023.05.12 |
| HttpClientBaseAddress가 작동하지 않는 이유는 무엇입니까? (0) | 2023.05.12 |
| Mongo C# 드라이버 - 중첩을 사용하여 동적으로 필터 구축 (0) | 2023.05.12 |