Использовать зашифрованные учетные данные Azure при инициализации нового SecretClient

Я следовал этому руководству по клиентской библиотеке Azure Key Vault для .NET (v4), пытаясь узнать о хранилищах ключей в настольных приложениях. Я настроил субъекта-службы в соответствии с инструкциями и предоставил ему доступ к моему хранилищу, после чего мне удалось получить секрет, используя

var client = new SecretClient(new Uri(kvUri), new DefaultAzureCredential());
string secretName = "test";
KeyVaultSecret secret = client.GetSecret(secretName);

но только после сохранения моих AZURE_CLIENT_ID, AZURE_CLIENT_SECRET и AZURE_TENANT_ID в качестве переменных среды.

Я хотел бы знать, могут ли эти три ключа быть зашифрованы в переменных среды и по-прежнему расшифрованы с помощью метода DefaultAzureCredential ()?

В качестве альтернативы, можно ли эти ключи хранить где-то еще, расшифровывать локально и ЗАТЕМ передаваться в метод DefaultAzureCredential ()?

Я попытался поиграть с перегрузкой DefaultAzureCredentialOptions (), но не было возможности передать секрет клиента ...

Я также попытался создать объект учетных данных токена в коде с помощью NuGet Fluent.Authentication и передать его в конструктор SecretClient, но получил сообщение об ошибке

cannot convert from 'Microsoft.Azure.Management.ResourceManager.Fluent.Authentication.AzureCredentials' to 'Azure.Core.TokenCredential'

Возможно ли то, что я пытаюсь сделать? Или Microsoft предполагает, что переменные среды являются достаточно безопасным местом для хранения незашифрованного идентификатора клиента + секрета?


person Themos    schedule 09.04.2020    source источник
comment
У нас нет возможности использовать NuGet Fluent.Authentication для создания SecretClient. Дополнительные сведения см. В документации. .microsoft.com / en-us / dotnet / api /. Если вы считаете, что безопасность, вы можете попробовать использовать расширение Visual Studio (аутентификация службы Azure): rahulpnath.com/ blog / defaultazurecredential_from_azure_sdk   -  person Jim Xu    schedule 09.04.2020
comment
Привет, @JimXu, спасибо за быстрый ответ, у меня были низкие ожидания относительно NuGet Flient.Authentication, но мне все же пришлось его попробовать .. Есть ли у вас какие-либо предложения относительно шифрования переменных среды или их явной передачи в DefaultAzureCredential ()?   -  person Themos    schedule 09.04.2020
comment
Относительно того, как зашифровать переменные среды, см. docs.microsoft.com/en-us/aspnet/core/security/   -  person Jim Xu    schedule 10.04.2020
comment
Привет, @JimXu, спасибо за продолжение работы с инструментом Secret Manager, хотя кажется, что он поддерживается только в проектах .NET Core? Также остается вопрос, как передать (теперь расшифрованные) client_id, client_secret и tenant_id методу DefaultAzureCredential ()?   -  person Themos    schedule 10.04.2020
comment
@JimXu хорошо понял, как передать учетные данные, вместо DefaultAzureCredential () мне вместо этого пришлось использовать var client = new SecretClient(new Uri(kvUri), new ClientSecretCredential(tenantId, clientId, clientSecret));   -  person Themos    schedule 10.04.2020
comment
Поскольку ваша проблема была решена самостоятельно, опубликуйте свой ответ.   -  person Jim Xu    schedule 10.04.2020


Ответы (1)


Я смог выяснить ответ, просмотрев ссылки на документацию Джима: вместо метода DefaultAzureCredential () (который использует переменные среды) мне пришлось использовать ClientSecretCredential () , перегрузка которого позволяет указать tenantId, clientId и clientSecret:

var client = new SecretClient(new Uri(kvUri), new ClientSecretCredential(tenantId, clientId, clientSecret));

Итак, теперь для дополнительной безопасности я могу просто хранить эти (зашифрованные) учетные данные в пользовательских настройках каждой машины разработчика.

person Themos    schedule 13.04.2020