Kubernetes Secrets 是管理敏感資訊的重要機制,但其安全性設定常被輕忽,可能導致嚴重漏洞。本文旨在提供全面的 Secrets 管理,從基本概念到進階策略,協助工程師保護敏感資訊。首先,理解 Secrets 的重要性至關重要,它們是 API 金鑰、密碼等資訊的安全儲存函式庫。不當的 Secrets 管理,例如將其暴露於程式碼倉函式庫,會增加系統風險。Secrets 以 base64 編碼儲存於 Kubernetes 的特殊物件中,確保資料安全。Opaque 是最常見的 Secrets 型別,用於儲存任意資料。實務上,加密是保護 Secrets 的關鍵。傳輸加密保護資料在傳輸過程中的安全,而靜態加密則保護儲存中的資料。API Server、Pod 資料和 Storage 都需要加密保護。在 CI/CD 流程中,安全地整合 Secrets 是一大挑戰,需要仔細考量不同 CI/CD 工具的特性。Jenkins 的 withCredentials 指令提供了一種注入 Secrets 的方法。此外,Kubernetes 的身份與存取控制(IAM)機制也是確保 Secrets 安全的關鍵。RoleBinding 將角色繫結到特定使用者,而 Role 則定義了許可權規則。最後,Kubernetes 支援與多種雲端服務供應商整合,例如 AWS Secret Manager、Azure Key Vault 和 Google Secret Manager,提供更彈性的 Secrets 管理方案。

Kubernetes Secrets 管理手冊

設計、實施及維護生產級 Kubernetes Secrets 管理方案

隨著容器協調技術的興起,Kubernetes 已成為容器協調的事實標準。它為開發團隊提供了前所未有的效率和靈活性,但在這個高效率的過程中,安全問題常常被忽視。特別是對於敏感資訊如憑證、API 金鑰等的管理,稱為「Secrets」的這些敏感資訊若管理不善,可能會導致嚴重的安全漏洞,甚至成為攻擊者的目標。

本文旨在為實務工作者提供一個全面的,探討 Kubernetes 中 Secrets 的管理和安全策略。玄貓將從基礎概念開始,逐步揭示 Kubernetes 安全架構中的潛在風險和常見陷阱,並提供實際可行的方法和工具來保護這些敏感資訊。

Kubernetes Secrets 的重要性

在現代雲原生應用開發中,Kubernetes 不僅僅是一個容器協調平台,更是一個強大的安全管理工具。然而,許多組織在使用 Kubernetes 的過程中,往往忽視了 Secrets 的管理。這些敏感資訊如果被惡意利用,可能會對組織造成不可逆轉的損失。

內容解密:

  • 容器協調技術:Kubernetes 作為一個容器協調平台,能夠自動化地佈署、擴充套件和管理容器化應用。它提供了豐富的功能來提升開發和執行效率。
  • 敏感資訊管理:Secrets 管理是 Kubernetes 安全策略中的重要部分。這些敏感資訊包括 API 金鑰、密碼、憑證等。
  • 安全風險:若 Secrets 管理不善,可能會導致嚴重的安全漏洞。例如,將 Secrets 傳遞至 GitHub 等程式碼倉函式庫中,可能會增加攻擊者的攻擊面。
  graph TD;
    A[Kubernetes] --> B[容器協調];
    A --> C[敏感資訊管理];
    C --> D[Secrets];
    D --> E[API 金鑰];
    D --> F[密碼];
    D --> G[憑證];
    B --> H[自動化佈署];
    B --> I[擴充套件管理];
    C --> J[安全風險];
    J --> K[程式碼倉函式庫漏洞];

此圖示展示了 Kubernetes 的主要功能及其與 Secrets 管理之間的關係。Kubernetes 作為一個容器協調平台,提供了自動化佈署和擴充套件管理等功能。同時,它也負責敏感資訊的管理,這些資訊包括 API 金鑰、密碼和憑證等。若 Secrets 管理不善,可能會導致嚴重的安全風險。

Kubernetes Secrets 的基本概念

