如何在 Azure Functions/apps 的连接字符串的一部分中引用密钥保管库机密

How to reference a key-vault secret in a part of the connection string in Azure Functions/apps

我正在 Azure 函数的应用程序设置中设置到服务总线的连接字符串。目前,我将整个连接字符串存储在 Key Vault 中,并在应用程序设置中引用 Key Vault 机密。那工作正常。但是我试图做的但没有成功的是仅将服务总线密钥而不是整个连接字符串存储在密钥保管库中。

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

Endpoint=sb://xxxxx.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=@Microsoft.KeyVault(SecretUri=xxxx.vault.azure.net/secrets/yyyy/zzzzz)

但这不起作用。

我需要进行这种分离的原因是,我想轮换密钥保管库中的密钥,如果整个连接字符串都存储在密钥保管库中,我就不能这样做。

更新 1:

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

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

我不认为你可以这样做,只有语法为 @Microsoft.KeyVault(...) 的应用程序设置将被识别为 Key Vault Reference。否则,它只会被识别为普通字符串,没有截图中的后半部分。

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

例如,一个是Endpoint=sb://xxxxx.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=,另一个是@Microsoft.KeyVault(SecretUri=xxxx.vault.azure.net/secrets/yyyy/zzzzz)。您也可以将第一个作为秘密存储在密钥库中,这取决于您。