Ошибка отсутствия секретного идентификатора при подключении к Vault с использованием облачного хранилища Spring

Я пытаюсь подключиться к хранилищу Spring, используя аутентификацию на основе ролей (проект весенней загрузки).

Согласно документации, я должен иметь возможность подключиться к пружинному хранилищу только с помощью Approle (режим pull). Однако при запуске приложения я получаю исключение отсутствия secrect-id.

http://cloud.spring.io/spring-cloud-vault/single/spring-cloud-vault.html#_approle_authentication.

Когда я передаю секретный идентификатор, я могу подключиться, и свойства / значения автоматически подключаются правильно.

Есть ли способ подключиться к хранилищу, используя «токен + роль / идентификатор роли», и Spring автоматически сгенерировать секретный идентификатор для меня во время выполнения, используя указанную информацию.

spring.cloud.vault:
    scheme: http
    host: <host url>
    port: 80
    token : <token>
    generic.application-name: vault/abc/pqr/test
    generic.backend: <some value>
    generic.default-context: vault/abc/pqr/test
    token: <security token>
    authentication: approle
    app-role:
      role-id: <role-id>

ПОМ:

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-vault-starter-config</artifactId>
        <version>1.0.0.BUILD-SNAPSHOT</version>
    </dependency>

Пожалуйста, дайте мне знать, если потребуется дополнительная информация.

Обновлять

@ mp911de, я пробовал в соответствии с вашим предложением, однако spring-cloud-vault выбирает свойства, установленные в bootstrap.yml, а не один набор внутри «onApplicationEvent», и поэтому решение не работает. Я попытался установить свойство методом «System.setProperty», но это событие не сработало.

Однако, если я устанавливаю свойства в методе main перед запуском, он работает должным образом. Но мне нужно сначала загрузить application.properties (нужно выбрать оттуда некоторую конфигурацию), и поэтому я не хочу писать там логику.

Что-то не так в моем подходе ??

@Component public class LoadVaultProperties implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {
private RestTemplate restTemplate = new RestTemplate();

@Override
public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
    try {
        String roleId = getRoleIdForRole(event); //helper method
        String secretId = getSecretIdForRoleId(event); //helper method

        Properties properties = new Properties();

        properties.put("spring.cloud.vault.app-role.secret-id", secretId);
        properties.put("spring.cloud.vault.app-role.role-id", roleId); 

        event.getEnvironment().getPropertySources().addFirst(new PropertiesPropertySource(
                PropertySourceBootstrapConfiguration.BOOTSTRAP_PROPERTY_SOURCE_NAME, properties));          
    } catch (Exception ex) {
        throw new IllegalStateException(ex);
    }
}

person Neeraj Kukreti    schedule 31.08.2017    source источник


Ответы (1)


Аутентификация AppRole Spring Vault поддерживает два режима, но не режим извлечения:

  1. Режим push, в котором вам нужно подать secret_id
  2. Аутентификация без secret_id, просто передав role_id. Этот режим требует, чтобы роль была создана без необходимости secret_id, установив bind_secret_id=false при создании роли.

Режим извлечения, как упоминается в документации Vault, требует, чтобы клиент знал о secret_id, полученном из обернутого ответа. Spring Vault не извлекает упакованный secret_id, но я думаю, что это было бы достойным улучшением.

Обновление: настройка свойств системы перед запуском приложения:

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {

        System.setProperty("spring.cloud.vault.app-role.role-id", "…");
        System.setProperty("spring.cloud.vault.app-role.secret-id", "…");

        SpringApplication.run(MyApplication.class, args);
}

Использованная литература:

person mp911de    schedule 31.08.2017
comment
Спасибо @ mp911de за ответ. В этом случае, в какой момент времени мне нужно получить secret_id в моем коде и установить его в свойствах приложения, чтобы он автоматически выбирался загрузкой Spring без исключения отсутствия secrect-id. - person Neeraj Kukreti; 04.09.2017
comment
Перед запуском SpringApplication. Вы можете сохранить его как системное свойство или создать источник свойств и зарегистрировать его в SpringApplication перед вызовом run(…). - person mp911de; 04.09.2017
comment
Я попробовал решение, предложенное вами, но столкнулся с проблемой и с этим подходом. Я обновил свой вопрос, добавив более подробную информацию. Спасибо - person Neeraj Kukreti; 04.09.2017
comment
onApplicationEvent(…) слишком поздно, потому что все свойства уже связаны в это время. - person mp911de; 04.09.2017
comment
В нашем случае токен и роль будут находиться на сервере конфигурации Spring Cloud (сейчас он локальный, но это план), и, таким образом, секретный идентификатор не может быть получен, пока не будет загружена указанная конфигурация. - person Neeraj Kukreti; 04.09.2017
comment
Давайте продолжим это обсуждение в чате. - person Neeraj Kukreti; 04.09.2017
comment
Исправлено в spring-config-vault 2.1. См. github.com/spring-cloud/spring-cloud-vault/issues. / 222 - person willome; 03.10.2018
comment
Мне нужно загрузить секретный идентификатор из одной из двух переменных среды в зависимости от того, какой профиль в настоящее время используется для запуска весенней загрузки. Например. если профиль - это dev, мне нужно получить переменную env SPRING_CLOUD_VAULT_APP_ROLE_SECRET_ID_DEV linux env, в противном случае, если профиль prod, мне нужно получить SPRING_CLOUD_VAULT_APP_ROLE_SECRET_ID_PROD. Учитывая тот факт, что я не могу получить доступ к @Autowired private Environment environment;, чтобы проверить текущий профиль в основной функции, как можно реализовать такую ​​логику? - person Ievgen; 06.08.2020