認證方式
不同的組織對安全和身份驗證有不同的要求。Vault 透過提供多種身份驗證方法來反映這一需求。Spring Cloud Vault 支援令牌和 AppId 身份驗證。
令牌身份驗證
令牌是 Vault 中身份驗證的核心方法。令牌身份驗證需要透過配置提供靜態令牌。作為備用方案,令牌也可以從 ~/.vault-token 中檢索,這是 Vault CLI 用於快取令牌的預設位置。
| 令牌身份驗證是預設的身份驗證方法。如果令牌被未經授權的方洩露,該方將獲得對 Vault 的訪問許可權,並可以訪問預期客戶端的秘密。 |
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 的身份驗證基礎設施以停用客戶端身份驗證和會話管理。
spring.cloud.vault:
authentication: NONE
-
authentication將此值設定為NONE可停用ClientAuthentication和SessionManager。
另請參閱: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 地址。
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
包含 echo 的換行符會導致不同的雜湊值,因此請務必包含 -n 標誌。 |
基於 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 地址以大寫形式指定,不帶冒號。包含 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。
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 身份驗證
AppRole 旨在用於機器身份驗證,類似於已棄用的(自 Vault 0.6.1 起)AppId 身份驗證。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
支援以下場景以及所需的配置詳細資訊
方法 |
RoleId |
SecretId |
RoleName |
令牌 |
提供 RoleId/SecretId |
已提供 |
已提供 |
||
未提供 SecretId 的 RoleId |
已提供 |
|||
提供 RoleId,拉取 SecretId |
已提供 |
已提供 |
已提供 |
|
拉取 RoleId,提供 SecretId |
已提供 |
已提供 |
已提供 |
|
完全拉取模式 |
已提供 |
已提供 |
||
封裝 |
已提供 |
|||
封裝 RoleId,提供 SecretId |
已提供 |
已提供 |
||
提供 RoleId,封裝 SecretId |
已提供 |
已提供 |
RoleId |
SecretId |
支援 |
已提供 |
已提供 |
✅ |
已提供 |
拉取 |
✅ |
已提供 |
封裝 |
✅ |
已提供 |
缺失 |
✅ |
拉取 |
已提供 |
✅ |
拉取 |
拉取 |
✅ |
拉取 |
封裝 |
❌ |
拉取 |
缺失 |
❌ |
封裝 |
已提供 |
✅ |
封裝 |
拉取 |
❌ |
封裝 |
封裝 |
✅ |
封裝 |
缺失 |
❌ |
您仍然可以使用推送/拉取/封裝模式的所有組合,方法是在上下文中提供一個已配置的 AppRoleAuthentication bean。Spring Cloud Vault 無法從配置屬性中匯出所有可能的 AppRole 組合。 |
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設定 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 例項的經過加密簽名的動態元資料資訊。
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 屬性來配置身份驗證角色。
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 預設為 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 角色的友好名稱。
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 身份驗證
azure 身份驗證後端為 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 伺服器的資源 ID 預設為 vault.hashicorp.com。要更改此設定,請相應地設定 spring.cloud.vault.azure-msi.identity-token-service。
另請參閱
TLS 證書身份驗證
cert 身份驗證後端允許使用由 CA 簽名或自簽名的 SSL/TLS 客戶端證書進行身份驗證。
要啟用 cert 身份驗證,您需要:
-
使用 SSL,請參見Vault 客戶端 SSL 配置
-
配置一個包含客戶端證書和私鑰的 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 身份驗證
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
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 服務帳戶的經過加密簽名的動態元資料資訊。
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: [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 和服務帳戶識別符號。
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: [email protected]
-
role設定正在嘗試登入的角色的名稱。 -
credentials.location包含 JSON 格式的 Google 憑據的憑據資源路徑。 -
credentials.encoded-keyOAuth2 帳戶私鑰的 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-iam 和 com.google.auth:google-auth-library-oauth2-http),因為身份驗證實現使用 Google API 進行憑據和 JWT 簽名。
Google 憑據需要 OAuth 2 令牌來維護令牌生命週期。所有 API 都是同步的,因此 GcpIamAuthentication 不支援響應式使用所需的 AuthenticationSteps。 |
另請參閱
GitHub 身份驗證
您可以透過提供個人訪問令牌使用 GitHub 身份驗證對 Vault 進行身份驗證。作為備用方案,如果安裝並驗證了 GitHub CLI,則還可以從其中檢索令牌。
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。
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 視為可信第三方,並使用託管例項身份。
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}環境變數。 -
instance-key設定 PCF 例項身份金鑰的路徑。預設為${CF_INSTANCE_KEY}環境變數。
| PCF 身份驗證需要 BouncyCastle (bcpkix-jdk15on) 位於類路徑上才能進行 RSA PSS 簽名。 |
ACL 要求
本節解釋了 Spring Vault 訪問哪些路徑,以便您可以根據所需功能派生策略宣告。
| 功能 | 關聯的 HTTP 動詞 |
|---|---|
建立 |
|
讀取 |
|
更新 |
|
delete |
|
列表 |
|