《OpenShift / RHEL / DevSecOps 匯總目錄》
文本已在 OpenShift 4.10 環境中進行驗證。
為什么在 GitOps 過程中要保護 Secret 中的敏感數據
在 Kubernetes 或 OpenShift 環境中通常使用 Secret 類型對象保存用戶和密碼等敏感信息。雖然 Secret 會使用 Base64 對明文數據進行加密保存,但是這還不夠安全。尤其是在基于 GitOps 的自動化部署過程中,保存這些敏感數據的 Secret 就放在可能任何人都可以訪問的 Git Repository 中,因此就需要保護在 GitOps 過程中使用的 Secret 敏感數據。
SealedSecret 工作原理
kubeseal 運行包括兩部分:部署在 OpenShift 中的 SealedSecretController,以及客戶端 kubeseal 命令。使用過程大致如下:
通過 kubeseal 命令并使用 OpenShift 認可的公鑰對 Secret 中的敏感數據進行加密,生成 SealedSecret 類型 YAML。加密后的 SealedSecret YAML 文件就可以放心存放在 Git Repository 中了。在 GipOps 過程中首先 SealedSecret 對象會被部署在 OpenShift 項目中,然后 SealedSecretController 會根據 SealedSecret 對象以及系統私鑰生成 Secret 對象。
安裝環境
安裝服務端
執行命令,在 kube-system 項目中部署 sealed-secrets-controller。
$ oc apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.18.2/controller.yaml
確認 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
查看 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
查看 sealed-secrets-keyzbk87 中包含的秘鑰內容。
$ oc get secret -n kube-system sealed-secrets-keyzbk87 -oyaml
執行命令可將公鑰證書下載到本地(確認其內容和上面日志中的證書相同),以便在 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-----
安裝客戶端
運行命令安裝客戶端
$
wget https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.18.2/kubeseal-0.18.2-linux-amd64.tar.gz
$
tar -xvzf kubeseal-0.18.2-linux-amd64.tar.gz kubeseal
$
sudo install -m
755 kubeseal /usr/local/bin/kubeseal
驗證
創建測試項目
$ oc new-project mysecret
執行命令生成定義 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
根據 Secret 對象生成 SealedSecret 對象定義文件
$ kubeseal
< db-secret.yaml
> db-sealedsecret.yaml
如果 kubeseal 無法訪問到 OpenShift,可執行以下命令生成 SealedSecret 對象定義文件
$ kubeseal --format
=yaml --cert
=my-pub-cert.pem
< db-secret.yaml
> db-sealedsecret.yaml
根據 YAML 文件創建 SealedSecret 對象。
$ oc create -f db-sealedsecret.yaml
確認 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
確認 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
執行命令,查看創建的 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
總結
以上是生活随笔為你收集整理的OpenShift 4 - 在 GitOps 中使用 SealedSecret 保护敏感数据的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。