在之前的文章中在 Jenkins 中使用 Trivy 进行容器扫描我们已经了解到Trivy 最基础的扫描镜像安全风险漏洞的功能,其实Trivy的功能远不止这些,今天我们着重来了解下Trivy根据自定义策略来扫描Kubernetes的配置文件.
目前Trivy支持以下类型的配置文件:
您需要记住的最重要的一点是自定义策略是Trivy用Rego. 我强烈建议您熟悉Rego语言。
Rego语言最初由Datalog开发,作为OPA或者Policy的默认语言,后期Kyverno也用了这种声明式语言
如下显示,Trivy支持特定配置文件并通过配置类型的文件扩展名检测正确的策略。
File extension | Configuration |
---|---|
.yaml, .yml and *.json | Kubernetes / Helm |
Dockerfile, Dockerfile., and .Dockerfile | Dockerfile |
Containerfile, Containerfile., and .Containerfile | Containerfile |
.yaml, .yml and *.json | CloudFormation |
.tf and .tf.json | Terraform / Terraform Plan |
我将使用一个非常简单的策略用例来解释自定义策略的结构。
让我们假设以下场景:您只想允许将来自特定容器注册表的 Pod 部署到您的集群。
package user.kubernetes.ID001
import future.keywords.in
import data.lib.kubernetes
default allowedRegistries = ["quay.io","ghcr.io","gcr.io"]
__rego_metadata__ := {
"id": "ID001",
"title": "Allowed container registry checks",
"severity": "CRITICAL",
"description": "The usage of non allowed container registries is not allowed",
}
__rego_input__ := {
"combine": false,
"selector": [{"type": "kubernetes"}],
}
allowedRegistry(image) {
registry := allowedRegistries[_]
startswith(image, registry)
}
deny[msg] {
container := kubernetes.containers[_]
not allowedRegistry(container.image)
msg := kubernetes.format(sprintf("Container '%s' of %s '%s' comes from not approved container registry", [container.name, kubernetes.kind, kubernetes.name]))
}
package
(必需字段)
__rego_metadata__
(可选字段)
使用有用的信息帮助丰富Trivy扫描结果。所有字段都是可选的。请查看官方文档以获取有关所有可用字段及其含义的更多信息
__rego_input__
(可选字段)
允许过滤输入数据的可选字段。在我的示例中,我只想扫描Kubernetes资源并忽略任何其他配置类型。
deny
(必需字段)
` import future.keywords`是一个特殊的导入,允许在您的策略中使用未来的关键字。
` import data.lib.result`是一个特殊的导入,允许使用result库来突出显示结果。
接下来我们来看下deny
这个结构体中写的是什么?
首先,我们检查我们是否只在 type 上应用规则Pod。然后我们遍历Pod中的所有容器,Pod并检查容器的镜像是否来自开头allowedContainerRegistry
中的镜像仓库中。
trivy 扫描到Pod.yaml
中nginx
的镜像并非来自"quay.io","ghcr.io","gcr.io"
这几个仓库.
root@ubuntu:~/trivy-custom-policies/pod# trivy conf --severity HIGH,CRITICAL --policy ./policy --namespaces user ./config
2023-03-01T11:51:48.904+0800 INFO Misconfiguration scanning is enabled
2023-03-01T11:51:51.065+0800 INFO Detected config files: 1
pod.yaml (kubernetes)
Tests: 68 (SUCCESSES: 67, FAILURES: 1, EXCEPTIONS: 0)
Failures: 1 (HIGH: 0, CRITICAL: 1)
CRITICAL: Container 'nginx' of Pod 'nginx' comes from not approved container registry
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
The usage of non allowed container registries is not allowed
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
root@ubuntu:~/trivy-custom-policies/pod#