乐趣区

关于加密:Helm-插件之-helmsecrets利用-PGP-加密你的-Values-文件-IDCF

在应用 Helm 部署应用程序时,咱们常常会遇到须要为所要部署的应用程序设定敏感信息值的状况,如:为应用程序本身设定登陆名和明码信息,或设定应用程序连贯数据库时所需的信息等等。

若将这些蕴含了敏感信息的值间接以明文的形式存储在自定义的 Values 文件中,尤其是当应用如 Git 等代码版本控制工具追踪 Values 文件时,将会带来十分大的安全隐患。

因而,咱们通常不会将这些蕴含有敏感信息的值保留在 Values 文件中,而是在部署的过程中,通过 HELM 命令的 --set 参数,以命令行的模式为这些变量设定值。

但应用这种形式同样也有它本身的局限性:首先,如果要设定的敏感字段过多,则在命令行中须要指定的参数就越多,这将使得命令行过于简短且容易出错,同时部署人员须要记住的部署参数也变得复杂起来;其次,通过查看零碎执行过的命令历史记录,同样可能获取到在执行 HELM 命令时所有指定的敏感信息参数,这在肯定水平上同样存在安全隐患。

而本文将介绍另一种相对来说比拟完满的解决方案:利用 Helm 的 secrets 插件,将这些蕴含了敏感信息的值通过某种加密伎俩加密之后,在保留到 Values 文件中去。

HELM SECRETS 插件简介

helm-secrets 插件能够帮忙咱们将定义在 values.yaml 文件中的值进行加密之后从新存储到 Values 文件中,被加密后的 Values 文件能够被随便散发、存储到代码版本管理工具中而不必放心敏感信息被裸露。上面是一个加密后的 Values 文件示例:

#ENC[AES256_GCM,data:IHAqGPYHlUdD2+xSn5ZcYCo=,iv:1KKx8l1zl41LuNYcKw3biXm0vx+vjAeA7wdnNHYjQ6Y=,tag:MmWG4SIeXPt0o0HOHGtJeQ==,type:comment]
registry:
    url: ENC[AES256_GCM,data:sYON9+wBDq9jcmhy8iUaITpIjApLbys=,iv:z/ITKkJp2rS/jMyvxghweA+7W0QlZ98PR+4gDGhX+WI=,tag:TLbCkMcIfW30/80FpaozoA==,type:str]
    username: ENC[AES256_GCM,data:5Ju2bxk=,iv:hxRUoi0lViW7chOQTiyZyt4nGMS5V5YZyFNf19LmvpA=,tag:lb830A5pnZ4bI0HUosyc7Q==,type:str]
    password: ENC[AES256_GCM,data:1WmPZCSlzGbSn2LqMc7DmHjQKTjsaPUdn9nMKvbl+KIJ451EPkV0s3dqF+NVZ5E+T6reYN/lY7Ok3VmGvboVAbFs1IYzn7KenbGLMGgCT+JhUFaYz16TeGGsyWDk6YcIIw/XzR6lTjilpHF+DuZuepOyiAnCO0Q5k4aux2lICQh6P8mOezt8flP9/blnFGVZhaaE5r5vT6hsaQbsy7Rnk2lP926xT8NWcaXR85AleRvevQ/zwFIFjjk=,iv:ivA6U20LCHOoR9WGSmuvlJdhnYx/ZC8Pw9czMjNrrlI=,tag:wX3SiiBv8OjSZkpbCznDZw==,type:str]

jenkins:
    master:
        JCasC:
            configScripts:
                credentials-config: ENC[AES256_GCM,data:3dN7KBW...Ov/rsUA=,tag:qlfV/0x0vr45JxMYM1UdMQ==,type:str]
sops:
    kms: []
    gcp_kms: []
    lastmodified: '2019-07-10T06:21:36Z'
    mac: ENC[AES256_GCM,data:sKsL25V5yci+oD1PpfA5fU6zE7YCc6Sxg7myE4eqoDcA+guG8gUg4Hcj5yAB4APBq3+KtPIXoF0hNHVYZOOYqZXQrMpO0jASjWHmLAFTUb6FE6xOtb4mP3FBk8W6Km7TfNz3Te8WW4nsb/+c0WmFSQnIolaeXgbbZhZ23x+V9g=1,iv:Oha7rwD2y3xCc+UnI+xXwrnFByMhNJkF84TiYq4/LsWI=,tag:W3e9ox2G9QL5jQEV0VwGA==,type:str]
    pgp:
    -   created_at: '2019-07-10T06:21:34Z'
        enc: |
            -----BEGIN PGP MESSAGE-----

            hQEMA9Q2nDmrg55qAQf/aXiC7EXZlP5OZDrH3clCb0I9uqP8eNhVgAzqyfSaajGB
            ...
            =h7fE
            -----END PGP MESSAGE-----
        fp: AD331C18082B4669992805DDCB8EA0C7BC44A464
    unencrypted_suffix: _unencrypted
    version: 3.0.3

