在 Day24 我们建置了 Database 相关 yaml 档案,并且利用 Helm Chart 部属到开发环境做检查,确认无任何问题後,准备将更新上传到 Git Repository,上传前做了最後一次检查,看到 Secret 元件时心想,把资料库帐密丢到 Git 储存是正确的吗 ?
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 时会先在 k8s Cluster 安装一个 Controller ,透过 Controller 将原本的 Secret 元件加密成 SealedSecret 元件,此元件因为加密过可以安全的储存到 Git Repo 里,当把 SealedSecret 元件部属到 k8s Cluster 时, Controller 就会将其解密,获得需要的 Secret 内容。
图片取至 Sealed Secrets: Protecting your passwords before they reach Kubernetes
要使用 Sealed-secrets 需要准备两个工具
下面就透过实际操作来了解如何建置 sealed-secrets 。
进入 Cloud Shell 网站
点击倒三角形->点选专案的 PROJECT_ID
,开启专案 Terminal
Controller 我们使用 Helm 进行安装。
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 工具。
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
kubeseal --version
(输出结果)
kubeseal version: v0.16.0
找到想要加密的 Secret 物件,这里使用前一天建立的 db-secret.yaml 档案。
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 物件
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 档案。
db-secret.yaml
档案mv db-sealed-secret.yaml db-secret.yaml
将 Secret 加密後,可以更新应用来检查是否 Secret 能成功建立。
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
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 也不用担心资安问题了。
>>: Day#10 初始专案...again (+版本控制)
此篇会介绍 Bootstrap 使用的 css reset 档案 _reboot.scss。 事前...
资料要产生出价值就不得不提AI与机器学习,各种AI的应用已成为各大平台服务的必争之地,透过演算法从不...
之前我们在写 API 程序的时候,一开始使用写死在程序里的资料集合(List),这个方法虽然快速让我...
今天是最後一天了,每天看这本书《听说做完380个实例,就能成为.NET Core大内高手》,真的里面...
不晓得大家还记不记得我在Day06的时候有跟大家大概介绍过Project创建完後的档案,还记得里面有...