如何在Azure函数/应用程序的部分连接字符串中引用键库密钥

问题描述 投票:0回答:1

我正在Azure函数的应用程序设置中设置到服务总线的连接字符串。当前,我将整个连接字符串存储在Key Vault中,并在应用程序设置中引用Key Vault秘密。很好但是,我尝试不成功的做法是仅将服务总线密钥存储,而不是将整个连接字符串存储在密钥库中。

我已尝试如下将连接字符串连接到门户中的KeyVault参考应用程序设置

Endpoint=sb://xxxxx.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;[email protected](SecretUri=xxxx.vault.azure.net/secrets/yyyy/zzzzz)

但是这不起作用。

我需要进行此分离的原因是,我想旋转密钥保管库中的密钥,如果整个连接字符串都存储在密钥保管库中,则无法这样做。

UPDATE1:

将连接字符串拆分为多个应用程序设置键可以解决此问题,但是这会限制我使用服务总线触发的azure函数的能力,该功能需要Run方法内应用程序设置中完整连接字符串键的名称签名如下

public static void Run(
    [ServiceBusTrigger("myqueue", AccessRights.Manage, Connection = "ServiceBusConnection")] 
    string myQueueItem
    ILogger log)

更新2:

到目前为止,我已经完成了工作,我希望我可以采用一种更简洁的方法,就是在自动化Powershell中使用正则表达式来仅替换连接字符串的SharedAccessKey部分。这样,我只对连接字符串使用一个应用程序设置。它正在工作,但我对此不太满意。

这是我在自动化运行手册中使用的代码:

$azureAutomationConnectionName = "AzureRunAsConnection"
$servicePrincipalConnection = Get-AutomationConnection -Name $azureAutomationConnectionName         

Add-AzureRmAccount -ServicePrincipal -TenantId $servicePrincipalConnection.TenantId -ApplicationId $servicePrincipalConnection.ApplicationId -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint 

$resourceGroupName = 'XXXX'
$serviceBusName = 'XXXX'
$serviceBusAccessPolicyName = 'RootManageSharedAccessKey'
$keyVaultName = 'XXXX'
$keyVaultSecretKey = 'XXXX'

$currentSecret = (Get-AzureKeyVaultSecret -VaultName $keyVaultName -Name $keyVaultSecretKey).SecretValueText

# Regenerate the Service Bus Primary Key
New-AzureRmServiceBusKey -ResourceGroupName $resourceGroupName -Namespace $serviceBusName -Name $serviceBusAccessPolicyName -RegenerateKey PrimaryKey

# Get the newly regenerated Primary Key
$newPrimaryKey = (Get-AzureRmServiceBusKey -ResourceGroupName $resourceGroupName -Namespace $serviceBusName -Name $serviceBusAccessPolicyName).PrimaryKey

# The secret is storing the entire connection string. We want to replace the SharedAccessKey Only
$newSecretStr = $currentSecret  -replace 'SharedAccessKey=[^;]*', ([string]::Format('SharedAccessKey={0}',$newPrimaryKey))

# Convert the Primary Key to Secure String
$newSecureSecretStr = ConvertTo-SecureString $newSecretStr -AsPlainText -Force

# Update the Secret Value in the Key Vault
Set-AzureKeyVaultSecret -VaultName $keyVaultName -Name $keyVaultSecretKey -SecretValue $newSecureSecretStr
azure azure-keyvault appsettings
1个回答
1
投票

[我认为您无法做到这一点,只有语法为@Microsoft.KeyVault(...)的应用程序设置将被识别为@Microsoft.KeyVault(...)。否则,它将被识别为正常字符串,而屏幕截图中没有后一半。

在您的情况下,解决方法是将服务总线连接字符串存储为两个独立的应用程序设置,当您使用它时,请通过代码将它们拼接在一起。

例如,一个是Key Vault Reference,另一个是Endpoint=sb://xxxxx.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=。您也可以将第一个密码存储为密钥库中的秘密,这取决于您。

@Microsoft.KeyVault(SecretUri=xxxx.vault.azure.net/secrets/yyyy/zzzzz)

© www.soinside.com 2019 - 2024. All rights reserved.