当前位置: 首页 > 知识库问答 >
问题:

Spring云配置-Vault和JDBC后端,在Vault中具有JDBC凭据

葛泳
2023-03-14

我试图修改我们目前的Spring云配置服务器,它只有一个JDBC后端,以包括一个保险库后端,以使JDBC连接证书保密。

库:

 Listener 1: tcp (addr: "127.0.0.1:8400", cluster address: "127.0.0.1:8401", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")

C:\apps\HashiCorp>vault kv get secret/my-secrets
=============== Data ===============
Key                           Value
---                           -----
spring.datasource.password    yadayadayada
spring.datasource.username    cobar

bootstrap.yml

server:
  port: 8888
spring:
  application:
    name: config-server
  cloud:
    config:
      allowOverride: true
      server:
        jdbc:
          sql: SELECT prop_key, prop_value from CloudProperties where application=? and profile=? and label=?
          order: 2 
        #https://cloud.spring.io/spring-cloud-config/reference/html/#vault-backend
        vault:
          scheme: http
          host: localhost
          port: 8400
          defaultKey: my-secrets
          order: 1

应用程序. yml

spring:
  main:
    banner-mode: off
    allow-bean-definition-overriding: true
  datasource:
    url: jdbc:mysql://localhost/bootdb?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false
    #username: cobar
    #password: yadayadayada
    driverClassName: com.mysql.jdbc.Driver
    hikari:
      connection-timeout: 60000
      maximum-pool-size: 5
  cloud:
    vault:
      scheme: http
      host: localhost
      port: 8400
      defaultKey: my-secrets
      token: root.RIJQjZ4jRZUS8mskzfCON88K

没有从vault中检索spring.datasource用户名和密码。

2021-12-01 12:43:39.927  INFO 5992 --- [  restartedMain]: The following profiles are active: jdbc,vault
2021-12-01 12:43:46.123 ERROR 5992 --- [  restartedMain] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool initialization.
Login failed for user ''. ClientConnectionId:a32

共有1个答案

凌和颂
2023-03-14

将属性从引导程序移动到应用程序上下文。

调用Vaultendpoint以获取机密并使用这些机密将数据源配置到JDBC后端。

@Slf4j
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

    public static final String VAULT_URL_FRMT = "%s://%s:%s/v1/secret/%s";

    @Autowired
    private Environment env;

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(ConfigServerApplication.class);
        app.addListeners(new ApplicationPidFileWriter());
        app.addListeners(new WebServerPortFileWriter());
        app.run(args);
    }
    
    
    @Order(1)
    @Bean("restTemplate")
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @Configuration
    public class JdbcConfig {

        @Autowired
        private RestTemplate restTemplate;

        @Bean
        public DataSource getDataSource() {
            Secrets secrets = findSecrets();
            DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
            dataSourceBuilder.url(secrets.getData().get("spring.datasource.url"));
            dataSourceBuilder.username(secrets.getData().get("spring.datasource.username"));
            dataSourceBuilder.password(secrets.getData().get("spring.datasource.password"));
            return dataSourceBuilder.build();
        }

        private Secrets findSecrets() {
            HttpHeaders httpHeaders = new HttpHeaders();
            httpHeaders.set("X-Vault-Token", env.getProperty("spring.cloud.vault.token"));
            HttpEntity request = new HttpEntity(httpHeaders);
            String url = String.format(VAULT_URL_FRMT,
                env.getProperty("spring.cloud.vault.scheme"),
                env.getProperty("spring.cloud.vault.host"),
                env.getProperty("spring.cloud.vault.port"),
                env.getProperty("spring.cloud.vault.defaultKey")
            );
            return restTemplate.exchange(url, HttpMethod.GET, request, Secrets.class, 1).getBody();
        }
    }
}
@Getter
@Setter
public class Secrets implements Serializable {

    private String request_id;
    private String lease_id;
    private boolean renewable;
    private Duration lease_duration;
    private Map<String, String> data;

}

现在,您有一个带有 JDBC 后端的云配置,您可以将数据库属性保密。

 类似资料:
  • 我正在使用Spring Cloud Config Server为我的客户端应用程序提供配置。为了方便机密配置,我使用HashiCorp Vault作为后端。对于其余的配置,我使用GIT repo。因此,我在复合模式下配置了配置服务器。请参阅我的配置服务器引导。yml如下:- 这一切都按预期工作。但是,我使用的代币使用Vault auth策略进行保护。见下文:- 我的问题是,我没有在所有这些范围内存

  • 不是为Spring Cloud Config Server提供一个AppRole或Static令牌来访问所有应用程序的所有机密,是否可以配置Spring Cloud Vault Config来在配置请求中使用给定的令牌? 这种通信将通过带有标头中的令牌的双向SSL进行。向外发送这样的令牌并不理想,但在这种情况下似乎是合适的解决方案。 请记住,这是一个Spring Cloud Config服务器,它

  • 我想设置一个能够使用Vault和git作为配置后端的配置服务器。我不太明白有关配置的一些事情: 为什么我需要设置<code>spring.cloud.config.server。vault和? 我真的需要两个都设置吗? 它们之间的区别是什么? 我只希望我的客户能够直接从配置服务器获取配置,而不管Vault是否存在。 因此,客户端仅在配置服务器上请求,并且配置服务器被用于从Vault获取机密。

  • 以下的区别是什么? Spring Cloud Vault-http://Cloud.spring.io/spring-cloud-vault/ 带有保险库后端的Spring Cloud Config服务器-http://Cloud.spring.io/spring-cloud-static/camden.sr4/#_spring_cloud_config_server

  • 我们正在使用SpringCloud2.2。6.RELEASE使用vault存储我们的微服务,我们的vault团队对请求数量表示不满,他们提供了Splunk日志访问,我看到许多请求如下: 我确实看到了对秘密/数据/应用程序等的正常请求,但是为什么会有对秘密/数据/应用程序的请求呢? 关于如何或在哪里制作这个有什么想法吗?

  • 我是HashiCorp Vault的新手,并设置了Spring云配置服务器,将Vault作为存储机密,密钥等的后端。 问题是我能够访问默认级别存储的机密,例如: 但是,我无法访问我存储在Vault中的配置文件特定机密。无论我将机密存储在哪个配置文件中,API始终返回默认值而不是配置文件特定值。 例如: 以下是存储在Vault开发实例(1.1.3版)上的秘密: Spring云配置服务器applica