能够看到,加密操作仅仅是针对 YAML 文件中所有 Key 对应的值进行的,而保留了 Key 本真。绝对于那种针对整个 YAML 文件进行整体加密的形式来说,通过这种加密形式加密后的文件,依然保留了很强的可读性,这使得咱们对加密后的 YAML 文件进行保护变的可能。

而当咱们部署应用程序时,间接将加密后的 Values 文件传递给 HELM 命令,helm-secrets 插件则会主动负责为咱们对加密的值进行解密操作,整个过程无需任何人为干涉。

装置 helm-secrets 插件

在应用 helm-secrets 插件之前,首先确保该插件被装置到了本地 HELM 中,装置 HELM 插件非常简单,应用上面命令间接进行装置即可:

$ helm plugin install https://github.com/futuresimple/helm-secrets

装置实现后,可通过 HELM 的 list 命令查看插件是否装置胜利:

$ helm plugin list
NAME       VERSION    DESCRIPTION
secrets    2.0.2      This plugin provides secrets values encryption for Helm charts secure storing

SOPS 命令简介

事实上,helm-secrets 插件自身并没有任何加密与解密的能力,也没有提供任何只针对于 YAML 文件的 Key 值进行加密和解密的工作形式,而它所有的工作,都是通过调用 SOPS 命令来帮忙它实现的。

SOPS 是由 Mozilla 开发的一款开源的文本编辑工具,它反对对 YAML, JSON, ENV, INI 和 BINARY 文本格式的文件进行编辑,并利用 AWS KMS, GCP KMS, Azure Key Vault 或 PGP 等加密形式对编辑的文件进行加密和解密。

咱们会在前面的大节中对 SOPS 做进一步的介绍。此时,你只需晓得 SOPS 命令是确保 helm-secrets 插件能够失常工作的必不可少的依赖,因而,咱们必须要确保零碎中正确装置了 SOPS 命令。

侥幸的是,helm-secrets 插件会自动检测并装置 sops 命令到咱们的零碎中,因而在插件装置实现后,你还应该能够运行 sops 相干命令,如获取 sops 的版本信息:

$ sops -v

当然,你也能够通过手动形式抉择自行装置 sops 工具,如应用 brew install sops 命令为 Mac 零碎装置 SOPS,或间接下载 SOPS 的可执行文件,更多信息请查看 SOPS 文档。

如果以上命令全副执行胜利,那么祝贺你,你曾经胜利装置了 helm-secrets 插件及其相干依赖。但在真正介绍如何应用该插件之前,咱们还须要理解一些加密解密相干的基础知识和命令。

PGP 简介

正如后面所讲,helm-secrets 插件是通过调用 SOPS 命令来对咱们的 Values 文件进行加密和解密的,而 SOPS 自身又反对多种加密形式,如 AWS 云的 KMS,Google 云的 MKS,微软 Azure 云的 Key Vault,以及 PGP 等加密形式。本文将着重介绍如何利用 PGP 对咱们的 Values 文件进行加密和解密。

PGP 与 GPG

在理解 PGP 加密之前,咱们首先要辨别好两个名词概念:PGP 与 GPG。

Pretty Good Privacy,也就是咱们平时所说的 PGP,实际上通常指的是 OpenPGP。OpenPGP 只是一系列协定或规范,而并非某个特定的工具或命令,它规定了如何应用特定的形式和算法对文件或内容进行加密和解密,任何实现了 OpenPGP 协定的工具都领有加密和解密的能力。而本文接下来所要应用的 gpg 命令,正是这样一个实现了 OpenPGP 协定的工具,或者说命令,利用 gpg 命令,咱们能够实现 PGP 加密形式。为了防止混同,后文将一律应用 GPG 代替。

装置 GPG

GPG,全名 GNU Privacy Guard,是隶属于 GNU 我的项目下的一款开源收费的加密工具。目前绝大部分 Linux 发行版本都默认装置了 GPG,间接运行上面命令查看你以后所在零碎中是否曾经正确装置了 GPG:

$ gpg --version

你也能够尝试应用上面命令手动装置 GPG 到你的零碎中:

# Ubuntu,Debian 用户
$ sudo apt install gnupg

# CentOS,Fedora,RHEL 用户
$ sudo yum install gnupg

# MacOS 用户
$ brew install gnupg

生成 GPG 密钥对

如果你应用过 SSH,那么你肯定相熟公钥和私钥的概念,GPG 同样也应用了公钥和私钥的概念实现了非对称加密算法。简略来说:公钥用于加密,领有公钥的人能够且仅仅能够进行加密操作,它能够分发给任何组织或集体;而私钥则用于解密,且仅能用于解密那些由该私钥与之配对的公钥加密的信息,任何领有私钥的人都能够进行解密操作,因而,确保私钥不被透露对安全性起着至关重要的作用。

