Мы также рассмотрели возможность использования хранилища ключей, но в конечном итоге мы оказались в ситуации защиты ключа хранилища ключей.
Постановка проблемы
Даже если вы можете переместить всю конфиденциальную информацию в хранилище ключей Azure, но для доступа к хранилищу ключей Azure вам нужны clientID и секретный ключ клиента (чтобы установить личность облачной службы и хранилища ключей, чтобы знать, кто к ней обращается).
Это означает, что секретный ключ клиента вашего приложения будет находиться в конфигурации облачной службы, что в первую очередь эквивалентно всей конфиденциальной информации, хранящейся в конфигурации облачной службы:).
Подход к решению
Идентификация управляемой службы могла бы стать способом доступа к хранилищу ключей Azure и избежать сохранения секретного ключа клиента в конфигурации облачной службы.
В отсутствие идентификаторов управляемых служб для классических облачных служб вы можете использовать Учетные данные сертификата для аутентификации приложения , чтобы помочь установить идентификацию приложения и получить доступ к хранилищу ключей для чтения ключей, секретов и т. Д.
Подробности и пример кода
- Вы регистрируете приложение Azure AD для представления своей облачной службы.
- Предоставьте соответствующий доступ (возможность получить ключи/ секреты и т. д.) к этому приложению Azure AD в политиках доступа Key Vault.
- Теперь вместо генерации обычного клиентского секрета следуйте инструкциям в Учетные данные сертификата для аутентификации приложения , чтобы связатьучетные данные сертификата с клиентским приложением в Azure AD.
- Убедитесь, что этот сертификат развернут со всеми экземплярами облачной службы, включив его в файл определения службы (CSDEF)
- Используйте клиент вашего приложенияID и этот сертификат для получения токена ичтение конфиденциальной информации из хранилища ключей Azure.
Пример кода доступен здесь: Аутентификация в Azure AD в приложениях демона с сертификатами
Только важные фрагменты кода
// Initialize the Certificate Credential to be used by ADAL.
X509Certificate2 cert = ReadCertificateFromStore(certName);
// Then create the certificate credential client assertion.
certCred = new ClientAssertionCertificate(clientId, cert);
// Acquire Auth token for talking to Azure KeyVault..
result = await authContext.AcquireTokenAsync(todoListResourceId, certCred);