【问题标题】:How to retrieve DB credentials from external file for Liquibase config如何从外部文件中检索 Liquibase 配置的数据库凭据
【发布时间】:2022-06-16 16:27:09
【问题描述】:

我有一个在 Azure Kubernetes 中运行的 Spring Boot 应用程序。该应用程序使用 Liquibase (Liquibase-Core 4.4.3) 在启动时为应用程序创建和修改数据库表。出于安全原因,应用程序对 Liquibase 用户具有不同的数据库凭据,并且 Liquibase 用户凭据是通过 application.properties 文件添加的,如下所示,使用环境变量:

spring.liquibase.url=${env_db_connection_url}
spring.liquibase.user=${env_db_lb_username}
spring.liquibase.password=${env_db_lb_password}

我们使用此方法添加凭据和环境变量,因为凭据因应用程序部署到的环境(例如 UAT、生产环境)而异,这允许管道处理差异而无需对代码。

我们的安全团队希望我们停止使用环境变量,因此我们正转向使用 csi 驱动程序来处理任何敏感信息。这有效地创建了类似于位于应用程序外部但在同一个容器中的外部属性文件。

但是,我现在无法解析 Liquibase 的数据库凭据,而且我不知道实现所需功能的最佳方法。我需要一个解决方案,我们仍然可以标记代码中的值,但它能够从外部属性文件中检索秘密值(数据库密码等)。

正如您可以想象的那样,对这些值进行硬编码甚至只是对它们进行加密都无法解决问题,因为环境之间的值会发生变化。我们能够在应用程序中检索值,但是我觉得这在过程中完成得太晚了,因为 Liquibase 在应用程序代码运行之前已经尝试启动(因此失败)。

任何帮助或建议将不胜感激。

【问题讨论】:

  • 我手头没有完整的例子因此评论,你很可能需要在一个可以从容器中读取这些外部属性文件的类中实现ApplicationContextInitializer,然后将它们作为弹簧属性注入在应用程序上下文中。
  • 感谢您的建议。如果我有任何快乐,我会看看并更新问题

标签: java spring-boot liquibase


【解决方案1】:

我用这样的方法解决了类似的问题。

我在 Jenkins 服务器上运行东西。不过没必要

我不在文件中保存数据库连接信息。将文件发送到服务器后,我使用 bash 脚本将数据库连接信息添加到这些文件中。数据库连接信息在服务器上,而不是版本控制系统上。

因此,我对未经授权的人隐藏了一些数据库连接信息(只有有权访问服务器的人才能访问它)。

A- 文件示例; liquibase.prod.properties 没有数据库数据

changeLogFile=./master.xml
logFile: liquibase.prod.log
logLevel: INFO
liquibase.hub.mode=off

B- 我在服务器上保持数据库连接的文件示例

spring.liquibase.url = my_env_db_connection_url
spring.liquibase.user= my_env_db_lb_username
spring.liquibase.password= my_env_db_lb_password

C- 我正在使用 Jenkins 和 cmd bash 向该文件添加行

type E:\file1.cfg >> file2.cfg

【讨论】:

    猜你喜欢
    • 2011-01-23
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 2014-08-13
    相关资源
    最近更新 更多