快速探索 Tetragon:基于 eBPF 的安全可观察性和执行工具

2023年 11月 17日 97.1k 0

Tetragon[1] 是一种灵活的安全可观察性和运行时策略执行工具,可直接使用 eBPF 应用策略和过滤,从而减少了监控、进程跟踪以及实时执行策略的开销。

Tetragon 提供了如下功能:

  • 监控进程执行
  • 监控文件操作
  • 监控网络活动
  • 执行策略

最后一个侧重策略的执行,可以通过发送信号或覆盖系统调用的返回值对重要的安全事件做出反应;前三种侧重监控,并可以将监控数据与容器、Kubernetes 元数据进行关联。

图片图片

演示

环境

  • 操作系统:Ubuntu 20.04
  • 内核:5.15.122
  • K8s 集群:k3s v1.27.1+k3s1

创建集群

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

安装 Tetragon

使用 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 -

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论