認證方式

不同的組織對安全和身份驗證有不同的要求。Vault 透過提供多種身份驗證方法來反映這一需求。Spring Cloud Vault 支援令牌和 AppId 身份驗證。

令牌身份驗證

令牌是 Vault 中身份驗證的核心方法。令牌身份驗證需要透過配置提供靜態令牌。作為備用方案,令牌也可以從 ~/.vault-token 中檢索,這是 Vault CLI 用於快取令牌的預設位置。

令牌身份驗證是預設的身份驗證方法。如果令牌被未經授權的方洩露,該方將獲得對 Vault 的訪問許可權,並可以訪問預期客戶端的秘密。
application.yml
spring.cloud.vault:
    authentication: TOKEN
    token: 00000000-0000-0000-0000-000000000000
  • authentication 將此值設定為 TOKEN 可選擇令牌身份驗證方法

  • token 設定要使用的靜態令牌。如果缺少或為空,則會嘗試從 ~/.vault-token 中檢索令牌。

另請參閱

Vault Agent 身份驗證

自 0.11.0 版本以來,Vault 附帶了一個 Vault Agent 邊車實用程式。Vault Agent 透過其 Auto-Auth 功能實現了 Spring Vault 的 SessionManager 的功能。應用程式可以透過依賴執行在 localhost 上的 Vault Agent 來重用快取的會話憑據。Spring Vault 可以傳送不帶 X-Vault-Token 頭的請求。停用 Spring Vault 的身份驗證基礎設施以停用客戶端身份驗證和會話管理。

application.yml
spring.cloud.vault:
    authentication: NONE
  • authentication 將此值設定為 NONE 可停用 ClientAuthenticationSessionManager

另請參閱:Vault 文件:Agent

AppId 身份驗證

Vault 支援 AppId 身份驗證,它由兩個難以猜測的令牌組成。AppId 預設為靜態配置的 spring.application.name。第二個令牌是 UserId,它是由應用程式確定的一部分,通常與執行時環境相關。IP 地址、Mac 地址或 Docker 容器名稱都是很好的例子。Spring Cloud Vault Config 支援 IP 地址、Mac 地址和靜態 UserId(例如,透過系統屬性提供)。IP 和 Mac 地址表示為十六進位制編碼的 SHA256 雜湊值。

基於 IP 地址的 UserId 使用本地主機的 IP 地址。

使用 SHA256 IP 地址 UserId 的 application.yml
spring.cloud.vault:
    authentication: APPID
    app-id:
        user-id: IP_ADDRESS
  • authentication 將此值設定為 APPID 可選擇 AppId 身份驗證方法

  • app-id-path 設定要使用的 AppId 掛載路徑

  • user-id 設定 UserId 方法。可能的值為 IP_ADDRESSMAC_ADDRESS 或實現自定義 AppIdUserIdMechanism 的類名

從命令列生成 IP 地址 UserId 的相應命令是

$ echo -n 192.168.99.1 | sha256sum
包含 echo 的換行符會導致不同的雜湊值,因此請務必包含 -n 標誌。

基於 Mac 地址的 UserId 從繫結到本地主機的網路裝置獲取其網路裝置。配置還允許指定 network-interface 提示以選擇正確的裝置。network-interface 的值是可選的,可以是介面名稱或介面索引(從 0 開始)。

使用 SHA256 Mac 地址 UserId 的 application.yml
spring.cloud.vault:
    authentication: APPID
    app-id:
        user-id: MAC_ADDRESS
        network-interface: eth0
  • network-interface 設定獲取物理地址的網路介面

從命令列生成 IP 地址 UserId 的相應命令是

$ echo -n 0AFEDE1234AC | sha256sum
Mac 地址以大寫形式指定,不帶冒號。包含 echo 的換行符會導致不同的雜湊值,因此請務必包含 -n 標誌。

自定義 UserId

UserId 生成是一個開放機制。您可以將 spring.cloud.vault.app-id.user-id 設定為任何字串,配置的值將用作靜態 UserId。

更高階的方法是,您可以將 spring.cloud.vault.app-id.user-id 設定為類名。此類必須位於您的類路徑中,並且必須實現 org.springframework.cloud.vault.AppIdUserIdMechanism 介面和 createUserId 方法。每次使用 AppId 進行身份驗證以獲取令牌時,Spring Cloud Vault 都會透過呼叫 createUserId 來獲取 UserId。

application.yml
spring.cloud.vault:
    authentication: APPID
    app-id:
        user-id: com.examlple.MyUserIdMechanism
MyUserIdMechanism.java
public class MyUserIdMechanism implements AppIdUserIdMechanism {

  @Override
  public String createUserId() {
    String userId = ...
    return userId;
  }
}

AppRole 身份驗證