在探討具體策略之前,我們需要先了解一些基本概念。Kubernetes 中的 Secrets 是一種特殊型別的物件,用於儲存和管理敏感資訊。這些資訊可以是密碼、API 金鑰或其他任何需要保護的資料。

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=   # base64 編碼
  password: MWYyZDFlMmU2N2Rm # base64 編碼

內容解密:

  • Secrets 物件:Kubernetes 中的 Secrets 是一種特殊型別的物件,用於儲存和管理敏感資訊。
  • base64 編碼:Secrets 中的資料通常使用 base64 編碼儲存,以確保資料在傳輸過程中的安全性。
  • Opaque 型別:這是最常見的一種 Secrets 型別,用於儲存任意資料。
  graph TD;
    A[Secrets] --> B[Opaque 型別];
    A --> C[Base64 編碼];
    A --> D[API 金鑰];
    A --> E[密碼];

此圖示展示了 Kubernetes Secrets 的基本結構及其常見用途。Secrets 是一種特殊型別的物件,主要用於儲存和管理敏感資訊。這些資訊通常使用 base64 編碼儲存,以確保資料在傳輸過程中的安全性。Opaque 型別是最常見的一種 Secrets 型別,用於儲存任意資料。

安全策略與最佳實踐

接下來我們來探討一些具體的安全策略和最佳實踐。首先我們需要了解如何在 Kubernetes 中進行加密操作。

加密操作

加密操作包括兩個主要部分:傳輸加密(Encryption in Transit)和靜態加密(Encryption at Rest)。

  • 傳輸加密:傳輸加密確保資料在傳輸過程中不被篡改或窺探。Kubernetes 支援多種加密協定,如 TLS 和 HTTPS。
  • 靜態加密:靜態加密確保資料在儲存時不被未經授權的人員讀取或篡改。Kubernetes 支援多種加密演算法來保護靜態資料。
apiVersion: v1
kind: Secret
metadata:
  name: encrypted-secret
type: Opaque
data:
  username: YWRtaW4=   # base64 編碼
  password: MWYyZDFlMmU2N2Rm # base64 編碼
stringData:
  additional-info: |
    This is an example of encrypted data.

加密策略

針對不同情境有不同加密策略可供選擇:

  • API Server 加密:所有 API Server 和 Cluster 資料都應該進行加密。
  • Pod 資料加密:Pod 中應該使用 TLS 和 HTTPS 進行資料傳輸。
  • Storage 加密:所有 Storage 資源應該進行靜態加密。

內容解密:

  • 傳輸加密:傳輸加密用於保護資料在傳輸過程中的安全性。
  • 靜態加密:靜態加密用於保護資料在儲存時不被未經授權的人員讀取或篡改。
  • API Server 加密:確保 API Server 和 Cluster 資料都進行加密。
  • Pod 資料加密:確保 Pod 中使用 TLS 和 HTTPS 進行資料傳輸。
  • Storage 加密:確保所有 Storage 資源進行靜態加密。
  graph TD;
    A[Security Strategies] --> B[TLS & HTTPS for Pod Data];
    A --> C[Encryption in Transit];
    A --> D[Encryption at Rest for Storage];
    A --> E[API Server Encryption];

此圖示展示了不同情境下的加密策略。傳輸加密用於保護資料在傳輸過程中的安全性;靜態加密則保護資料在儲存時不被未經授權的人員讀取或篡改;Pod 資料應該使用 TLS 和 HTTPS;API Server 和所有 Storage 資源應該進行相應的加密操作。

CI/CD Pipeline 與 Secrets 整合

自動化佈署流程是現代雲原生應用開發中不可或缺的一部分。然而如何將 Secrets 安全地整合到 CI/CD Pipeline 中是一個挑戰。

  • CI/CD Pipeline 基本概念 :CI/CD 是持續整合/持續交付(Continuous Integration/Continuous Delivery)的一部分。
  • Secrets 整合 :要將 Secrets 安全地整合到 CI/CD Pipeline 中需要考慮多方面因素。
  • CI/CD Tools :不同 CI/CD 工具有不同方法來整合和保護 Secrets。
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                script {
                    // Build process
                }
            }
        }
        stage('Deploy') {
            steps {
                script {
                    // Deploy process with secrets injection
                    withCredentials([string(credentialsId: 'my-secret', variable: 'SECRET')]) {
                        sh 'echo $SECRET'
                    }
                }
            }
        }
    }
}

