资讯详情

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

公众号关注「奇妙的 Linux 世界」

设为「星标」,每天带你去玩 Linux !

adbb3721ec5e8cd9dcea29e6eb06bece.png

默认情况下,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 documentation for a detailed walk-through)。

预配 Azure 服务主体 (SP)

若要创造新的 Azure SP,请使用以下命令:

#createaserviceprincipal azadspcreate-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":"<your_tenant_identifier> #}

SOPS(以及一些即将到来的命令)需要存储在环境变量中进行身份验证。换句话说,您可以快速使用以下命令appId、tenant和存储password在当地环境变量中export:

exportAZURE_CLIENT_ID=<appId> exportAZURE_CLIENT_SECRET=<password> exportAZURE_TENANT_ID=<tenant>

如果您想将 SOPS 集成到您的 CI 在管道中,请考虑使用存储机密(这是在 GitHub 调用上下文中的敏感配置数据)或有竞争力的解决方案来处理您 CI 敏感数据在系统中。

点击上图,打开小程序,『饿了么外卖』每天免费领红包!

预配 Azure Key Vault 实例

你需要一个 Azure Key Vault 实例。使用 Azure CLI 预配新的 Azure Key Vault 如下列代码段所示,非常简单:

#createanewResourceGroup azgroupcreate-nrg-sops-sample-lgermanywestcentral  #createaKeyVaultinstance azkeyvaultcreate-nkv-sops-sample\ -grg-sops-sample\ -lgermanywestcentral  #createanaccesspolicyfortheSP azkeyvaultset-policy-nkv-sops-sample\ -grg-sops-sample\ --spn$AZURE_CLIENT_ID\ --key-permissionsencryptdecrypt

在 Azure Key Vault 中创建了用于加密和解密的密钥

在这个时候,你必须在我们新创造的 Azure Key Vault 用于加密和解密的实际密钥:

#createankeyforencryption/decryption azkeyvaultkeycreate-nsops-sample-key\ --vault-namekv-sops-sample\ --opsencryptdecrypt\ --protectionsoftware

除身份验证信息外,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 -

将密码回显服务器部署到 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

部署后,使用简单的端口转发并curl验证部署:

# deploy the sample pod 
kubectl apply -f pod.yml

# verify pod is running
kubectl get po
#
# NAME                    READY   STATUS    RESTARTS   AGE
# echo-74bc9c6d74-vh5lr   1/1     Running   0          4m38s

# activate port forwarding
kubectl port-forward echo-74bc9c6d74-vh5lr --port 8080:5000
#
# Forwarding from 127.0.0.1:8080 -> 5000
# Forwarding from [::1]:8080 -> 5000

# start a new terminal session
# issue an HTTP request to the echo pod with curl
curl http://localhost:8080 | jq

您应该获得一个JSON包含 Pod 内所有可用环境变量的对象,包括mysecret解密值为的环境变量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 使加密和解密秘密的过程变得轻松。与 Azure Key Vault 等服务的无缝集成非常棒。团队会发现这种方法非常有用,尤其是在从传统持续部署过渡到GitOps 期间。还值得一提的是,SOPS 与Flux无缝集成,Flux是基于 GitOps Toolkit 的最流行的持续交付解决方案之一。

本文转载自:「云原生技术爱好者社区」,原文:https://tinyurl.com/9kxjh87z,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

点击下方图片即可阅读

一次由 Kubernetes HostPort 引发的服务故障排错记实『美团|饿了么』外卖红包天天免费领,吃饭省钱杠杠滴!

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

标签: 二极管jeu05dp二极管jeu05df

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台