【问题标题】:"Secret id missing" error while connecting to Vault using Spring cloud vault使用 Spring Cloud Vault 连接到 Vault 时出现“Secret id missing”错误
【发布时间】:2018-02-09 05:21:17
【问题描述】:

我正在尝试使用基于角色的身份验证(spring boot 项目)连接到 spring vault。

根据文档,我应该只能使用 approle(拉模式)连接到 spring vault。但是,我在应用程序启动时遇到了 secrect-id 缺失异常。

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

当我通过时,秘密 ID 也可以连接,并且属性/值正在正确地自动连接。

有什么方法可以使用“token + role/role-id”连接到保险库,并在运行时使用提到的信息自动为我生成 secret-id。

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 before run 方法中设置属性,它会按预期工作。但我需要先加载 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);
    }
}

【问题讨论】:

    标签: spring-cloud hashicorp-vault spring-vault spring-cloud-vault-config


    【解决方案1】:

    Spring Vault 的 AppRole 认证支持两种模式,但不支持拉取模式:

    1. 需要提供secret_id 的推送模式
    2. 仅通过 role_id 即可在没有 secret_id 的情况下进行身份验证。此模式需要创建角色而不需要 secret_id,方法是在创建角色时设置 bind_secret_id=false

    保险柜文档中提到的拉取模式要求客户端了解从包装响应中获得的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);
    }
    

    参考文献:

    【讨论】:

    • 感谢@mp911de 的回复。在这种情况下,在什么时候,我需要在我的代码中获取 secret_id 并将其设置为应用程序属性,以便 Spring boot 自动选择它而不会出现 secrect-id 丢失异常
    • 在您启动 SpringApplication 之前。您可以将其存储为系统属性或创建属性源并在调用run(…) 之前将其注册到run(…)
    • 我尝试了您建议的解决方案,但也面临这种方法的问题。我已经用更多细节更新了我的问题。谢谢
    • onApplicationEvent(…) 为时已晚,因为当时所有属性都已绑定。
    • 在我们的例子中,令牌和角色将驻留在 spring 云配置服务器中(现在它在本地,但这是计划),因此在加载提到的配置之前无法获取 secret-id。
    猜你喜欢
    • 2021-12-17
    • 2022-09-24
    • 2023-01-20
    • 2019-05-11
    • 1970-01-01
    • 2019-11-23
    • 2020-12-10
    • 2018-09-27
    • 2021-08-29
    相关资源
    最近更新 更多