在应用 gpg 命令进行加密解密之前,首先须要生成 GPG 公钥和私钥。你能够应用命令 gpg --gen-key 来交互式地生成密钥对,之所以说交互式,是因为在生成密钥对时会要求用户交互式的输出一些相干信息,如如用户名、邮箱等等。你也能够应用上面命令间接生成出密钥对,留神,在执行命令之前,请留神批改下方 name、email 等字段信息为你本人相应的信息:

$ gpg --batch --generate-key <<EOF
%echo Generating a basic OpenPGP key for HELM Secret
Key-Type: RSA
Key-Length: 4096
Subkey-Type: RSA
Subkey-Length: 4096
Name-Real: HELM Secret
Name-Comment: Used for HELM Secret Plugin
Name-Email: helm-secret@email.com
Expire-Date: 0
%no-ask-passphrase
%no-protection
%commit
%echo done
EOF

该命令将会为咱们生成一对长度为 4096 且永不过期的 RSA 密钥对,gpg 命令反对应用更多的参数来管制生成密钥对,如为生成的密钥对设定应用明码等等,更多对于 GPG 命令的应用参数,请参考官网文档。

当生成 GPG 密钥对当前,咱们就可通过 gpg 的 --list-keys--list-secret-keys 命令别离列出以后零碎中的公钥和私钥信息了:

$ gpg --list-key

pub   rsa4096 2020-04-24 [SCEA]
      13D525EEF0A5FA38F4E78F7900E0160999E3C663
uid           [ultimate] HELM Secret (Used for HELM Secret Plugin) <helm-secret@email.com>
sub   rsa4096 2020-04-24 [SEA]

下面命令列出了以后零碎中的公钥信息,其中 13D525EEF0A5FA38F4E78F7900E0160999E3C663 或者后十六位 00E0160999E3C663 为公钥的 ID。

咱们也能够通过传递密钥的用户名、邮箱或 ID 来查看某个特定的密钥信息:

$ gpg --list-key "HELM Secret"
# 或
$ gpg --list-key "helm-secret@email.com"
# 或
$ gpg --list-key 00E0160999E3C663

在生成了密钥对之后,就能够利用它们来为咱们的文件进行加密和解密操作了。

应用 GPG 加密和解密文件

为了更好地了解 help-secrets(或 SOPS 命令)的劣势,咱们首先尝试间接应用 gpg 命令来加密咱们的文件:

首先创立一个名为 secrets.values.yaml 的文件,并写入以下内容:

App:
 username: login-user
 password: login-pwd

应用 gpg 命令对该文件进行加密:

$ gpg -e -r 00E0160999E3C663 secrets.values.yaml
  • -e 参数指定本次为加密操作
  • -r 参数指定了加密时所要应用的公钥信息,这里间接通过公钥 ID 来指定,咱们也能够应用密钥的用户名和邮箱等信息,如 HELM Secrethelm-secret@email.com

当加密实现后,GPG 命令会在 secrets.values.yaml 文件所在的目录下创立一个与它同名,且以 .gpg 结尾的新文件 secrets.values.yaml.gpg

该文件蕴含了加密后的内容,如果你尝试查看该文件内容,会发现整个文件内容将会以乱码的模式展示进去,而这正式 GPG 的工作形式。

当然,咱们也能够应用 gpg 命令对某个加密过的文件进行解密操作:

$ gpg -d secrets.values.yaml.gpg
gpg: encrypted with 4096-bit RSA key, ID C79B2F32F9EE1A8E, created 2020-04-24
      "HELM Secret (Used for HELM Secret Plugin) <helm-secret@email.com>"
App:
  username: login-user
  password: login-pwd

-d参数用指定 GPG 命令执行的是解密操作。与加密操作不同,咱们并没有指定解密时要应用的私钥 ID,这是因为 GPG 在加密的同时,将解密时所需的私钥信息一并写入到了加密后的文件中去。当然,你依然能够应用 -r C8EABE3FAE86D256 参数明确指定解密时应用的私钥 ID。你可能曾经留神到了,其实私钥 ID 与公钥 ID 完全相同。

当解密操作胜利后,GPG 命令会将解密后的内容间接打印到屏幕上。

至此,咱们胜利地应用了 GPG 命令对文件进行了加密和解密操作,但不难看出,GPG 的加密操作是针对整个文件进行的,而加密后的文件内容也将变得齐全无奈保护。

接下来,就让咱们简略看一下,如何应用 SOPS 命令对这种 Key-Value 类型的文件进行加密和解密,并同时保障加密后的文件的可读性和可维护性的。

SOPS 的简略应用

为了更好地了解 helm-secrets 插件,先让咱们简略看一下如何通过 SOPS 命令应用咱们刚刚生成的 GPG 密钥对来对 YAML 文件进行加密和解密操作:

