1. 概述
在本教程中,我們將實現 Spring CredHub,它是 CredHub 的 Spring 抽象,用於存儲憑證以及帶有映射憑證資源到用户和操作的訪問控制規則。請注意,在運行代碼之前,我們需要確保我們的應用程序在 Cloud Foundry 平台上運行,並且已安裝 CredHub。
2. Maven 依賴
首先,我們需要安裝 <a href="https://mvnrepository.com/artifact/org.springframework.credhub/spring-credhub-starter"><em>spring-credhub-starter</em></a > 依賴:
<dependency>
<groupId>org.springframework.credhub</groupId>
<artifactId>spring-credhub-starter</artifactId>
<version>2.2.0</version>
</dependency>3. 為什麼憑證管理很重要?
憑證管理是指在整個生命週期中,安全且集中地處理憑證的過程,主要包括生成、創建、輪換和撤銷等環節。 儘管每個公司的應用程序和信息技術環境差異很大,但有一點是始終如一的:應用程序需要訪問其他應用程序、數據庫或工具時,都需要憑證。
憑證管理對於數據安全至關重要,因為它為用户和應用程序提供了訪問敏感信息的方式。 因此,在傳輸中和存儲時都必須確保其安全。 最佳策略之一是使用 API 調用,將硬編碼的憑證和手動管理替換為像 CredHub 這樣的專用憑證管理工具,以編程方式檢索它們。
4. CredHub API
CredHub 提供了全面的 API 接口,用於管理和訪問您的 CredHub 資源。這些 API 允許您通過編程方式與 CredHub 系統交互,實現自動化和集成。
API 概覽
- 認證 (Authentication): 所有 API 請求都需要有效的認證憑據。
- 速率限制 (Rate Limits): 為了保護系統穩定性和公平使用,API 請求受到速率限制。
- 版本控制 (Version Control): CredHub API 遵循版本控制策略,以確保向後兼容性。
主要 API 端點
/users: 用於管理用户賬户。/credentials: 用於管理憑據(例如,API 密鑰、密碼)。/organizations: 用於管理組織和組織結構。/policies: 用於管理 CredHub 策略。
代碼示例 (JavaScript)
// 獲取用户信息的示例
fetch('/users/123')
.then(response => response.json())
.then(data => console.log(data));
// 獲取憑據的示例
fetch('/credentials/api_key')
.then(response => response.json())
.then(data => console.log(data));
4.1. 身份驗證
CredHub API 身份驗證有以下兩種方式:UAA(OAuth2) 和 多方 TLS。
默認情況下,CredHub 提供集成的多方 TLS 身份驗證。要使用此方案,請在應用程序屬性中指定 CredHub 服務器的 URL:
spring:
credhub:
url: <CredHub URL>通過 UAA 還可以驗證 API,這需要使用客户端憑據授權令牌獲取訪問令牌。
spring:
credhub:
url: <CredHub URL>
oauth2:
registration-id: <credhub-client>
security:
oauth2:
client:
registration:
credhub-client:
provider: uaa
client-id: <OAuth2 client ID>
client-secret: <OAuth2 client secret>
authorization-grant-type: <client_credentials>
provider:
uaa:
token-uri: <UAA token server endpoint>訪問令牌隨後可以傳遞到授權標頭中。
4.2. 憑據 API
通過 `CredHubCredentialOperations</em/> 接口,我們可以調用 CredHub API 創建、更新、檢索和刪除憑據。 CredHub 支持的憑據類型如下:
- value – 用於單個配置的字符串
- json – 用於靜態配置的 JSON 對象
- user – 3 個字符串 – 用户名、密碼和密碼哈希
- password – 用於密碼和其他字符串憑據的字符串
- certificate – 包含根 CA、證書和私鑰的對象
- rsa – 包含公鑰和私鑰的對象
- ssh – 包含 SSH 格式的公鑰和私鑰的對象
4.2. 權限 API
權限在憑據寫入時提供,用於控制用户可以訪問、更新或檢索的內容。Spring CredHub 提供 CredHubPermissionV2Operations 接口,用於創建、更新、檢索和刪除權限。用户允許執行的捛作包括:讀取、寫入 和 刪除。
5. CredHub 集成
我們將實現一個 Spring Boot 應用程序,該應用程序返回訂單詳情,並演示一些示例以解釋憑證管理的全生命週期。
5.1. CredHubOperations 接口
CredHubOperations 接口位於 org.springframework.credhub.core 包中。它是 Spring CredHub 的核心類,支持豐富的特性,用於與 CredHub 交互。 它提供對接口的訪問,這些接口對整個 CredHub API 進行建模,並對領域對象和 CredHub 數據之間進行映射:
public class CredentialService {
private final CredHubCredentialOperations credentialOperations;
private final CredHubPermissionV2Operations permissionOperations;
public CredentialService(CredHubOperations credHubOperations) {
this.credentialOperations = credHubOperations.credentials();
this.permissionOperations = credHubOperations.permissionsV2();
}
}5.2. 憑證創建
首先,我們創建一個新的憑證,類型為 密碼,該憑證使用 PasswordCredentialRequest 構建而成:
SimpleCredentialName credentialName = new SimpleCredentialName(credential.getName());
PasswordCredential passwordCredential = new PasswordCredential((String) value.get("password"));
PasswordCredentialRequest request = PasswordCredentialRequest.builder()
.name(credentialName)
.value(passwordCredential)
.build();
credentialOperations.write(request);同樣,其他的 CredentialRequest 實現也可以用於構建不同類型的憑證,例如,ValueCredentialRequest 用於 value 憑證,RsaCredentialRequest 用於 rsa 憑證,等等。
ValueCredential valueCredential = new ValueCredential((String) value.get("value"));
request = ValueCredentialRequest.builder()
.name(credentialName)
.value(valueCredential)
.build();RsaCredential rsaCredential = new RsaCredential((String) value.get("public_key"), (String) value.get("private_key"));
request = RsaCredentialRequest.builder()
.name(credentialName)
.value(rsaCredential)
.build();5.3. 憑據生成
Spring CredHub 還提供了一種動態生成憑據的選項,以避免應用程序端管理憑據的精力消耗。 這樣做,反過來又增強了數據安全性。 讓我們看看如何實現此功能:
SimpleCredentialName credentialName = new SimpleCredentialName("api_key");
PasswordParameters parameters = PasswordParameters.builder()
.length(24)
.excludeUpper(false)
.excludeLower(false)
.includeSpecial(true)
.excludeNumber(false)
.build();
CredentialDetails<PasswordCredential> generatedCred = credentialOperations.generate(PasswordParametersRequest.builder()
.name(credentialName)
.parameters(parameters)
.build());
String password = generatedCred.getValue().getPassword();5.4. 憑據輪換與撤銷
憑據管理中的另一個重要環節是輪換憑據。以下代碼演示了我們如何使用 密碼 憑據類型來實現這一點:
CredentialDetails<PasswordCredential> newPassword = credentialOperations.regenerate(credentialName, PasswordCredential.class);
CredHub 還允許 證書 憑證類型同時擁有多個有效版本,從而實現無需停機地進行輪換。 最終 且 最為 關鍵 的 環節 是 憑證的撤銷,該撤銷操作可以如下實施:</span
credentialOperations.deleteByName(credentialName);5.5. 憑證檢索
現在我們對完整的憑證管理生命週期有了充分的瞭解。我們將看到如何檢索最新版本的 密碼 憑證,用於訂單 API 身份驗證:
public ResponseEntity<Collection<Order>> getAllOrders() {
try {
String apiKey = credentialService.getPassword("api_key");
return new ResponseEntity<>(getOrderList(apiKey), HttpStatus.OK);
} catch (Exception e) {
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
}
}
public String getPassword(String name) {
SimpleCredentialName credentialName = new SimpleCredentialName(name);
return credentialOperations.getByName(credentialName, PasswordCredential.class)
.getValue()
.getPassword();
}5.6. 控制憑據訪問權限
權限可以附加到憑據上,以限制訪問。例如,一個權限授予單個用户訪問憑據的權限,並使該用户能夠對憑據執行所有操作。 另一個權限可以附加,允許所有用户僅對憑據執行 讀取 操作。
下面是一個示例,演示瞭如何將權限附加到憑據上,允許用户 u101 執行 讀取 和 寫入 操作:
Permission permission = Permission.builder()
.app(UUID.randomUUID().toString())
.operations(Operation.READ, Operation.WRITE)
.user("u101")
.build();
permissionOperations.addPermissions(name, permission);Spring CredHub 除了支持 <em READ 和 <em WRITE 之外,還提供對其他操作的支持,從而允許用户:
- – 通過 ID 和名稱獲取憑據
- – 通過名稱設置、生成和更新憑據
- – 通過名稱刪除憑據
- – 通過憑據名稱獲取訪問控制列表 (ACL)
- – 向憑據 ACL 添加和刪除條目
6. 結論
在本教程中,我們演示瞭如何使用 Spring CredHub 庫將 CredHub 集成到 Spring Boot 中。 我們為 Order 應用程序集中了憑證管理,涵蓋了兩個關鍵方面:憑證生命週期和權限。