# 🚀 私有雲 - **高等級安全方案** ## **使用 HashiCorp Vault 進行動態密碼管理** ### **✅ 優點** 1. 應用程式請求 Vault 生成 **臨時帳密** 2. Vault 產生一組 **限時帳密** 並回應 3. 應用程式使用該帳密存取資料庫 4. 帳密在短時間內 **自動失效** --- ## **🔄 HashiCorp Vault 運作流程** 1. **管理員設定 Vault** - 在 Vault 內部建立 **KV(Key-Value)存儲**,或使用 **Database Secrets Engine** 來管理資料庫密碼。 - 設定 **動態密碼生成**,允許應用程式透過 API 請求臨時密碼。 2. **應用程式請求存取密碼** - 應用程式透過 **Vault API** 或 **CLI** 向 Vault 請求資料庫帳密。 - Vault 驗證應用程式的身份(透過 ACL、JWT、TLS 憑證等)。 3. **Vault 產生臨時帳密** - Vault 透過 **Database Secrets Engine** 產生 **限時有效的資料庫帳密**(例如 1 小時後自動失效)。 - 避免長期靜態密碼暴露風險。 4. **應用程式使用帳密連接資料庫** - 應用程式取得臨時帳密後,使用該密碼與資料庫建立連線。 5. **密碼過期與自動失效** - Vault 會在設定的時間後 **自動撤銷密碼**,防止未授權存取。 - 透過 **審計日誌(Audit Logs)** 記錄所有存取紀錄,以確保安全性。 --- # 🚀 私有雲 - **中等級安全方案** ## **在 Java 專案導入 IDC Kubernetes Secrets** ### **🔐 適用於:** - **資料庫密碼** - **API Key** - **憑證** 等敏感資訊 --- ## **1️⃣ Kubernetes Secret 建立方法** | **方法** | **指令/YAML 設定** | **描述** | |----------|----------------|----------| | **使用 `kubectl` 命令行** | `kubectl create secret generic my-secret --from-literal=DB_USER=myuser --from-literal=DB_PASSWORD=mypassword` | 透過命令行建立 Secret | | **使用 YAML 定義 Secret** | 建立 `secret.yaml` 檔案,然後 `kubectl apply -f secret.yaml` | 可版本控制、易於管理 | | **Base64 編碼方式** | `echo -n 'myuser' | base64` | Kubernetes Secret `data` 欄位需要 Base64 編碼 | --- ## **2️⃣ Java 應用讀取 Kubernetes Secrets 的方式** | **方法** | **適用場景** | **優點** | **缺點** | |----------|-------------|----------|----------| | **環境變數讀取** | 適用於所有 Java 專案 | 簡單、安全、無須修改應用程式架構 | 需確保 Pod 內的環境變數安全 | | **掛載 Secret 作為 Volume** | 需要存取大量設定檔 | 避免密碼暴露於環境變數 | 需要額外的 Volume 掛載 | | **Spring Boot 整合 `spring-cloud-kubernetes`** | Spring Boot 應用 | 直接讀取 Kubernetes Secrets,易於維護 | 需額外安裝 Spring Cloud Kubernetes 依賴 | --- ## **3️⃣ 環境變數讀取方式** | **步驟** | **Kubernetes Deployment 設定** | **Java 讀取方式** | |----------|------------------------|----------------| | **設定環境變數** | ```yaml env: - name: DB_USER valueFrom: secretKeyRef: name: my-secret key: DB_USER ``` | `System.getenv("DB_USER")` | | **部署 Kubernetes** | `kubectl apply -f deployment.yaml` | - | --- ## **4️⃣ 掛載 Secret 為 Volume** | **步驟** | **Kubernetes Deployment 設定** | **Java 讀取方式** | |----------|------------------------|----------------| | **掛載 Volume** | ```yaml volumeMounts: - name: secret-volume mountPath: "/etc/secrets" ``` | `Files.readAllBytes(Paths.get("/etc/secrets/DB_USER"))` | --- ## **5️⃣ Spring Boot 整合 Kubernetes Secrets** | **步驟** | **設定** | **描述** | |----------|---------|----------| | **加入 Spring Boot 依賴** | `spring-cloud-starter-kubernetes-fabric8-config` | 允許 Spring Boot 直接存取 Kubernetes Secrets | | **設定 `application.properties`** | `spring.cloud.kubernetes.secrets.enableApi=true` | 啟用 Secret 自動讀取 | | **使用 `@Value` 讀取 Secret** | `@Value("${DB_USER}")` | 直接將 Kubernetes Secret 讀取到 Spring Boot 變數 | --- # 🚀 私有雲 - **低等級安全方案** ## **使用幻境變數管理**