本文重点章节
- 作者观察
- Kasten 与 Kyverno
- Kyerno + Kasten 数据保护策略快速上手
- Kyerno 策略引擎介绍
- Kyvero 的安装与部署
- Kyvero 策略实践 - Kasten 数据保护的策略检查
- Kasten 数据保护策略的说明
- 关键要点总结
- 参考文献
1.作者观察
随着云原生基础架构的普及,越来越多的企业开始把工作重点放在云原生的安全策略上。从 Redhat 公司 《2022 年 Kubernetes 安全现状报告》中,我们发现,受访者最担心由于容器和 Kubernetes 环境中的错误配置
而导致的风险。应对这一挑战的最佳方法是尽可能自动化配置管理,以便用安全工具(而不是人工)提供帮助开发人员和 DevOps 团队更安全地配置容器和 Kubernetes 的护栏。
2022 State of Kubernetes security report
https://www.redhat.com/en/resources/state-kubernetes-security-report
在云原生数据方面,为了避免因错误配置,导致无法预估 RPO 和 RTO 而造成的数据丢失和业务停滞,很多企业正在考虑利用自动化数据安全管理策略,比如 Kyverno 或是 OPA, 本期我们主要来介绍如何利用 Kyverno 管理策略实现 Kasten 的数据保护的自动化。
2.Kasten 与 Kyverno
在 Kasten 5.0后 引入了大量的安全能力,其中也包含 Kyverno,这使得可客户可以检查备份策略是否满足 3-2-1-1-0 的数据管理黄金法则,保证企业达成勒索病毒防护与实现 RPO 的目标,实现数据保护的可观察性与可预测性。
3.Kyerno + Kasten 数据保护策略快速上手
3.1 Kyerno 策略引擎介绍
Kyverno 是为 Kubernetes 专门设计的策略引擎,目前 Nirmata 已经将其捐赠给 CNCF 。这个词本身来自于希腊语中“治理”的含义。使用 Kyverno,可以将Policy
即 “策略” 作为 Kubernetes 资源进行管理,它并不需要用其它的语言来进行编写。这允许管理员或 SRE 使用熟悉的工具,如 kubectl、git 和 kustomize 来管理这些策略。
在 Kubernetes 的准入机制中, Admission Controller 是非常重要的概念,除验证之外,还可以对集群资源进行更改以适配策略要求,熟悉 Kasten 的人可能都了解, Kasten Kanister Sidecar 就是以这种方式进行注入的。基于这个原理,Kyverno 策略可以 Validate
验证、Mutate
变异或适配和Generate
生成 Kubernetes 资源,除此之外,还包括镜像安全的校验等。Kyverno 使用标签选择器和通配符匹配资源,可以在在不同的namespace 中生成和同步默认设定,拦截或报告违规行为,可方便的使用 kubectl 进行测试。
3.2 Kyvero 的安装与部署
1. Kyvero 的安装
$ helm repo add kyverno https://kyverno.github.io/kyverno/
$ helm repo update
$ helm install kyverno kyverno/kyverno --namespace kyverno --create-namespace
2. 安装策略报告器 GUI:
$ helm repo add policy-reporter https://kyverno.github.io/policy-reporter
$ helm repo update
$ helm install policy-reporter policy-reporter/policy-reporter --set kyvernoPlugin.enabled=true --set ui.enabled=true --set ui.plugins.kyverno=true -n policy-reporter --create-namespace
3. 利用 NodePort 访问 Kyverno Report GUI:
$ kubectl expose service policy-reporter-ui -n policy-reporter --type=NodePort --name=policy-reporter-ui-nodeport
$ kubectl get svc -n policy-reporter |grep NodePort
policy-reporter-ui-nodeport NodePort 10.109.70.159 <none> 8080:31176/TCP 29s
$ kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
mars-k8s1 Ready control-plane,master 26h v1.21.1 172.16.124.70 <none> Ubuntu 20.04.2 LTS 5.15.0-46-generic docker://20.10.17
4. 访问 Kyverno 仪表盘
基于上面的信息,我们来访问如下链接即可
http://172.16.124.70:31176/#/
3.2 Kyvero 策略实践 - Kasten 数据保护的策略检查
Kyverno 的策略引擎是符合 Kubernetes 原生的开发标准的,所以 Kyverno 策略编写很容易,只需要了解 Kubernetes API,即通过声明性 YAML 方式,即可完成对于策略的制定,这里是 Kasten 数据保护策略实现的概要:
- 执行策略声明 - 对要部署的 Deployment 和 SatefulSet 强制实施此策略
- 应用标签管理 - 在元数据标头中查找 purpose = production 的标签。
- 数据保护策略 - 如应用匹配,则查找以值 “k10” 开头的 “数据保护”标签,支持正则表达式与通配符
- 勒索病毒防护 - 查找是否存在不可变的备份存储库。
$ vim prod-backup-enforce-policy.yaml
# Kyverno Policy for Kasten Data Protection
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: prod-backup-enforce-policy
spec:
validationFailureAction: enforce
rules:
- name: cd-prod-backup-policy
match:
resources:
kinds:
- Deployment
- StatefulSet
validate:
message: "Production Deployments and StatefulSets must have Data Protection Policies with
Immutability Enabled (use labels: dataprotection: k10-<policyname> and immutable: enabled)"
pattern:
metadata:
labels:
=(purpose): production
dataprotection: k10-?*
immutable: enabled
$ kubectl apply -f prod-backup-enforce-policy.yaml
clusterpolicy.kyverno.io/prod-backup-enforce-policy created
在策略生效后,如果开发人员尝试在没有这些标签的情况下部署Deployment 或是 StatefulSet ,系统将立即显示带有可自定义消息的反馈:
$ kubectl create ns demo-app
namespace/demo-app created
$ kubectl apply -f demo-app.yaml -n demo-app
persistentvolumeclaim/demo-pvc created
Error from server: error when creating "demo-app.yaml": admission webhook "validate.kyverno.svc-fail" denied the request:
resource Deployment/demo-app/demo-app was blocked due to the following policies
prod-backup-enforce-policy:
cd-prod-backup-policy: 'validation error: Production Deployments and StatefulSets
must have Data Protection Policies with Immutability Enabled (use labels: dataprotection:
k10-<policyname> and immutable: enabled). Rule cd-prod-backup-policy failed at
path /metadata/labels/dataprotection/'
测试:依照策略在部署的文件中加入 Label
vim demo-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-app
labels:
app: demo
purpose: production
dataprotection: k10-policy-enforce-backup
immutable: enabled
spec:
<truncated...>
$ kubectl apply -f demo-app.yaml -n demo-app
persistentvolumeclaim/demo-pvc unchanged
deployment.apps/demo-app created
结果:顺利完成部署
说明:可以看到应用已经部署到 Kubernetes Cluster,而且从 Kyverno 的仪表盘中也可以看到 Passing Policy Result per Namespace
中 已经有我们刚刚部署的 demo-app 存在了。
4. Kasten 数据保护策略的说明
当然,为了能让客户能够更方便的使用 Kyerno 策略引擎达成云原生数据保护的目标,Kasten by Veeam 还编写了很多数据保护策略,这些策略可以集成到基础架构即代码的日常 DevOps 工作中,为此类问题提供 “护栏” ,从根本上防止配置错误的应用投入生产环境的。
-
检查 3-2-1 备份策略
3-2-1 规则建议您至少有 3 个数据副本,位于 2 个不同的存储目标,1 个在异地。确保在多区域的云发生故障时,应用程序及数据可恢复。 -
检查防勒索病毒存储库的启用
K10 对象存储存储,支持对象锁定功能的 AWS S3 或 S3 兼容对象存储,可以达成不可变备份。由于保留存储的成本增加,默认情况下通常不启用不变性。此策略检查配置文件是否包含“protectionPeriod”,这是不变性的主要配置。 -
按标签检查数据保护
检查 Deployment 和 StatefulSet 具有命名 K10 策略的 “K10-dataprotection” 标签。与 “generate” ClusterPolicy 结合使用以按名称生成特定的 K10 数据保护策略。 -
检查每小时 RPO
可以让 K10 的策略资源遵守恢复点目标 (RPO) 最佳实践,此策略建议使用具有每小时粒度的 RPO 频率(如果它具有 appPriority: Mission Critical) -
生成黄金备份策略
为添加标签 “dataprotection:k10-goldpolicy” 的任何 Deployment 或 StatefulSet 生成备份策略,此策略最适合确定数据保护目标,并通过应用程序标签简单地分配备份。 -
最小备份合规策略
可以验证 K10 政策资源是否符合通用的合规性保留标准。根据 GFS 保留取消注释您要强制执行的法规/合规标准。此策略删除备份操作中的保留值并将其替换为指定的保留。
Kyerno 策略引擎在 Kasten 的应用
https://kyverno.io/policies/?policytypes=Kasten%2520K10%2520by%2520Veeam
5. 关键要点总结 - Key take Way point
Kubernetes 正在为企业提供前所未有的多云战略,现已逐渐成为企业基础架构的核心。由于数据是所有企业应用程序的基本要素,如果没有有效的数据管理策略,企业的数据安全将面临前所未有的挑战。
通过启用在 Kasten 在 Kyverno 策略引擎框架上的数据保护策略,可以为配置错误、保护不当等的问题提供“护栏“,在根本上防止错误配置的应用程序投入到生产环境,从而使企业达成行业合规要求。
关键要点 Key take Way point
Kyvero + Kasten 可以
- 解决没有数据保护的配置错误
- 将保护策略的实施与验证自动化
- 使企业自动化、可视化的达成行业合规要求
6. 参考文献
Kasten 官方文档
https://docs.kasten.io/
Kasten 实战系列文章
https://www.data2clouds.com/?p=118
Kasten 数据保护策略 on Kyverno
https://kyverno.io/policies/?policytypes=Kasten%2520K10%2520by%2520Veeam
Kyverno 官网
https://kyverno.io
Kyverno 官方文档
https://kyverno.io/docs/