Как ссылаться на секрет хранилища ключей в части строки подключения в функциях / приложениях Azure - PullRequest
1 голос
/ 08 октября 2019

Я устанавливаю строку подключения к служебной шине в настройках приложения функции 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:

Разделение строки подключения на несколько ключей настройки приложения может работать для этой проблемы, но это ограничило бы мою возможность использовать, скажем, сервисные шины, запускаемые функциями лазера, для которых требовалось полное имяключ строки подключения в настройках приложения внутри сигнатуры метода Run, как показано ниже

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

ОБНОВЛЕНИЕ 2:

Обход, который я проделал до сих пор, который, я надеюсь, может сделать более чистый подходиспользовать регулярные выражения в моей автоматизации Powershell, чтобы заменить только часть SharedAccessKey строки подключения. Таким образом, я использую только одну настройку приложения для строки подключения. Это работает, но мне это неудобно.

Это код, который я использую в моем Runbook Automation Runbook:

$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 ]

1 голос
/ 08 октября 2019

Я не думаю, что вы можете сделать это, просто настройки приложения с синтаксисом @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

0 голосов
/ 29 октября 2019

Вы когда-нибудь находили разрешение на это? У меня похожая проблема, когда я предлагаю изменить синтаксис ConnectionString учетной записи хранения, разрешив ссылку на секрет KeyVault.

Azure Key Vault / Интеграция хранилища / функции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...