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

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

В соответствии с документацией, я должен иметь возможность подключаться к пружинному хранилищу только при использовании подходящего режима. Тем не менее, я получаю secrect-id пропущенное исключение при запуске приложения.

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

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

Есть ли способ, которым я могу соединиться с хранилищем, используя "токен + роль / идентификатор роли" и 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>

POM:

<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);
    }
}

1 ответ

Проверка подлинности AppRole в Spring Vault поддерживает два режима, но не режим извлечения:

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

Режим Pull, как указано в документации 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);
}

Рекомендации:

Другие вопросы по тегам