简单灵活的秘密管理工具

2020-12-08 17:39:50

sops是支持YAML,JSON,ENV,INI和BINARY格式的加密文件的编辑器,并使用AWS KMS,GCP KMS,Azure Key Vault和PGP进行加密。

对于冒险的,不稳定的功能,您可以在develop分支中使用,您可以从源代码中安装它们:

Python Sops怎么了?我们在Go中重写了Sops来解决许多部署问题,但是Python分支仍然存在于python-sops下。我们会继续维护一段时间,您仍然可以点安装肥皂,但是我们强烈建议您改用Go版本。

如果您使用的是AWS KMS,请在IAM控制台中创建一个或多个主密钥,并在SOPS_KMS_ARN env变量中将它们导出,以逗号分隔。建议在不同区域中至少使用两个主密钥。

如果要使用PGP,请导出SOPS_PGP_FP env变量中以逗号分隔的公共密钥的指纹。

然后只需以文件路径作为参数调用sops。它将透明地处理加密/解密并在编辑器中打开明文文件

$ sops mynewtestfile.yamlmynewtestfile.yaml不存在,正在创建它。请稍候,正在生成加密密钥并将其存储在写入mynewtestfile.yaml的安全时尚文件中

如果将$ EDITOR设置为或不设置$ vim,将在vim中进行编辑。请记住,sop将等待编辑器退出,然后尝试重新加密文件。一些GUI编辑器(atom,sublime)产生一个子进程,然后立即退出。他们通常可以选择退出退出之前等待主编辑器窗口关闭的选项。有关更多信息,请参见#127。

myapp1:ENC [AES256_GCM,data:Tr7o =,iv:1 =,aad:No =,tag:k =] app2:db:用户:ENC [AES256_GCM,data:CwE4O1s =,iv:2k =,aad:o = ,tag:w ==]密码:ENC [AES256_GCM,data:p673w ==,iv:YY =,aad:UQ =,tag:A =]#用于app2密钥秘密操作的私钥:|-ENC [AES256_GCM,数据:Ea3kL5O5U8 =,iv:DM =,aad:FKA =,tag:EA ==] an_array:-ENC [AES256_GCM,data:v8jQ =,iv:HBE =,aad:21c =,tag:gA ==]- ENC [AES256_GCM,data:X10 =,iv:o8 =,aad:CQ =,tag:Hw ==]-ENC [AES256_GCM,data:KN =,iv:160 =,aad:fI4 =,tag:tNw == ]肥皂:kms:-created_at:1441570389.775376 enc:CiC .... PM1Hm arn:arn:aws:kms:us-east-1:656532927350:key / 920aff2e-c5f1-4040-943a-047fa387b27e-created_at:1441570391.925734 enc: Ci ... awNx arn:arn:aws:kms:ap-southeast-1:656532927350:key / 9006a8aa-0fa6-4c14-930e-a2dfb916de1d pgp:-fp:85D77543B3D624B63CEA9E6DBC17301B491B3F21 created_at:144157039 ----- BEGIN PGP消息----- hQIMA0t4uZHfl9qgAQ // UvGAwGePyHuf2 / zayWcloGaDs0MzI + zw6CmXvMRNPUsA ... = oJgS ----- END PGP消息-----

加密/解密密钥的副本安全地存储在每个KMS和PGPblock中。只要KMS或PGP方法之一仍然可用,您就可以访问您的数据。

sops加密文件包含解密其内容的必要信息。sops用户的所有需求都是有效的AWS凭证以及对KMS密钥的必要权限。

< file>将被打开,解密,传递给文本编辑器(默认为vim),如果修改则加密,然后保存回其原始位置。除了实际的编辑之外,所有这些步骤对用户都是透明的。

如果您想测试肥皂而不需要进行大量设置,则可以使用存储库随附的示例文件和pgp密钥:

使用GCP KMS进行加密/解密需要KMS ResourceID。您可以使用cloud控制台获取ResourceID,也可以使用gcloudsdk创建一个:

$ gcloud kms密钥环创建sops --location全局$ gcloud kms密钥创建sops-key --location global -keyring的sops-目的加密$ gcloud kms密钥列表--location全局--keyring的sops my-project / locations / global / keyRings / sops / cryptoKeys / sops-key ENCRYPT_DECRYPT ENABLED

