社区编辑申请
注册/登录
如何使用 Mozilla SOPS 优雅的管理你的 Kubernetes Secret
系统 Linux
本文演示了如何将YAMLSOPS 与 Azure Key Vault 结合使用来加密和解密 Kubernetes 机密(文件),这允许您将信息与其他 Kubernetes 清单直接存储在 git 中。

默认情况下,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 -

将密码回显服务器部署到 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 的最流行的持续交付解决方案之一。

责任编辑:庞桂玉 来源: 奇妙的Linux世界
相关推荐

2022-05-02 18:15:04

KubernetesLinux开源

2022-04-15 09:23:29

Kubernetes面试题

2022-02-23 20:20:48

Kubernetes网络模型

2022-03-10 08:24:17

Docker容器SaaS

2022-03-10 09:28:24

Kubernete云原生

2022-05-24 14:26:11

云原生数据库云架构

2022-05-24 10:27:39

博云容器云运维

2022-03-29 09:21:21

DevOps开发

2022-03-28 18:27:07

容器容器云PaaS

2022-04-19 16:16:35

DevOps云原生容器

2022-04-07 10:17:18

云原生服务器优化

2021-11-08 07:48:48

2022-05-25 11:22:06

VMware

2022-03-08 08:32:43

2022-03-04 23:01:02

云计算管理工具

2022-04-12 15:54:12

阿里云云原生开源

2022-05-24 09:00:00

云计算Kubernetes安全

2019-08-16 11:48:53

容器云平台软件

2022-05-24 06:04:25

多云混合云Kubernetes

2022-05-24 10:36:45

云原生容器应用

同话题下的热门内容

微软发布 Windows 11 累积更新(KB5014019),版本号升至 22000.708NVIDIA 的开源驱动程序对 Linux 意味着什么Windows 11年度版本更新了啥!详细剖析Windows 11 22H2Windows 11年度更新定了!Windows 11 22H2 RTM已可下载1 核有难 15 核围观?专业人士反馈微软 Windows 11 CPU 占用率读数不正确,尤其是 AMD日志系统成本飙升千万,吓得我赶紧把ES换成ClickHouse……如何将Windows 11 Sandbox用作虚拟机?Windows 11的新功能可以帮助用户在命令提示符中节省时间

编辑推荐

你应该知道的八款国产操作系统为什么你可能想要略过Ubuntu 17.04?HarmonyOS 2.0鸿蒙第二期开发者Beta公测申请指南让后端开发情何以堪?前端程序猿薪资大曝光谷歌“断供”华为!中国真写不出操作系统?
我收藏的内容
点赞
收藏

51CTO技术栈公众号