AppRole 旨在用於機器身份驗證,類似於已棄用的(自 Vault 0.6.1 起)AppId 身份驗證。AppRole 身份驗證由兩個難以猜測的(秘密)令牌組成:RoleId 和 SecretId。

Spring Vault 支援各種 AppRole 場景(推/拉模式和封裝)。

RoleId 和可選的 SecretId 必須透過配置提供,Spring Vault 不會查詢這些或建立自定義 SecretId。

具有 AppRole 身份驗證屬性的 application.yml
spring.cloud.vault:
    authentication: APPROLE
    app-role:
        role-id: bde2076b-cccb-3cf0-d57e-bca7b1e83a52

支援以下場景以及所需的配置詳細資訊

表 1. 配置

方法

RoleId

SecretId

RoleName

令牌

提供 RoleId/SecretId

已提供

已提供

未提供 SecretId 的 RoleId

已提供

提供 RoleId,拉取 SecretId

已提供

已提供

已提供

拉取 RoleId,提供 SecretId

已提供

已提供

已提供

完全拉取模式

已提供

已提供

封裝

已提供

封裝 RoleId,提供 SecretId

已提供

已提供

提供 RoleId,封裝 SecretId

已提供

已提供

表 2. 拉取/推送/封裝矩陣

RoleId

SecretId

支援

已提供

已提供

已提供

拉取

已提供

封裝

已提供

缺失

拉取

已提供

拉取

拉取

拉取

封裝

拉取

缺失

封裝

已提供

封裝

拉取

封裝

封裝

封裝

缺失

您仍然可以使用推送/拉取/封裝模式的所有組合,方法是在上下文中提供一個已配置的 AppRoleAuthentication bean。Spring Cloud Vault 無法從配置屬性中匯出所有可能的 AppRole 組合。
AppRole 身份驗證僅限於使用反應式基礎設施的簡單拉取模式。尚不支援完全拉取模式。將 Spring Cloud Vault 與 Spring WebFlux 堆疊一起使用會啟用 Vault 的反應式自動配置,可以透過設定 spring.cloud.vault.reactive.enabled=false 來停用。
具有所有 AppRole 身份驗證屬性的 application.yml
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 設定 RoleId。

  • secret-id 設定 SecretId。如果 AppRole 配置為不需要 SecretId(參見 bind_secret_id),則可以省略 SecretId。

  • role:設定拉取模式的 AppRole 名稱。

  • app-role-path 設定要使用的 AppRole 身份驗證掛載路徑。

AWS-EC2 身份驗證

aws-ec2 身份驗證後端為 AWS EC2 例項提供安全的引入機制,允許自動檢索 Vault 令牌。與大多數 Vault 身份驗證後端不同,此後端不需要首先部署或提供安全敏感憑據(令牌、使用者名稱/密碼、客戶端證書等)。相反,它將 AWS 視為可信第三方,並使用唯一表示每個 EC2 例項的經過加密簽名的動態元資料資訊。

使用 AWS-EC2 身份驗證的 application.yml
spring.cloud.vault:
    authentication: AWS_EC2

AWS-EC2 身份驗證預設啟用 nonce,以遵循“首次使用信任”(TOFU) 原則。任何未經授權的方,只要獲得了 PKCS#7 身份元資料的訪問許可權,就可以對 Vault 進行身份驗證。

首次登入時,Spring Cloud Vault 會生成一個 nonce,該 nonce 與例項 ID 一起儲存在身份驗證後端中。重新身份驗證需要傳送相同的 nonce。任何其他方都沒有該 nonce,並且可以在 Vault 中引發警報以進行進一步調查。

nonce 儲存在記憶體中,並在應用程式重新啟動時丟失。您可以使用 spring.cloud.vault.aws-ec2.nonce 配置靜態 nonce。

AWS-EC2 身份驗證角色是可選的,預設為 AMI。您可以透過設定 spring.cloud.vault.aws-ec2.role 屬性來配置身份驗證角色。

配置了角色的 application.yml
spring.cloud.vault:
    authentication: AWS_EC2
    aws-ec2:
        role: application-server
具有所有 AWS EC2 身份驗證屬性的 application.yml
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 預設為 nonce 生成

AWS-IAM 身份驗證

aws 後端為 AWS IAM 角色提供安全的身份驗證機制,允許根據執行中應用程式的當前 IAM 角色自動對 Vault 進行身份驗證。與大多數 Vault 身份驗證後端不同,此後端不需要首先部署或提供安全敏感憑據(令牌、使用者名稱/密碼、客戶端證書等)。相反,它將 AWS 視為可信第三方,並使用呼叫方使用其 IAM 憑據簽名的 4 條資訊來驗證呼叫方是否確實在使用該 IAM 角色。