仍然应用咱们后面创立好的 secrets.values.yaml 文件,并确保写入了以下内容:

App:
  username: login-user
  password: login-pwd

应用 sops 命令对 secrets.values.yaml 文件进行加密:

$ sops --encrypt --in-place --pgp 00E0160999E3C663 secrets.values.yaml
  • --encrypt, -e 参数通知 sops 进行加密操作;
  • --in-place, -i 参数指定将加密后的内容间接替换掉原文件内容,若不指定该参数,则加密后的内容将会被输入到屏幕上;
  • --pgp, -p 参数指定咱们加密时所要应用的 PGP 公钥 ID。

查看加密后的 secrets.values.yaml 文件内容:

$ cat secrets.values.yaml

App:
    username: ENC[AES256_GCM,data:VwLJ94VxsEBMZg==,iv:Qeb6aNT1oryPplmtUx1ufIeiqwJ9APllLnorqvkdjRU=,tag:CuWtAlLEZeOuQFoW34FiEQ==,type:str]
    password: ENC[AES256_GCM,data:jo8lGGOFZuDY,iv:5Wwt/T0SskFxgWXNRjpoIPq+PIuTGILGIeN/dYOJ/Fg=,tag:ncC3t67xArsXvwwEjAGyLg==,type:str]
sops:
    kms: []
    gcp_kms: []
    azure_kv: []
    lastmodified: '2020-04-24T03:48:37Z'
    mac: ENC[AES256_GCM,data:uFdXa2qWDSYqaeVsOLZiQos5K611uZYW91ZhLT00MJRb32TxE190RlJjhvl8+/GUOClZcIaU8DejebDP1TVqVFl6wpFqjVM3TLwW0JDm+b+zpCzMje9e17dNjLp7W2awBTPmrF3AXUopLi8oHOuopW89q2gKgFIUW215zjmQET0=,iv:A85xzE6gEXpcwUE6rIvHwHNhqmaCmFOHoYX3Y4qjaGI=,tag:VSB9b9vKLRJg4/klwliJbQ==,type:str]
    pgp:
    -   created_at: '2020-04-24T03:48:35Z'
        enc: |
            -----BEGIN PGP MESSAGE-----

            hQIMA8ebLzL57hqOAQ//fOzjkY5tW1/fGd/HWrxsgC02YxAjmHggI2ek5VacdhYP
            A9RUYhpipJpBt1LnwHq/B1rV1E4dkOu1lpyAmI9P0qIc+6o0+6jEhqEyjsDQSGn5
            kh31oBNYfLq8XpHQg33jOIHpv6/BU7tqzsVMum3HjvnsSrhc3gRtBq5LZoLP/smA
            3y36tRLHIGFGqOEwy3CdSiPmsyCKQBEYRK0+7mhXX+ulEMudYXKgXk4qCL1UAB0y
            X03K0UATNYp8fRkHqzcpf5nLDNzpCGI0BNbxBQYZdbcP3KFNyKGDFtDaNCcJq9jv
            d6yMnioNWYBCtDlrZXlQGzipheWKwZ7JnNa1nmYpCJ3uh6I3mbtkHjljD88QUm6Y
            czGAsTDYESJPl5y2wdKdMxHOyE++Ii5LvNr2UD3D+ePYvAIpK1TWjfokCe18ZvvD
            v4kHbqbJfffpLCmy0CRVFu/yLnGdZGqniPY/UPPRk28cnKF+fxpX7EmLvzCUgadC
            4emIrR6nBUgGvU+fInZrNOccRhYU2S4So45CW2EXW5E4uNj8ayfUgtaUeRwW8pRE
            ZMGe1yna7a8UC0syiubC1rr8KHKs8nITfRrelV/BtEkfFDI9sm77AMcaWaAaaBz8
            C1L3A1iPhnclDnt3USqOTioLnZs9CjysyNSeiTvehsTC1E3GqgmVbUGob+0Im2fS
            XgHaA9fXLtulXkRQGFYpaNEt6r0mkgdq0DXCCfba6EflHg9BvPfrK0dtXrchlCY/
            K154U0LkPNHtLBXB0rNwz0Z9aA1CwBdRZ6r8V67SJS1nbsiIvyHfc4dq8n3qhVM=
            =HOrp
            -----END PGP MESSAGE-----
        fp: 00E0160999E3C663
    unencrypted_suffix: _unencrypted
    version: 3.5.0

不难看出,SOPS 仅仅是对 YAML 文件中的值进行了加密,而保留了所有 Key 信息,这使得即便是加密后的文件依然保留了很强的可读性。

此外,SOPS 还在文件中追加了一个新的 Key 值 sops,用于保留加密该文件时所应用的一些加密信息。

当然,咱们还能够通过 sops 命令对加密后的文件进行解密操作:

