iT邦幫忙

2021 iThome 鐵人賽

DAY 25
0
DevOps

DevOps 好想學!新手也能打造雲端 Study Lab系列 第 25

Day25 - 如何安全的把 Kubernetes Secret 儲存到 Git Repository

前言

Day24 我們建置了 Database 相關 yaml 檔案,並且利用 Helm Chart 部屬到開發環境做檢查,確認無任何問題後,準備將更新上傳到 Git Repository,上傳前做了最後一次檢查,看到 Secret 元件時心想,把資料庫帳密丟到 Git 儲存是正確的嗎 ?

  • db-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
data:
  MONGO_INITDB_ROOT_USERNAME: ZGJ1c2Vy
  MONGO_INITDB_ROOT_PASSWORD: ZGJwYXNzd2Q=

帳密有使用 base64 編碼過,使其變成非明碼 ( opaque ) 的形式,但要注意 base64 只是一種編碼形式而非加密方式,只要用 base64decode 工具就能輕鬆破解。

echo ZGJwYXNzd2Q= | base64 --decode

(輸出結果)

dbpasswd

GitOps 概念強調把所有資源集中到 Git 去做管理,但若是直接把 Secret 物件也上傳到 Git Repo ,只要有 Repo 讀取權限的人就能取得帳號密碼,進而引發可怕的資安問題。針對這樣的情境,我們可以使用 sealed-secrets 工具,讓你可以安全的把 Kubernetes Secret 儲存到 Git Repository 。

Sealed-secrets 介紹

使用 Sealed-secrets 時會先在 k8s Cluster 安裝一個 Controller ,透過 Controller 將原本的 Secret 元件加密成 SealedSecret 元件,此元件因為加密過可以安全的儲存到 Git Repo 裡,當把 SealedSecret 元件部屬到 k8s Cluster 時, Controller 就會將其解密,獲得需要的 Secret 內容。

https://ithelp.ithome.com.tw/upload/images/20210925/20139235n3aXWwxYqe.png

圖片取至 Sealed Secrets: Protecting your passwords before they reach Kubernetes

Sealed-secrets 操作教學

要使用 Sealed-secrets 需要準備兩個工具

  • 在 K8s Cluster 安裝 Sealed-secrets Controller
  • 在 CLI 安裝 kubeseal

下面就透過實際操作來了解如何建置 sealed-secrets 。

  1. 進入 Cloud Shell 網站

  2. 點擊倒三角形->點選專案的 PROJECT_ID,開啟專案 Terminal

Controller 我們使用 Helm 進行安裝。

  1. 安裝 Sealed-secrets Controller
helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
helm repo update
helm install --namespace kube-system secret-manager sealed-secrets/sealed-secrets 

接著安裝 kubeseal CLI 工具。

  1. 安裝 kubeseal
wget https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.16.0/kubeseal-linux-amd64 -O kubeseal
sudo install -m 755 kubeseal /usr/local/bin/kubeseal
  1. 檢查 kubeseal 是否成功安裝
kubeseal --version

(輸出結果)

kubeseal version: v0.16.0

找到想要加密的 Secret 物件,這裡使用前一天建立的 db-secret.yaml 檔案。

  1. 找到 db-secret.yaml 檔案
cd ~/webapp/templates
cat db-secret.yaml

(輸出結果)

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
data:
  MONGO_INITDB_ROOT_USERNAME: ZGJ1c2Vy
  MONGO_INITDB_ROOT_PASSWORD: ZGJwYXNzd2Q=

接著就可以透過 Controller 以及 kubeseal,將 Secret 加密成 SealedSecret 物件

  1. db-secret.yaml 加密成 SealedSecret 物件
kubeseal --format=yaml --scope cluster-wide\
    --controller-name=secret-manager-sealed-secrets \
    --controller-namespace=kube-system \
    < db-secret.yaml | tee db-sealed-secret.yaml

--scope cluster-wide 代表可以在任何 Namespace 被解密

(輸出結果)

apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  annotations:
    sealedsecrets.bitnami.com/cluster-wide: "true"
  creationTimestamp: null
  name: db-secret
