如何在 PCF 中存储一个小的机密文件,以便 Spring 启动应用程序可以访问它
How to store a small Confidential file in PCF so that a Spring boot App can access it
我必须将我的 Kafka Keystore.jks
和 Truststore.jks
文件存储在 PCF 中,以便我的 spring 引导应用程序在那里运行可以使用它来访问集群。
我想到的解决方案如下。
我的 Jenkins 管道连接到 Hashicorp Vault。所以我可以将 BASE64 编码的内容保存在 Vault 中,并在部署期间从那里读取它。但我不知道如何在我的 Java 应用程序启动之前将该内容作为文件转储到 PCF VM 中。我试图追求 .profile
路线;不幸的是 Java 构建包不支持 .profile
。任何指点将不胜感激,谢谢!
您可以使用 spring-cloud-vault
插件让 spring-boot bootstrap 在应用程序启动时从保险库中获取您的秘密。
Spring-cloud-vault plugin
但我不明白为什么您需要将 JKS 文件放在保险库中。
这些 JKS 文件受密码保护,这意味着您可以将 jks 文件作为资源捆绑在您的 JAR 中,并在应用程序启动时获取从保险库打开这些 JKS 文件所需的秘密密码
几个选项:
将受密码保护的 JKS 文件作为文件放入您的应用程序中。使用环境变量、用户提供的服务、通过 Spring 配置服务器或通过 CredHub 服务代理传递密码以读取它们。
与 #1 相同,但创建一个用于安装 JKS 文件的小型自定义构建包。首先使用平台 multi-buildpack 功能 运行 您的自定义构建包,然后使用 Java 构建包。如果您有许多使用相同 JKS 文件的应用程序,此选项会更方便一些。
Base64 编码您的 JKS 文件并将它们填充到环境变量、用户提供的服务、Spring 配置服务器或通过 CredHub 服务代理。在您的应用程序启动时检索并解码它们,在 .profile
文件或应用程序本身中。
构建 JAR 文件时,您可以 运行 运行 jar uf <path/to/file.jar> .profile
它将 .profile
文件添加到 JAR 的根目录。
您可以通过运行宁jar tf <path/to/file.jar>
确认它在正确的位置。输出应该是这样的...
...
BOOT-INF/lib/jackson-annotations-2.9.0.jar
BOOT-INF/lib/jackson-core-2.9.6.jar
BOOT-INF/lib/reactive-streams-1.0.2.jar
BOOT-INF/lib/logback-core-1.2.3.jar
BOOT-INF/lib/log4j-api-2.10.0.jar
<rest of your files here>
...
.profile
注意 .profile
前面没有路径。这就是它需要正常工作的地方。
希望对您有所帮助!
我创建了一个新的供应构建包来帮助解决这个问题
https://github.com/starkandwayne/dot-profile-buildpack
cf push javaapp --path build/jibs/myapp-1.0.0.jar \
-b https://github.com/starkandwayne/dot-profile-buildpack \
-b java_buildpack \
--no-start
cf set-env javaapp PROFILED "$(cat <<SHELL
#!/bin/bash
cat > config.json <<JSON
{
"some": "config"
}
JSON
SHELL
)"
cf start javaapp
当然,您也可以在 cf push -f manifest.yml
.
中设置 $PROFILED
env var
我必须将我的 Kafka Keystore.jks
和 Truststore.jks
文件存储在 PCF 中,以便我的 spring 引导应用程序在那里运行可以使用它来访问集群。
我想到的解决方案如下。
我的 Jenkins 管道连接到 Hashicorp Vault。所以我可以将 BASE64 编码的内容保存在 Vault 中,并在部署期间从那里读取它。但我不知道如何在我的 Java 应用程序启动之前将该内容作为文件转储到 PCF VM 中。我试图追求 .profile
路线;不幸的是 Java 构建包不支持 .profile
。任何指点将不胜感激,谢谢!
您可以使用 spring-cloud-vault
插件让 spring-boot bootstrap 在应用程序启动时从保险库中获取您的秘密。
Spring-cloud-vault plugin
但我不明白为什么您需要将 JKS 文件放在保险库中。 这些 JKS 文件受密码保护,这意味着您可以将 jks 文件作为资源捆绑在您的 JAR 中,并在应用程序启动时获取从保险库打开这些 JKS 文件所需的秘密密码
几个选项:
将受密码保护的 JKS 文件作为文件放入您的应用程序中。使用环境变量、用户提供的服务、通过 Spring 配置服务器或通过 CredHub 服务代理传递密码以读取它们。
与 #1 相同,但创建一个用于安装 JKS 文件的小型自定义构建包。首先使用平台 multi-buildpack 功能 运行 您的自定义构建包,然后使用 Java 构建包。如果您有许多使用相同 JKS 文件的应用程序,此选项会更方便一些。
Base64 编码您的 JKS 文件并将它们填充到环境变量、用户提供的服务、Spring 配置服务器或通过 CredHub 服务代理。在您的应用程序启动时检索并解码它们,在
.profile
文件或应用程序本身中。
构建 JAR 文件时,您可以 运行 运行 jar uf <path/to/file.jar> .profile
它将 .profile
文件添加到 JAR 的根目录。
您可以通过运行宁jar tf <path/to/file.jar>
确认它在正确的位置。输出应该是这样的...
...
BOOT-INF/lib/jackson-annotations-2.9.0.jar
BOOT-INF/lib/jackson-core-2.9.6.jar
BOOT-INF/lib/reactive-streams-1.0.2.jar
BOOT-INF/lib/logback-core-1.2.3.jar
BOOT-INF/lib/log4j-api-2.10.0.jar
<rest of your files here>
...
.profile
注意 .profile
前面没有路径。这就是它需要正常工作的地方。
希望对您有所帮助!
我创建了一个新的供应构建包来帮助解决这个问题
https://github.com/starkandwayne/dot-profile-buildpack
cf push javaapp --path build/jibs/myapp-1.0.0.jar \
-b https://github.com/starkandwayne/dot-profile-buildpack \
-b java_buildpack \
--no-start
cf set-env javaapp PROFILED "$(cat <<SHELL
#!/bin/bash
cat > config.json <<JSON
{
"some": "config"
}
JSON
SHELL
)"
cf start javaapp
当然,您也可以在 cf push -f manifest.yml
.
$PROFILED
env var