【问题标题】:Pulling db secrets from vault to execute Jooq not working on localhost从保险库中提取数据库机密以执行 Jooq 不在本地主机上工作
【发布时间】:2019-07-05 01:50:58
【问题描述】:

我们正在使用jooq 生成代码来查询我们的数据库。为了让jooq 运行,我们使用如下环境变量提供配置:

<plugin>
    <groupId>org.jooq</groupId>
    <artifactId>jooq-codegen-maven</artifactId>
    <version>${jooq.version}</version>

    <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>

    <configuration>
        <jdbc>
            <driver>org.postgresql.Driver</driver>
            <url>${DB_URL}</url>
            <user>${DB_USER}</user>
            <password>${DB_PASSWORD}</password>
        </jdbc>

        <generator>
            <name>org.jooq.codegen.JavaGenerator</name>

            <database>
                <name>org.jooq.meta.postgres.PostgresDatabase</name>
                <includes>.*</includes>
                <excludes />
                <dateAsTimestamp>true</dateAsTimestamp>
                <inputSchema>myDb</inputSchema>
            </database>

            <generate>
                <deprecated>false</deprecated>
                <instanceFields>true</instanceFields>
            </generate>

            <target>
                <packageName>com.myapp.jooq</packageName>
                <directory>target/generated-sources/jooq-postgres</directory>
            </target>
        </generator>
    </configuration>

    <dependencies>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>${postgresql.version}</version>
        </dependency>
    </dependencies>
</plugin>

为了设置这些属性DB_URLDB_USERDB_PASSWORD,我们使用vault-maven-plugin,它在 maven 生命周期中的 jooq 之前执行。这是我们使用的配置:

<plugin>
    <groupId>com.deciphernow</groupId>
    <artifactId>vault-maven-plugin</artifactId>
    <version>1.0.0</version>
    <executions>
        <execution>
            <id>pull</id>
            <phase>initialize</phase>
            <goals>
                <goal>pull</goal>
            </goals>
            <configuration>
                <servers>
                    <server>
                        <url>http://my.hostedvault.net:8200</url>
                        <token>myTokenHere</token>
                        <paths>
                            <path>
                                <name>secret/myApp</name>
                                <mappings>
                                    <mapping>
                                        <key>spring.datasource.username</key>
                                        <property>DB_USER</property>
                                    </mapping>
                                    <mapping>
                                        <key>spring.datasource.password</key>
                                        <property>DB_PASSWORD</property>
                                    </mapping>
                                    <mapping>
                                        <key>spring.datasource.url</key>
                                        <property>DB_URL</property>
                                    </mapping>
                                </mappings>
                            </path>
                        </paths>
                    </server>
                </servers>
            </configuration>
        </execution>
    </executions>
</plugin>

这运行得很好,但是当我们将插件更改为 localhost:8200 时,它总是返回 404 错误:

[错误] 无法在项目 myApp 上执行目标 com.deciphernow:vault-maven-plugin:1.0.0:pull (pull):抛出异常。 Vault 以 HTTP 状态代码响应:404 -> [Help 1]

这仅发生在 vault-maven-plugin 中使用的 localhost 保险库中。所以,这看起来像是 maven 插件上的一个错误(我确认我的 localhost vault 工作属性和 spring-boot 可以毫无问题地从中提取)。知道如何为 Jooq 提供存储在保险库中的凭据属性吗?

【问题讨论】:

    标签: java spring-boot jooq hashicorp-vault


    【解决方案1】:

    我发现了问题,所以发布答案以防其他人遇到同样的问题。

    我在dev 模式下运行vault,所以当我们使用此模式时,保险库会将/data 附加到uri。我是这样开始保管库的:

    docker run -p 8200:8200 --name='vault' --cap-add=IPC_LOCK -e 'VAULT_DEV_ROOT_TOKEN_ID=myroottoken' vault
    

    插件vault-maven-plugin 似乎与在server(生产)模式下运行的vault 一起工作。所以,如果我们用这个命令启动 Vault 一切正常:

    docker container run --cap-add=IPC_LOCK -e 'VAULT_LOCAL_CONFIG={"backend": {"file": {"path": "/vault/file"}}, "default_lease_ttl": "168h", "max_lease_ttl": "720h", "ui": "true", "listener": {"tcp": {"address": "0.0.0.0:8200", "tls_disable": "true"}}}' -e VAULT_ADDR=http://127.0.0.1:8200 -e VAULT_API_ADDR=http://127.0.0.1:8200 -p 8200:8200 vault server
    

    请注意,您必须通过以下方式进入容器来打开保险库:

    docker container exec -it <containerId> /bin/sh
    

    然后发出这个命令:vault operator init

    【讨论】:

      猜你喜欢
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 2021-08-09
      相关资源
      最近更新 更多