OpenShift 4 - 在 GitOps 中使用 SealedSecret 保护敏感数据

76 篇文章 6 订阅
7 篇文章 0 订阅

OpenShift / RHEL / DevSecOps 汇总目录
文本已在 OpenShift 4.15 环境中进行验证。

为什么在 GitOps 过程中要保护 Secret 中的敏感数据

在 Kubernetes 或 OpenShift 环境中通常使用 Secret 类型对象保存用户和密码等敏感信息。虽然 Secret 会使用 Base64 对明文数据进行加密保存,但是这还不够安全。尤其是在基于 GitOps 的自动化部署过程中,保存这些敏感数据的 Secret 就放在可能任何人都可以访问的 Git Repository 中,因此就需要保护在 GitOps 过程中使用的 Secret 敏感数据。

SealedSecret 工作原理

kubeseal 运行包括两部分:部署在 OpenShift 中的 SealedSecretController,以及客户端 kubeseal 命令。使用过程大致如下:

  1. 通过 kubeseal 命令并使用 OpenShift 认可的公钥对 Secret 中的敏感数据进行加密,生成 SealedSecret 类型 YAML。加密后的 SealedSecret YAML 文件就可以放心存放在 Git Repository 中了。
  2. 在 GipOps 过程中首先 SealedSecret 对象会被部署在 OpenShift 项目中,然后 SealedSecretController 会根据 SealedSecret 对象以及系统私钥生成 Secret 对象。
    在这里插入图片描述

安装 SealedSecret 环境

安装 SealedSecret 客户端

运行命令安装客户端

$ VERSION=0.26.2
$ curl -L https://github.com/bitnami-labs/sealed-secrets/releases/download/v${VERSION}/kubeseal-${VERSION}-linux-amd64.tar.gz | tar xvz -C ./
$ sudo install -m 755 kubeseal /usr/local/bin/kubeseal

安装 SealedSecret 服务端

  1. 执行命令,在 kube-system 项目中部署 sealed-secrets-controller。
$ oc apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v${VERSION}/controller.yaml
  1. 确认 sealed-secrets-controller 已经部署成功。
$ oc get deploy -n kube-system sealed-secrets-controller
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
sealed-secrets-controller   1/1     1            1           2m
  1. 查看 sealed-secrets-controller 的运行日志,确认 sealed-secrets-controller 创建了 kube-system/sealed-secrets-keyXXXXX 证书。
$ oc logs -n kube-system deploy/sealed-secrets-controller
controller version: 0.18.2
2022/09/21 03:02:28 Starting sealed-secrets controller version: 0.18.2
2022/09/21 03:02:28 Searching for existing private keys
2022/09/21 03:02:32 New key written to kube-system/sealed-secrets-keyzbk87
2022/09/21 03:02:32 Certificate is
-----BEGIN CERTIFICATE-----
MIIEzDCCArSgAwIBAgIQXDpPt5ppBPmawIpBqzYNlzANBgkqhkiG9w0BAQsFADAA
MB4XDTIyMDkyMTAzMDIzMloXDTMyMDkxODAzMDIzMlowADCCAiIwDQYJKoZIhvcN
AQEBBQADggIPADCCAgoCggIBAM4JVqTLoPrM/1uFI0GdrSPFgkyHpXLipZr4KGEa
53eBWZ7XeHX3RVNTwXQXCuveZPMSDiXL3JBVt/WwKHopowuq1XCK0G5PUQlzM9c3
l6eAfB8Se6lUofVRVThD75k/RwkDskdx4xxSvYrQKi9CrG7OvdrKEFxSJbuOWAIL
VyXG+MR9cWtKg2NTYu7cFBYjhAVymk6IotGbjRL352LP9XyEUYE0XCLYaP57WwVL
jGOUUqRy0oWtYd9UH2b7tZbY5JMM7imCCEZtCltM9SqKgZU3Q07DJ51O025++bYg
GyDztof1B8MwSErvWx0QCbI+RsSIIgRy6Rc3gOqV0nu5RWml6zg3T0TGFbuWsjLe
SfC6tpnxeGdizm8qwWOKxa1hfrdP/CQx3LdkSuAWO1+MQh9ZW09bzRM36xOxHU5B
aUN9QJ6dcpUnmLF6ptWm77mllhPN0fJh2i4e/hmm7dGZI6MYFn6Vt1dYy0YMEcA6
DaBJIlzHPuqckU00pc3qn0MCujH50w+PoZNK0I0mtRL9b1hFWMVQ0s0PWpfHgX8X
QjsT/LN2gm0nM0/SktjDC28pI2FZpCo0Kc9U8uqM0AUf7wb7rzB1noPizKnawsVe
aM9WGV+Wx7yQmchiaFRWgllzyR58164hhw5emelVVUMEY+iKmPRyNM2ralpSjoFY
m8t/AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIAATAPBgNVHRMBAf8EBTADAQH/MB0G
A1UdDgQWBBRUzpEg1KGpzint0spIRo6C97tHxDANBgkqhkiG9w0BAQsFAAOCAgEA
kzHDA4XSAkD62aZi5kpoJ87SxkfsEhkio9ZQZFrOfMu+G3INmLZcKqokXXEJeEyn
hUsA2RS6toQO+devaTW312Ggrwn5XMQFWXPsZ7dUn/Ph1y25B+h0ekfv1B9J3pab
PvLcOY1F9bZRd2qj2FPUZBRIz8uO8nsHc/AZxxLAfkle72pvjRErRYYP0O1rZm90
iutQfe77NMtYisk3n/2wXx6S8iAiSQn81ECwJaGCbvggFrnSn/JJYAAiG2eMkt9l
t/HbTvzVBnXIJOZXaazKd2Na5wNmSKcsknVQhkAIf7VHYXA6eMIAYgai8fEh3KB3
pMEkaOhPUZUWgxv+bq+um5KDpQzgZx+Dx/nGCdJfa7yQHMHRzMgYOoryb6BwtL8h
Ue3Y9N9OCcpoW1aXjmffV2Z7+udKTFpOp/sFQc5DJnunTFS9dyqESQiA55U/PLGy
vkjSfA6+ybIeFzy1DlcQcAOE5ewOiVaATp4Em8T1c75/eU+dBsU9w07NRYA4H8NB
PT2GUG/d656AkMOn/OBEKoDZc9AaiaCXjIWJHAiart4u9W3tdpi2ymDOUyDXgXPa
WjGGkOx6rabMdeb6GxTSZNoUKcNkEdJqshoBrAZ1rS8b29xjZcugRFHmurxEZWRv
S4VjvLJqAeDW1BkOGLfi9L44AcKW/yyMAUwQ1cglEMY=
-----END CERTIFICATE-----
 
