Считывание секрета, хранящегося в хранилище ключей, из службы приложений, запускающей контейнер

#azure #azure-web-app-service #azure-keyvault

#azure #azure-web-app-service #azure-keyvault

Вопрос:

Я создал службу приложений, в которой запущен сервер идентификации контейнера. Этому контейнеру необходим сертификат, который я загружаю из хранилища ключей. Чтобы получить содержимое сертификата, я сделал следующее:

  • Загрузите сертификат в хранилище ключей
  • Доступ к содержимому осуществляется с помощью секретной конечной точки хранилища ключей (https://mykeyvault.vault.azure.net/secrets/IdentityCert )

В моей первой попытке я сохранял только URI секрета в настройках приложения и пытался получить значение, используя следующий код:

 var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
                    new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));

var cert = keyVaultClient
    .GetSecretAsync(
        Env.GetString("CERTIFICATE_KEY_VAULT_KEY"))
    .ConfigureAwait(false).GetAwaiter().GetResult();

identityServerBuilder.AddSigningCredential(new X509Certificate2(Convert.FromBase64String(cert.Value)));

  

Это работает, если я развертываю код в виртуальной машине. Но этого не произойдет, если я разверну код в службе приложений, работающей с контейнером. Итак, я решил попробовать другой вариант, который заключается в использовании ссылки на хранилище ключей. Итак, я создал новые настройки приложения, подобные этим:

 CERTIFICATE_CONTENT = @Microsoft.KeyVault(SecretUri=https://mykeyvault.vault.azure.net/secrets/IdentityCert/5221036c6b734d5fa69cba29976a8592)
  

А затем просто использует это значение внутри моего кода:

 var certificateContent = Env.GetString("CERTIFICATE_CONTENT");

identityServerBuilder.AddSigningCredential(new X509Certificate2(Convert.FromBase64String(certificateContent)));
  

Но это тоже не работает.

Я включил управляемую идентификацию в службе приложений и добавил ее в Политики доступа в Хранилище ключей.

Как я могу получить значение из хранилища ключей? Есть ли что-то, чего я не хватает?

Комментарии:

1. Что означает «это не работает»? Вы получаете сообщение об ошибке?

2. Это означает, что служба приложений не обращается к хранилищу ключей для получения значения секрета, а просто возвращает значение настроек приложения (которое является ссылкой на секрет хранилища ключей). В любом случае, это была моя ошибка, я неправильно настроил политику доступа.

Ответ №1:

Итак, ошибка заключалась в том, как я добавлял новую политику доступа. Я выбирал основной идентификатор и авторизованное приложение. Оказывается, мне нужно только выбрать принципала, оставив Авторизованное приложение как «Не выбрано».