您可以通过AZURE_AUTH_METHODenvironment变量强制使用特定的身份验证方法,该变量可以是以下之一:clientcredentials,clientcertificate,usernamepassword,msi或cli(默认值)。

$ az ad sp-为rbac -n my-keyvault-sp {" appId&#34 ;:"< some-uuid> ","显示名称&#34 ;:" my-keyvault-sp&#34 ;、"名称&#34 ;:" http:// my-keyvault -sp","密码&#34 ;:"< some-uuid> ","< tenant-id> "}

使用Azure Key Vault进行加密/解密需要密钥的资源标识符。格式如下:

要从命令行创建密钥保管库并为其分配服务主体权限,请执行以下操作:

#如果没有资源组,则创建一个资源组:$ az group create --name sops-rg --location westeurope#密钥库名称是全局唯一的,因此生成一个:$ keyvault_name = sops- $(uuidgen | tr -d -| head -c 16)#创建一个保管库,一个密钥,并授予服务主体访问权限:$ az keyvault create --name $ keyvault_name --resource-group sops-rg --location westeurope $ az keyvault key create-名称sops-key --vault-name $ keyvault_name-保护软件--ops加密解密$ az keyvault set-policy --name $ keyvault_name-资源组sops-rg --spn $ AZURE_CLIENT_ID \ --key-permissions加密解密#读取密钥ID:$ az keyvault key show --name sops-key --vault-name $ keyvault_name --query key.kidhttps://sops.vault.azure.net/keys/sops-key/some -串

我们假设您正在运行Vault的一个(或多个)实例,并且您有权访问它。有关如何部署Vault的安全实例的说明,请参阅Hashicorp的官方文档。

$#用运行Vault的地址替换它$ export VAULT_ADDR = http://127.0.0.1:8200 $#如果您以前将`vault login'用作生产用途,则可能不需要这样做$ export VAULT_TOKEN = toor $#检查保险库是否已启动并正确配置$保险库状态密钥值--- -----密封类型shamir初始化true密封假总份额1阈值1版本1.2.0集群名称vault-cluster-618cc902集群ID e532e461-e8f0-1352-8a41-fc7c11096908HA启用假$#如果尚未完成,则需要启用传输引擎(建议创建专门针对肥皂的传输引擎,其中可能具有具有不同权限级别的多个密钥) !在以下位置启用传输秘密引擎:sops / $#然后创建一个或多个密钥$ Vault写sops / keys / firstkey type = rsa-4096Success!数据写入:sops / keys / firstkey $ vault写入sops / keys / secondkey type = rsa-2048成功!数据写入:sops / keys / secondkey $ vault写入sops / keys / thirdkey type = chacha20-poly1305成功!写入到的数据:sops / keys / thirdkey $ sops --hc-vault-transit $ VAULT_ADDR / v1 / sops / keys / firstkey vault_example.yml $ cat<< EOF> .sops.yaml creation_rules:-path_regex:\ .dev \ .yaml $ hc_vault_transit_uri:" $ VAULT_ADDR / v1 / sops / keys / secondkey" -path_regex:\ .prod \ .yaml $ hc_vault_transit_uri:" $ VAULT_ADDR / v1 / sops / keys / thirdkey" EOF $肥皂--verbose -e prod / raw.yaml> prod / encrypted.yaml

创建新文件时,sop使用命令行参数--kms,-pgp,-gcp-kms或--azure-kv中定义的PGP,KMS和GCP KMS,或使用环境变量SOPS_KMS_ARN,SOPS_PGP_FP,SOPS_GCP_KMS_IDS,SOPS_AZURE_KEYVAULT_URLS 。该信息存储在sops部分下的文件中,因此解密文件不需要再次提供这些参数。

可以通过以下三种方法之一在一个sops文件中添加和删除Master PGP和KMS主密钥:

updatekeys命令使用.sops.yaml配置文件来更新(添加或删除)加密文件中的相应机密。请注意,以下示例使用Block Scalar yaml构造来构建以空格分隔的列表。

Sops会提示您进行更改。可以通过提供-y标志来禁用此交互性。

命令行标志--add-kms,-add-pgp,-add-gcp-kms,-add-azure-kv,-rm-kms,-rm-pgp,-rm-gcp-kms和--rm-azure-kv可用于在文件中添加和删除密钥。创建新文件时,这些标志使用逗号分隔的语法作为--kms,-pgp,-gcp-kmsand --azure-kv参数文件。

请注意,在此模式下,-r或--rotate是必需的。不指定rotate将忽略--add- *选项。如果要添加密钥而不旋转数据密钥,请使用updatekeys。

#将新的pgp密钥添加到文件中并旋转数据密钥$ sops -r -i --add-pgp 85D77543B3D624B63CEA9E6DBC17301B491B3F21 example.yaml#从文件中删除pgp密钥并旋转数据密钥$ sops -r -i- rm-pgp 85D77543B3D624B63CEA9E6DBC17301B491B3F21 example.yaml

另外,在编辑时,带有-s标志的sops将显示主键。此方法可用于在“ sops”部分下添加或删除kms或pgp密钥。使用-i标志调用sops将执行就地编辑,而不是将输出重定向到stdout。

例如,要将KMS主密钥添加到文件,请在编辑时添加以下条目:

保存文件后,sop将更新其元数据并使用新添加的主密钥对数据密钥进行加密。删除的条目仅从文件中删除。

删除密钥时,建议使用-r旋转数据密钥,否则,被删除密钥的所有者可能在过去拥有对数据密钥的更多访问权限。

同样,可以在命令行中使用任何KMS命令来设置--aws-profile标志。

通过在每个账户中扮演角色,SOPS可以在多个AWS账户中使用KMS。能够承担角色是AWS的一项不错的功能,它使管理员可以在帐户之间建立信任关系,通常从最安全的帐户到最不安全的帐户。在我们的用例中,我们使用角色来指示允许AWS Master帐户的用户在开发和登台AWS帐户中使用KMSmaster密钥。使用角色,可以使用多个帐户中的KMS密钥对单个文件进行加密,从而提高了可靠性和易用性。

通过将每个KMS主密钥与允许用户在每个帐户中承担的角色联系起来,可以在各种帐户中使用密钥。 IAM角色文档详细说明了如何在AWS端进行配置。

从浸泡的角度来看,您只需指定KMS密钥必须与其ARN一起承担的角色,如下所示:

该角色必须具有使用KMS调用加密和解密的权限。下面显示了一个示例策略。

{" Sid&#34 ;:"允许使用键&#34 ;、"效果&#34 ;:" Allow&#34 ;、" &#34 ;: [" kms:加密&#34 ;、" kms:解密&#34 ;、" kms:ReEncrypt *&#34 ;、" kms:GenerateDataKey *",kms:DescribeKey" ]," Resource&#34 ;:" *&#34 ;," Principal&#34 ;: {" AWS&#34 ;: [" arn: aws:iam :: 927034868273:role / sops-dev-xyz" ]}}

您可以在--kms标志和SOPS_KMS_ARN变量中指定角色,方法是将其附加到主键的ARN,并用+号分隔:

SOPS可以使用AWS KMS密钥策略和加密上下文来完善给定KMS主密钥的访问控制。

创建新文件时,您可以在--encryption-context标志中通过键值对的逗号分隔列表指定加密上下文:

加密上下文将存储在文件元数据中,并且不需要在解密时提供。

加密上下文可以与KMS密钥策略结合使用,以定义只能访问给定上下文的角色。下面显示了一个示例策略:

{" Effect&#34 ;:&#34 ;," Principal&#34 ;: {" AWS&#34 ;:" arn:aws: iam :: 111122223333:role / RoleForExampleApp" }," Action&#34 ;:" kms:Decrypt&#34 ;," Resource&#34 ;:" *&#34 ;,&#34 ;,& #34 ;: {" StringEquals&#34 ;: {" kms:EncryptionContext:AppName&#34 ;:" ExampleApp&#34 ;、" kms:EncryptionContext:FilePath& #34 ;:" / var / opt / secrets /" }}}

建议定期更新数据密钥。 sops通过-r标志支持keyrotation。在现有文件上调用它会导致sops用新的数据密钥对文件进行重新加密,然后使用文件中定义的各种KMS和PGP主密钥对其进行加密。

指定--kms --gcp-kms和--pgp参数来创建所有新文件通常很繁琐。如果您的机密存储在特定目录(如git存储库)下,则可以在根目录下创建.sops.yaml配置文件,以定义用于哪个文件名的密钥。

在这种情况下,放在mysecretrepo / .sops.yaml中的文件可以管理三种文件类型的三组配置:

#按顺序评估创建规则,第一个匹配将赢得creation_rules:#创建与模式* .dev.yaml匹配的文件后,#使用KMS集A-path_regex:\ .dev \ .yaml $ kms:&#39 ; arn:aws:kms:us-west-2:927034868273:key / fe86dd69-4132-404c-ab86-4269956b4500,arn:aws:kms:us-west-2:361527076523:key / 5052f06a-5d3f-489e-b86c -57201e06f31e + arn:aws:iam :: 361527076523:role / hiera-sops-prod' pgp:' FBC7B9E2A4F9289AC0C1D4843D16CEE4A27381B4' #个prod文件在PROD IAM中使用KMS集B-path_regex:\ .prod \ .yaml $ kms:' arn:aws:kms:us-west-2:361527076523:key / 5052f06a-5d3f-489e-b86c -57201e06f31e + arn:aws:iam :: 361527076523:role / hiera-sops-prod,arn:aws:kms:eu-central-1:361527076523:key / cb1fab90-8d17-42a1-a9d8-334968904f94 + arn:aws: iam :: 361527076523:role / hiera-sops-prod' pgp:' FBC7B9E2A4F9289AC0C1D4843D16CEE4A27381B4' hc_vault_uris:" http:// localhost:8200 / v1 / sops / keys / thirdkey" #使用GCP KMS的gcp文件-path_regex:\ .gcp \ .yaml $ gcp_kms:projects / mygcproject / locations / global / keyRings / mykeyring / cryptoKeys / thekey#最后,如果上述规则不匹配,则此为#catchall将使用KMS集C对文件进行加密#缺少path_regex意味着它将匹配所有内容-kms:' arn:aws:kms:us-west-2:927034868273:key / fe86dd69-4132-404c-ab86 -4269956b4500,arn:aws:kms:us-west-2:142069644989:key / 846cfb17-373d-49b9-8baf-f36b04512e47,arn:aws:kms:us-west-2:361527076523:key / 5052f06a-5d3f-489e -b86c-57201e06f31e' pgp:' FBC7B9E2A4F9289AC0C1D4843D16CEE4A27381B4'

在mysecretrepo下创建任何文件时,无论是在根目录下还是在子目录下,sop都将递归查找.sops.yaml文件。如果找到一个文件,则将正在创建的文件的文件名与配置文件的文件名正则表达式进行比较。选择匹配的第一个正则表达式,并使用其KMS和PGP密钥对文件进行加密。应当注意,.sops.yaml的查找是从工作目录(CWD)而不是加密文件的目录中进行的(请参见问题242)。

creation_rules:#在创建正在开发的文件时,使用#KMS集A-path_regex:。* / development /.* kms:' arn:aws:kms:us-west-2:927034868273:key / fe86dd69 -4132-404c-ab86-4269956b4500,arn:aws:kms:us-west-2:361527076523:key / 5052f06a-5d3f-489e-b86c-57201e06f31e + arn:aws:iam :: 361527076523:role / hiera-sops-产品pgp:' FBC7B9E2A4F9289AC0C1D4843D16CEE4A27381B4' #个prod文件在PROD IAM中使用KMS集B-path_regex:。* / production /.* kms:' arn:aws:kms:us-west-2:361527076523:key / 5052f06a-5d3f-489e-b86c -57201e06f31e + arn:aws:iam :: 361527076523:role / hiera-sops-prod,arn:aws:kms:eu-central-1:361527076523:key / cb1fab90-8d17-42a1-a9d8-334968904f94 + arn:aws: iam :: 361527076523:role / hiera-sops-prod' pgp:' FBC7B9E2A4F9289AC0C1D4843D16CEE4A27381B4' #个其他文件使用KMS设置C-kms:' arn:aws:kms:us-west-2:927034868273:key / fe86dd69-4132-404c-ab86-4269956b4500,arn:aws:kms:us-west- 2:142069644989:key / 846cfb17-373d-49b9-8baf-f36b04512e47,arn:aws:kms:us-west-2:361527076523:key / 5052f06a-5d3f-489e-b86c-57201e06f31e' pgp:' FBC7B9E2A4F9289AC0C1D4843D16CEE4A27381B4'

请注意,在sops命令行或环境变量中传递KMS或PGP参数时,将忽略配置文件。

sops检查SOPS_GPG_EXEC环境变量。如果指定,它将尝试使用那里的可执行文件集而不是默认的gpg。

默认情况下,Sop使用密钥服务器keys.openpgp.org检索本地密钥环中不存在的GPG密钥,这不再是可配置的。您可以从以下文章中了解有关原因的更多信息:[SKS密钥服务器网络受到攻击](https://gist.github.com/rjhansen/67ab921ffb4084c865b3618d6955275f)。

默认情况下,Sop使用每个主密钥对文件的数据密钥进行加密,这样,如果有任何主密钥可用,则可以对文件进行解密。但是,有时需要访问多个主密钥以实现以下目的:解密文件。这可以通过关键组来实现。

在sop中使用密钥组时,数据密钥会分为几部分,因此需要多个组中的密钥来解密文件。 sops使用Shamir's Secret Sharing拆分数据密钥,以便每个密钥组都有一个片段,密钥组中的每个密钥都可以解密该片段,并且需要可配置数量的片段(阈值)来解密和拼凑完整的片段。数据密钥。当使用多个密钥组解密文件时,sop会按顺序浏览密钥组,然后在每个组中,尝试使用该组中的主密钥来恢复数据密钥的片段。一旦片段被恢复,直到所有片段被恢复以获得完整的数据密钥,sop才移至下一组。

默认情况下,阈值设置为密钥组的数量。例如,如果您在SOPS文件中配置了三个密钥组,并且您未覆盖默认阈值,则将需要三个组中每个组的一个主密钥来解密文件。

例如,您可以将具有3个PGP密钥和3个KMS密钥的新密钥组添加到文件my_file.yaml中:

$ sops组添加--file my_file.yaml --pgp指纹1 --pgp指纹2 --pgp指纹3 --kms arn1 --kms arn2 --kms arn3

或者,您可以从my_file.yaml中删除第一个组(组号为0,组号为零索引):

creation_rules:-path_regex:。* keygroups。* key_groups:#第一个密钥组-pgp:-指纹1-指纹2 kms:-arn:arn1角色:role1上下文:foo:bar-arn:arn2#第二个密钥组-pgp:-Fingerprint3 -指纹4公里:-arn:arn3-arn:arn4#第三个密钥组-pgp:-指纹5

在此配置下,我们可以像通常那样创建一个新的加密文件,如果要覆盖默认阈值,则可以选择提供--shamir-secret-sharing-threshold命令行标记。然后,sops将把数据密钥分为三个部分(从密钥组的数量开始),并使用每个组中的主密钥对每个片段进行加密。

或者,您可以使用shamir_threshold在.sops.yaml配置中为每个创建规则配置Shamir阈值:

creation_rules:-path_regex:。* keygroups。* shamir_threshold:2 key_groups:#第一个密钥组-pgp:-指纹1-指纹2 kms:-arn:arn1角色:role1上下文:foo:bar-arn:arn2#第二个密钥组-pgp :-指纹3-指纹4 kms:-arn:arn3-arn:arn4#第三密钥组-pgp:-指纹5 阈值(shamir_threshold)设置为2,因此此配置将需要来自三个不同密钥组中的两个的主密钥才能解密该文件。然后可以像使用任何其他SOPS文件一样对文件进行解密: 在某些情况下,您可能希望在无法直接访问加密密钥(例如PGP密钥)的计算机上运行sops。 sops keyservice允许您转发套接字,以便sops可以访问存储在远程计算机上的加密密钥。 这类似于GPG代理,但更具可移植性。 SOPS使用客户端-服务器方法来 ......