$ sops --decrypt secrets.values.yaml

App:
    username: login-user
    password: login-pwd

--decrypt, -d 参数指定咱们要对文件进行解密操作。当然,你也能够通过 -p 参数将解密时的私钥 ID 传递给 SOPS 命令,但这通常是不必要但,因为与 GPG 一样,SOPS 在加密文件时会主动解密时须要的私钥 ID 记录在内。

通过下面的操作,咱们胜利地应用 SOPS 命令对 YAML 文件进行了加密和解密操作,而这也正是 helm-secrets 插件背地的工作流程。在理解了 SOPS 工作模式之后,接下来,让咱们开始正式步入 helm-secrets 插件的学习中去。

开始应用 helm-secrets 插件

在把握了 GPG 和 SOPS 的一些基本原理和操作后,学习应用 helm-secrets 插件就将变得特地简略起来。

helm-secrets 插件会为 HELM 命令创立一个新的子命令:secrets,所有对于该插件的子命令,都是通过 helm secrets 格局所调用的。首先让咱们通过 -h 参数打印出 helm-secrets 插件的帮忙文档信息:

$ helm secrets -h

GnuPG secrets encryption in Helm Charts

This plugin provides ability to encrypt/decrypt secrets files
to store in less secure places, before they are installed using
Helm.

To decrypt/encrypt/edit you need to initialize/first encrypt secrets with
sops - https://github.com/mozilla/sops

Available Commands:
  enc           Encrypt secrets file
  dec           Decrypt secrets file
  view          Print secrets decrypted
  edit          Edit secrets file and encrypt afterwards
  clean         Remove all decrypted files in specified directory (recursively)
  install       wrapper that decrypts secrets[.*].yaml files before running helm install
  template      wrapper that decrypts secrets[.*].yaml files before running helm template
  upgrade       wrapper that decrypts secrets[.*].yaml files before running helm upgrade
  lint          wrapper that decrypts secrets[.*].yaml files before running helm lint
  diff          wrapper that decrypts secrets[.*].yaml files before running helm diff
                  (diff is a helm plugin)

帮忙文档信息列出了 helm-secrets 插件反对的所有子命令,而这些子命令又能够被划分为两类:

  • 一类是由该插件提供的子命令,如 encdecviewedit 以及 clean 等,这些子命令由该插件所创立,而在 HEML 中并不存在;
  • 另一类则是在 HELM 中曾经存在的子命令,如 encdecviewedit 以及 clean 等。对于这些本就存在于 HELM 中的子命令来说,helm-secrets 插件仅仅是对这些子命令做了一层封装操作,而背地真正调用的依然是 HELM 本身的这些子命令,因而通过 helm-secrets 插件调用这些子命令时的用法与间接通过 HELM 调用的用法完全一致。

提醒:你还能够为某个特定的子命令应用 -h 参数,来获取该子命令的帮忙文档信息,如 helm secrets dec -h

上面让咱们通过部署一个理论的例子,来演示 helm-secrets 插件是如何工作的。

PostgreSQL

PostgreSQL 是由伯克利大学开发的一款有着 30 多年历史的开源关系型数据库,现在仍被大量的公司和企业所应用。HELM 官网 Chart 仓库也提供了稳定版的 PostgreSQL Chart,来帮忙咱们在 Kubernetes 平台上疾速部署 PostgreSQL 集群。接下来,就让咱们尝试应用 helm-secret 插件部署一个 PostgreSQL 数据库集群到咱们的 Kubernetes 平台上,来看看它是如何帮忙咱们爱护咱们的敏感信息不被透露的。

默认状况下,PostgreSQL Chart 会为部署的 PostgreSQL 实例创立一个名为 postgres 的管理员账号,并生成一个蕴含 10 位字符的随机字符串作为它的明码。咱们能够通过为 Chart 设定 postgresqlUsernamepostgresqlPassword 的值,来手动指定管理员的用户名和明码信息。

首先创立一个蕴含如下内容的 secrets.yaml 文件:

postgresqlDatabase: my-database
postgresqlUsername: admin
postgresqlPassword: admin

该文件指定了为部署的 PostgreSQL 实例创立一个名为 admin 的管理员账号,同时设定它的明码为 admin。

尝试间接应用 HELM 命令通过该 Values 文件做一次测试部署:

$ helm install postgresql stable/postgresql -f secrets.yaml --dry-run --debug

下面的命令中因为咱们应用了 --dry-run 参数,因而它只会将所有将要部署到 Kubernetes 平台上到资源全副以 YAML 的格局输入到屏幕上,而不会做真正的部署。

如果你认真查看输入的 YAML 信息,会发现该 Chart 会创立一个蕴含了一个名为 postgresql-password Key 的 Kubernetes Secret 资源,其值为“YWRtaW4=”,应用命令 echo "YWRtaW4=" | base64 -d - 将该值进行 base64 转译之后输入到屏幕上,咱们会失去“admin”,这阐明咱们在 secrets.yaml 文件中的配置曾经失效。

