iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
DevOps

DevOps菜鳥的30天實踐挑戰:從 CI/CD Pipeline 到雲端佈署系列 第 26

Day26 - 配置與管理 Kubernetes Secrets:保護敏感資訊

  • 分享至 

  • xImage
  •  

在現代應用程式的開發和維運過程中,安全地處理包括 API 密鑰、資料庫憑證、OAuth token 等,敏感資訊變得非常重要。如果這些資訊被未經授權的用戶取得,會導致嚴重的後果。Kubernetes 提供了 Secrets 這個資源來安全地存儲和管理敏感資訊,並確保應用程式可以安全地存取這些資訊。


什麼是 Kubernetes Secrets?

https://ithelp.ithome.com.tw/upload/images/20241010/20169492qi4GLsakds.png
圖片來源

Kubernetes Secrets 是用來存儲敏感資訊的資源。它能夠將敏感資訊從容器映像中分離出來,從而避免將憑證或密碼寫死在應用程式內部。通過使用 Secrets,應用程式可以在運行時從 Kubernetes 中安全地獲取這些敏感資料,而不需要將它們暴露在應用程式碼中。

Kubernetes Secrets的優點

敏感資訊的保護 是任何現代應用的核心要素。若不適當地保護這些資訊,將會給系統帶來極大的安全風險。

  1. 避免寫死敏感資訊:應用程式無需將密碼或憑證寫死 (hard-coding),可以在佈署時動態注入這些資訊。
  2. 安全傳遞和存取:支援加密存儲,並通過 Kubernetes API 安全地傳遞到 Pod 中。
  3. 減少攻擊面:將敏感資訊分開管理,能夠減少這些資訊被意外暴露或洩露的風險。
  4. 簡單的版本管理:Secrets 可以被更新或更換,確保不同環境中使用的敏感資訊是正確和一致的。

Kubernetes Secrets 的類型

支援不同類型的 Secrets,其中最常見的包括:

  • Opaque:用來存儲任意類型的資料,例如密碼、API Key 等。
  • docker-registry:用於存儲 Docker 鏡像庫的憑證。
  • tls:用來存儲 TLS 憑證的密鑰對 (private key 和 public certificate)。

如何使用 Kubernetes Secrets?

創建 Secrets

我們可以通過以下兩種方式來創建 Secrets,假設要創建一個包含資料庫憑證的 Secret:

  1. 使用命令行工具 kubectl

    kubectl create secret generic db-credentials --from-literal=username=myuser --from-literal=password=mypassword
    

    上述命令會創建一個名為 db-credentials 的 Secret,並且將 usernamepassword 以 Key-Value 的形式存儲在裡面。

  2. 使用 YAML 文件

    • 我們可以直接通過 YAML 文件來定義 Secrets:
    apiVersion: v1
    kind: Secret
    metadata:
      name: db-credentials
    type: Opaque
    data:
      username: bXl1c2Vy  # 'myuser' 的 base64 編碼
      password: bXlwYXNzd29yZA==  # 'mypassword' 的 base64 編碼
    

    使用 base64 編碼是 Kubernetes 在處理 Secrets 時的常見方式,因此每一個 data 值都需要進行編碼。

將 Secrets 加入 Pod

將 Secrets 注入 Pod 有兩種常見的方法:

  1. 通過環境變量 (Environment Variables)

    在 Pod 的定義中,可以通過環境變量來存取 Secrets。例如:

    apiVersion: v1
    kind: Pod
    metadata:
      name: secret-pod
    spec:
      containers:
      - name: mycontainer
        image: nginx
        env:
        - name: DB_USERNAME
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: username
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: password
    

    在這個配置中,DB_USERNAMEDB_PASSWORD 會被從 Secrets 中讀取,並且作為環境變量注入到容器中。

  2. 通過掛載為 Volume

    另一種方式是將 Secrets 掛載為 Volume,讓應用程式從文件系統中讀取敏感資訊:

    apiVersion: v1
    kind: Pod
    metadata:
      name: secret-pod
    spec:
      containers:
      - name: mycontainer
        image: nginx
        volumeMounts:
        - name: secret-volume
          mountPath: "/etc/secret"
          readOnly: true
      volumes:
      - name: secret-volume
        secret:
          secretName: db-credentials
    

    在這種情境下,/etc/secret 目錄會包含 db-credentials Secret 中的所有 Key-Value,應用程式可以直接讀取該目錄中的文件來存取敏感資訊。


如何保障 Secrets 的安全性?

  1. 定期更新:敏感資訊應該定期更換,並通過 CI/CD 流程自動更新 Secrets。
  2. 限制存取權限:最小權限原則,確保只有需要存取 Secrets 的 Pod 和服務帳號才有權限存取。
  3. 加密 Secrets:Kubernetes 支援將 Secrets 以加密形式存儲在 etcd 中。可以配置 Kubernetes 叢集來加密所有存儲的 Secrets。

https://ithelp.ithome.com.tw/upload/images/20241010/20169492fsE7M6qrEN.png
圖片來源

  1. 使用秘密管理服務:在更高安全性需求下,可以考慮使用 AWS Secrets Manager、Azure Key Vault 或 HashiCorp Vault 來存儲和管理 Secrets。

https://ithelp.ithome.com.tw/upload/images/20241010/20169492GZhq15iEWV.jpg
圖片來源


小結

Kubernetes Secrets 是保護應用敏感資訊的核心工具。通過正確使用 Secrets,DevOps 團隊可以有效地保護關鍵資訊,並確保應用程式的安全性。無論是通過環境變量還是 Volume 掛載,Kubernetes 都能夠靈活且安全地將敏感資訊提供給運行中的容器!


參考文件


上一篇
Day25 - 安全的 DevOps 流程:DevSecOps介紹
下一篇
Day27 - 災難恢復與備份策略
系列文
DevOps菜鳥的30天實踐挑戰:從 CI/CD Pipeline 到雲端佈署30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言