Kasten 调用 HashiCorp Vault 加密备份数据
1. 数据加密备份的意义
数据是企业的资产,在备份存储库上的数据在保留状态时必须提防恶意行为。数据中心的安全操作规范中对备份数据加密的规定是保护备份基础架构的关键。Kasten by Veeam 将数据保留到存储库时会将备份数据进行加密,以达成存储环境安全的目的。本期文章我们一起学习如何用 HashiCorp Vault 对备份数据进行加密保护。
本文目录
1.数据加密备份的意义
2.Kasten K10 加密的工作原理与设置
3.HashiCorp Vault 与 Transit Secrets Engine 介绍
4.利用 HashiCorp Vault 加密 Kasten k10 备份数据
5.设置 Kasten K10 与 Vault 集成
6.总结
2. Kasten K10 加密的工作原理
Kasten by Veeam 存储备份数据时,始终使用AES-256-GCM 对称加密对其进行保护,无论是导出到外部位置的快照还是存储在 Kasten K10 catalog svc
中的应用程序元数据、configmap 和 secret。
-
Master Key :首次安装 Kasten K10 时,加密服务
crypto-svc
将生成Master Key
, 这是加密和解密备份的基本密钥。即使它不直接用于加密备份,它也可用于派生加密密钥。为了保护主密钥,Kasten K10 仅以加密形式存储它。K10 将用 Passkey 对其来进行加解密,然后将它存储在 K
10 Catalog 中。 -
Encryption Key:Kasten K10 使用对称加密密钥来加密备份。每个策略都有自己的加密密钥,该密钥是使用主密钥和策略名称派生的。Kasten K10 从不存储加密密钥而是将其按需派生。
-
Passkey:在检索主密钥时,例如 K10 重新启动后或生成新的 Master Key,K10 的加密服务使用 Passkey 对存储 catelog 中的 Master key 进行加解密操作。K10 允许用户拥有多个 Passkey。这些密钥可以是下面列出的任何不同类型的组合。但是,在任何时间点,只有它们中的一个会被使用。
Passkey API 资源用于添加、编辑、列出或删除用于数据和元数据加密的 Passkey ,详情见如下说明。
Note
配置 K10 加密
https://docs.kasten.io/latest/install/configure.html#listing-passkeys
2.1 安装时设定 Passkey
如果您不指定集群密码,K10 将在安装过程中生成带有随机密码的 Passkey。随机生成的密钥可以通过更改密钥说明进行更改,,详情见如上说明。但是,如果需要在安装之前指定密码,可以通过如下方式来完成。
kubectl create secret generic k10-cluster-passphrase \
--namespace kasten-io \
--from-literal passphrase=<key>
Warning
集群密码设置或自动生成后,请勿直接修改或删除集群密码,请按照下面的密码更改工作流程进行操作。
3. HashiCorp Vault 与 Transit Secrets Engine 介绍
3.1 HashiCorp Vault 介绍
HashiCorp Vault 是企业级私密信息管理工具。在云原生的世界 里 HashiCorp 是一家非常出色的公司。HashiCorp 是一家专注于DevOps工具,我们常用的 Vagrant、Terraform、Vault、Nomad等,都来自于这家公司。
3.2 HashiCorp Vault Transit Secrets Engine
Vault Transit secrets engine 使安全团队能够在数据传输和放置期间对其进行驻守与保护。 因此,即使发生数据入侵,企业的数据也会使用 AES256-GCM或密钥进行加密。 即使攻击者能够访问原始数据,他们也只能看到加密位。
备份数据属于敏感信息,将数据加密后再存储到后端存储库是每个企业都需要的。在 DevOps 环境中,为了安全性我们总要调用加解密机制,这时如果将整个密钥的生命周期管理包括:生成、访问权限、轮替和吊销操作都交给开发者显然是不现实的。这时 HashiCorp Vault,提供的 Encryption as a Service,都可以让大家都放轻松了。
如上图,应用将数据发送到 Vault 并加密,加密数据可存储在 Vault 或者其它的 DataStore 中,而应用使用数据时只要找到Vault 就可以找到数据而不用为加解密而操心,详情请参阅如下文 档。
Note
Encryption as a Service: Transit Secrets Engine
https://learn.hashicorp.com/tutorials/vault/eaas-transit
4. 利用 HashiCorp Vault 加密 Kasten k10 备份数据
4.1 安装 Hashicorp Vault
设置生产级 Vault 集群超出了本文的范围,但出于演示目的,我将在运行 Kasten K10 的 Kubernetes 集群中设置单个 Vault 实例。
$ helm repo add hashicorp <https://helm.releases.hashicorp.com>
$ helm repo list
NAME URL
hashicorp https://helm.releases.hashicorp.com
kasten https://charts.kasten.io/
kubectl create namespace vault
helm install vault hashicorp/vault --namespace vault
4.2 初始化 Vault
kubectl -n vault exec -it vault-0 -- vault operator init
Unseal Key 1: nsuWVKkz0vaAu+Xm3Oz2uS/R/dENBMHpou+TNU5DBmiy
Unseal Key 2: 4MVV1zy0XvuxCtSTNun/JehwQ3RpBPYyrV7Czclikoyc
Unseal Key 3: QfL4sasAkZbniDDeyoTiPLtv5TFapJyuTiJt2XeJyJzD
Unseal Key 4: vXd4qP81C28t9tsehHmZ5b3/cVOPtXB6stgbTzeocmGT
Unseal Key 5: c95/AFTg655r2MfJEBVhHAqIQSUXgvofFoWBjrbrQVmL
Initial Root Token: s.y9eMPtXF3QL3EnyFMGGjJuNV
Vault initialized with 5 key shares and a key threshold of 3. Please securely
distribute the key shares printed above. When the Vault is re-sealed,
restarted, or stopped, you must supply at least 3 of these keys to unseal it
before it can start servicing requests.
Vault does not store the generated master key. Without at least 3 keys to
reconstruct the master key, Vault will remain permanently sealed!
It is possible to generate new unseal keys, provided you have a quorum of
existing unseal keys shares. See "vault operator rekey" for more information
$ kubectl -n vault exec -it vault-0 -- vault status
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed true
Total Shares 5
Threshold 3
Unseal Progress 0/3
Unseal Nonce n/a
Version 1.9.2
Storage Type consul
HA Enabled true
4.3 Unseal Vault
最后,我们可以通过提供三个解封密钥来解封 Vault:
kubectl -n vault exec -it vault-0 -- vault operator unseal <Unseal Key>
kubectl -n vault exec -it vault-0 -- vault operator unseal <Unseal Key>
kubectl -n vault exec -it vault-0 -- vault operator unseal <Unseal Key>
4.4 访问 Hashicorp Vault UI
sudo kubectl -n vault port-forward svc/vault-ui 443:8200
4.5 启用 “Transit Secrets Engine”
$ kubectl -n vault exec -it vault-0 -- vault login
Token (will be hidden):
Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.
Key Value
--- -----
token s.y9eMPtXF3QL3EnyFMGGjJuNV
token_accessor oENy9arBkQNts8zaVxvLJOiE
token_duration ∞
token_renewable false
token_policies ["root"]
identity_policies []
policies ["root"]
$ kubectl -n vault exec -it vault-0 -- vault secrets enable transit
Success! Enabled the transit secrets engine at: transit/
4.6 为 Kasten K10 设置 Key 与 Token
现在我们启用了 Secrets Engine,接下来我们创建一个密钥。这将用于保护 Kasten K10 的 Master Key
kubectl -n vault exec -it vault-0 -- vault write -f transit/keys/kasten
Success! Data written to: transit/keys/kasten
由于我们不想让 Kasten K10 完全访问 Vault,我们需要创建一个策略,只允许使用 Key 来加解密数据并查看有关密钥的信息。
为此,我们创建一个名为 kasten-policy.hcl 的策略文件:
path "transit/encrypt/kasten" {
capabilities = [ "update" ]
}
path "transit/decrypt/kasten" {
capabilities = [ "update" ]
}
path "transit/keys/kasten" {
capabilities = [ "read" ]
}
然后我们使用该文件在 Vault 中创建策略:
kubectl -n vault exec -i vault-0 -- vault policy write kasten - < kasten-policy.hcl
Success! Uploaded policy: kasten
现在我们可以为 Kasten K10 创建 Token 令牌:
kubectl -n vault exec -it vault-0 -- vault token create -policy=kasten
Key Value
--- -----
token s.DR8qNWcYKE6hO848y8LHeY6V
token_accessor awxZe1gENAiE3NA73qSJU64L
token_duration 768h
token_renewable true
token_policies ["default" "kasten"]
identity_policies []
policies ["default" "kasten"]
5.设置 Kasten K10 与 Vault 集成
为了让 Kasten K10 能够与 Vault 对接,我们需要设置集成方法。首先,我们需要将上一步中的令牌存储在 Kubernetes Secret 中:
kubectl create secret generic vault-creds \
--namespace kasten-io \
--from-literal vault_token=s.DR8qNWcYKE6hO848y8LHeY6V
secret/vault-creds created
接下来,我们需要在 Kasten helm 安装中设置以下值:
vault.address=http://vault.vault.svc.cluster.local:8200(如果您已经安装了 Vault,请使用您的 Vault 集群的 URL)
vault.secretName=vault-creds
用 helm 升级的现有参数的方法如下:
# 导出当前配置
$ helm get values k10 --output yaml --namespace=kasten-io > k10_val.yaml
# 加入升级的配置
$ helm upgrade k10 k10-5.0.7.tgz --namespace=kasten-io -f k10_val.yaml \
--set vault.address=https://vault.vault.svc.cluster.local:8200 \
--set vault.secretName=vault-creds
5.1 将加密机制切换到 Vault
在完成了上述配置后,现在 Kasten K10 可以访问 Vault,我们将创建新的 Vault Passkey。用于 Vault Transit Engine 中的 Kasten K10 密钥重新加密主密钥并存储密文。
有关更多详细信息,请参阅 Kasten K10 文档。
Reference
Kasten k10 PassKey Management
https://docs.kasten.io/latest/install/configure.html?highlight=hashicorp%20vault#passkey-management
接下来我将配置让 Kasten K10 将在需要访问时将主密钥的密文发送到 Vault,例如,当 Kasten K10 需要派生加密密钥以保护应导出的快照时。
要将默认 Passkey 切换为 Vault Passkey,我们需要通过创建以下文件 passkey-vault.yaml 来创建新的 Passkey.
kubectl create -f passkey-vault.yaml
apiVersion: vault.kio.kasten.io/v1alpha1
kind: Passkey
metadata:
name: vaultKey
spec:
vaulttransitkeyname: kasten
vaulttransitpath: /transit
usenow: true
新密钥现在应该是唯一正在使用的密钥
kubectl get passkeys.vault.kio.kasten.io -o yaml
kubectl -n kasten-io logs -f -l run=crypto-svc -c crypto-svc
6. 总结
备份数据安全非常重要, 在 Kasten K10 中利用 HashiCorp Vault 对数据进行加密,可帮助企业保护备份数据中的敏感信息。Kasten K10结合生态行成的丰富安全功能充分体现了 Veeam 在提供可靠、安全的软件方面所做的不懈努力。
7. 参考链接
HashiCorp Vault Transit Secrets Engine
https://docs.kasten.io/latest/install/configure.html?highlight=hashicorp%20vault#hashicorp-vault-transit-secrets-engine
Kasten K10 and End-to-End Security
https://www.kasten.io/kubernetes/resources/blog/kasten-k10-and-end-to-end-security
Kasten K10 V5.0 Offers Enhanced Kubernetes Security And More
https://www.storagereview.com/news/kasten-k10-v5-0-offers-enhanced-kubernetes-security-and-more
Encryption as a Service: Transit Secrets Engine
https://learn.hashicorp.com/tutorials/vault/eaas-transit