为生产配置 Spring Cloud Config Server 和 Spring Cloud Vault
Configuring Spring Cloud Config Server and Spring Cloud Vault for production
我正在尝试设置由 Spring Cloud Vault 秘密管理支持的 Spring Cloud Config Server。我对 Spring 比较陌生,但我已尝试按照此处的说明和示例进行操作:-
http://cloud.spring.io/spring-cloud-vault-config/
一切正常,只要您遵循默认设置,例如 vault 端点的 http、localhost 和 8200 以及 tls_disable = 1 关闭 SSL。然而,这些不是任何真实环境的实用设置,而且几乎没有任何例子可以帮助解决这个问题。谁能帮忙举个例子?
我已成功设置启用 TLS 的保管库。我已经成功设置了一个使用自签名证书连接的配置服务器。我什至可以将一个秘密值注入配置服务器并通过 @Value
和 @PostConstruct
.
公开它
所有这些都有效。但是,当我尝试利用 Spring Conig 端点访问保险库时,我得到以下信息:-
{
"timestamp": 1486413850574,
"status": 500,
"error": "Internal Server Error",
"exception": "org.springframework.web.client.ResourceAccessException",
"message": "I/O error on GET request for \"http://127.0.0.1:8200/v1/secret/myapp\": Connection refused: connect; nested exception is java.net.ConnectException: Connection refused: connect",
"path": "/myapp/default"
}
即使我在 bootstrap.yml
中设置了覆盖,配置服务器仍使用默认值。:-
server:
port: 8888
spring:
profiles:
active: vault
spring.cloud.vault:
host: myhost.mydomain.com
port: 8200
scheme: https
authentication: TOKEN
token: 0f1887c3-d8a8-befd-a5a2-01e4e066c50
ssl:
trust-store: configTrustStore.jks
trust-store-password: changeit
如您所见,它应该指向 myhost.mydomain.com 而不是
127.0.0.1 并且它应该使用 https,而不是 http 作为协议方案。
我不确定为什么它对配置服务器端点使用这些默认值,但在 spring 云保管库启动期间使用正确的设置。我正在使用 Spring Dalsten.M1 和 Spring Cloud Vault 1.0.0.M1 的所有最新稳定版本。我意识到这些是里程碑版本。我也尝试过 Camden 和 Brixton 组合,但没有成功。如果需要,我可以提供代码。
非常感谢任何帮助。
正如我在对 spensergibb 的回复中提到的,我自己已经成功地解决了这个问题。根据他的评论,我将阐明我的意图,因为这将有助于对问题达成共识。我正在尝试做两件事:-
建立一个使用 Vault 作为后端的配置服务器(与默认 GIT 后端相反)并将 Vault API 公开给客户端应用程序(通过 TLS ) 以便他们可以取回自己的秘密。我不希望我所有的客户端应用程序都直接连接到 Vault。我希望他们通过让配置服务器连接到 Vault 从配置服务器获取配置。直到昨晚,我才能够实现这个目标,除非我将所有内容都设置为默认设置,禁用 TLS 并使用环回地址,Vault 软件的端口 8200 等。显然,默认设置对于我们部署的任何环境都不实用。我会提到 spencergibb 发布的 link 确实帮助我理解了为什么这不起作用,但原因的微妙之处是我之前错过它的原因。请继续阅读我的解释。
我希望配置服务器直接从 Vault 配置自身。也就是说,通过 Spring Cloud Vault Config 连接到 Vault。如文档中所述,这对我立即起作用。然而,这个目标有点微不足道,因为我目前没有真正的用例。但我想了解它是否可以完成,因为我没有看到不这样做的真正原因,而且这似乎是集成 Vault 的良好第一步。
这两种功能之间的区别帮助我理解了问题源于以下事实:Spring Cloud Config Server 和 Spring Cloud Vault 似乎使用两个不同的 bean 来注入 Vault 配置特性。 Spring Cloud Config Server 使用带有 @ConfigurationProperties("spring.cloud.config.server.vault") 注释的 VaultEnvironmentRepository,Spring Cloud Vault 使用带有 @ConfigurationProperties("spring.cloud.vault") 注释的 VaultProperties。
这导致我向我的 bootstrap yml 添加了两个不同的配置。
server:
port: 8888
spring:
profiles:
active: local, vault
application:
name: quoting-domain-configuration-server
cloud:
vault:
host: VDDP03P-49A26EF.lm.lmig.com
port: 8200
scheme: https
authentication: TOKEN
token: 0f1997c3-d8a8-befd-a5a2-01e4e066c50a
ssl:
trust-store: configTrustStore.jks
trust-store-password: changeit
config:
server:
vault:
host: VDDP03P-49A26EF.lm.lmig.com
port: 8200
scheme: https
authentication: TOKEN
token: 0f1997c3-d8a8-befd-a5a2-01e4e066c50a
注意相同的配置细节。只是不同的 yml 路径。这是我错过的微妙之处,因为我首先让目标 1 开始工作,并假设相同的配置适用于两个目标。 (注意:令牌和密码是人为设计的)。
除了 SSL 握手错误外,这几乎可以正常工作。如您所见,spring.cloud.config.server.vault 路径上没有设置 SSL 属性。 VaultProperties bean 不支持它们。我不确定如何处理这个问题(也许是我找不到的另一个 non-vault 特定 bean)。我的解决方案是像这样简单地强制自己进行证书配置:-
@SpringBootApplication
@EnableConfigServer
public class Application
{
public static void main(String[] args)
{
System.setProperty("javax.net.ssl.trustStore",
Application.class.getResource("/configTrustStore.jks").getFile());
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
SpringApplication.run(Application.class, args);
}
}
这个 SSL 解决方案非常丑陋。我确信必须有更好的方法来完成这一部分。所以我愿意接受其他建议。但是,一旦我完成了上述所有步骤,现在一切正常。
感谢您的来信。我正在努力让这个工作。我能够让客户端服务连接到 Spring Cloud Config 服务器和 Vault 服务器,但我无法让 Spring Cloud Config 服务器连接到 Vault 服务器。
在将您的配置复制到我的 Spring 云配置服务器后,我什至感到很吃力。虽然我最终让它与您的配置一起工作,但我能够将它缩减很多。关键是令牌不属于 Spring Cloud Config 服务器。它属于客户端。
我在浏览器中尝试 http://localhost:8888/{application}/default
但得到以下信息:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Thu May 11 14:21:31 EDT 2017
There was an unexpected error (type=Bad Request, status=400).
Missing required header: X-Config-Token
我使用 PostMan 发送了包含 Vault 令牌的 X-Config-Token
header 请求,它成功了。
这是我的最终配置。
server:
port: ${PORT:8888}
management:
context-path: /manage
security:
enabled: true
spring:
profiles:
active: git,vault
application:
name: config-server
cloud:
config:
server:
git:
order: 1
uri: file:///temp/config-server/config
vault:
order: 0
host: localhost
port: 8200
scheme: http
看来您需要将令牌添加到客户端。也许使用 spring.cloud.config.token
.
改为
@SpringBootApplication
@EnableConfigServer
public class Application
{
public static void main(String[] args)
{
System.setProperty("javax.net.ssl.trustStore",
Application.class.getResource("/configTrustStore.jks").getFile());
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
SpringApplication.run(Application.class, args);
}
}
写
bootstrap yml ->
javax.net.ssl.trustStore: /configTrustStore.jks
javax.net.ssl.trustStorePassword: changeit
虽然我回复晚了。但是我能够配置 spring 云配置服务器以使用 Vault 作为后端,并通过证书进行 CERT 身份验证。此外,您不需要在 GET 请求中发送 X-Config-Token。因此,您的 config-server GET 请求将以与 GITHUB 相同的方式工作,因为 backend.As 我的实现将即时获取令牌并通过附加 header 更改传入请求.我建议检查我的教程和 github 存储库中的所有步骤。
和GitHub 存储库:https://github.com/java-developer-raman/config-server-vault-backend
我正在尝试设置由 Spring Cloud Vault 秘密管理支持的 Spring Cloud Config Server。我对 Spring 比较陌生,但我已尝试按照此处的说明和示例进行操作:-
http://cloud.spring.io/spring-cloud-vault-config/
一切正常,只要您遵循默认设置,例如 vault 端点的 http、localhost 和 8200 以及 tls_disable = 1 关闭 SSL。然而,这些不是任何真实环境的实用设置,而且几乎没有任何例子可以帮助解决这个问题。谁能帮忙举个例子?
我已成功设置启用 TLS 的保管库。我已经成功设置了一个使用自签名证书连接的配置服务器。我什至可以将一个秘密值注入配置服务器并通过 @Value
和 @PostConstruct
.
所有这些都有效。但是,当我尝试利用 Spring Conig 端点访问保险库时,我得到以下信息:-
{
"timestamp": 1486413850574,
"status": 500,
"error": "Internal Server Error",
"exception": "org.springframework.web.client.ResourceAccessException",
"message": "I/O error on GET request for \"http://127.0.0.1:8200/v1/secret/myapp\": Connection refused: connect; nested exception is java.net.ConnectException: Connection refused: connect",
"path": "/myapp/default"
}
即使我在 bootstrap.yml
中设置了覆盖,配置服务器仍使用默认值。:-
server:
port: 8888
spring:
profiles:
active: vault
spring.cloud.vault:
host: myhost.mydomain.com
port: 8200
scheme: https
authentication: TOKEN
token: 0f1887c3-d8a8-befd-a5a2-01e4e066c50
ssl:
trust-store: configTrustStore.jks
trust-store-password: changeit
如您所见,它应该指向 myhost.mydomain.com 而不是 127.0.0.1 并且它应该使用 https,而不是 http 作为协议方案。
我不确定为什么它对配置服务器端点使用这些默认值,但在 spring 云保管库启动期间使用正确的设置。我正在使用 Spring Dalsten.M1 和 Spring Cloud Vault 1.0.0.M1 的所有最新稳定版本。我意识到这些是里程碑版本。我也尝试过 Camden 和 Brixton 组合,但没有成功。如果需要,我可以提供代码。
非常感谢任何帮助。
正如我在对 spensergibb 的回复中提到的,我自己已经成功地解决了这个问题。根据他的评论,我将阐明我的意图,因为这将有助于对问题达成共识。我正在尝试做两件事:-
建立一个使用 Vault 作为后端的配置服务器(与默认 GIT 后端相反)并将 Vault API 公开给客户端应用程序(通过 TLS ) 以便他们可以取回自己的秘密。我不希望我所有的客户端应用程序都直接连接到 Vault。我希望他们通过让配置服务器连接到 Vault 从配置服务器获取配置。直到昨晚,我才能够实现这个目标,除非我将所有内容都设置为默认设置,禁用 TLS 并使用环回地址,Vault 软件的端口 8200 等。显然,默认设置对于我们部署的任何环境都不实用。我会提到 spencergibb 发布的 link 确实帮助我理解了为什么这不起作用,但原因的微妙之处是我之前错过它的原因。请继续阅读我的解释。
我希望配置服务器直接从 Vault 配置自身。也就是说,通过 Spring Cloud Vault Config 连接到 Vault。如文档中所述,这对我立即起作用。然而,这个目标有点微不足道,因为我目前没有真正的用例。但我想了解它是否可以完成,因为我没有看到不这样做的真正原因,而且这似乎是集成 Vault 的良好第一步。
这两种功能之间的区别帮助我理解了问题源于以下事实:Spring Cloud Config Server 和 Spring Cloud Vault 似乎使用两个不同的 bean 来注入 Vault 配置特性。 Spring Cloud Config Server 使用带有 @ConfigurationProperties("spring.cloud.config.server.vault") 注释的 VaultEnvironmentRepository,Spring Cloud Vault 使用带有 @ConfigurationProperties("spring.cloud.vault") 注释的 VaultProperties。
这导致我向我的 bootstrap yml 添加了两个不同的配置。
server:
port: 8888
spring:
profiles:
active: local, vault
application:
name: quoting-domain-configuration-server
cloud:
vault:
host: VDDP03P-49A26EF.lm.lmig.com
port: 8200
scheme: https
authentication: TOKEN
token: 0f1997c3-d8a8-befd-a5a2-01e4e066c50a
ssl:
trust-store: configTrustStore.jks
trust-store-password: changeit
config:
server:
vault:
host: VDDP03P-49A26EF.lm.lmig.com
port: 8200
scheme: https
authentication: TOKEN
token: 0f1997c3-d8a8-befd-a5a2-01e4e066c50a
注意相同的配置细节。只是不同的 yml 路径。这是我错过的微妙之处,因为我首先让目标 1 开始工作,并假设相同的配置适用于两个目标。 (注意:令牌和密码是人为设计的)。
除了 SSL 握手错误外,这几乎可以正常工作。如您所见,spring.cloud.config.server.vault 路径上没有设置 SSL 属性。 VaultProperties bean 不支持它们。我不确定如何处理这个问题(也许是我找不到的另一个 non-vault 特定 bean)。我的解决方案是像这样简单地强制自己进行证书配置:-
@SpringBootApplication
@EnableConfigServer
public class Application
{
public static void main(String[] args)
{
System.setProperty("javax.net.ssl.trustStore",
Application.class.getResource("/configTrustStore.jks").getFile());
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
SpringApplication.run(Application.class, args);
}
}
这个 SSL 解决方案非常丑陋。我确信必须有更好的方法来完成这一部分。所以我愿意接受其他建议。但是,一旦我完成了上述所有步骤,现在一切正常。
感谢您的来信。我正在努力让这个工作。我能够让客户端服务连接到 Spring Cloud Config 服务器和 Vault 服务器,但我无法让 Spring Cloud Config 服务器连接到 Vault 服务器。
在将您的配置复制到我的 Spring 云配置服务器后,我什至感到很吃力。虽然我最终让它与您的配置一起工作,但我能够将它缩减很多。关键是令牌不属于 Spring Cloud Config 服务器。它属于客户端。
我在浏览器中尝试 http://localhost:8888/{application}/default
但得到以下信息:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Thu May 11 14:21:31 EDT 2017
There was an unexpected error (type=Bad Request, status=400).
Missing required header: X-Config-Token
我使用 PostMan 发送了包含 Vault 令牌的 X-Config-Token
header 请求,它成功了。
这是我的最终配置。
server:
port: ${PORT:8888}
management:
context-path: /manage
security:
enabled: true
spring:
profiles:
active: git,vault
application:
name: config-server
cloud:
config:
server:
git:
order: 1
uri: file:///temp/config-server/config
vault:
order: 0
host: localhost
port: 8200
scheme: http
看来您需要将令牌添加到客户端。也许使用 spring.cloud.config.token
.
改为
@SpringBootApplication
@EnableConfigServer
public class Application
{
public static void main(String[] args)
{
System.setProperty("javax.net.ssl.trustStore",
Application.class.getResource("/configTrustStore.jks").getFile());
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
SpringApplication.run(Application.class, args);
}
}
写
bootstrap yml ->
javax.net.ssl.trustStore: /configTrustStore.jks
javax.net.ssl.trustStorePassword: changeit
虽然我回复晚了。但是我能够配置 spring 云配置服务器以使用 Vault 作为后端,并通过证书进行 CERT 身份验证。此外,您不需要在 GET 请求中发送 X-Config-Token。因此,您的 config-server GET 请求将以与 GITHUB 相同的方式工作,因为 backend.As 我的实现将即时获取令牌并通过附加 header 更改传入请求.我建议检查我的教程和 github 存储库中的所有步骤。
和GitHub 存储库:https://github.com/java-developer-raman/config-server-vault-backend