2022/09/21 03:02:32 HTTP server serving on :8080
  1. 查看 sealed-secrets-keyzbk87 中包含的秘钥内容。
$ oc get secret -n  kube-system sealed-secrets-keyzbk87 -oyaml
  1. 执行命令可将公钥证书下载到本地(确认其内容和上面日志中的证书相同),以便在 kubeseal 无法访问 OpenShift 时使用。
$ kubeseal --fetch-cert > my-pub-cert.pem
$ cat my-pub-cert.pem
-----BEGIN CERTIFICATE-----
MIIEzDCCArSgAwIBAgIQXDpPt5ppBPmawIpBqzYNlzANBgkqhkiG9w0BAQsFADAA
MB4XDTIyMDkyMTAzMDIzMloXDTMyMDkxODAzMDIzMlowADCCAiIwDQYJKoZIhvcN
AQEBBQADggIPADCCAgoCggIBAM4JVqTLoPrM/1uFI0GdrSPFgkyHpXLipZr4KGEa
53eBWZ7XeHX3RVNTwXQXCuveZPMSDiXL3JBVt/WwKHopowuq1XCK0G5PUQlzM9c3
l6eAfB8Se6lUofVRVThD75k/RwkDskdx4xxSvYrQKi9CrG7OvdrKEFxSJbuOWAIL
VyXG+MR9cWtKg2NTYu7cFBYjhAVymk6IotGbjRL352LP9XyEUYE0XCLYaP57WwVL
jGOUUqRy0oWtYd9UH2b7tZbY5JMM7imCCEZtCltM9SqKgZU3Q07DJ51O025++bYg
GyDztof1B8MwSErvWx0QCbI+RsSIIgRy6Rc3gOqV0nu5RWml6zg3T0TGFbuWsjLe
SfC6tpnxeGdizm8qwWOKxa1hfrdP/CQx3LdkSuAWO1+MQh9ZW09bzRM36xOxHU5B
aUN9QJ6dcpUnmLF6ptWm77mllhPN0fJh2i4e/hmm7dGZI6MYFn6Vt1dYy0YMEcA6
DaBJIlzHPuqckU00pc3qn0MCujH50w+PoZNK0I0mtRL9b1hFWMVQ0s0PWpfHgX8X
QjsT/LN2gm0nM0/SktjDC28pI2FZpCo0Kc9U8uqM0AUf7wb7rzB1noPizKnawsVe
aM9WGV+Wx7yQmchiaFRWgllzyR58164hhw5emelVVUMEY+iKmPRyNM2ralpSjoFY
m8t/AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIAATAPBgNVHRMBAf8EBTADAQH/MB0G
A1UdDgQWBBRUzpEg1KGpzint0spIRo6C97tHxDANBgkqhkiG9w0BAQsFAAOCAgEA
kzHDA4XSAkD62aZi5kpoJ87SxkfsEhkio9ZQZFrOfMu+G3INmLZcKqokXXEJeEyn
hUsA2RS6toQO+devaTW312Ggrwn5XMQFWXPsZ7dUn/Ph1y25B+h0ekfv1B9J3pab
PvLcOY1F9bZRd2qj2FPUZBRIz8uO8nsHc/AZxxLAfkle72pvjRErRYYP0O1rZm90
iutQfe77NMtYisk3n/2wXx6S8iAiSQn81ECwJaGCbvggFrnSn/JJYAAiG2eMkt9l
t/HbTvzVBnXIJOZXaazKd2Na5wNmSKcsknVQhkAIf7VHYXA6eMIAYgai8fEh3KB3
pMEkaOhPUZUWgxv+bq+um5KDpQzgZx+Dx/nGCdJfa7yQHMHRzMgYOoryb6BwtL8h
Ue3Y9N9OCcpoW1aXjmffV2Z7+udKTFpOp/sFQc5DJnunTFS9dyqESQiA55U/PLGy
vkjSfA6+ybIeFzy1DlcQcAOE5ewOiVaATp4Em8T1c75/eU+dBsU9w07NRYA4H8NB
PT2GUG/d656AkMOn/OBEKoDZc9AaiaCXjIWJHAiart4u9W3tdpi2ymDOUyDXgXPa
WjGGkOx6rabMdeb6GxTSZNoUKcNkEdJqshoBrAZ1rS8b29xjZcugRFHmurxEZWRv
S4VjvLJqAeDW1BkOGLfi9L44AcKW/yyMAUwQ1cglEMY=
-----END CERTIFICATE-----

