加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 系统 > 正文

如何运用Mozilla SOPS优雅的管理你的 Kubernetes Secret

发布时间:2022-02-10 20:34:53 所属栏目:系统 来源:互联网
导读:默认情况下,Kubernetes Secret(机密信息)以 base64 编码存储在YAML文件中。因为信息缺乏加密通常会导致如何安全地存储秘密的问题。当然您也不想将敏感的配置数据放入 git 存储库,因为它只是经过base64编码而已。 echo base64_representation | base64
  默认情况下,Kubernetes Secret(机密信息)以 base64 编码存储在YAML文件中。因为信息缺乏加密通常会导致如何安全地存储秘密的问题。当然您也不想将敏感的配置数据放入 git 存储库,因为它只是经过base64编码而已。
 
  echo <base64_representation> | base64 -d.
 
  一个典型的解决方案是使用Azure Key Vault或HashiCorp Vault 等服务来保留敏感数据。可以使用Secrets Store CIS 驱动程序将这些服务与 Kubernetes 集成。但是,依赖附加服务意味着除了 Kubernetes 之外,您还必须管理和维护该服务。此外,根据您用于存储敏感数据的服务,某些敏感配置必须存储在某处以配置 CIS 驱动程序。
 
  作为替代方案,您可以使用Mozilla SOPS (SOPS)来加密和解密您的 Kubernetes 机密文件。通过 SOPS 加密的信息可以存储在源代码版本控制中。加密的信息将在部署到 Kubernetes 之前在本地解密。本文演示了如何将YAMLSOPS 与 Azure Key Vault 结合使用来加密和解密 Kubernetes 机密(文件),这允许您将信息与其他 Kubernetes 清单直接存储在 git 中。
  
  什么是 Mozilla SOPS
 
  Mozilla的标准操作程序(加解密操作)是一个与平台无关的CLI,用于不同格式的编辑加密的文件-包括yaml,json,ini,binary,和其它。SOPS 支持多个后端使用密钥进行加密和解密。以下是五个最受欢迎的支持场景:
 
  PGP
  Azure 密钥保管库
   知识管理系统
  GCP知识管理系统
  HashiCorp 金库
  为了针对 Azure Key Vault 进行身份验证,SOPS 按以下顺序尝试多种身份验证模式:
 
  客户凭证
  客户证书
  用户名密码
  托管服务身份 (MSI)
  Azure CLI 身份验证
  尽管 Azure CLI 身份验证无障碍,但我建议您在本地开发机器上使用 Azure 服务主体 (SP)。要在 Kubernetes 中使用 SOPS 解密机密(例如,如果您使用 GitOps 运算符,例如 Flux),您应该考虑使用托管服务标识 (MSI) 和 Azure AD Pod 标识的组合。(有关详细的演练,请考虑官方全量文档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)
 
  若要创建新的 Azure SP,请使用以下命令:
 
  复制
  # create a service principal
  az ad sp create-for-rbac -n sp-sops-keyvault -o json
  # {
  #   "appId": "00000000-0000-0000-000000000000",
  #   "displayName": "http://sp-sops-keyvault",
  #   "name": "http://sp-sops-keyvault",
  #   "password": "00000000-0000-0000-000000000000",
  #   "tenant": "<your_tenant_identifier>
  # }
   SOPS(以及一些即将推出的命令)需要存储在环境变量中的进行身份验证。也就是说,您可以使用以下命令快速将appId、tenant和存储password在本地环境变量中export:
 
  复制
  export AZURE_CLIENT_ID=<appId>
  export AZURE_CLIENT_SECRET=<password>
  export AZURE_TENANT_ID=<tenant>
   如果您想将 SOPS 集成到您的 CI 管道中,请考虑使用存储库机密(这是在 GitHub 上下文中调用敏感配置数据的方式)或有竞争力的解决方案来处理您的 CI 系统中的敏感数据。
 
  预配 Azure Key Vault 实例
 
  你需要一个 Azure Key Vault 实例。使用 Azure CLI 预配新的 Azure Key Vault 非常简单,如以下代码段所示:
 
  复制
  # create a new Resource Group
  az group create -n rg-sops-sample -l germanywestcentral
  # create a Key Vault instance
  az keyvault create -n kv-sops-sample
     -g rg-sops-sample
     -l germanywestcentral  
  # create an access policy for the SP
  az keyvault set-policy -n kv-sops-sample
     -g rg-sops-sample
     --spn $AZURE_CLIENT_ID
     --key-permissions encrypt decrypt
   在 Azure Key Vault 中创建用于加密和解密的密钥
 
  此时,您必须在我们新创建的 Azure Key Vault 实例中创建用于加密和解密的实际密钥:
 
  复制
  # create an key for encryption / decryption  
  az keyvault key create -n sops-sample-key
      --vault-name kv-sops-sample
      --ops encrypt decrypt
      --protection software
   除了身份验证信息,SOPS 还需要我们刚刚创建的密钥的标识符。同样,使用 Azure CLI 并将标识符存储在环境变量中:
 
  复制
  # read and store key identifier
  export KEY_ID=$(az keyvault key show -n sops-sample-key
      --vault-name kv-sops-sample
      --query key.kid -o tsv)
   安装 Mozilla SOPS
 
  如前所述,SOPS 是一个跨平台的 CLI。您可以从 GitHub 下载 CLI,网址为https://github.com/mozilla/sops/releases。确保可执行文件作为PATH变量的一部分放在文件夹中。
 
  复制
  # download sops cli for macOS
  curl -O -L -C - https://github.com/mozilla/sops/releases/download/v3.7.1/sops-v3.7.1.darwin
  # move and rename the cli to /usr/bin
  sudo mv sops-v3.7.1.darwin /usr/bin/sops
  # make it executable
  sudo chmod +x /usr/bin/sops
  # latest macOS may prevent you from using SOPS CLI
  # use System Preferences > Security & Privacy to whitelist SOPS
   加密 Kubernetes Secret
 
  首先,使用kubectl以下命令创建一个常规的 Kubernetes 密钥:
 
  复制
  # create the Kubernetes secret
  kubectl create secret generic demo
      --from-literal mysecret=secret_value
      -o yaml
      --dry-run=client > secret.encoded.yml
  # print the contents of secret.encoded.yml
  cat secret.encoded.yml
  # apiVersion: v1
  # data:
  #   mysecret: c2VjcmV0X3ZhbHVl
  # kind: Secret
  # metadata:
  #   creationTimestamp: null
  #   name: demo
   如您所见,密钥存储在其base64表示中。现在,使用 SOPS CLI 创建密钥的加密变体。特别是在考虑在 Flux 中解密机密时,请确保您提供--encrypted-regex参数并将加密限制为仅存储在data和 中的值stringData。
 
  复制
  # encrypt secret.encoded.yml using SOPS
  sops --encrypt --encrypted-regex '^(data|stringData)$'
      --azure-kv $KEY_ID secret.encoded.yml > secret.encrypted.yml
  # print the contents of secret.encrypted.yml
  cat secret.encrypted.yml
  # apiVersion: v1
  # data:
  #    mysecret: ENC[AES256_GCM,data:gz/WAjWte3bCnNm6e+G4ow==,iv:VB4pAv833tDdD4n76h4CqEZNpGdwA3V1QGWp7PK/Jfc=,tag:CcUy3rti4XcWArmHANVS8Q==,type:str]
  # 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)$
  #     version: 3.7.1
   默认情况下,信息的加密版本包含有关 Azure Key Vault 以及用于加密和解密的密钥的基本信息。此信息使解密变得容易,您将在几分钟后看到。但是,您也可以提供自定义.sops.yaml配置文件以从实际机密文件中删除此元数据。此时,您可以删除密钥的编码版本,并使用以下命令将加密版本添加到 git:
 
  复制
  # delete encoded version of the secret
  rm secret.encoded.yml
  # add encrypted secret to source control and commit it
  git add secret.encrypted.yml
  git commit -m 'chore: add encrypted secret'
   解密 Kubernetes Secrets 以进行部署
 
  要将密钥部署到 Kubernetes,您必须对其进行解密。同样,SOPS CLI 可以提供帮助。解密后的密钥可以直接通过管道传输到kubectl部署,如以下代码段所示:
 
  复制
  # decrypt and deploy the secret
  sops --decrypt secret.encrypted.yml | kubectl apply -f -
  1.
  2.
  将密码回显服务器部署到 Kubernetes
 
  将机密信息存储在 Kubernetes 中,您可以配置 echo 容器,它将通过HTTP. 注意envFrom清单的一部分。先前创建的机密信息填充到环境变量:
 
  复制
  apiVersion: v1
  kind: Pod
  metadata:
    name: echo
    labels:
      app: echo
  spec:
      containers:
      - image: thorstenhans/env-via-http:0.0.1
        name: main
        ports:
          - containerPort: 5000
            protocol: TCP
        envFrom:
          - secretRef:
              name: demo
              optional: true
        resources:
          requests:
            cpu: 50m
            memory: 32Mi
          limits:
            cpu: 100m
            memory: 48Mi

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读