Tetragon 是一种灵活的安全可观察性和运行时策略执行工具,可直接使用 eBPF 应用策略和过滤,从而减少了监控、进程跟踪以及实时执行策略的开销。
Tetragon 提供了如下功能:
最后一个侧重策略的执行,可以通过发送信号或覆盖系统调用的返回值对重要的安全事件做出反应;前三种侧重监控,并可以将监控数据与容器、Kubernetes 元数据进行关联。
export INSTALL_K3S_VERSION=v1.27.1+k3s1
curl -sfL https://get.k3s.io | sh -s - --disable traefik --disable local-storage --disable metrics-server --disable servicelb --write-kubeconfig-mode 644 --write-kubeconfig ~/.kube/config
示例应用使用我们在 使用 Cilium 增强 Kubernetes 网络安全 中有用过的”星球大战“的场景。
kubectl create -f https://raw.githubusercontent.com/cilium/cilium/v1.15.0-pre.1/examples/minikube/http-sw-app.yaml
使用 helm 来安装 Tetragon。
helm repo add cilium https://helm.cilium.io
helm repo update
helm install tetragon cilium/tetragon -n kube-system
查看 Tetragon 的组件。
kubectl get pod -n kube-system -l app.kubernetes.io/instance=tetragon
NAME READY STATUS RESTARTS AGE
tetragon-operator-f68fdfcf6-jltn2 1/1 Running 0 6m23s
tetragon-mh8fp 2/2 Running 0 6m23s
其中 tetragon 是 Daemonset 类型,在每个节点上都会运行其示例。在后面的演示中,我们将使用其获取事件信息。
该命令会使用 pod 中的 tetra CLI 链接 Tetragon 的 daemon server 打印和过滤事件。
-o
支持json
和compact
:前者打印详细信息,后者打印紧凑的信息--pods
打印指定 pods 的事件,这里支持正则
kubectl exec -ti -n kube-system ds/tetragon -c tetragon -- tetra getevents -o compact --pods xwing
我们在 xwing 的 pod 中尝试 curl
发送请求。
kubectl exec -ti xwing -- bash -c 'curl -I https://ebpf.io/applications/#tetragon'
在 CLI 事件监控中可以看到监控到进行的执行。
process default/xwing /usr/bin/bash -c "curl -I https://ebpf.io/applications/#tetragon"
process default/xwing /usr/bin/curl -I https://ebpf.io/applications/#tetragon
exit default/xwing /usr/bin/curl -I https://ebpf.io/applications/#tetragon 0
要获取详细的事件信息,可以使用 -o json
。在详细信息中,是记录更多进程的详细内容(pid、时间戳等)以及 Kubernetes 的元数据(所在的 pod、label、容器相关、node 等信息)。
{
"process_exec": {
"process": {
"exec_id": "bWFzdGVyOjEwOTE5NTI2MzMxNDc4OTM6ODY1Njk3",
"pid": 865697,
"uid": 0,
"cwd": "/",
"binary": "/usr/bin/bash",
"arguments": "-c \"curl -I https://ebpf.io/applications/#tetragon\"",
"flags": "execve rootcwd clone",
"start_time": "2023-11-15T21:09:01.365214693Z",
"auid": 4294967295,
"pod": {
"namespace": "default",
"name": "xwing",
"container": {
"id": "containerd://53d9871b8ef6acb30a918cd2edd036ef2482f3d2f50322296b846f9a964f23c6",
"name": "spaceship",
"image": {
"id": "docker.io/cilium/json-mock@sha256:4abfabfc1ac49834ce79b5594719e82b518107aa97e1867c42234a5126b1e1be",
"name": "docker.io/cilium/json-mock:latest"
},
"start_time": "2023-11-15T14:09:41Z",
"pid": 39
},
"pod_labels": {
"app.kubernetes.io/name": "xwing",
"class": "xwing",
"org": "alliance"
},
"workload": "xwing",
"workload_kind": "Pod"
},
"docker": "53d9871b8ef6acb30a918cd2edd036e",
"parent_exec_id": "bWFzdGVyOjEwOTE5NTI1OTA0NDY0NzM6ODY1Njg3",
"tid": 865697
},
"parent": {
"exec_id": "bWFzdGVyOjEwOTE5NTI1OTA0NDY0NzM6ODY1Njg3",
"pid": 865687,
"uid": 0,
"cwd": "/run/k3s/containerd/io.containerd.runtime.v2.task/k8s.io/9a020d636a187acf021007efe3aaf2bc2ac5af8c7bcaec8cff80834e1e456c49",
"binary": "/var/lib/rancher/k3s/data/ead6a1703a6dcb4fa71296173ee208c5b05b95a27574fe74946557324bab2582/bin/runc",
"arguments": "--root /run/containerd/runc/k8s.io --log /run/k3s/containerd/io.containerd.runtime.v2.task/k8s.io/53d9871b8ef6acb30a918cd2edd036ef2482f3d2f50322296b846f9a964f23c6/log.json --log-format json --systemd-cgroup exec --process /tmp/runc-process2446102553 --console-socket /tmp/pty4128173919/pty.sock --detach --pid-file /run/k3s/containerd/io.containerd.runtime.v2.task/k8s.io/53d9871b8ef6acb30a918cd2edd036ef2482f3d2f50322296b846f9a964f23c6/eaef092e99f54c7c3898984db0e0c36bc8859d695c753db86e672c8db576f4d8.pid 53d9871b8ef6acb30a918cd2edd036ef2482f3d2f50322296b846f9a964f23c6",
"flags": "execve clone",
"start_time": "2023-11-15T21:09:01.322512873Z",
"auid": 4294967295,
"parent_exec_id": "bWFzdGVyOjEwNjY3Nzk1NTk0MzcxNTE6NzgyNTA4",
"tid": 865687
}
},
"node_name": "master",
"time": "2023-11-15T21:09:01.365213793Z"
}
接下来在 xwing
pod 中的操作文件。在 Linux 中 /etc
目录通常包含系统级的配置文件和脚本,这些文件用于配置系统的各种方面,因此对该目录的操作应当谨慎。
kubectl exec -ti xwing -- bash -c 'echo foo >> /etc/bar'
此时这里看到还只是进程相关的事件。
process default/xwing /usr/bin/bash -c "cat /etc/bar"
process default/xwing /usr/bin/cat /etc/bar
exit default/xwing /usr/bin/cat /etc/bar 0
应用下面的策略:
kubectl apply -f - <
然后就可以看到文件操作的相关事件了。
process default/xwing /usr/bin/bash -c "echo foo >> /etc/bar"
write default/xwing /usr/bin/bash /etc/bar
write default/xwing /usr/bin/bash /etc/bar
exit default/xwing /usr/bin/bash -c "echo foo >> /etc/bar" 0
应用下面的策略,监控 TCP 连接的建立,但是排除集群内的网络连接,将容器的 IP CIDR 排除添加到 NotDAddr
的列表中。
10.42.0.0/16
和10.43.0.0/16
分别是 K3s 的 pod CIDR 和 service CIDR。
kubectl apply -f - <
在监控的事件就可以看到 TCP 连接的建立了。
process default/xwing /usr/bin/bash -c "curl -I https://ebpf.io/applications/#tetragon"
process default/xwing /usr/bin/curl -I https://ebpf.io/applications/#tetragon
connect default/xwing /usr/bin/curl tcp 10.42.0.7:38676 -> 104.198.14.52:443
exit default/xwing /usr/bin/curl -I https://ebpf.io/applications/#tetragon 0
假如需要对 /etc
目录进行写保护,需要上面创建的 file-monitoring-filtered
策略,添加 matchActions
。
kubectl apply -f - <
现在尝试修改 /etc
下的文件时,进程会直接退出。
kubectl exec -ti xwing -- bash -c 'echo foo >> /etc/bar'
command terminated with exit code 137
在事件监控中可以看到进程执行收到了 SIGKILL
指令。
process default/xwing /usr/bin/bash -c "echo foo >> /etc/bar"
write default/xwing /usr/bin/bash /etc/bar
write default/xwing /usr/bin/bash /etc/bar
exit default/xwing /usr/bin/bash -c "echo foo >> /etc/bar" SIGKILL
同样,针对网络活动的监控也可以如法炮制,有兴趣的可以试试。
这个架构图跟之前在 探索 Cilium 的工作机制 所做的图类似,实际的工作机制也类似。
通过命令可以看到 tetragon pod 中实际上有两个容器:export-stdout
和 tetragon
。
kubectl get pod tetragon-mh8fp -o=jsonpath='{.spec.containers[*].name}' -n kube-system
export-stdout tetragon
tetragon
容器中运行了 Tetragon 的 Daemon 进程,在这个容器中还可以执行 tetra
命令(tetragon CLI)。
Daemon 进程:
127.0.0.1:54321
。CLI 的执行实际上都是通过该 API 与 Daemon 进行交互。上面演示中不管是监控还是策略执行,都是通过 跟踪策略(Tracing Policy) 来完成。跟踪策略 TracingPolicy
是 Tetragon 的自定义资源,允许用户跟踪内核中的任意事件,并可定义对匹配采取的操作。
策略由挂钩点(hook point,支持 kprobes、tracepoint 和 uprobes)以及用于内核过滤和指定操作的选择器组成。
Tetragon 支持三种挂钩点:支持 kprobes、tracepoint 和 uprobes。kprobes
和 tracepoints
可用于连接内核空间,而 uprobes
用于连接到用户空间程序。
tcp_connect
,与内核版本强相关,也就是说不同内核版本的内核函数探针可能存在差异。sudo ls /sys/kernel/debug/tracing/events
查看内核上可用的跟踪点列表。在 Tetragon 中,TracingPolicy使用选择器来定义对事件所要执行的内核
BPF 过滤和操作,也就是策略中指定关注的事件以及事件发生时要触发的操作。选择器包含如下几种:
比如我们在前面的例子中,针对 /etc
目录的写保护就用到了参数选择器(匹配操作的目录和操作类型)和操作选择器(返回 Sigkill 信号)。
Tetragon 是一个专注于 eBPF、实时处理、安全性、可观测性和策略执行的工具,特别是在 Kubernetes 环境中。它通过利用一系列高级的挂钩点(hook points)和选择器(selectors),为基础设施安全提供了强大支持,并能够针对关键事件进行有效防护。
深入理解 Tetragon,我们可以看到它主要是一个底层工具,专注于围绕进程、文件和网络活动实施安全策略。在网络方面,Tetragon 主要处理第三层(L3)的基础信息事件,如 IP 层面的通信。但它在处理更高层次的应用协议,如第四层(L4)的传输控制协议(TCP)或第七层(L7)的应用层协议方面,能力有限。这种限制反映了 Tetragon 的核心定位:专注于底层结构的监控和安全,而非高层应用协议的分析。
总的来说,Tetragon 提供了一个针对 Kubernetes 环境优化的、底层的安全和监控工具,其强大的 eBPF 支持使其在处理基础设施安全事件时表现出色,尽管在更高层次的网络协议处理上有所局限。
关注"云原生指北"微信公众号 (转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)