加密 secrets.yaml 文件

正如你所看到的那样,PostgreSQL 的管理员用户名和明码都以明文的形式存储在了 secrets.yaml 文件中。接下来,就让咱们应用 helm-secrets 插件的 enc 子命令对该文件进行加密:

$ helm secrets enc secrets.yaml

如果你间接执行下面命令,有可能会和我一样失去上面的错误信息:

Encrypting secrets.yaml
config file not found and no keys provided through command line options
Error: plugin "secrets" exited with error

该错误信息是由 SOPS 命令报错的,它提醒咱们说,当它尝试加密文件时,即没有在配置文件中找到加密时要应用的公钥信息,也没有在命令行中指定公钥信息。

换言之,就是 SOPS 不晓得应用哪个 GPG 公钥对文件进行加密操作。通过后面的学习咱们晓得,可通过 --pgp, -p 参数将密钥对信息传递给 SOPS 命令,但因为这里是通过 helm-secrets 插件调用的 SOPS 命令,咱们无奈像应用 SOPS 命令自身那样通过参数的形式传递信息。

其实 SOPS 命令还提供另外两种设定 GPG 密钥对信息的形式:通过设定环境变量和配置文件的形式来指定 GPG 密钥对。

设定环境变量:

如果咱们没有在命令行通过 --pgp, -p 参数为 SOPS 指定密钥信息,那么它则会尝试从 SOPS_PGP_FP 零碎环境变量中获取该信息,因而咱们能够将密钥对 ID 指定给该环境变量:

$ export SOPS_PGP_FP=00E0160999E3C663

SOPS 配置文件:

SOPS 还反对另一种更加灵便的形式来指定密钥信息 —— 配置文件。每当执行 SOPS 命令时,它都会在当前目录下查找名为 .sops.yaml 的文件作为它的配置文件,上面是一个最根本的 SOPS 配置文件:

creation_rules:
    - pgp: "13D525EEF0A5FA38F4E78F7900E0160999E3C663"

事实上,SOPS 的配置文件能做到的远远不止这些,咱们能够在配置文件中设定多条规定,并为每条规定设定不同的密钥信息,以达到不同的文件应用不同的密钥进行加密和解密,更多对于 SOPS 配置信息,请参考 SOPS 文档。

当为 SOPS 配置好密钥信息后,再次执行 helm secrets enc secrets.yaml 命令从新为 secrets 文件加密。加密操作会讲加密后的内容将间接笼罩掉原 secrets.yaml 文件中的内容,查看加密后的 secrets.yaml 文件:

$ cat secrets.yaml

postgresqlDatabase: ENC[AES256_GCM,data:aZNFdHVIgJkWDiI=,iv:zsban/onWOllCou/lpgIUzZoIGlZAjTHcVmG+Xu+asI=,tag:lCbMEVCsR7Nhc+jBZTc1Ng==,type:str]
postgresqlUsername: ENC[AES256_GCM,data:/9ciQtc=,iv:+csoC+vx7wfT8WHrzECktG1UU/sVq+Q44zdJZHMPDaU=,tag:DHiCF1x7hyHnYi7gMFm3Lg==,type:str]
postgresqlPassword: ENC[AES256_GCM,data:9xAlAbg=,iv:EH+DmDZU9g/u6eCMkaNBDhxpPkDpX7HQrhcAFVPVqOw=,tag:snEhGpmkRAwjuVrxYHCOiA==,type:str]
sops:
    kms: []
    gcp_kms: []
    azure_kv: []
    lastmodified: '2020-04-24T04:56:24Z'
    mac: ENC[AES256_GCM,data:KQ5P2C55mdaUt1EFqV9411rXY7pi/dQlRQ/FcW6BqQe45u/ZqhCNR1VD8H2tZ4BRl1mQ4xOGzOYdzddKRc/D0vNHVyoEI4IRd2Jd+QnICINDwQ/Xq9kXysOSnV308DSV+EAabxreIDKdvV7RF3b5GGoEifXS8YDVhQmQjfGyhwU=,iv:sR2TI9W+1YAzfY5k82tnkrN4Q+vH3kxITGi9kzLOMq4=,tag:auUx5q6imy2nVfJLsBoGrg==,type:str]
    pgp:
    -   created_at: '2020-04-24T04:56:22Z'
        enc: |
            -----BEGIN PGP MESSAGE-----

            hQIMA8ebLzL57hqOAQ/+Oq3bVKIx8T9EqI1EyvBeuW2lN95MDAjZD/+77ntTixW/
            zNintG5dEPT9Uqi1mlwTCqZF9D1ptuQMgLgvddV/PPLG7afO60yy1kQW2+jGWons
            N0HuinVvESs7GCj+xMBd0cyKZ0iYqbafg4Mub60T0qX4/w9IuDV1o/vswceajmaC
            YkKF/ATMnLEV0UVVeXwzyVWFGrmworPWStyx9WgB3Vj0VEYGQPub6JzSRUyGdHVr
            2JljSKlTzAzlAUbcEvKCxjWWBypkvNTMua9AhMtYtagbRlcJuSFdOIAgbIVHW6Qd
            C06b/HL5+B8umeweN36g5BSjUiD8HmtpFEKBT92WKuYfRFijkCSME3VhVGvHm4Zo
            fPPLQRswf5dRu8IXBFW52/W36/ZgzzA1kqf1cGCTETMMQghxeRSuQU9caZ4L0UFm
            ZbXdB+w92XZjiNVR5EpA1hDLbBQVKqUjZ92dpmNql5bzKoBObT+p/7hb8ixNLc66
            EBgPbefbAdQBkwuelSdNIi2vfkSFVxMLDvsL5Zn8YLrEbjaresQ0rvugxIUj4190
            moZ/I08HmsfyC02xGReK0ZCmbWR/+NcSJJOqofNAFrK0ritcT8hUPN86VuhVS6xp
            NaT1FTLBCae8vqsn1FIK09f+u64hxfQiOBmtMQ7JrTG2xDo5BiHn+sydAdD6/I3S
            XgGLdaDg1ZPsT4peB56Qy1G8H2DlwGSmM+Drazfgvus+zyW8FaVNfIUbrydu1u2X
            79U4BXQhjhDDIXwf+ipttksfEEhpMN1JxzrLO7l9pYYe13/VRR1NmkI7p3eN+GM=
            =n0UG
            -----END PGP MESSAGE-----
        fp: 00E0160999E3C663
    unencrypted_suffix: _unencrypted
    version: 3.5.0

