默认情况下,KubernetesSecrets(机密信息)存储在base64编码的YAML文件中。因为缺乏对信息的加密,往往会导致如何安全地存储秘密的问题。当然,您也不希望将敏感的配置数据放入git存储库,因为它只是base64编码的。echo|base64-d。典型的解决方案是使用AzureKeyVault或HashiCorpVault等服务来保存敏感数据。这些服务可以使用SecretsStoreCIS驱动程序与Kubernetes集成。但是,依赖其他服务意味着除了Kubernetes之外,您还必须管理和维护该服务。此外,根据您用来存储敏感数据的服务,某些敏感配置必须存储在某处以配置CIS驱动程序。作为替代方案,您可以使用MozillaSOPS(SOPS)来加密和解密您的Kubernetes机密。通过SOPS加密的信息可以存储在源代码版本控制中。加密信息将在部署到Kubernetes之前在本地解密。本文演示了如何将YAMLSOPS与AzureKeyVault结合使用来加密和解密Kubernetes机密(文件),这使您可以将信息与其他Kubernetes清单一起直接存储在git中。什么是MozillaSOPSMozilla的标准操作程序(加密和解密操作)是一个独立于平台的CLI,用于编辑不同格式的加密文件——包括yaml、json、ini、二进制等。SOPS支持使用密钥进行加密和解密的多个后端。以下是五个最受支持的方案:PGPAzureKeyVault知识管理系统GCP知识管理系统HashiCorpVault为了对AzureKeyVault进行身份验证,SOPS按以下顺序尝试多种身份验证模式:客户端凭据客户端凭据用户名密码托管服务身份(MSI))AzureCLI身份验证虽然AzureCLI身份验证工作顺利,但我建议您在本地开发计算机上使用Azure服务主体(SP)。要在Kubernetes中使用SOPS解密机密(例如,如果您使用Flux等GitOps运算符),您应该考虑结合使用托管服务身份(MSI)和AzureADPod身份。(有关详细的演练,请考虑官方全量文档https://www.thorsten-hans.com/encrypt-your-kubernetes-secrets-with-mozilla-sops/?utm_source=hs_email&utm_medium=email&_hsenc=p2ANqtz-8D9JEMI3MsO2qdM0KGA0m3685hu1H0RBcgBj6rDozFznQ7_Ra-tmzdJYwuE7Hf2TfjXwqk#:~:text=flux%20documentation%20for%20a%20detailed%20walk-through)。设置Azure服务主体(SP)要创建新的AzureSP,请使用以下命令:#createaserviceprincipalazadspcreate-for-rbac-nsp-sops-keyvault-ojson#{#"appId":"00000000-0000-0000-000000000000",#"displayName":"http://sp-sops-keyvault",#"name":"http://sp-sops-keyvault",#"password":"00000000-0000-0000-000000000000",#"tenant":"#}SOPS(以及一些即将发布的命令)需要存储在环境变量中的身份验证。即可以使用以下命令快速导出本地环境变量中的appId、租户和存储的密码:exportAZURE_CLIENT_ID=exportAZURE_CLIENT_SECRET=exportAZURE_TENANT_ID=在您的CI管道中,考虑使用存储库机密(这是在GitHub上下文中调用敏感配置数据的方式)或用于处理CI系统中敏感数据的竞争解决方案。预配AzureKeyVault实例您需要一个AzureKeyVault实例。预配一个新的AzureKeyVault就像使用AzureCLI一样简单,如以下代码片段所示:kv-sops-sample\-grg-sops-sample\-lgermanywestcentral#为SPAzkeyvaultset-policy创建访问策略-nkv-sops-sample\-grg-sops-sample\--spn$AZURE_CLIENT_ID\--key-permissionsencryptdecryptCreateakeyforencryptionanddecryptioninAzureKeyVault此时你必须在我们新建的AzureKeyVault实例中创建用于加密和解密的实际密钥:#createankeyforencryption/decryptionazkeyvaultkeycreate-nsops-sample-key\--vault-namekv-sops-sample\--opsencryptdecrypt\--protectionsoftware除了认证信息,SOPS还需要我们刚刚创建的密钥标识符。同样,使用AzureCLI并将标识符存储在环境变量中:#readandstorekeyidentifierexportKEY_ID=$(azkeyvaultkeyshow-nsops-sample-key\--vault-namekv-sops-sample\--querykey.kid-otsv)安装MozillaSOPS如前所述,SOPS是一个跨平台的CLI。您可以从GitHub下载CLI,网址为https://github.com/mozilla/sops/releases。确保可执行文件作为PATH变量的一部分放置在文件夹中。#下载适用于macOScurl-O-L-C的sopscli-https://github.com/mozilla/sops/releases/download/v3.7.1/sops-v3.7.1.darwin#将cli移动并重命名为/usr/binsudomvsops-v3.7.1.darwin/usr/bin/sops#使其可执行sudochmod+x/usr/bin/sops#最新的macOS可能会阻止您使用SOPSCLI#使用系统偏好设置>安全和隐私将SOPS加密列入白名单KubernetesSecret首先,使用kubectl创建一个常规的Kubernetessecret:#创建Kubernetessecretkubectlcreatesecretgenericdemo\--from-literalmysecret=secret_value\-oyaml\--dry-run=client>secret.encoded.yml#打印secret.encoded.ymlcat的内容它的base64表示。现在,使用SOPSCLI创建密钥的加密变体。特别是在考虑在Flux中解密机密时,请确保提供--encrypted-regex参数并将加密限制为仅存储在data和stringData中的值。#使用SOPSsops加密secret.encoded.yml--encrypt--encrypted-regex'^(data|stringData)$'\--azure-kv$KEY_IDsecret.encoded.yml>secret.encrypted.yml#打印内容secret.encrypted.ymlcatsecret.encrypted.yml#apiVersion:v1#data:#mysecret:ENC[AES256_GCM,data:gz/WAjWte3bCnNm6e+G4ow==,iv:VB4pAv833tDdD4n76h4CqEZNpGdwA3V1QGWp7PK/Jfc=,tag:CcVcUyrm3rti4=,标签:CcVcUyrm3rti4]#kind:Secret#metadata:#creationTimestamp:null#name:demo#sops:#kms:[]#gcp_kms:[]#azure_kv:#-vault_url:https://kv-sops-sample.vault.azure。net#name:sops-sample-key#version:ee44c0c0cc9e4620aa4f4c86c4942047#created_at:"2021-08-02T20:55:40Z"#enc:EjszDACgiDP8rW3wzs-7fAmFzlAhCq0-R9YlA9cuPcq78EXEeNTC8OnlSdXQAGdGrgE9oylu1HKZa4RB9GxzzVDav8uNVPp67NPmC4-teeA5iRE4jqlp1An6sG6CpkZGcAmKWpfj_DEWecqrNGWSLTA2hI_HKwG5xNkFh9Myik6732W-XL65IFqgepcFrNIzeHetznO0j1iISNXqMeJjeCnZ6Qq0jcXUMIfQnXjAllKfjSukiT3A3GlWxP0j50Z328t-JHi5RowYHT-hC8FDOdR_U95sqnFd27RgEXmbDIU6IGvP3vmCiZJz4YQCPXaGhySvFY6qCEoCbCSC4RaoWw#hc_vault:[]#age:[]#lastmodified:"2021-08-02T20:55:41Z"#mac:ENC[AES256_GCM,data:AmKRnzoImfIzPa3JBcuxUKRrse5uZwJGukpLj1wxed3R7lsUN+QAV1+WkfNyeMoW5C3ek7j20Xpbvzi+MgP8zcQOwWSwA79Svgz3hKMn9eTRTfgU+4jYezIIHCwkv61MTN8RGW5AhOInYP8oRPW3zKD+SbBO/Jeu7SC+/oVn07I=,iv:S4Th+0quL84lhJtA/lugEv+iLc+WhWEYPSlXGWKhd/M=,tag:CUGg8+UM7gNSzfjJx1Ua1w==,type:str]#pgp:[]#encrypted_regex:^(data|stringData)$#版本:3.7.1默认情况下,加密版信息包含AzureKeyVault的基本信息和加解密所用的密钥。正如您将在几分钟后看到的那样,此信息使解密变得容易。但是,您也可以提供自定义.sops.yaml配置文件以从实际机密文件中删除此元数据。此时,您可以删除秘密的编码版本并将加密版本添加到git:#deleteencodedversionofthesecretrmsecret.encoded.yml#addencryptedsecrettosourcecontrolandcommititgitaddsecret.encrypted.ymlgitcommit-m'chore:addencryptedsecret'解密用于部署的Kubernetes秘密要将秘密部署到Kubernetes,您必须解密它。同样,SOPSCLI可以提供帮助。解密的秘密可以直接通过管道传输到kubectl部署,如以下代码片段所示:kubectlapply-f--deployingasecretsopsechoserver到Kubernetes将Secret存储在Kubernetes中,你可以配置echo容器,它将通过HTTP。请注意清单的envFrom部分。先前创建的秘密被填充到环境变量中:apiVersion:v1kind:Podmetadata:name:echolabels:app:echospec:containers:-image:thorstenhans/env-via-http:0.0.1name:mainports:-containerPort:5000protocol:TCPenvFrom:-secretRef:name:demooptional:trueresources:requests:cpu:50mmemory:32Milimits:cpu:100mmemory:48Mi部署后,使用简单的端口转发和curl来验证部署:#deploythesamplepodkubectlapply-fpod.yml#验证pod是否正在运行kubectlgetpo##NAMEREADYSTATUSRESTARTSAGE#echo-74bc9c6d74-vh5lr1/1Running04m38s#activateportforwardingkubectlport-forwardecho-74bc9c6d74-vh5lr:--port5000##Forwardingfrom127.0.0.1:8080->5000#Forwardingfrom[::1]:8080->5000#startanewterminalsession#issueanHTTPrequesttotheechopodwithcurlcurlhttp://localhost:8080|jq你应该得到一个包含Po的JSONd中所有可用环境变量的对象,包括环境变量secret_value{"hostName":"echo-74bc9c6d74-vh5lr","envVars":["KUBERNETES_SERVICE_PORT=443","KUBERNETES_PORT=tcp://10.0.0.1:443","HOSTNAME=echo-74bc9c6d74-vh5lr","SHLVL=1","PORT=5000","HOME=/root","mysecret=secret_value","KUBERNETES_PORT_443_TCP_ADDR=10.0.0.1","PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","KUBERNETES_PORT_443_TCP_PORT=443","KUBERNETES_PORT_443_TCP_PROTO=tcp","KUBERNETES_SERVICE_PORT_HTTPS=443","KUBERNETES_PORT_443_TCP=tcp://10.0.0.1:443","KUBERNETES_SERVICE_HOST=10.0.0.1","PWD=/"]}结论能够在源代码管理中安全地存储机密信息非常棒。SOPS使加密和解密秘密的过程变得容易。与AzureKeyVault等服务的无缝集成非常棒。团队会发现这种方法很有用,尤其是在从传统持续部署到GitOps的过渡期间。还值得一提的是,SOPS与Flux无缝集成,Flux是基于GitOps工具包的最流行的持续交付解决方案之一。