Authentication methods
不同的组织对安全和身份验证有不同的需求。Vault 通过提供多种身份验证方法来反映这种需求。Spring Cloud Vault 支持令牌和 AppId 身份验证。
Token authentication
令牌是 Vault 中的身份验证核心方法。令牌身份验证需要提供一个静态令牌来使用配置。作为后备,也可以从 `~/.vault-token`中检索令牌,这是 Vault CLI 用于缓存令牌的默认位置。
令牌验证是默认验证方法。如果公开了一个令牌,则未经计划的一方可以访问 Vault 并可以访问目标客户端的机密。 |
spring.cloud.vault:
authentication: TOKEN
token: 00000000-0000-0000-0000-000000000000
-
authentication
将此值设为TOKEN
可选择标记身份验证方法 -
token
设置要使用的静态标记。如果缺失或为空,则会尝试从 ~/.vault-token 中检索标记。
另请参阅:
Vault Agent authentication
Vault 从 0.11.0 版本开始使用 Vault Agent 提供了 Sidecar 实用程序。Vault Agent 通过其自动身份验证功能实现了 Spring Vault 的`SessionManager`功能。应用程序可以通过依赖于在 localhost 上运行的 Vault Agent 来重用缓存会话凭证。Spring Vault 可以在没有请求的`X-Vault-Token`标题的情况下发送请求。禁用 Spring Vault 的身份验证基础设施以禁用客户端身份验证和会话管理。
spring.cloud.vault:
authentication: NONE
-
authentication
将此值设为NONE
会禁用ClientAuthentication
和SessionManager
。
AppId authentication
Vault 支持 AppId 身份验证,该身份验证由两个难以猜测的令牌组成。AppId 默认值为以静态方式配置的 spring.application.name
。第二个令牌是 UserId,它是由应用程序确定的一部分,通常与运行时环境相关。IP 地址、Mac 地址或 Docker 容器名称是不错的示例。Spring Cloud Vault Config 支持 IP 地址、Mac 地址和静态 UserId(例如通过系统属性提供)。IP 和 Mac 地址表示为经过十六进制编码的 SHA256 哈希。
基于 IP 地址的 UserId 使用本地主机的 IP 地址。
spring.cloud.vault:
authentication: APPID
app-id:
user-id: IP_ADDRESS
-
authentication
将此值设为APPID
可选择 AppId 身份验证方法 -
app-id-path
设置要使用的 AppId 存储位的路径 -
user-id
设置 UserId 方法。可能的值为IP_ADDRESS
、MAC_ADDRESS
或实现自定义AppIdUserIdMechanism
的类名
从命令行生成 IP 地址 UserId 的相应命令为:
$ echo -n 192.168.99.1 | sha256sum
包含 |
基于 Mac 地址的 UserId 从本地主机绑定的设备中获取其网络设备。配置还允许指定 network-interface
提示以选择正确的设备。network-interface
的值是可选的,并且可以是接口名称或接口索引(基于 0)。
spring.cloud.vault:
authentication: APPID
app-id:
user-id: MAC_ADDRESS
network-interface: eth0
-
network-interface
设置用于获取物理地址的网络接口
从命令行生成 IP 地址 UserId 的相应命令为:
$ echo -n 0AFEDE1234AC | sha256sum
指定 Mac 地址时以大写字母指定且不带冒号。包含 |
Custom UserId
UserId 生成是一种开放机制。您可以将`spring.cloud.vault.app-id.user-id` 设置为任意字符串,且配置的值将被用作静态 UserId。
更高级的方法允许您将 spring.cloud.vault.app-id.user-id
设置为类名。此类必须在您的类路径中,并且必须实现 org.springframework.cloud.vault.AppIdUserIdMechanism
接口和 createUserId
方法。Spring Cloud Vault 将通过每次使用 AppId 验证以获取 Token 时调用 createUserId
来获取 UserId。
spring.cloud.vault:
authentication: APPID
app-id:
user-id: com.examlple.MyUserIdMechanism
public class MyUserIdMechanism implements AppIdUserIdMechanism {
@Override
public String createUserId() {
String userId = ...
return userId;
}
}
AppRole authentication
AppRole 旨在用于机器身份验证,例如不再使用的 (自 Vault 0.6.1 起) AppId authentication。AppRole 身份验证由两个难以猜测的(秘密)令牌组成:RoleId 和 SecretId。
Spring Vault 支持各种 AppRole 场景(推送/拉取模式和包装)。
配置必须提供 RoleId 和可选 SecretId,Spring Vault 不会查找这些内容或创建自定义 SecretId。
spring.cloud.vault:
authentication: APPROLE
app-role:
role-id: bde2076b-cccb-3cf0-d57e-bca7b1e83a52
支持以下场景以及必需的配置详细信息:
Method |
RoleId |
SecretId |
RoleName |
Token |
Provided RoleId/SecretId |
Provided |
Provided |
||
Provided RoleId without SecretId |
Provided |
|||
Provided RoleId, Pull SecretId |
Provided |
Provided |
Provided |
|
Pull RoleId, provided SecretId |
Provided |
Provided |
Provided |
|
Full Pull Mode |
Provided |
Provided |
||
Wrapped |
Provided |
|||
Wrapped RoleId, provided SecretId |
Provided |
Provided |
||
Provided RoleId, wrapped SecretId |
Provided |
Provided |
RoleId |
SecretId |
Supported |
Provided |
Provided |
✅ |
Provided |
Pull |
✅ |
Provided |
Wrapped |
✅ |
Provided |
Absent |
✅ |
Pull |
Provided |
✅ |
Pull |
Pull |
✅ |
Pull |
Wrapped |
❌ |
Pull |
Absent |
❌ |
Wrapped |
Provided |
✅ |
Wrapped |
Pull |
❌ |
Wrapped |
Wrapped |
✅ |
Wrapped |
Absent |
❌ |
你可以通过在上下文中提供一个配置过的 |
AppRole 验证仅限于使用响应式基础设施的简单拉取模式。尚未支持完全拉取模式。将 Spring Cloud Vault 和 Spring WebFlux 堆栈一起使用将启用 Vault 的响应式自动配置,可以通过设置 spring.cloud.vault.reactive.enabled=false
来禁用此功能。
spring.cloud.vault:
authentication: APPROLE
app-role:
role-id: bde2076b-cccb-3cf0-d57e-bca7b1e83a52
secret-id: 1696536f-1976-73b1-b241-0b4213908d39
role: my-role
app-role-path: approle
-
role-id
sets the RoleId. -
secret-id
设置 SecretId。如果 AppRole 在未要求 SecretId 的情况下配置,可以省略 SecretId(请参见bind_secret_id
)。 -
role
: 设置用于拉取模式的 AppRole 名称。 -
app-role-path
设置要使用的 approle 身份验证存储位的路径。
AWS-EC2 authentication
aws-ec2 身份验证后端为 AWS EC2 实例提供了一种安全的引入机制,允许自动检索 Vault 令牌。与大多数 Vault 身份验证后端不同,此后端不需要首先部署或配置安全敏感凭据(令牌、用户名/密码、客户端证书等)。相反,它将 AWS 视为受信任的第三方,并使用加密签名的动态元数据信息来唯一表示每个 EC2 实例。
spring.cloud.vault:
authentication: AWS_EC2
AWS-EC2 身份验证默认启用随机数,以遵循首次使用信任 (TOFU) 原则。任何意外获得 PKCS#7 标识元数据访问权限的一方都可以针对 Vault 进行身份验证。
在首次登录期间,Spring Cloud Vault 会生成一个随机数,该随机数与实例 ID 一起存储在身份验证后端中。重新验证需要发送相同的随机数。任何其他方都没有随机数,并且可以在 Vault 中发出警报以作进一步调查。
随机数保存在内存中,并且在应用程序重新启动期间丢失。您可以使用 spring.cloud.vault.aws-ec2.nonce
配置一个静态随机数。
AWS-EC2 身份验证角色是可选的,且默认为 AMI。您可以通过设置`spring.cloud.vault.aws-ec2.role`属性来配置身份验证角色。
spring.cloud.vault:
authentication: AWS_EC2
aws-ec2:
role: application-server
spring.cloud.vault:
authentication: AWS_EC2
aws-ec2:
role: application-server
aws-ec2-path: aws-ec2
identity-document: http://...
nonce: my-static-nonce
-
authentication
将此值设为AWS_EC2
可选择 AWS EC2 身份验证方法 -
role
设置尝试登录时所针对的角色的名称。 -
aws-ec2-path
设置要使用的 AWS EC2 挂载路径 -
identity-document
设置 PKCS#7 AWS EC2 身份文档的 URL -
nonce
用于 AWS-EC2 认证。空值默认生成 nonce
AWS-IAM authentication
aws后端为 AWS IAM 角色提供一种安全的身份验证机制,允许基于运行应用程序的当前 IAM 角色与 Vault 进行自动身份验证。与大多数 Vault 身份验证后端不同,此后端不需要先部署或预配安全敏感凭据(令牌、用户名/密码、客户端证书等)。它将 AWS 视为受信任的第三方,并使用由调用者使用其 IAM 凭据签名的 4 条信息来验证该调用者确实正在使用该 IAM 角色。
应用程序正在运行的当前 IAM 角色会自动计算。如果您在 AWS ECS 上运行应用程序,那么应用程序将使用分配给正在运行的容器的 ECS 任务的 IAM 角色。如果您在 EC2 实例上单独运行应用程序,那么使用的 IAM 角色将是分配给 EC2 实例的角色。
使用 AWS-IAM 身份验证时,你必须在 Vault 中创建一个角色并将其分配给你的 IAM 角色。一个空 角色
默认会使用当前 IAM 角色友好名称。
spring.cloud.vault:
authentication: AWS_IAM
spring.cloud.vault:
authentication: AWS_IAM
aws-iam:
region: aws-global
role: my-dev-role
aws-path: aws
server-name: some.server.name
endpoint-uri: https://sts.eu-central-1.amazonaws.com
-
region
设置 AWS 区域的名称。如果不提供,则区域将由 AWS 默认值确定。 -
role
设置尝试登录时所针对的角色的名称。这应与你的 IAM 角色绑定。如果不提供,则当前 IAM 用户的友好名称将用作 vault 角色。 -
aws-path
设置要使用的 AWS 挂载的路径 -
server-name
设置用于X-Vault-AWS-IAM-Server-ID
标头以防止某些类型的重播攻击的值。 -
endpoint-uri
设置用于iam_request_url
参数的 AWS STS API 的值。
AWS-IAM 需要 AWS Java SDK v2 依赖项 (software.amazon.awssdk:auth
),因为身份验证实现使用 AWS SDK 类型来进行凭据和请求签名的。
Azure MSI authentication
azure auth 后端为 Azure VM 实例提供安全引入机制,它允许自动检索 Vault 令牌。与大多数 Vault 身份验证后端不同,此后端不要求首先部署或提供安全敏感凭据(令牌、用户名/密码、客户端证书等)。相反,它将 Azure 视为第三方授权并使用可以绑定到 VM 实例的托管服务标识和实例元数据信息。
spring.cloud.vault:
authentication: AZURE_MSI
azure-msi:
role: my-dev-role
spring.cloud.vault:
authentication: AZURE_MSI
azure-msi:
role: my-dev-role
azure-path: azure
metadata-service: http://169.254.169.254/metadata/instance…
identity-token-service: http://169.254.169.254/metadata/identity…
-
role
设置尝试登录时所针对的角色的名称。 -
azure-path
设置要使用的 Azure 挂载路径 -
metadata-service
设置用于访问实例元数据服务时的 URI -
identity-token-service
设置用于访问身份令牌服务时的 URI
Azure MSI 身份验证从实例元数据服务中获取有关虚拟机的环境详细信息(订阅 ID、资源组、VM 名称)。Vault 服务器的 Resource Id 默认为 https://vault.hashicorp.com
。若要更改此设置,请相应设置 spring.cloud.vault.azure-msi.identity-token-service
。
另请参阅:
TLS certificate authentication
cert
auth 后端允许使用 SSL/TLS 客户端证书进行身份验证,这些证书可以由 CA 签名或自签名。
若要启用 cert
身份验证,你需要:
-
使用 SSL,见Vault Client SSL configuration
-
配置包含客户端证书和私钥的 Java
Keystore
-
将
spring.cloud.vault.authentication
设置为CERT
spring.cloud.vault:
authentication: CERT
ssl:
key-store: classpath:keystore.jks
key-store-password: changeit
key-store-type: JKS
cert-auth-path: cert
Cubbyhole authentication
Cubbyhole 身份验证使用 Vault 原语来提供安全的身份验证工作流。Cubbyhole 身份验证使用令牌作为主要登录方法。使用临时令牌从 Vault 的 Cubbyhole secret 后端获取第二个登录 Vault 令牌。登录令牌通常使用时间较长,用于与 Vault 进行交互。登录令牌将从存储在 /cubbyhole/response
中的包装响应中检索。
-
创建包装令牌 *
令牌创建的响应封装要求 Vault 0.6.0 或更高版本。 |
$ vault token-create -wrap-ttl="10m"
Key Value
--- -----
wrapping_token: 397ccb93-ff6c-b17b-9389-380b01ca2645
wrapping_token_ttl: 0h10m0s
wrapping_token_creation_time: 2016-09-18 20:29:48.652957077 +0200 CEST
wrapped_accessor: 46b6aebb-187f-932a-26d7-4f3d86a68319
spring.cloud.vault:
authentication: CUBBYHOLE
token: 397ccb93-ff6c-b17b-9389-380b01ca2645
另请参阅:
GCP-GCE authentication
gcp身份验证后端允许使用现有的 GCP(Google Cloud Platform)IAM 和 GCE 凭证登录 Vault。
GCP GCE(Google Compute Engine)验证会创建 JSON Web 令牌 (JWT) 格式的签名以用于服务帐户。Compute Engine 实例的 JWT 可通过 Instance identification从 GCE 元数据服务获取。此 API 创建可以用于确认实例身份的 JSON Web 令牌。
与大多数 Vault 身份验证后端不同,此后端不需要预先部署或设置安全敏感的凭据(令牌、用户名/密码、客户端证书等)。相反,它将 GCP 视为受信任的第三方,并使用加密签名的动态元数据信息,该信息唯一地表示每个 GCP 服务帐户。
spring.cloud.vault:
authentication: GCP_GCE
gcp-gce:
role: my-dev-role
spring.cloud.vault:
authentication: GCP_GCE
gcp-gce:
gcp-path: gcp
role: my-dev-role
service-account: my-service@projectid.iam.gserviceaccount.com
-
role
设置尝试登录时所针对的角色的名称。 -
gcp-path
设置要使用的 GCP 挂载的路径 -
service-account
允许将服务帐户 Id 重写为特定值。默认为default
服务帐户。
另请参阅:
GCP-IAM authentication
gcp身份验证后端允许使用现有的 GCP(Google Cloud Platform)IAM 和 GCE 凭证登录 Vault。
GCP IAM 身份验证会创建 JSON Web 令牌 (JWT) 格式的签名以用于服务帐户。通过调用 GCP IAM 的 projects.serviceAccounts.signJwt
API,可获取服务帐户的 JWT。调用方通过 GCP IAM 进行身份验证,并以此证明其身份。此 Vault 后端将 GCP 视为受信任的第三方。
IAM 凭证可以从运行时环境(特别是 GOOGLE_APPLICATION_CREDENTIALS
环境变量)、Google Compute 元数据服务或外部提供(例如,JSON 或 base64 编码)获取。JSON 是首选形式,因为它携带了调用 `projects.serviceAccounts.signJwt`所需的项目 ID 和服务帐户标识符。
spring.cloud.vault:
authentication: GCP_IAM
gcp-iam:
role: my-dev-role
spring.cloud.vault:
authentication: GCP_IAM
gcp-iam:
credentials:
location: classpath:credentials.json
encoded-key: e+KApn0=
gcp-path: gcp
jwt-validity: 15m
project-id: my-project-id
role: my-dev-role
service-account-id: my-service@projectid.iam.gserviceaccount.com
-
role
设置尝试登录时所针对的角色的名称。 -
credentials.location
包含 JSON 格式 Google 凭据的凭据资源的路径。 -
credentials.encoded-key
以 JSON 格式对 OAuth2 帐户私钥进行 base64 编码的内容。 -
gcp-path
设置要使用的 GCP 挂载的路径 -
jwt-validity
配置 JWT 令牌的有效期。默认为 15 分钟。 -
project-id
允许将项目 Id 重写为特定值。默认为从获得的凭据中获取的项目 Id。 -
service-account
允许将服务帐户 Id 重写为特定值。默认为从获得的凭据中获取的服务帐户。
GCP IAM 身份验证需要 Google Cloud Java SDK 依赖项 (com.google.apis:google-api-services-iam
和 com.google.auth:google-auth-library-oauth2-http
),因为身份验证实现使用 Google API 来进行凭据和 JWT 签名。
Google 认证需要维护令牌生命周期的 OAuth 2 令牌。所有 API 同步,因此, |
另请参阅:
Kubernetes authentication
Kubernetes 身份验证机制(从 Vault 0.8.3 起)允许使用 Kubernetes 服务帐户令牌向 Vault 进行身份验证。身份验证基于角色,该角色绑定到服务帐户名称和命名空间。
一个包含 pod 的服务帐户 JWT 令牌的文件会自动装载到 /var/run/secrets/kubernetes.io/serviceaccount/token
。
spring.cloud.vault:
authentication: KUBERNETES
kubernetes:
role: my-dev-role
kubernetes-path: kubernetes
service-account-token-file: /var/run/secrets/kubernetes.io/serviceaccount/token
-
role
sets the Role. -
kubernetes-path
设置要使用的 Kubernetes 装载路径。 -
service-account-token-file
设置包含 Kubernetes 服务帐户令牌的文件的位置。默认为/var/run/secrets/kubernetes.io/serviceaccount/token
。
另请参阅:
Pivotal CloudFoundry authentication
pcf身份验证后端为运行在 Pivotal 的 CloudFoundry 实例内的应用程序提供了安全引入机制,允许自动检索 Vault 令牌。与大多数 Vault 身份验证后端不同,此后端不需要首先部署或提供对安全敏感的凭证(令牌、用户名/密码、客户端证书等),因为身份供应是由 PCF 本身处理的。相反,它将 PCF 视为受信任的第三方,并使用托管实例身份。
spring.cloud.vault:
authentication: PCF
pcf:
role: my-dev-role
spring.cloud.vault:
authentication: PCF
pcf:
role: my-dev-role
pcf-path: path
instance-certificate: /etc/cf-instance-credentials/instance.crt
instance-key: /etc/cf-instance-credentials/instance.key
-
role
设置尝试登录时所针对的角色的名称。 -
pcf-path
设置要使用的 PCF 装载路径。 -
instance-certificate
设置到 PCF 实例身份证书的路径。默认为${CF_INSTANCE_CERT}
env 变量。 -
instance-key
设置到 PCF 实例身份密钥的路径。默认为${CF_INSTANCE_KEY}
env 变量。
PCF 身份验证需要 BouncyCastle (bcpkix-jdk15on) 位于类路径上,用于 RSA PSS 签名。 |
ACL Requirements
此部分说明了 Spring Vault 访问的路径,以便你可以从所需的功能中推导出策略声明。
Capability | Associated HTTP verbs |
---|---|
create |
|
read |
|
update |
|
delete |
|
list |
|
另请参阅 [role="bare"][role="bare"]https://www.vaultproject.io/guides/identity/policies。