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 也不用担心资安问题了。


<<:  终极密码DC版

>>:  Day#10 初始专案...again (+版本控制)

第 27 集:Bootstrap 客制化 reboot 重置

此篇会介绍 Bootstrap 使用的 css reset 档案 _reboot.scss。 事前...

DAY 29 Big Data 5Vs – Value(价值) - AWS SageMaker & ML Family

资料要产生出价值就不得不提AI与机器学习,各种AI的应用已成为各大平台服务的必争之地,透过演算法从不...

[Day16] MySQL 简介

之前我们在写 API 程序的时候,一开始使用写死在程序里的资料集合(List),这个方法虽然快速让我...

第30天:《听说做完380个实例,就能成为.NET Core大内高手》里面真的没怎麽讲.NET Core

今天是最後一天了,每天看这本书《听说做完380个实例,就能成为.NET Core大内高手》,真的里面...

Day19 探讨setting(1)

不晓得大家还记不记得我在Day06的时候有跟大家大概介绍过Project创建完後的档案,还记得里面有...