---
# System prepended metadata

title: 密碼安全防護機制

---

# 🚀 私有雲 - **高等級安全方案**
## **使用 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 變數 |

---

# 🚀 私有雲 - **低等級安全方案**
## **使用幻境變數管理**




