Vault 后端

Spring Cloud Config Server 还支持 Vault 作为后端。

Vault 是一个安全访问秘密的工具。秘密是指任何您希望严格控制访问权限的信息,例如 API 密钥、密码、证书和其他敏感信息。Vault 为任何秘密提供统一接口,同时提供严格的访问控制并记录详细的审计日志。

有关 Vault 的更多信息,请参阅 Vault 快速入门指南

要使配置服务器能够使用 Vault 后端,您可以使用 vault 配置文件运行您的配置服务器。例如,在您的配置服务器的 application.properties 中,您可以添加 spring.profiles.active=vault

默认情况下,Spring Cloud Config Server 使用基于令牌的身份验证从 Vault 获取配置。Vault 还支持其他身份验证方法,如 AppRole、LDAP、JWT、CloudFoundry、Kubernetes Auth。为了使用 TOKEN 或 X-Config-Token 标头以外的任何身份验证方法,我们需要在类路径上添加 Spring Vault Core,以便 Config Server 可以将身份验证委托给该库。请将以下依赖项添加到您的 Config Server App。

Maven (pom.xml)

<dependencies>
	<dependency>
		<groupId>org.springframework.vault</groupId>
		<artifactId>spring-vault-core</artifactId>
	</dependency>
</dependencies>

Gradle (build.gradle)

dependencies {
    implementation "org.springframework.vault:spring-vault-core"
}

默认情况下,配置服务器假定您的 Vault 服务器运行在 127.0.0.1:8200。它还假定后端名称为 secret,键为 application。所有这些默认值都可以在您的配置服务器的 application.properties 中配置。下表描述了可配置的 Vault 属性

名称 默认值

host

127.0.0.1

port

8200

scheme

http

backend

secret

defaultKey

application

defaultLabel

main(仅当 enableLabel 设置为 true 时使用)

enableLabel

profileSeparator

,

kvVersion

1

skipSslValidation

超时

5

namespace

null

上表中所有属性都必须以 spring.cloud.config.server.vault 为前缀,或放置在复合配置的正确 Vault 部分中。

所有可配置属性都可以在 org.springframework.cloud.config.server.environment.VaultEnvironmentProperties 中找到。

Vault 0.10.0 引入了版本化的键值后端(k/v 后端版本 2),它暴露了一个与早期版本不同的 API,现在它要求在挂载路径和实际上下文路径之间有一个 data/,并将秘密包装在一个 data 对象中。设置 spring.cloud.config.server.vault.kv-version=2 将考虑这一点。

此外,还支持 Vault Enterprise 的 X-Vault-Namespace 标头。要将其发送到 Vault,请设置 namespace 属性。

在您的配置服务器运行后,您可以向服务器发出 HTTP 请求以从 Vault 后端检索值。为此,您需要一个用于您的 Vault 服务器的令牌。

首先,在您的 Vault 中放置一些数据,如以下示例所示

$ vault kv put secret/application foo=bar baz=bam
$ vault kv put secret/myapp foo=myappsbar

其次,向您的配置服务器发出 HTTP 请求以检索值,如以下示例所示

$ curl -X "GET" "https://:8888/myapp/default" -H "X-Config-Token: yourtoken"

您应该看到类似于以下内容的响应

{
   "name":"myapp",
   "profiles":[
      "default"
   ],
   "label":null,
   "version":null,
   "state":null,
   "propertySources":[
      {
         "name":"vault:myapp",
         "source":{
            "foo":"myappsbar"
         }
      },
      {
         "name":"vault:application",
         "source":{
            "baz":"bam",
            "foo":"bar"
         }
      }
   ]
}

客户端向 Config Server 提供必要认证以使其与 Vault 通信的默认方式是设置 X-Config-Token 标头。但是,您也可以省略该标头,并通过设置与 Spring Cloud Vault 相同的配置属性来在服务器中配置认证。要设置的属性是 spring.cloud.config.server.vault.authentication。它应该设置为其中一种支持的认证方法。您可能还需要设置与您使用的认证方法相关的其他属性,方法是使用与 spring.cloud.vault 文档中相同的属性名称,但使用 spring.cloud.config.server.vault 前缀。有关更多详细信息,请参阅 Spring Cloud Vault 参考指南

如果您省略 X-Config-Token 标头并使用服务器属性设置认证,则 Config Server 应用程序需要额外依赖 Spring Vault 才能启用其他认证选项。有关如何添加该依赖项,请参阅 Spring Vault 参考指南

多个属性源

使用 Vault 时,您可以为应用程序提供多个属性源。例如,假设您已将数据写入 Vault 中的以下路径

secret/myApp,dev
secret/myApp
secret/application,dev
secret/application

写入 secret/application 的属性可供使用 Config Server 的所有应用程序使用。名为 myApp 的应用程序将可以使用写入 secret/myAppsecret/application 的任何属性。当 myApp 启用了 dev 配置文件时,它将可以使用写入上述所有路径的属性,其中列表中第一个路径中的属性优先于其他路径中的属性。

通过标签启用搜索

默认情况下,Vault 后端在搜索秘密时不会使用标签。您可以通过将 enableLabel 功能标志设置为 true,并可选地设置 defaultLabel 来更改此行为。当未提供 defaultLabel 时,将使用 main

enableLabel 功能标志打开时,Vault 中的秘密在其路径中应始终包含所有三个段(应用程序名称、配置文件和标签)。因此,上一节中的示例,在启用了功能标志的情况下,将如下所示:

secret/myApp,dev,myLabel
secret/myApp,default,myLabel       # default profile
secret/application,dev,myLabel     # default application name
secret/application,default,myLabel # default application name and default profile.

在属性源中解密 Vault 秘密

Spring Cloud Config Server 通过使用特殊占位符前缀 {vault} 支持从 Vault 解密属性。此功能允许在运行时直接从 Vault 动态解析敏感配置属性。

配置步骤

所有与 Vault 集成的配置设置都应放置在您的 application.ymlapplication.properties 中。以下是激活 Vault 配置文件、连接到您的 Vault 服务器以及使用 {vault} 前缀格式化属性所需的特定配置。

启用 Vault 配置文件

为您的 Spring Cloud Config Server 激活 Vault 配置文件

spring:
  profiles:
    active: vault

Vault 配置

设置与您的 Vault 服务器的连接以及必要的认证详细信息

spring:
  cloud:
    config:
      server:
        vault:
          host: vault.example.com
          port: 8200
          scheme: https
          backend: secret
          defaultKey: application
          kvVersion: 2
          authentication: TOKEN
          token: ${VAULT_TOKEN}
          skipSslValidation: true

这些设置指定 Vault 服务器地址、认证方法以及访问 Vault 所需的令牌。

属性格式

定义带有 {vault} 前缀的属性,以指定用于检索秘密的 Vault 路径和键

some:
  sensitive:
    value: '{vault}:path/to/secret#key'

此格式直接映射到秘密在 Vault 中的存储位置 (path/to/secret) 和要检索的特定秘密键 (key)。

错误处理

如果配置服务器在解密过程中遇到任何问题,例如路径不正确、访问问题或缺少键,受影响的属性将以 invalid. 为前缀,其值将设置为 <n/a>。此方法类似于处理以 {cipher} 为前缀的属性,但它专门为与 Vault 集成而定制,在解密失败时提供清晰的反馈。

© . This site is unofficial and not affiliated with VMware.