現(xiàn)如今開發(fā)的大多數(shù)應(yīng)用程序,或多或少都會用到一些敏感信息,用于執(zhí)行某些業(yè)務(wù)邏輯。比如使用用戶名密碼去連接數(shù)據(jù)庫,或者使用秘鑰連接第三方服務(wù)。在代碼中直接使用這些密碼或者秘鑰是最直接的方式,但同時也帶來了很大的安全問題,如何保證密碼、秘鑰不被泄露。
如果你的應(yīng)用程序已經(jīng)被容器化,且使用Kubernetes(k8s),那情況會好很多。Kubernetes提供了一個原生資源,稱為“Secret”,可用于管理和存儲敏感信息。敏感信息被編碼為未加密的Base64格式,并被存儲在Secret對象中。Secret可以作為環(huán)境變量被注入到Pod內(nèi)部的容器中,也可以作為數(shù)據(jù)卷掛載到容器內(nèi)部。
為了保證敏感信息的安全性,Secret對象應(yīng)該被加密,并且應(yīng)該使用Kubernetes RBAC機制對訪問進行控制。如果你正在使用AWS公有云來托管Kubernetes集群,則可以利用AWS密鑰管理服務(wù)(KMS)對靜態(tài)數(shù)據(jù)進行加密。
Kubernetes的清單文件通常被提交到代碼倉庫中以進行版本控制。但是你可能不希望將敏感信息以純文本或Base64編碼字符串的形式提交到Git代碼倉庫中。我們都應(yīng)該知道為什么,這不安全!但是,你在Kubernetes集群之外將敏感數(shù)據(jù)保存在何處,以確保它們是安全的?
有很多方法可以解決這個問題。下面列出了其中幾個:
1選項1:加密純文本敏感數(shù)據(jù),然后再提交到Git代碼倉庫中
使用對稱或非對稱算法加密純文本敏感數(shù)據(jù)。
使用Kubernetes Custom Resource Definition(CRD)創(chuàng)建自定義的Secret對象,以使用加密的文本數(shù)據(jù)。
創(chuàng)建一個自定義Kubernetes控制器,該控制器讀取自定義Secret對象中的加密信息,并在運行時解密,并創(chuàng)建一個原生的Secret對象。
使用這種方法,你可以將加密的數(shù)據(jù)提交到Git代碼倉庫中。而且它沒有風(fēng)險,因為數(shù)據(jù)是加密的,只能用你的私鑰解密。但是你把私鑰放在哪里?
如何存儲加密密鑰和管理整個加解密過程,可以使用Bitnami的Sealed Secrets[1]。
2選擇2:使用第三方服務(wù)來存儲敏感數(shù)據(jù)
你可以將敏感數(shù)據(jù)存儲到第三方服務(wù)中,如AWS Secrets Manager或HashiCorp Vault。
創(chuàng)建自定義Kubernetes控制器,基于配置從這些服務(wù)中獲取機密信息,并在運行時創(chuàng)建Kubernetes Secret對象。
External Secrets[2]項目可以幫助你實現(xiàn)選項2。
你還可以增強應(yīng)用程序邏輯,以便在應(yīng)用程序啟動時從第三方服務(wù)讀取機密信息,但這里的整體思想是將機密信息管理與應(yīng)用程序業(yè)務(wù)邏輯分離開來,并利用Kubernetes的功能來進行相同的管理。
3快速概覽Sealed Secrets
在Sealed Secret開源項目中,你可以將你的Secret加密為一個SealedSecret,這樣就可以安全地存儲,甚至可以存儲到公共存儲庫中。SealedSecret只能由運行在目標(biāo)集群中的控制器解密,其他人,甚至包括原始作者,都無法從SealedSecret獲得原始的Secret。
Sealed Secrets由兩部分組成:
服務(wù)器端的控制器
客戶端工具:kubeseal
kubeseal使用非對稱加密來加密數(shù)據(jù),然后只有服務(wù)端的控制器才能解密數(shù)據(jù)。
這些加密數(shù)據(jù)被編碼在SealedSecret資源中,你可以將其視為創(chuàng)建Secret的配方。
下面是如何使用Sealed Secrets來管理Secret的具體步驟。
1、安裝kubeseal,這是一個客戶端工具,可以幫助你創(chuàng)建SealedSecret
>wgethttps://github.com/bitnami-labs/sealed-secrets/releases/download/v0.15.0/kubeseal-linux-amd64-Okubeseal >sudoinstall-m755kubeseal/usr/local/bin/kubeseal
2、安裝服務(wù)器端控制器,為SealedSecret創(chuàng)建Custom Resource Definition(CRD)
>kubectlapply-fhttps://github.com/bitnami-labs/sealed-secrets/releases/download/v0.15.0/controller.yaml rolebinding.rbac.authorization.k8s.io/sealed-secrets-service-proxiercreated role.rbac.authorization.k8s.io/sealed-secrets-key-admincreated clusterrole.rbac.authorization.k8s.io/secrets-unsealercreated deployment.apps/sealed-secrets-controllercreated customresourcedefinition.apiextensions.k8s.io/sealedsecrets.bitnami.comcreated service/sealed-secrets-controllercreated clusterrolebinding.rbac.authorization.k8s.io/sealed-secrets-controllercreated serviceaccount/sealed-secrets-controllercreated role.rbac.authorization.k8s.io/sealed-secrets-service-proxiercreated rolebinding.rbac.authorization.k8s.io/sealed-secrets-controllercreated
3、驗證sealed-secret controller Pod是否運行
>kubectlgetpods-nkube-system-lname=sealed-secrets-controller NAMEREADYSTATUSRESTARTSAGE sealed-secrets-controller-7c766b885b-d5r2r1/1Running07m39s
如果你查看Pod的日志,你將看到控制器為自己創(chuàng)建的一對秘鑰,這對秘鑰將被用于加解密過程。
>kubectllogssealed-secrets-controller-7c766b885b-d5r2r-nkube-system controllerversion:v0.15.0 2021/05/012034Startingsealed-secretscontrollerversion:v0.15.0 2021/05/012034Searchingforexistingprivatekeys 2021/05/012035Newkeywrittentokube-system/sealed-secrets-keymt6dg 2021/05/012035Certificateis -----BEGINCERTIFICATE----- MIIErjCCApagAwIBAgIRAJqYfaZsali26I8pvBXoFGYwDQYJKoZIhvcNAQELBQAw ADAeFw0yMTA1MDEyMDEzMzVaFw0zMTA0MjkyMDEzMzVaMAAwggIiMA0GCSqGSIb3 DQEBAQUAA4ICDwAwggIKAoICAQDp/yO5PY8ACHBDuguhtfpOwlbScK9hZorJloyx ixVCc57j1zMSX0pSVcrk1Yuyf6sYvBQtDi16kM70z6y/ODiz+9g87K/jY7B0UAoi mpzM/T0tWJiG9ixyNMZhHoNREauokSlbERq3Jl8ZNTfmxHWhLH7DhkJ7MdpQfMpK a3XHcSZyz1mXFqv+OSCCwllWCRHmHgp/vqudAv8+NYm0gnAxKt2fjlv/ObX8J1RI CtLnlsCpp/9SyVcSTeYYaqjUsI7fTUZ7tkTE/bdQHwf3xe4DhUty7xLqMF1OPSPw EetL8fGO0VqoSQFKQ0Bf78+8vhAA2cwkuqB6vQQm9pT3yC5niSCUo+jwFcfyknjr yx8DINbq6K9B40EXh8X7w4I6zwYpyT0GoNU54wW0ki8pHRm7EnFeBOkUvNspzmKn t/EZEDVq74Kkl/BRNRvKHYlwudSoJuvvX6JM8DVvRp0lMPnXnG3RLSmCP3gEFQBZ DhbnkwO+6ADX9Q4vyqelWoHWdVGVULDlMDhSzvEhFFgPcZXzWTShH81vfl8M6lpT U0ysZkA6i3A29XEJpPj35yWPBDWmKF5fLM3ChMt/NSJEeoJN1RboPDAgVUTxEW59 q+Tq09/zlYD7Ch8PNc3IWNXjFNXmCAAOw9Z1VBbD8p6LrC5JvBtPoWYqufWVXQD9 KDe+6wIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAAEwDwYDVR0TAQH/BAUwAwEB/zAN BgkqhkiG9w0BAQsFAAOCAgEAvu//VzDREYZPPIW1maTxo9C/nHEEuOP0rQU3zVQr bBYf8N0b5wpCllESCgi0JDJJXrE8KrjfdtawjoBrBlHOdWHF+fIot2KbrC/i37em /ulMAgiiJzrKM/ExJuCuH60fsSIx4wrg46tQpU8jHFWq7nGnsaE+UN3QPjuvQ+qo KKDSBLDxLx+q9vBfaXElblh4okUI8Pr4UEEJrYiPzPM6nA9EPpy53N3si4jyDJJb 2IsCUa2bW6iBhpyZOQQUPn22ziWRQ/sYYNmtP/gX0rwtk+Rr8TTdzPYGZcYfMQ6O TFq4Zo2/TnpCL/CUr2DiSuF2qdWGGvbQOENYq2FNuDI4zeljElcZHXA8nhpbNSJs 7VNqqz5ZTFCKyL0Gn6SawGT7EdwBT2AD3F33Qd/7bXG/On7KdVw6FKHbZOR2RcoS YFQv7Xr8g/4atQjxDa7R5+zkxd5unsvpFhYM1UfNJc4cjJ7SmfCCHoPGiwZ0OgqB 6SvUVU64QmMMJ/jYAJkYMOakSHaRITHAvvBjpAMKxSjjb7qZD5FnpXLhRY9lNiY6 MnnQRxJskCw+R6geIAHTMzAofMfc1haIEr+3oMFZfyh1LFFsz3B4hMxXYKrWYDje +96bhAY9X7L0UfREjmw8HCeZneEuBJjX9z/PyIeMdhViLh9uO/MAL1MBxdBVA55+ LW8= -----ENDCERTIFICATE----- 2021/05/012035HTTPserverservingon:8080
運行以下命令查看公鑰/私鑰信息。
>kubectlgetsecret-nkube-system-lsealedsecrets.bitnami.com/sealed-secrets-key-oyaml
4、創(chuàng)建一個名為secrets.yaml的Secret清單文件
apiVersion:v1 data: DB_PWD:cGFzc3dvcmQ=//base64encoded DB_USER:cm9vdA==//base64encoded kind:Secret metadata: name:db-secrets
現(xiàn)在讓我們使用kubeseal命令,將secrets.yaml轉(zhuǎn)變?yōu)镾ealedSecret資源清單文件。
>kubeseal--format=yamlsealed-secret.yaml >catsealed-secret.yaml apiVersion:bitnami.com/v1alpha1 kind:SealedSecret metadata: creationTimestamp:null name:db-secrets namespace:default spec: encryptedData: DB_PWD:AgDaCRi27RV4/sVI2ok7JlqBSKT5+c7gGJog+... DB_USER:AgAZG67CrrOBnyKIKha7xhJulr+CQGPaE/PpsjvY8jJR0IDO2... template: metadata: creationTimestamp:null name:db-secrets namespace:default
在上面的步驟中,kubeseal從Kubernetes集群獲取公鑰并使用該公鑰加密數(shù)據(jù)。
5、讓我們使用SealedSecret資源清單文件,在Kubernetes中創(chuàng)建資源。
>kubectlapply-fsealed-secret.yaml
如果你再次檢查控制器的日志,你將看到控制器攔截了請求,并解密來自SealedSecret的加密數(shù)據(jù),數(shù)據(jù)被解密后,將創(chuàng)建Kubernetes的Secret對象。
>kubectllogssealed-secrets-controller-7c766b885b-d5r2r-nkube-system 2021/05/012006Updatingdefault/db-secrets 2021/05/012006Event(v1.ObjectReference{Kind:"SealedSecret",Namespace:"default",Name:"db-secrets",UID:"fd89a7e7-c81a-4110-9de6-6b65195169d3",APIVersion:"bitnami.com/v1alpha1",ResourceVersion:"19365",FieldPath:""}):type:'Normal'reason:'Unsealed'SealedSecretunsealedsuccessfully
一旦創(chuàng)建了Kubernetes Secret對象,就可以將它作為環(huán)境變量注入到容器中,或者作為數(shù)據(jù)卷掛載。
上面步驟4中創(chuàng)建的SealedSecret資源清單文件可以被提交到Git代碼倉庫中。secrets.yaml文件可以丟棄,因為它不再需要了。被存儲在sealed-secret.yaml文件中的數(shù)據(jù)是安全的,它是被加密的,且只能由運行在Kubernetes集群中的Controller解密。
希望這篇文章能讓你知道如何保護Kubernetes的機密信息。
原文標(biāo)題:如何優(yōu)雅的保護 Kubernetes 中的 Secrets
文章出處:【微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
控制器
+關(guān)注
關(guān)注
112文章
16133瀏覽量
177147 -
代碼
+關(guān)注
關(guān)注
30文章
4728瀏覽量
68252 -
kubernetes
+關(guān)注
關(guān)注
0文章
223瀏覽量
8683
原文標(biāo)題:如何優(yōu)雅的保護 Kubernetes 中的 Secrets
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論