我正在尝试使用Azure DevOps中的Azure Powershell任务在Azure Keyvault中设置秘密。 我使用以下代码:
Set-AzureKeyVaultSecret -VaultName $KeyvaultName -Name $SecretName -SecretValue $secretvalue
将名称和值全部设置在变量内部,并尝试在不使用变量的情况下使用它。
该值使用以下代码保存为安全字符串。ConvertTo-SecureString
但是当我在Azure DevOps Release管道中运行此powershell代码时,我不断收到以下错误消息:
Cannot retrieve access token for resource 'AzureKeyVaultServiceEndpointResourceId'. Please ensure that you have provided the appropriate access tokens when using access token login.
因此,我通过使用get,list,set secrets权限将它们添加到访问策略中,从而确保了服务主体和构建服务器对密钥库具有正确的访问权限。
我还添加了以下代码行,以确保配置文件正确加载
########################################################################################
$azureRmProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile
$profileClient = New-Object -TypeName Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient -ArgumentList ($azureRmProfile)
$context = Get-AzureRmContext
$AzureToken = $profileClient.AcquireAccessToken($context.Tenant.Id)
Add-AzureRmAccount -AccessToken $AzureToken.AccessToken -AccountId $AzureToken.UserId
########################################################################################
通过在内联脚本的开头添加此代码,并将配置文件与commando一起用作-DefaultProfile的变量。
是否有人尝试从Azure DevOps中的powershell任务设置秘密。或者知道为什么Powershell脚本无法访问密钥库。 azurermContext突击队为我提供了正确的输出,甚至尝试了Get-AzureRmKeyvault命令来确定与环境的连接是否已经正确建立。而且这也没有带来任何问题。
答案 0 :(得分:2)
确定可以正常工作(定期使用)
Set-AzContext -SubscriptionId $SubscriptionId
## $SubscriptionId is a subscription ID where is the target KV
$Secretvalue = ConvertTo-SecureString $SecretValuePlainText -AsPlainText -Force
## $SecretValuePlainText is the secret to store
Set-AzKeyVaultSecret -VaultName $KeyVaultName -Name $SecretName -SecretValue $Secretvalue -ErrorVariable setSecretError -Expires $ExpirationDate -NotBefore $ActivationDate
## $SecretName, $ExpirationDate, $ActivationDate - obvious :)
当然,如果您不是从脚本或内联中引用变量,而是从发布中引用$(variable_name)
我们用于此目的的服务主体/服务连接是目标订阅(或由您决定的密钥库)的所有者的临时身份。
答案 1 :(得分:1)
我遇到了完全相同的问题。 发现问题是缺少访问令牌。
呼叫-KeyVaultAccessToken
时就是Add-AzureRmAccount
。
在这里找到解决方案:https://github.com/Azure/azure-powershell/issues/4818#issuecomment-376155173
答案 2 :(得分:0)
我用以下内容解决了我的问题。
我使用了基于托管身份的服务连接。这需要一些变通办法来访问密钥库(如@john所述)。但这是不必要的。通过基于服务主体创建新的服务连接。此解决方法不是必需的,因此可以解决此问题。