验证

  1. 创建测试项目
$ oc new-project mysecret
  1. 执行命令生成定义 Secret 的 YAML 格式定义文件,其中包含 username 和 password 两个敏感数据。
$ oc create secret generic db-secret --from-literal=username=admin --from-literal=password='password' --dry-run=client -o yaml > db-secret.yaml
  1. 根据 Secret 对象生成 SealedSecret 对象定义文件
$ kubeseal < db-secret.yaml > db-sealedsecret.yaml
  1. 如果 kubeseal 无法访问到 OpenShift,可执行以下命令生成 SealedSecret 对象定义文件
$ kubeseal --format=yaml --cert=my-pub-cert.pem < db-secret.yaml > db-sealedsecret.yaml
  1. 根据 YAML 文件创建 SealedSecret 对象。
$ oc create -f db-sealedsecret.yaml
  1. 确认 SealedSecret 和 Secret 对象都创建成功。
$ oc get sealedsecret db-secret
NAME        AGE
db-secret   2m40s
 
$ oc get secret db-secret
NAME        TYPE     DATA   AGE
db-secret   Opaque   2      2m9s
  1. 确认 sealed-secrets-controller 日志中有 SealedSecret unsealed successfully 提示。
$ oc logs -n kube-system deploy/sealed-secrets-controller
2022/09/21 07:02:23 Updating mysecret/db-secret
2022/09/21 07:02:23 Event(v1.ObjectReference{Kind:"SealedSecret", Namespace:"mysecret", Name:"db-secret", UID:"4a7096f1-0c80-4098-a8ce-8c7da5ab9bf0", APIVersion:"bitnami.com/v1alpha1", ResourceVersion:"521438", FieldPath:""}): type: 'Normal' reason: 'Unsealed' SealedSecret unsealed successfully
  1. 执行命令,查看创建的 db-secret 对象中 username 和 password 内容正确。
$ oc get secret db-secret -o jsonpath='{.data.username}' | base64 -d
$ oc get secret db-secret -o jsonpath='{.data.password}' | base64 -d

其他

另外
https://cloud.redhat.com/blog/a-guide-to-secrets-management-with-gitops-and-kubernetes

参考

https://cloud.redhat.com/blog/gitops-secret-management
https://cloud.redhat.com/blog/integrating-hashicorp-vault-in-openshift-4
https://blog.stderr.at/openshift/2021-09-25-sealed_secrets/
https://medium.com/@jerome_tarte/managing-your-sensitive-information-during-gitops-process-with-secret-sealed-27498c77e2b8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值