不难发现,加密后的文件内容与咱们之前应用 sops 命令加密的文件内容在格局上完全一致,这也正阐明了 SOPS 是 helm-secret 插件背地真正的“幕后使者”。

加密后的 secrets.yaml 文件将被用于部署咱们的 Chart,且该文件也能够被自在散发、存储到 Git 中去,因为咱们只有确保 PGP 私钥不被透露,就无需放心该文件会被别人解密,从而导致敏感信息被透露的问题。

同样,helm-secrets 插件也提供了用于解密的 dec 子命令:

$ helm secrets dec secrets.yaml

且与 SOPS 一样,解密后的内容将被存储到新创建的 secrets.yaml.dec 文件中去。

你还能够应用 helm-secrets 插件提供的 view 子命令间接查看解密后的文件内容:

$ helm secrets view secrets.yaml

postgresqlDatabase: my-database
postgresqlUsername: admin
postgresqlPassword: admin

当生成好加密后的 secrets.yaml 文件后,就能够通过 helm-secrets 插件应用该文件进行部署工作了。

部署 PostgreSQL

helm-secrets 插件提供的 install 子命令用于部署 HELM Chart,而正如咱们后面所讲那样,它仅仅是对 helm install 命令进行了一层封装操作,因而用法与 helm install 命令完全一致:

$ helm secrets install postgresql stable/postgresql -f secrets.yaml

当执行以上命令时,helm-secrets 插件首先会对 secrets.yaml 文件中所有 Key 值进行解密操作,再将解密后的 YAML 文件传递给 helm install 命令进行部署。

你能够通过执行命令 kubectl get secret --namespace default postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode 来查看刚刚部署的 PostgreSQL 实例的管理员明码信息,来验证明码是否咱们之前设定的 admin。

Values 文件名

不知你是否曾经留神到,在部署 PostgreSQL Chart 时,咱们将所有自定义变量值全副保留到了一个名为 secrets.yaml 的文件中,而在通常状况下,咱们都习惯于将这些自定义变量值保留到名为 values.yaml 的文件中去。

事实上,这是无意而为之的,因为 helm-secrets 插件仅仅会对 secrets.yaml 文件,以及任何以 secrets.为前缀名的 YAML 进行解密,例如:

$ helm secrets install XXXX -f values.yaml -f secrets.yaml -f secrets.env.yaml

当应用下面命令部署时,helm-secrets 插件仅仅会对 secrets.yamlsecrets.env.yaml 文件中的所有 Key 值进行解密操作,而保留 values.yaml 中的 Key 值不变。

另外须要切记的一点是,尽管 .yaml.yml 都可作为 YAML 类型文件的后缀来应用,但 helm-secret 只反对 .yaml 后缀,应用 .yml 作为后缀的文件将无奈被解密。

在其它节点执行部署操作

到目前为止,从创立 PGP 密钥对,到对 secrets.yaml 文件的加密,在到部署 PostgreSQL 等等所有这一系列操作全副都在同一台机器上实现。但当团队内有其它成员须要与你一起开发和部署 Helm Chart,或者你心愿能够在其它机器上做开发部署时,则你还须要理解如何导入与导出 PGP 密钥对。