spec:
  encryptedData:
    MONGO_INITDB_ROOT_PASSWORD: AgA7P2AWsBs1cEdOq/RQkOJHnk3uc+HMQLxzhe1uXnPa3wZKDRk2hyGDCVeUtlxMzltObdCTtNR7cJkaiLZ6zlpP0wlpbv+F1cjJmqLIq4zqEAcwOradycQ4ZgJbq3qYi4ovN8aR22K0CgzkpH1g+UQBWrPBbiP7Ti1SVjsylKylkxirWdoGShTSmaBjW1DVlOEISSLuq6pXuJieu5GB+y5MO9MvA6qmEHh2nCuNKRD6DKpUghvx9g7jkz1jjoMopZ7Zd3rc+oh6lqp6vVgFIcfXmt8zbcGOXG+qhVLn/fWqQN2U0HVpV3w7bYtotsNbgjvXp/F4YNdCETrI16ZKDU8uygfOAlUnlfcWC+lionkza5hpkjD7x/h6R+WTYaTDlBQUKq2XCoo40bPoyy+hlpRBEmNB5cH83+bJ7NklBqIYeJw50Y7ShRxsRF1RkaNB3t80SZ1dFxVu45VGZPdt2rCmdH7vKCYx6A65IkdK3pTVhLkP7r0gG++dPgmTbCA9BTGGX1lXR9BJ9Yw7PF40xI6HihWKHcIHFeYd6fXDD5RGPwRcUoQhaINP4q+/gO4sp4/P73l1bB6306Dt0m2W1L2Vv9WTtPqsWMd1QTRowSQF4xd+nFKA3qqksGwFqM4raMKQ4v9joN+WDALzbxmTB9YgoyRCWH4zCxVadzMxiY/bErhX5KUwribuogyHD+gxju5V5ysKhEpS0g==
    MONGO_INITDB_ROOT_USERNAME: AgC5fgrIwS97phQZ2b61nIjVlO3IcNXFNAJmvgIrQLf1q0EHFzcjAdbOvXMOLoLxErVeYAqmO0lTLSQo7/x00D3r9MocO6UfHGQo7Jdf60iFZ85Y8AyFetSFtCckJY5yRpnPJCvOrcffCUaFKpiBRl7q6q0eBJxD/MWjftRG2et65Z8UNHeDzhQb9v9qv3CR3i0be8PwCq5HaN0LxsBRe77mMvLlJ6fywTI3ea0FZ5vVYxQlQhD6Jc+LFZzfSA3KG9HPaflKPmMuD2a7fdQTenNykrfexewnP35XAEQTBNuAW6YreIa16wGVeTMfaxJCCiwlIGBtLkrBq8ZQW+1GvxXQ1yh1FcQ+8173UQj3ppHoQ8qJl+UYS63vpQh3z0YYFsWHyWNhIpkq+P5PMEf3OsvPtHEX2dSojL78Hugbknl3aqGKuVB3lNhpHlxYaZAbbhED9fuF9zRi28U6AMHVpxof13fFlSIsgHdmbm+vQbISA3U3f6BOi312VCYzCqA9G8lx//NwqBaH/cgIjrRpPXOlIzUOcAcmqlclZsxmrT4y1yRBrSKK8+6pGr1PlNAHBxL/r/795LbjXzuDS5ZNpe2F2iKa0cpIEhcqbcYSGX6v7YIllLjW5vogH6JjTa7NivWx0RK5ONWXn1c36YpoTDtp8t+8XwhsTOOseny/bOZx/iJRzzYia28LHQ/xsAwUbzETmK+SyRs=
  template:
    data: null
    metadata:
      annotations:
        sealedsecrets.bitnami.com/cluster-wide: "true"
      creationTimestamp: null
      name: db-secret

產生了 db-sealed-secret.yaml 檔案,裡面的 DB 帳密資訊已被加密過,可以用此物件來取代掉原本的 Secret 檔案。

  1. 取代 db-secret.yaml 檔案
mv db-sealed-secret.yaml db-secret.yaml

將 Secret 加密後,可以更新應用來檢查是否 Secret 能成功建立。

  1. 使用 Helm Chart 更新應用
cd ~/webapp
helm upgrade webapp-dev .

(輸出結果)

Release "webapp-dev" has been upgraded. Happy Helming!
NAME: webapp-dev
LAST DEPLOYED: Sat Sep 25 11:20:58 2021
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
  1. 檢查是否存在 db-secret 元件
kubectl get secret db-secret

(輸出結果)

NAME        TYPE     DATA   AGE
db-secret   Opaque   2      27s

在 Helm Chart 裡原本放的是 SealedSecret 物件,部屬到 k8s 時就會解密成 Secret 物件。

總結

若以前是將 Secret 直接放到 Repo 裡面的人,千萬不要再這麼做。透過 Sealed-secrets 這個好用工具,即使將 Secret 放在 Public Repo 也不用擔心資安問題了。


上一篇
Day24 - 為 Kubernetes 應用增添 Database
下一篇
Day26 - 替 Kubernetes 服務掛上心愛的 Domain
系列文
DevOps 好想學!新手也能打造雲端 Study Lab30

尚未有邦友留言

立即登入留言