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

时间:2019-10-08 05:34:03

标签: azure azure-keyvault appsettings

我正在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)

但这不起作用。

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

UPDATE1:

将连接字符串拆分为多个应用程序设置键可以解决此问题,但会限制我使用服务总线触发的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

2 个答案:

答案 0 :(得分:1)

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

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

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

enter image description here

答案 1 :(得分:0)

您有没有找到解决方法?我有一个类似的问题,我提议对存储帐户ConnectionString语法进行更改,以允许引用KeyVault Secret。

Azure Key Vault / Storage / Function integration