應用程式當前執行的 IAM 角色會自動計算。如果您的應用程式在 AWS ECS 上執行,則應用程式將使用分配給執行中容器的 ECS 任務的 IAM 角色。如果您的應用程式在 EC2 例項之上裸機執行,則使用的 IAM 角色將是分配給 EC2 例項的 IAM 角色。

使用 AWS-IAM 身份驗證時,您必須在 Vault 中建立一個角色並將其分配給您的 IAM 角色。空 role 預設為當前 IAM 角色的友好名稱。

具有所需 AWS-IAM 身份驗證屬性的 application.yml
spring.cloud.vault:
    authentication: AWS_IAM
具有所有 AWS-IAM 身份驗證屬性的 application.yml
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 身份驗證

azure 身份驗證後端為 Azure VM 例項提供了安全的引入機制,允許自動檢索 Vault 令牌。與大多數 Vault 身份驗證後端不同,此後端不需要首先部署或提供安全敏感憑據(令牌、使用者名稱/密碼、客戶端證書等)。相反,它將 Azure 視為可信第三方,並使用可繫結到 VM 例項的託管服務身份和例項元資料資訊。

具有所需 Azure 身份驗證屬性的 application.yml
spring.cloud.vault:
    authentication: AZURE_MSI
    azure-msi:
        role: my-dev-role
具有所有 Azure 身份驗證屬性的 application.yml
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 伺服器的資源 ID 預設為 vault.hashicorp.com。要更改此設定,請相應地設定 spring.cloud.vault.azure-msi.identity-token-service

另請參閱

TLS 證書身份驗證

cert 身份驗證後端允許使用由 CA 簽名或自簽名的 SSL/TLS 客戶端證書進行身份驗證。

要啟用 cert 身份驗證,您需要:

  1. 使用 SSL,請參見Vault 客戶端 SSL 配置

  2. 配置一個包含客戶端證書和私鑰的 Java Keystore

  3. spring.cloud.vault.authentication 設定為 CERT

application.yml
spring.cloud.vault:
    authentication: CERT
    ssl:
        key-store: classpath:keystore.jks
        key-store-password: changeit
        key-store-type: JKS
        cert-auth-path: cert

Cubbyhole 身份驗證

Cubbyhole 身份驗證使用 Vault 原語提供安全的身份驗證工作流。Cubbyhole 身份驗證使用令牌作為主要登入方法。臨時令牌用於從 Vault 的 Cubbyhole 秘密後端獲取第二個登入 VaultToken。登入令牌通常壽命更長,用於與 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
application.yml
spring.cloud.vault:
    authentication: CUBBYHOLE
    token: 397ccb93-ff6c-b17b-9389-380b01ca2645

另請參閱

GCP-GCE 身份驗證

gcp 身份驗證後端允許透過使用現有的 GCP(Google Cloud Platform)IAM 和 GCE 憑據登入 Vault。

GCP GCE(Google Compute Engine)身份驗證為服務帳戶建立 JSON Web 令牌(JWT)形式的簽名。計算引擎例項的 JWT 是透過使用例項身份識別從 GCE 元資料服務獲取的。此 API 建立一個 JSON Web 令牌,可用於確認例項身份。

與大多數 Vault 身份驗證後端不同,此後端不需要首先部署或提供安全敏感憑據(令牌、使用者名稱/密碼、客戶端證書等)。相反,它將 GCP 視為可信第三方,並使用唯一表示每個 GCP 服務帳戶的經過加密簽名的動態元資料資訊。

具有所需 GCP-GCE 身份驗證屬性的 application.yml
spring.cloud.vault:
    authentication: GCP_GCE
    gcp-gce:
        role: my-dev-role
具有所有 GCP-GCE 身份驗證屬性的 application.yml
spring.cloud.vault:
    authentication: GCP_GCE
    gcp-gce:
        gcp-path: gcp
        role: my-dev-role
        service-account: [email protected]
  • role 設定正在嘗試登入的角色的名稱。

  • gcp-path 設定要使用的 GCP 掛載路徑

  • service-account 允許將服務帳戶 ID 覆蓋為特定值。預設為 default 服務帳戶。

另請參閱

GCP-IAM 身份驗證

gcp 身份驗證後端允許透過使用現有的 GCP(Google Cloud Platform)IAM 和 GCE 憑據登入 Vault。

GCP IAM 身份驗證為服務帳戶建立 JSON Web 令牌 (JWT) 形式的簽名。服務帳戶的 JWT 是透過呼叫 GCP IAM 的 projects.serviceAccounts.signJwt API 獲取的。呼叫者透過對 GCP IAM 進行身份驗證來證明其身份。此 Vault 後端將 GCP 視為受信任的第三方。