內容解析:

  • CI/CD Pipeline:CI/CD 是持續整合/持續交付(Continuous Integration/Continuous Delivery)的一部分。
  • Secrets 整合 :要將 Secrets 安全地整合到 CI/CD Pipeline 中需要考慮多方面因素。
  • withCredentials :Jenkins 提供了一種 withCredentials 指令來注入 secrets 。
  graph TD;
    A[CI/CD Pipeline] --> B[Build Stage];
    B --> C[Deploy Stage with Secrects Injection];
    A --> D[Injection Mechanism with Jenkins withCredentials]

此圖示展示了 CI/CD Pipeline 中如何處理 Secret 注入步驟。在 Build 階段與 Deploy 階段都需要考慮 Secret 的注入機制來確保秘鑰安全與運作無緒。

身份與存取控制

身份與存取控制(Identity and Access Management, IAM)是 Kubernetes 安全性中不可或缺的一部分。IAM 用於控制誰可以存取哪些資源以及如何存取這些資源。

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-secrets-binding
subjects:
- kind: User
  name: "jane"
roleRef:
  kind: Role
  name: read-secrets-role
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

內容解析:

  • RoleBinding:RoleBinding 用於將角色繫結到特定使用者或服務帳戶上。
  • Role:角色定義了一組許可權規則來控制誰可以執行什麼操作。
  • namespace:指定 namespace 用來限制角色範圍。
  graph TD;
    A[k8s IAM] --> B[k8s RoleBinding]
    B ---> C[k8s Role]

此圖示展示了身份與存取控制(IAM)機制如何運作。角色繫結(RoleBinding)將角色繫結到特定使用者上而角色則定義了一組許可權規則來控制使用者可以執行什麼操作。

不同雲端服務供應商間之整合

Kubernetes 原生支援多雲端服務環境整合與第三方供應商之整合以提升系統之彈性與可擴充性。

  1. AWS Secret Manager
  2. Azure Key Vault
  3. Google Secret Manager

以下為 AWS 與 Azure 的整合範例:

# AWS Secret Manager Example (Assume the AWS IAM role and permissions are properly configured)
apiVersion: v1
kind: Pod
metadata:
  name: aws-secrets-pod
spec:
  containers:
    - name: aws-container
      image: amazon/aws-cli:v2.0.0 # Example image for illustration purposes.
      envFrom:
        - secretRef:
            name: aws-secrets # Assume this secret is already created in Kubernetes.
# Azure Key Vault Example (Assume the Azure Managed Identity and permissions are properly configured)
apiVersion: v1
kind: Pod
metadata:
  name: azure-secrets-pod
spec:
  containers:
    - name: azure-container
      image: mcr.microsoft.com/azure-cli:v2.0.0 # Example image for illustration purposes.
      envFrom:
        - secretRef:
            name: azure-secrets # Assume this secret is already created in Kubernetes.

內容解析:

  • AWS 與 Azure 的整合方法類別似但具細微差異之處請參照其官方檔案以確認正確組態方式及許可權分配方式。
  • 本範例中 secretRef 組態可以使用環境變數方式組態以達到整合之需求並且假設已經完成 secret 建立流程以避免誤解為連結錯誤結果。(即為環境變數方式)
  graph TD;
A["AWS Secret Manager"]-->B["IAM Role"];
B-->C["Secret Creation"];
A-->D["Managed Identity"];

E["Azure Key Vault"]-->D["Managed Identity"];
D-->F["Secret Creation"];

G["Kubernetes"]-->H["Pod Environment Variables"];
H-->I["Secret Reference"];
I-->J["Secure Integration"];

此圖示展示了 AWS 與 Azure 雲端服務之整合流程:

  1. AWS Secret Manager 需要設定 IAM Roles 和適當許可權後進行秘鑰建立以達到正確使用 Secret 。
  2. Azure Key Vault 需要設定 Managed Identity 和適當許可權後進行秘鑰建立以達到正確使用 Secret 。
  3. 在 Kubernetes Pod 組態環境變數後引入 secretReference 組態可以達到多雲環境整合目標並達到同樣秘鑰協助之需求與效果相同.