共计 8852 个字符,预计需要花费 23 分钟才能阅读完成。
1.SOPS 简介
1.1 什么是 SOPS?
首先,让我们切入正题,直奔主题:什么是 SOPS?
SOPS 是 Secrets OP eration S 的缩写,是一个开源文本文件编辑器,可以自动加密 / 解密文件。
强调文本编辑器、加密和自动化。
通常,当您想要加密文本文件时,您需要执行以下操作:
-
使用您最喜欢的编辑器来编写、编辑和操作文本数据,并将其保存为文件。
-
使用加密 / 解密工具加密整个文件。
当需要读取加密文件时:
-
首先,您需要使用加密 / 解密工具对文件进行解密。
-
使用您选择的文本编辑器打开解密的文件(现在它是常规文本文件)。
这种“正常”过程的缺点是显而易见的:一项工作需要两个工具(一个编辑器和一个加密 / 解密工具)。
输入 SOPS。
安装 SOPS 最简单的方法是通过 brew:
brew install sops
#对于其他操作系统用户,请参阅 SOPS 的官方 GitHub 存储库。#https://github.com/mozilla/sops
注意:您绝对可以使用其他带有 SOPS 的文本编辑器。对于 VSCode,您甚至有一个名为 vscode-sops 的扩展,它使您能够通过简单的基于项目的配置自动解密 / 加密 VSCode 中的文件。请记住,此扩展仍处于早期开发阶段,可能包含错误。
即使您不想安装扩展,您仍然可以使用 VSCode 来编辑文件:将 $EDITOR 环境变量设置为 code –wait,(在您的~/.bashrc 或 中~/.zshrc),VSCode 将在调用 时打开该文件 sops my-file.yaml。
1.2 它是如何工作的?
简而言之,SOPS 在一个软件包中提供了加密 / 解密和文本编辑功能,并且工作流程是完全自动化的。这就是它的闪光点:
-
当您写入文件时,SOPS 首先使用您选择的指定加密方法来加密文件,然后再将其保存到磁盘。这是自动完成的,无需任何人为干预。当然,如果您使用 SOPS 之外的其他文本编辑器打开该文件,您将无法读取其内容,因为它已加密。
-
当您使用 SOPS 读取加密文件时,它首先会解密该文件,将其打开并向您显示。虽然这听起来像是一项两步工作,但 SOPS 会自动完成,因此对于最终用户来说,这看起来只需一步。
1.3 亮点:灵活性
SOPS 支持各种加密方法,例如:
这使得敏感文件的管理和编辑变得简单而灵活。
如果我想使用本地 GPG 密钥编辑文本文件,没问题;如果我想编辑 ENV 文件并希望它由 HashiCorp Vault 加密,SOPS 也能满足我的需求。我不必对所有文件使用一种加密方法,因为 SOPS 是高度可定制的。
好了,说得够多了;让我们尝试一下,亲身感受一下。
2 个带有 PGP 密钥的 SOPS
2.1 PGP 与 GPG
PGP,GPG,令人困惑……我知道,对吧?
简而言之,GPG 是一个实现 PGP 的 CLI 工具:
-
PGP(Pretty Good Privacy)是一种加密程序,为数据通信提供加密隐私和身份验证。它可用于签名、加密和解密文本、电子邮件、文件、目录和整个磁盘分区,并提高电子邮件通信的安全性。
-
另一方面,GPG 代表 GnuPG,它是 OpenPGP 标准 RFC4880 的免费实现(命令行工具)。GPG 允许您对您的数据和通信进行加密和签名;它具有多功能密钥管理系统和适用于各种公钥目录的访问模块。
现在我们已经摆脱了令人困惑的命名法,让我们使用 GPG CLI 工具创建一个 PGP 密钥;然后,我们可以测试 SOPS 是如何工作的。
2.2 使用 GPG 创建 PGP 密钥
安装 GnuPG 最简单的方法是通过 brew,macOS 的包管理器:
brew install gnupg
如果您使用的是其他操作系统,例如 Linux,则可以使用相应的包管理器。最有可能的是,这会起作用:
sudo apt-get install gnupg
使用 GnuPG,创建密钥就像下面一样简单(记住将您的名字作为 KEY_NAME 的值):
export KEY_NAME="KEY_NAME"
export KEY_COMMENT="sops 测试密钥"
gpg --batch --full-generate-key 现在,如果您运行 gpg --list-keys,您将看到生成的密钥:
$ gpg --list-keys
gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
/Users/toycms/.gnupg/pubring.kbx
--------------------------------
pub rsa4096 2022-09-15 [SCEA]
A2B73FB4DA0891B38EECD35B47991CD146C9C4BC
uid [ultimate] KEY_NAME (sops 测试密钥)
sub rsa4096 2022-09-15 [SEA]
在输出的“pub”部分,您可以获得 GPG 密钥指纹。或者,您也可以跑去 gpg --list-secret-keys "${KEY_NAME}" 获取它。
存储密钥指纹以供将来参考。
2.3 SOPS 配置
我们需要一个简单的配置来让 SOPS 知道我们将使用之前生成的 PGP 密钥进行加密 / 解密。为此,请.sops.yaml 在您的 $HOME 目录下创建一个包含以下内容的文件:
creation_rules:
- pgp: >-
A2B73FB4DA0891B38EECD35B47991CD146C9C4BC
请记住替换您在上一步中生成的密钥指纹。
好的,现在我们完成了。
2.4 带有文本文件的 SOPS
运行以下命令创建一个名为的新文件 a -text-file.txt:
cd sops a-text-file.txt
开始编辑内容(例如我输入“hello world”),然后保存。
现在,如果我们尝试 cat 该文件,我们将无法获取内容:
$ cat a-text-file.txt
{"data": "ENC[AES256_GCM,data:U1j0eOC7URJZsNb+Iqs=,iv:4F3Bw1YOIE2xxdag+PbrMLGcqAjG48qVDeiu+xTfnro=,tag:2tX0jUssBYeI0IF7Lxmy+A==,type:str]",
"sops": {
"kms": null,
"gcp_kms": null,
"azure_kv": null,
"hc_vault": null,
"age": null,
"lastmodified": "2022-09-15T04:38:19Z",
"mac": "ENC[AES256_GCM,data:w1HJ/A7t0DxD1KObLeLQVzSWVrobIAF/lUg/8DRH9khba8/cDGVjhrkheki09uWDfHo4vb+odrPsBBW6vtRemqd4Y+HTAH37l8e9IltbH1eUzgoKyOh0uNULLnxbpDTnxykTOCychgiHmPS0ggpetagHLxi0jOLGFe4FxOfbCdY=,iv:qMOCu7AtT7HnnQn22L3VsJ7JY/Wb5C0RLEfdl8g5OG4=,tag:PAb7sKHQZB65TBPts71s2g==,type:str]",
"pgp": [
{
"created_at": "2022-09-15T04:38:09Z",
"enc": "-----BEGIN PGP MESSAGE-----nnhQIMAxuQA5jWgsG6AQ/9HE0Xk8zM/oLJOqx4SaxKFKNmncYvRWSdADlXC341qYUGn353VeMIbfl1u8Mg3iZxoUvD4SrkAEl63DOunhATWTtY2phtjoVxpoFhxOnu170zwnKawewc9qzzjcAG5Oq/EqZeo0ip81VdZdfk9h05rSvH7y1vJ8YLgt6/3t6ZYlLdKAnOF5jkjEqSyY9iaSZiFxVarT2PLygaIeG3zp9+mWcUjIaR9dzGILXDfwhNooFYlMNno8GoEoMZUQVLLb4oFmWvnP/dG92ksimxp9ba4L0YWcd+HUJNGIxx8a1w5njGduqInDI67rVH8t94CwD30WGJq6d4yeo99JkN/gx88GdgLzuNzdclrMVbtR2f+ifqW0+KXnza0e/AMCaCFHOUVZ8OGPJPZbBAB11hS/cRb9+JA/+OVolB9eGu6YkGhhAPS2xYVDn4WC6vaNBgRwbu0YUxEiMWng2KM2QVeZlnFDJzUN/WNDwnmP9vY3keOqLJAAkkNtpnyGCzA2PG2LvrMEPxoFj1uEtR8vxVcs56vp9Q6JdtA1wh+w61Mt1mnFbY6/6fsFQKnC40L0UpukNNGsl1rl6jvlJEUoyjqxG9eWPMX3VKyXIrwEFYcEQ2pvEnsTHLx9pZanfxN4oiEW7leMPYzS5bEbx2pUxSrp94Om6T1fVRtBhWBGb2QaWPZCYR2p2cQRW1zUnaAEJAhAV9CcPDhhrHpYn06QbJf4kvM1SNXT5vRkeeC/fxS7HkqM3ukNzHkgrUijznj5k9vB7prn+2fGkpNxYSLOOW0Zgn0INpEkaBoRpdcfvFeE+kVv+rmUL9jsPWJpOAnygzUZnejMwOnn=v3OPn-----END PGP MESSAGE-----n",
"fp": "A2B73FB4DA0891B38EECD35B47991CD146C9C4BC"
}
],
"unencrypted_suffix": "_unencrypted",
"version": "3.7.3"
}
}
但根据输出,我们可以得出结论:
读取文件:
sops a-text-file.txt
我们又恢复了原来的内容!
请注意,在读取文件时,我们不需要指定使用哪种加密 / 解密方法来读取加密文件,因为当我们首先创建它时,加密 / 解密方法已经由 SOPS 存储为文件的一部分。
2.5 结构化数据的 SOPS
自动加密文本文件的全部内容是 SOPS 的一个显着优势,但如果文件包含结构化数据,例如:
-
YAML
-
JSON
-
*.ini
-
环境电压
SOPS 可以做得更好!
咱们试试吧:
sops a-yaml-file.yaml
我放置了以下内容:
username: toycms
password: test
如果我们使用常规文本编辑器打开该文件,例如 cat:
$ cat a-yaml-file.yaml
username: ENC[AES256_GCM,data:h/BVd2tf,iv:IjzYAQQErVeWhwIIuMMfq/pjFr9YJVDNSl6ceRPv+6Q=,tag:2+xJOR89rsOMIQMWHNSEqw==,type:str]
password: ENC[AES256_GCM,data:zaz1Jw==,iv:VZ81YN4FRQf14g4olKwb6A8W00BIFT/OgWSEqkrO29s=,tag:tRJHVU7ANvGSw0tOjqGKiQ==,type:str]
...(omitted)
似乎只有“值”被加密,而不是“密钥”!
这是一个巨大的优势,因为如果我们用常规文本编辑器打开这个文件,我们仍然可以获得数据的结构,只是我们无法读取加密的内容。
我想你知道为什么我对这个功能感到兴奋,因为我只是想到了一个很棒的应用程序:加密 Kubernetes 秘密 YAML 文件!加密后,我们仍然可以清楚地看到内容和密钥,但看不到值,从而可以安全地将文件存储在某处并与他人共享。
值得一提的是,对于 YAML 文件,SOPS 还对注释进行加密,这是另一个很棒的功能:敏感值字段可能在注释部分也有一些敏感描述。
好的,到目前为止,我们已经通过标准文本文件和结构化文件演示了 SOPS 的基本功能。但我们已经使用 PGP 密钥完成了所有操作,这在生产环境中使用可能不太常见。接下来,让我们尝试使用 HashiCorp Vault 和 AWS KMS(两个最著名的秘密 / 密钥管理器)进行 SOPS。
HashiCorp Vault 的 3 个 SOPS
3.1 Vault 简介
如果您不了解 HashiCorp Vault,它的核心是一个秘密管理器,但它可以做更多的事情,包括加密管理。典型的用例包括秘密管理、加密服务、密钥管理等。这是一个开源项目,您可以在自己的基础设施中运行;HashiCorp 还提供基于云的服务。
3.2 设置本地 Vault 进行测试
对于 SOPS 教程,我们将设置一个本地 Vault 服务进行测试,最快的方法是使用 Docker:
docker run -d -p8200:8200 vault:1.2.0 server -dev -dev-root-token-id=toor
请注意,这只是为了设置本地开发 Vault 服务器;不要在生产环境中执行此操作。对于生产使用,请查看 官方文档。
在 Docker 容器中本地运行 Vault 后,运行以下命令进行验证:
$ export VAULT_ADDR=http://127.0.0.1:8200
$ export VAULT_TOKEN=toor
$ vault status
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed false
Total Shares 1
Threshold 1
Version 1.2.0
Cluster Name vault-cluster-618cc902
Cluster ID e532e461-e8f0-1352-8a41-fc7c11096908
HA Enabled false
Vault 启动并运行后,让我们创建一个供 SOPS 使用的密钥:
$ # 启用传输引擎(如果尚未完成)$ # 建议专门为 SOPS 创建一个传输引擎
$ vault secrets enable -path=sops transit
Success! Enabled the transit secrets engine at: sops/
$ # 创建一个密钥
$ vault write sops/keys/firstkey type=rsa-4096
Success! Data written to: sops/keys/firstkey
3.3 通过 SOPS 使用 Vault 中的密钥
接下来,让我们使用我们在 Vault 中创建的密钥编辑文件:
sops --hc-vault-transit $VAULT_ADDR/v1/sops/keys/firstkey another-yaml-file.yaml
以 YAML 格式编写一些键 / 值对,然后保存。
如果我们使用其他文本编辑器(例如 vim)打开该文件,我们可以看到与 Vault 相关的信息也保存为文件的一部分。因此,当我们需要阅读它时,我们只需运行:
sops another-yaml-file.yaml
就是这样:该过程与使用 PGP 密钥完全相同。
SOPS 在其配置文件中支持精细范围的规则,因此它根据这些用户定义的规则知道每个文件使用什么加密方法和哪个密钥。
4 使用 AWS KMS 的 SOPS
4.1 KMS 简介
AWS KMS(密钥管理服务)是一项基于云的服务,可帮助创建和控制加密密钥。与 HashiCorp Vault 类似,它可以创建、存储和使用加密密钥;不同之处在于,HashiCorp Vault 也是一个秘密管理器,而 AWS 有一个单独的服务(AWS Secrets Manager)用于轮换、管理和提供秘密。
4.2 创建 AWS KMS 密钥
对于这一部分,我们将使用 AWS CLI。
如果您还没有安装,请按照此处的官方文档进行安装。安装完成后,我们需要在使用前对其进行正确的配置。
官方文档
https://aws.amazon.com/cli/
配置
https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html
这里我们假设您的 AWS CLI 已经可以正常工作并且具有访问 AWS KMS 所需的权限。
使用 AWS CLI 在 AWS KMS 中创建密钥非常简单:
aws kms create-key
--tags TagKey=Purpose,TagValue=Test
--description "Test key"
从输出中复制 ARN,我们可以将其保存为 ENV var(将 ARN 替换为您自己的值):
export ARN=arn:aws:kms:ap-southeast-1:858104165444:key/620abad4-8043-4166-8712-2b4684378d3a
4.3 将 AWS KMS 中的密钥与 SOPS 结合使用
同样简单明了:
sops --kms $ARN aws-kms-encryption-example.yaml
同样,加密方法信息保存为文件的一部分,使用 SOPS 读取文件不需要指定解密方法,就像使用 GPG 或 Vault 一样。
SOPS 支持更多加密方法,例如 GCP KMS、Azure Key Vault 等。从 SOPS 的存储库中了解更多信息!
5 总结
5.1 为什么需要 SOPS
看完整个教程并自己执行许多命令后,您一定有点累了。现在是放松的讲故事时间:
几年前,我正在从事一个大型金融科技相关项目,整个基础设施的中心是一个 OpenShift 集群(可以将其视为定制的 Kubernetes)。
在集群中,我们使用命名空间来分隔不同的环境;我们使用 OpenShift 集群作为秘密管理的单一事实来源。
例如:如果我们需要更新密钥的值,我们可以在 OpenShift 控制台中执行此操作。如果我们需要在 Jenkins 中使用机密,我们可以在 OpenShift 中添加一个机密,它将自动同步为 Jenkins 机密。一切看起来都很好。
然而,如果我们想与其他团队成员共享秘密或将秘密迁移到另一个集群 / 环境中,那就很棘手:我们必须将秘密导出为 K8s 秘密 YAML 文件,然后共享该文件。
这既是一个安全问题,也是一个生产力问题:如果 YAML 与不应该访问该秘密的人共享怎么办?如果 OpenShift 集群中的秘密发生了变化,但我们不知道,因为我们手头的 YAML 文件不可能自动与集群同步,该怎么办?
一般来说,使用 K8s 本机机密作为单一事实来源并不是最佳实践,但从 K8s 环境之外的地方使用机密并不简单。即使机密仅在集群内使用,您仍然必须创建硬编码的 YAML 副本:在哪里保存这些 YAML 文件,以及如何安全地共享它们?
这就是 SOPS 可以提供帮助的地方:它以最小甚至没有开销的方式加密您的敏感文件,从而可以轻松存储和共享秘密文件。
5.2 某些用例的替代方案
有两种类似的工具,虽然功能要弱得多,但根据您的具体用例,可能同样有价值:
-
Git-crypt 可以自动加密和解密 git 存储库中的文件。您选择保护的文件在提交时会加密,在签出时会解密。git-crypt 允许您自由共享包含公共和私有内容混合的存储库。如果您想在团队内共享秘密,这是一个很棒的工具,但它仅支持 PGP 密钥加密;您必须自己生成和管理这些 PGP 密钥。而且,如果你只想自动进行一些加密 / 解密而不使用 git,那是没有意义的。
-
Ansible Vault 对变量和文件进行加密,以保护敏感内容(例如密码或密钥),而不是在 Ansible 剧本或角色中将其以明文形式保留。它的工作原理与 SOPS 类似,但显然,它只能在 Ansible 上下文中使用。当然,您也可以将 SOPS 与 Ansible 结合使用。
SOPS 仍然是通用用途的王者,特别是如果您想为不同的文件使用不同的加密方法。
5.3 SOPS 不是什么
需要明确的是:SOPS 不是秘密管理者。是的,您可以将其用作一种快速且廉价的解决方案,将敏感数据存储在加密文件中。但是,随着您的用例扩展,您可能会遇到困难。仅以文件格式保存机密有其局限性。例如,您可能在某些时候需要 API 访问您的机密。SOPS 并不是为此而设计的,在其之上构建自定义解决方案充其量也很笨拙。
这正是秘密管理器的用途:允许您灵活地选择所有秘密的格式、策略和访问方法(如文件、K8s 原生 YAML、来自应用程序、实际用户等)。现代秘密管理器与 CLI、CI/CD 系统、编排平台等有许多集成,因此很可能,您的所有需求都可以在不加密文件的情况下得到满足。文章来源:https://www.toymoban.com/diary/system/539.html
文章来源地址 https://www.toymoban.com/diary/system/539.html
到此这篇关于 SOPS 综合指南的文章就介绍到这了, 更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持 TOY 模板网!