IAM 憑據可以從執行時環境(特別是 GOOGLE_APPLICATION_CREDENTIALS 環境變數)、Google Compute 元資料服務獲取,或者作為 JSON 或 base64 編碼從外部提供。JSON 是首選形式,因為它包含呼叫 projects.serviceAccounts.signJwt 所需的專案 ID 和服務帳戶識別符號。

具有所需 GCP-IAM 身份驗證屬性的 application.yml
spring.cloud.vault:
    authentication: GCP_IAM
    gcp-iam:
        role: my-dev-role
具有所有 GCP-IAM 身份驗證屬性的 application.yml
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: [email protected]
  • role 設定正在嘗試登入的角色的名稱。

  • credentials.location 包含 JSON 格式的 Google 憑據的憑據資源路徑。

  • credentials.encoded-key OAuth2 帳戶私鑰的 base64 編碼內容,為 JSON 格式。

  • 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-iamcom.google.auth:google-auth-library-oauth2-http),因為身份驗證實現使用 Google API 進行憑據和 JWT 簽名。

Google 憑據需要 OAuth 2 令牌來維護令牌生命週期。所有 API 都是同步的,因此 GcpIamAuthentication 不支援響應式使用所需的 AuthenticationSteps

另請參閱

GitHub 身份驗證

您可以透過提供個人訪問令牌使用 GitHub 身份驗證對 Vault 進行身份驗證。作為備用方案,如果安裝並驗證了 GitHub CLI,則還可以從其中檢索令牌。

application.yml
spring.cloud.vault:
    authentication: GITHUB
    github:
        token: gho_…
  • authentication 將此值設定為 GITHUB 可選擇 GitHub 身份驗證方法

  • token 設定要使用的靜態令牌。如果缺少或為空,並且已安裝 GitHub CLI 並進行身份驗證,並且透過 spring.cloud.vault.github.allow-cli-token=true 允許訪問,則會嘗試從 gh auth token 中檢索令牌。

  • allow-cli-token 啟用回退到 GitHub CLI 以檢索令牌。預設停用以避免意外呼叫 GitHub CLI。

另請參閱

Kubernetes 身份驗證

Kubernetes 身份驗證機制(自 Vault 0.8.3 起)允許使用 Kubernetes 服務帳戶令牌對 Vault 進行身份驗證。身份驗證基於角色,角色繫結到服務帳戶名稱和名稱空間。

包含 Pod 服務帳戶的 JWT 令牌的檔案會自動掛載到 /var/run/secrets/kubernetes.io/serviceaccount/token

具有所有 Kubernetes 身份驗證屬性的 application.yml
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 設定角色。

  • kubernetes-path 設定要使用的 Kubernetes 掛載路徑。

  • service-account-token-file 設定包含 Kubernetes 服務帳戶令牌的檔案位置。預設為 /var/run/secrets/kubernetes.io/serviceaccount/token

另請參閱

Pivotal CloudFoundry 身份驗證

pcf 身份驗證後端為在 Pivotal CloudFoundry 例項中執行的應用程式提供了安全的引入機制,允許自動檢索 Vault 令牌。與大多數 Vault 身份驗證後端不同,此後端不需要首先部署或提供安全敏感憑據(令牌、使用者名稱/密碼、客戶端證書等),因為身份提供由 PCF 本身處理。相反,它將 PCF 視為可信第三方,並使用託管例項身份。

具有所需 PCF 身份驗證屬性的 application.yml
spring.cloud.vault:
    authentication: PCF
    pcf:
        role: my-dev-role
具有所有 PCF 身份驗證屬性的 application.yml
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} 環境變數。

  • instance-key 設定 PCF 例項身份金鑰的路徑。預設為 ${CF_INSTANCE_KEY} 環境變數。

PCF 身份驗證需要 BouncyCastle (bcpkix-jdk15on) 位於類路徑上才能進行 RSA PSS 簽名。

ACL 要求

本節解釋了 Spring Vault 訪問哪些路徑,以便您可以根據所需功能派生策略宣告。

功能 關聯的 HTTP 動詞

建立

POST/PUT

讀取

GET

更新

POST/PUT

delete

DELETE

列表

LIST (GET)

身份驗證

登入:POST auth/$authMethod/login

鍵值掛載發現

GET sys/internal/ui/mounts/$mountPath

SecretLeaseContainer

SecretLeaseContainer 根據配置的租約端點使用不同的路徑。

LeaseEndpoints.Legacy

  • 撤銷:PUT sys/revoke

  • 續訂:PUT sys/renew

LeaseEndpoints.Leases (SysLeases)

  • 撤銷:PUT sys/leases/revoke

  • 續訂:PUT sys/leases/renew

會話管理

  • 令牌查詢:GET auth/token/lookup-self

  • 續訂:POST auth/token/renew-self

  • 撤銷:POST auth/token/revoke-self

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