公钥的导入与导出

通过后面对 PGP 的解说咱们理解到,公钥用于加密,私钥用于解密。因而,你若心愿其他人或在其它工作机器上也有可能加密 Values 文件的能力,那么,你只需将你的 PGP 公钥导入到他的工作电脑上即可。

导入 PGP 公钥有两种形式:一种是手动导出导入公钥;另一种是上传你的公钥到公钥服务器中,其他人则能够间接从公钥服务器中导入你的公钥。上面就让咱们别离看一下如何通过这两种形式导入与导出你的公钥。

手动导入导出公钥

首先将公钥导入到文件中:

$ gpg --export --armor "helm-secret@email.com" > helm.pub

该命令将公钥导出到了名为 helm.pub 的文件中,将导出的公钥传递给别人。

通过 import 命令导入到本人机器中即可:

$ gpg --import helm.pub

通过公钥服务器导入与导出公钥

为了便于导入别人公钥,世界上存在许多公钥服务器,专门用于存储公钥信息。任何人都能够上传本人的公钥到这些服务器上,以便别人下载应用。

上传公钥非常简单,仅需指定要应用的服务器,以及要上传的公钥 ID 即可:

$ gpg --keyserver keyserver.ubuntu.com --send-key 00E0160999E3C663

该命令会将咱们的公钥 00E0160999E3C663 上传到 keyserver.ubuntu.com 服务器上。

一旦将公钥上传到某个服务器之后,就能够从该服务器导入公钥到本地电脑中:

$ gpg --keyserver keyserver.ubuntu.com --recv 00E0160999E3C663

gpg --keyserver keyserver.ubuntu.com --recv 00E0160999E3C663
gpg: key 00E0160999E3C663: public key "HELM Secret (Used for HELM Secret Plugin) <helm-secret@email.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1

无论应用哪种导入形式,在导入实现后,你都应该能够通过 gpg --list-keys 命令查看到刚刚导入都公钥信息。

提醒:导入公钥仅仅使你领有了加密的能力,因而你无奈在只导入了公钥的机器上应用 helm-secrets 进行解密或部署操作。

私钥的导入与导出

与加密流程相似,若你心愿其他人或在其它工作机器上可能解密你的 Values 文件,那么你则须要将你的私钥导入到其它的工作机器上。私钥的导入与导出只能通过手动形式实现:

$ gpg --export-secret-key -a "helm-secret@email.com" > helm

咱们首先应用 --export-secret-key 命令将私钥导入到了 helm 文件中,将该文件通过平安的形式传递给须要的人之后,应用上面命令再次导入即可:

$ gpg --import helm

gpg: key 00E0160999E3C663: "HELM Secret (Used for HELM Secret Plugin) <helm-secret@email.com>" not changed
gpg: key 00E0160999E3C663: secret key imported
gpg: Total number processed: 1
gpg:              unchanged: 1
gpg:       secret keys read: 1
gpg:   secret keys imported: 1

当私钥导入胜利后,即可通过 gpg --list-secret-keys 命令查看以后零碎中的私钥信息。

导入私钥,就意味着以后所在机器领有了解密的能力,同样也就意味着领有了部署的能力。

提醒:私钥用于解密操作,因而你能够在导入了私钥的机器上应用 helm-secrets 进行部署。然而,你若想批改 Values 文件并加密,同样须要确保你正确地导入了公钥。

再次揭示,领有私钥就等于领有了解密的能力,因而,肯定要确保私钥的平安而不被泄密。

结束语

源码中透露用户名明码等敏感信息的事件频频发送,工具只是伎俩,最重要的是时刻保持警惕的头脑。

最初的最初,你能够通过顺次执行以下命令进行清理操作:

# 删除 PostgreSQL 部署
$ helm delete postgresql

# 删除 PGP 密钥对
$ gpg --delete-secret-key 00E0160999E3C663
$ gpg --delete-key 00E0160999E3C663

# 删除所有 Values 文件
$ rm -rf secrets*.yaml*

起源:DevSecOps SIG

作者:张泽亮

申明:文章取得作者受权在 IDCF 社区公众号(devopshub)转发。优质内容共享给思否平台的技术伙伴,如原作者有其余思考请分割小编删除,致谢。

6 月每周四晚 8 点,【冬哥有话说】开心一“夏”。公众号留言“开心”可获取地址

  • 0603 无敌哥《IDCF 人才成长地图与 5P》(《端到端 DevOps 继续交付 (5P) 精品课》第 1 课)
  • 0610 冬哥《带你玩转翻新设计思维》
  • 0617 无敌哥《麻利项目管理到底是个啥》
  • 0624 冬哥《VUCA 时代的麻利领导力》
退出移动版