今天开发的大多数应用都会或多或少地使用一些敏感信息来执行某些业务逻辑。例如,使用用户名和密码连接数据库,或使用密钥连接第三方服务。直接在代码中使用这些密码或者秘钥是最直接的方式,但是也会带来很多安全问题,如何保证密码和秘钥不被泄露。如果你的应用程序已经容器化并使用Kubernetes(k8s),情况会好很多。Kubernetes提供了一种称为“Secret”的原生资源,可用于管理和存储敏感信息。敏感信息以未加密的Base64格式编码并存储在Secret对象中。Secret可以作为环境变量注入到Pod内部的容器中,也可以作为数据卷挂载到容器内部。为保证敏感信息的安全,对Secret对象进行加密,并使用KubernetesRBAC机制控制访问。如果您使用AWS公共云来托管Kubernetes集群,则可以利用AWS密钥管理服务(KMS)来加密静态数据。Kubernetes清单文件通常提交到代码存储库以进行版本控制。但是您可能不想将敏感信息以纯文本或Base64编码字符串的形式提交到Git存储库。我们都应该知道为什么,它不安全!但是,您将敏感数据保存在Kubernetes集群之外的什么地方以确保它们的安全?有很多方法可以解决这个问题。下面列出了其中的一些:选项1:在提交到Git存储库之前加密明文敏感数据使用对称或非对称算法加密明文敏感数据。使用Kubernetes自定义资源定义(CRD)创建自定义Secret对象以使用加密的文本数据。创建一个自定义Kubernetes控制器,该控制器读取自定义Secret对象中的加密信息,在运行时对其进行解密,并创建一个本机Secret对象。使用此方法,您可以将加密数据提交到Git存储库。而且它是无风险的,因为数据是加密的,只能用您的私钥解密。但是你把私钥放在哪里呢?如何存储加密密钥和管理整个加解密过程,可以使用Bitnami的SealedSecrets。选项2:使用第三方服务存储敏感数据您可以将敏感数据存储在第三方服务中,例如AWSSecretsManager或HashiCorpVault。创建自定义Kubernetes控制器,根据配置从这些服务中获取机密,并在运行时创建Kubernetes机密对象。ExternalSecrets项目可以帮助您解决选项2。您还可以增强应用程序逻辑以在应用程序启动时从第三方服务读取机密,但这里的总体思路是将机密管理与应用程序业务逻辑分开并利用Kubernetes的功能做同样的管理。SealedSecrets快速概览在SealedSecret开源项目中,您可以将您的Secret加密到SealedSecret中,以便它可以安全存储,即使在公共存储库中也是如此。SealedSecret只能由运行在目标集群中的controller来解密,其他人,即使是原作者,也无法从SealedSecret中获取到原始Secret。SealedSecrets由两部分组成:服务器端控制器客户端工具:kubesealkubeseal使用非对称加密对数据进行加密,然后只有服务器端控制器才能解密数据。此加密数据在SealedSecret资源中编码,您可以将其视为创建Secret的秘诀。下面是使用SealedSecrets管理Secrets的具体步骤。1、安装kubeseal,这是一个可以帮你创建SealedSecret的客户端工具>wgethttps://github.com/bitnami-labs/sealed-secrets/releases/download/v0.15.0/kubeseal-linux-amd64-Okubeseal>sudoinstall-m755kubeseal/usr/local/bin/kubeseal2。安装服务器端控制器并为SealedSecret>kubectlapply-fhttps://github.com/bitnami-labs/sealed-secrets/releases/download/v0.15.0/controller.yamlrolebinding.rbac创建自定义资源定义(CRD)。authorization.k8s.io/sealed-secrets-service-proxiercreatedrole.rbac.authorization.k8s.io/sealed-secrets-key-admincreatedclusterrole.rbac.authorization.k8s.io/secrets-unsealercreateddeployment.apps/sealed-secrets-controllercreatedcustomresourcedefinition。apiextensions.k8s.io/sealedsecrets.bitnami.comcreatedservice/sealed-secrets-controllercreatedclusterrolebinding.rbac.authorization.k8s.io/sealed-secrets-controllercreatedserviceaccount/sealed-secretauthorization.k8s.io/sealed-secrets-service-proxiercreatedrolebinding.rbac.authorization.k8s.io/sealed-secrets-controllercreated3.验证sealed-secretcontrollerPod是否正在运行>kubectlgetpods-nkube-system-lname=sealed-secrets-controllerNAMEREADYSTATUSRESTARTSAGEsealed-secrets-controller-7c766b885b-d5r2r1/1Running07m39s到一对controller为自己创建的secretkey,这对secretkey会在加解密过程中用到>kubectllogssealed-secrets-controller-7c766b885b-d5r2r-nkube-systemcontrollerversion:v0.15.02021/05/0120:13:34Startingsealed-secrets-controllerversion:v0.15.02021/05/0120:13:34搜索现有的3writtenprivatekeys2021/05/0120:13:34/sealed-secrets-keymt6dg2021/05/0120:13:35Certificateis-----BEGINCERTIFICATE-----MIIErjCCApagAwIBAgIRAJqYfaZsali26I8pvBXoFGYwDQYJKoZIhvcNAQELBQAwADAeFw0yMTA1MDEyMDEzMzVaFw0zMTA0MjkyMDEzMzVaMAAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDp/yO5PY8ACHBDuguhtfpOwlbScK9hZorJloyxixVCc57j1zMSX0pSVcrk1Yuyf6sYvBQtDi16kM70z6y/ODiz+9g87K/jY7B0UAoimpzM/T0tWJiG9ixyNMZhHoNREauokSlbERq3Jl8ZNTfmxHWhLH7DhkJ7MdpQfMpKa3XHcSZyz1mXFqv+OSCCwllWCRHmHgp/vqudAv8+NYm0gnAxKt2fjlv/ObX8J1RICtLnlsCpp/9SyVcSTeYYaqjUsI7fTUZ7tkTE/bdQHwf3xe4DhUty7xLqMF1OPSPwEetL8fGO0VqoSQFKQ0Bf78+8vhAA2cwkuqB6vQQm9pT3yC5niSCUo+jwFcfyknjryx8DINbq6K9B40EXh8X7w4I6zwYpyT0GoNU54wW0ki8pHRm7EnFeBOkUvNspzmKnt/EZEDVq74Kkl/BRNRvKHYlwudSoJuvvX6JM8DVvRp0lMPnXnG3RLSmCP3gEFQBZDhbnkwO+6ADX9Q4vyqelWoHWdVGVULDlMDhSzvEhFFgPcZXzWTShH81vfl8M6lpTU0ysZkA6i3A29XEJpPj35yWPBDWmKF5fLM3ChMt/NSJEeoJN1RboPDAgVUTxEW59q+Tq09/zlYD7Ch8PNc3IWNXjFNXmCAAOw9Z1VBbD8p6LrC5JvBtPoWYqufWVXQD9KDe+6wIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAAEwDwYDVR0TAQH/BA??UwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAvu//VzDREYZPPIW1maTxo9C/nHEEuOP0rQU3zVQrbBYf8N0b5wpCllESCgi0JDJJXrE8KrjfdtawjoBrBlHOdWHF+fIot2KbrC/i37em/ulMAgiiJzrKM/ExJuCuH60fsSIx4wrg46tQpU8jHFWq7nGnsaE+UN3QPjuvQ+qoKKDSBLDxLx+q9vBfaXElblh4okUI8Pr4UEEJrYiPzPM6nA9EPpy53N3si4jyDJJb2IsCUa2bW6iBhpyZOQQUPn22ziWRQ/sYYNmtP/gX0rwtk+Rr8TTdzPYGZcYfMQ6OTFq4Zo2/TnpCL/CUr2DiSuF2qdWGGvbQOENYq2FNuDI4zeljElcZHXA8nhpbNSJs7VNqqz5ZTFCKyL0Gn6SawGT7EdwBT2AD3F33Qd/7bXG/On7KdVw6FKHbZOR2RcoSYFQv7Xr8g/4atQjxDa7R5+zkxd5unsvpFhYM1UfNJc4cjJ7SmfCCHoPGiwZ0OgqB6SvUVU64QmMMJ/jYAJkYMOakSHaRITHAvvBjpAMKxSjjb7qZD5FnpXLhRY9lNiY6MnnQRxJskCw+R6geIAHTMzAofMfc1haIEr+3oMFZfyh1LFFsz3B4hMxXYKrWYDje+96bhAY9X7L0UfREjmw8HCeZneEuBJjX9z/PyIeMdhViLh9uO/MAL1MBxdBVA55+LW8=-----ENDCERTIFICATE-----2021/05/0120:13:35HTTPserverservingon:8080运行以下命令查看公钥/私钥信息>kubectlgetsecret-nkube-system-lsealedsecrets.bitnami.com/sealed-secrets-key-oyaml4.创建一个名为secrets.yamlapiVersion:v1data:DB_PWD:cGFzc3dvcmQ=//base64encodedDB_USER:cm9vdA==//base64encodedkind:Secretmetadata:name:db-secrets的Secret清单文件现在让我们使用kubeseal命令,将secrets.yaml转换为SealedSecret资源清单文件。>kubeseal--format=yaml
