Получите секреты keyvault, используя Spring api с идентификаторами управляемых сервисов - PullRequest
0 голосов
/ 15 марта 2019

Из-за некоторых новых требований безопасности API-интерфейс, который я сейчас разрабатываю, должен хранить несколько URL-адресов, имен учетных записей Azure и т. Д. В хранилище ключей Azure, а не в файле конфигурации application.yml.

Проблема в том, что у меня проблемы с аутентификацией / доступом к клиенту хранилища ключей в локальной среде. У меня очень ограниченный доступ к самому хранилищу функций / клавиш Azure, поэтому тестирование нового кода, который я пишу, на данный момент практически невозможно:

 public String getSecretFromKeyVault(String key) {

        /**
        * Breaks in the constructor call, as the system.env variables for MSI_ENDPOINT and MSI_SECRET are null.
        **/

        AppServiceMSICredentials credentials = new AppServiceMSICredentials(AzureEnvironment.AZURE);
        KeyVaultClient client = new KeyVaultClient(credentials);

        SecretBundle secret = client.getSecret("url-for-key-vault", key);
       return secret.value();

    }

Я знаю, что переменные будут установлены на облачном сервере, но у меня вопрос как я могу наилучшим образом убедиться, что вызовы хранилища были выполнены правильно (юнит, интеграция, локальные тесты e2e) и как мне удалось бы использовать вызовы из хранилища ключей во время локальной разработки / выполнения?

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

Я также попытался войти в Azure, используя az login перед запуском сервера, но это тоже не сработало.

Есть ли у кого-нибудь какие-либо предложения о том, как мне решить эту проблему, или какие у меня лучшие варианты на будущее?

Замечания по применению:

  • Java версия: 8
  • пружинный ботинок
  • Среда разработки и развертывания Azure / vsts

1 Ответ

0 голосов
/ 07 июня 2019

Поскольку вы используете spring-boot, вам лучше использовать реализацию источника свойств Microsoft, которая отображает свойства keyvault в свойства Spring, а для локальной разработки и тестирования вы устанавливаете эквивалентные свойства в файлах свойств.

Используйте пружинные профили. допустим, у вас есть профили azure и local. В вашем файле application-azure.yml настройте ваше приложение на использование keyvault:

# endpoint on the azure internal network for getting the identity access token

MSI_ENDPOINT: http://169.254.169.254/metadata/identity/oauth2/token
MSI_SECRET: unused

# this property triggers the use of keyvault for properties

azure.keyvault:
  uri: https://<your-keyvault-name>.vault.azure.net/

Теперь вы можете добавить секретные свойства из контекста Spring в ваши переменные, и они будут считаны из keyvault:

  @Value("${superSecretValue}")
  String secretValue;

Чтобы это работало локально для тестирования, в вашем файле application-local.yml вы можете установить для секретного свойства что-то подходящее:

superSecretValue: dummy-for-testing-locally

Зависимость Azure, которую нужно добавить к build.gradle:

implementation "com.microsoft.azure:azure-keyvault-secrets-spring-boot-starter:2.1.6"

Запустите свой подпружиненный кувшин с azure в качестве активного профиля при развертывании и local при тестировании и разработке вне Azure. Это проверено и работает с контейнерами Azure Java.

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