【问题标题】:Spring boot application properties load process change programatically to improve securitySpring Boot 应用程序属性加载过程以编程方式更改以提高安全性
【发布时间】:2018-10-17 11:19:28
【问题描述】:

我在应用程序属性中定义了带有数据库凭据的 Spring Boot 微服务。

spring.datasource.url=<<url>>
spring.datasource.username=<<username>>
spring.datasource.password=<<password>>

我们不使用spring数据源手动创建连接。只有 Spring 使用 JPA 创建数据库连接。(org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration)

我们只提供应用程序属性,但 spring 会自动创建连接以与数据库连接池一起使用。

我们要求在不使用明文形式的数据库属性的情况下增强安全性。两种可能的方法。

  1. 加密数据库凭据
  2. 使用 AWS 密钥管理器。 (然后通过应用程序加载获取凭据)

对于option1,可以使用jasypt,因为我们只是提供属性,不想手动创建数据源,spring框架怎么理解是问题。如果更好,我可以获得一些工作样本或方法。

关于选项2,

  • 首先我们需要定义secretName。
  • 使用 secertName 并从 AWS Secret Manager 获取数据库凭证。
  • 以编程方式更新 application.properties 以了解 Spring 框架。 (我需要知道这一步)

我需要使用选项 1 和选项 2。提到了每个选项的问题。

【问题讨论】:

    标签: spring spring-boot spring-data-jpa aws-java-sdk


    【解决方案1】:

    您可以做的是为您的属性使用环境变量。你可以像这样使用它们:

    spring.datasource.url=${SECRET_URL}
    

    然后您可以检索这些并使用 ProcessBuilder 启动您的 Spring 流程。 (或以任何其他方式设置变量)

    【讨论】:

    • 我们不是手动启动应用程序,只使用 docker 镜像。要使用环境变量,我们必须在启动应用程序时定义它们。由于我们使用的是 docker,需要在 docker 文件中重新定义。
    • 您还可以在 main 方法中从外部源(AWS 机密)加载它们,并使用 app.setDefaultProperties(Collections.singletonMap("spring.datasource.url", &lt;value&gt;)); 设置应用程序属性
    【解决方案2】:

    我找到了解决问题的方法。

    我们需要在spring.factories文件中定义org.springframework.context.ApplicationListener。它应该定义所需的应用程序上下文侦听器,如下所示。

    org.springframework.context.ApplicationListener=com.sample.PropsLoader
    

    PropsLoader 类是这样的。

    public class PropsLoader implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {
    
    
    @Override
    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
    
        ConfigurableEnvironment environment = event.getEnvironment();
    
        String appEnv          = environment.getProperty("application.env");
        //set new properties based on the application environment.  
        // calling other methods and depends on the enviornment and get the required value set  
        Properties props       = new Properties();
        props.put("new_property", "value");
    
        environment.getPropertySources().addFirst(new PropertiesPropertySource("props", props));
    
    }
    
    }
    

    spring.factories 文件应在resources 包和META-INF 下定义 文件夹。

    这将在加载任何其他 bean 之前使用新属性设置应用程序上下文。

    【讨论】:

      猜你喜欢
      • 2016-05-22
      • 2016-11-17
      • 1970-01-01
      • 2012-12-19
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      相关资源
      最近更新 更多