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

这篇具有很好参考价值的文章主要介绍了快速探索 Tetragon:基于 eBPF 的安全可观察性和执行工具。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

Tetragon 提供了如下功能:

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

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

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

演示

环境

  • 操作系统: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 支持 jsoncompact:前者打印详细信息,后者打印紧凑的信息
--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 - <<EOF
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
  name: "file-monitoring-filtered"
spec:
  kprobes:
  - call: "security_file_permission"
    syscall: false
    return: true
    args:
    - index: 0
      type: "file" # (struct file *) used for getting the path
    - index: 1
      type: "int" # 0x04 is MAY_READ, 0x02 is MAY_WRITE
    returnArg:
      index: 0
      type: "int"
    returnArgAction: "Post"
    selectors:
    - matchArgs:      
      - index: 0
        operator: "Prefix"
        values:
        - "/etc"
      - index: 1
        operator: "Equal"
        values:
        - "2" # MAY_WRITE
EOF

然后就可以看到文件操作的相关事件了。

🚀 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/1610.43.0.0/16 分别是 K3s 的 pod CIDR 和 service CIDR。

kubectl apply -f - <<EOF
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
  name: "monitor-network-activity-outside-cluster"
spec:
  kprobes:
  - call: "tcp_connect"
    syscall: false
    args:
    - index: 0
      type: "sock"
    selectors:
    - matchArgs:
      - index: 0
        operator: "NotDAddr"
        values:
        - 127.0.0.1
        - 10.42.0.0/16
        - 10.43.0.0/16
      matchActions:
      - action: Sigkill
EOF

在监控的事件就可以看到 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 - <<EOF
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
  name: "file-monitoring-filtered"
spec:
  kprobes:
  - call: "security_file_permission"
    syscall: false
    return: true
    args:
    - index: 0
      type: "file" # (struct file *) used for getting the path
    - index: 1
      type: "int" # 0x04 is MAY_READ, 0x02 is MAY_WRITE
    returnArg:
      index: 0
      type: "int"
    returnArgAction: "Post"
    selectors:
    - matchArgs:      
      - index: 0
        operator: "Prefix"
        values:
        - "/etc"
      - index: 1
        operator: "Equal"
        values:
        - "2" # MAY_WRITE
      matchActions:
      - action: Sigkill
EOF

现在尝试修改 /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

同样,针对网络活动的监控也可以如法炮制,有兴趣的可以试试。

分析

Tetragon 架构

这个架构图跟之前在 探索 Cilium 的工作机制 所做的图类似,实际的工作机制也类似。

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

通过命令可以看到 tetragon pod 中实际上有两个容器:export-stdouttetragon

kubectl get pod tetragon-mh8fp  -o=jsonpath='{.spec.containers[*].name}' -n kube-system
export-stdout tetragon

tetragon 容器中运行了 Tetragon 的 Daemon 进程,在这个容器中还可以执行 tetra 命令(tetragon CLI)。

Daemon 进程:

  • 加载/卸载 BPF 程序
  • 监控策略的变化,将策略写入到 eBPF Map 中。在非 K8s 环境,会监控文件目录中的策略更新。
  • 对外提供了 gRPC 的 API,监听在 127.0.0.1:54321。CLI 的执行实际上都是通过该 API 与 Daemon 进行交互。

跟踪策略

上面演示中不管是监控还是策略执行,都是通过 跟踪策略(Tracing Policy) 来完成。跟踪策略 TracingPolicy 是 Tetragon 的自定义资源,允许用户跟踪内核中的任意事件,并可定义对匹配采取的操作。

策略由挂钩点(hook point,支持 kprobes、tracepoint 和 uprobes)以及用于内核过滤和指定操作的选择器组成。

挂钩点 Hook Point

Tetragon 支持三种挂钩点:支持 kprobes、tracepoint 和 uprobes。kprobes 和 tracepoints 可用于连接内核空间,而 uprobes 用于连接到用户空间程序。

  • kprobes 内核空间探针:将 BPF 代码挂载到内核函数,比如前面监控网络活动时用的 tcp_connect,与内核版本强相关,也就是说不同内核版本的内核函数探针可能存在差异。
  • tracepoints 跟踪点:与 kprobes 相比,在不同内核版本间的差异很小,更加稳定。可以通过 sudo ls /sys/kernel/debug/tracing/events 查看内核上可用的跟踪点列表。
  • uprobes 内核空间探针:在用户空间程序的特定地址设置探针,监控和跟踪用户空间代码的执行。(目前 Tetragon 这部分的文档是缺失的)。

选择器 Selector

在 Tetragon 中,TracingPolicy使用选择器来定义对事件所要执行的内核 BPF 过滤和操作,也就是策略中指定关注的事件以及事件发生时要触发的操作。选择器包含如下几种:

  • 参数
  • 返回值
  • 进程 PID
  • 二进制文件的路径
  • Linux 命名空间
  • Linux 功能
  • 命名空间变更
  • Linux 功能变更
  • 对选择器应用操作

比如我们在前面的例子中,针对 /etc 目录的写保护就用到了参数选择器(匹配操作的目录和操作类型)和操作选择器(返回 Sigkill 信号)。

总结

Tetragon 是一个专注于 eBPF、实时处理、安全性、可观测性和策略执行的工具,特别是在 Kubernetes 环境中。它通过利用一系列高级的挂钩点(hook points)和选择器(selectors),为基础设施安全提供了强大支持,并能够针对关键事件进行有效防护。

深入理解 Tetragon,我们可以看到它主要是一个底层工具,专注于围绕进程、文件和网络活动实施安全策略。在网络方面,Tetragon 主要处理第三层(L3)的基础信息事件,如 IP 层面的通信。但它在处理更高层次的应用协议,如第四层(L4)的传输控制协议(TCP)或第七层(L7)的应用层协议方面,能力有限。这种限制反映了 Tetragon 的核心定位:专注于底层结构的监控和安全,而非高层应用协议的分析。

总的来说,Tetragon 提供了一个针对 Kubernetes 环境优化的、底层的安全和监控工具,其强大的 eBPF 支持使其在处理基础设施安全事件时表现出色,尽管在更高层次的网络协议处理上有所局限。

关注"云原生指北"公众号
(转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)文章来源地址https://www.toymoban.com/news/detail-760203.html

到了这里,关于快速探索 Tetragon:基于 eBPF 的安全可观察性和执行工具的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【eBPF-01】初见:基于 BCC 框架的第一个 eBPF 程序

    闲言少叙,本文记录了如何零基础通过 BCC 框架,入门 eBPF 程序的开发,并实现几个简易的程序。 有关 eBPF 的介绍,网络上的资料有很多,本文暂且先不深入讨论,后面会再出一篇文章详细分析其原理和功能。 我们目前只需要知道, eBPF 实际上是一种过滤器,这种过滤器 几

    2024年02月04日
    浏览(62)
  • 基于 eBPF 的 Kubernetes 可观测实践

    可观测是为了解决问题,所以在聊可观测之前,应先对问题排查的普适原则进行了解。 问题排查的原则 以排查系统问题为例,要理解系统,要先关注基础知识,理解编程语言基本的计算机科学知识,关注系统大图比如架构部署和重大流程,要关注运行细节,要对核心功能的

    2024年01月19日
    浏览(57)
  • 用AI技术提高智能安防摄像头的鲁棒性和安全性

    作者:禅与计算机程序设计艺术 随着人工智能技术的飞速发展,智能安防摄像头作为其应用场景之一,得到了越来越广泛的应用。然而,智能安防摄像头在面临各种挑战时,如图像识别、目标检测、运动跟踪等,依然存在许多的鲁棒性和安全性问题。为了解决这些问题,本文

    2024年02月06日
    浏览(39)
  • eBPF技术:开启下一代系统观测与网络安全的可能性

    导言:在当今数字化时代,系统观测和网络安全成为了企业和组织中至关重要的领域。而eBPF(extended Berkeley Packet Filter)技术作为一种创新的工具和框架,正在迅速崭露头角。本文将深入探讨eBPF技术的原理、优势和应用领域,以展示其在开启下一代系统观测与网络安全中的潜

    2024年04月25日
    浏览(35)
  • 【eBPF-02】入门:基于 BCC 框架的程序进阶

    本文是 eBPF 系列的第二篇文章,我们来学习 eBPF BCC 框架的进阶用法,对上一篇文章中的代码进行升级,动态输出进程运行时的参数情况。 主要内容包括: 通过 kprobe 挂载内核事件的 eBPF 程序要如何编写? 通过 tracepoint 挂载内核事件的 eBPF 程序要如何编写? eBPF 的程序事件类

    2024年02月04日
    浏览(44)
  • DeeTune:基于 eBPF 的百度网络框架设计与应用

    作者 | 百度APP云原生技术研发组 导读 随着云计算的技术的不断迭代演进,百度内部服务逐渐搬迁到云环境中,部署成本和效率取得明显收益,但一些可观测能力的短板和缺失逐渐显露,传统的方式往往通过植入代码进行修改来实现,但在业务形态和技术栈多样性的背景下,

    2024年02月09日
    浏览(43)
  • 探索设计模式的魅力:捕捉变化的风-用观察者模式提升用户体验

    设计模式专栏: 目录 一、引言  核心概念  应用场景  可以解决的问题 二、场景案例 2.1 不用设计模式实现 2.2 存在问题 2.3 使用设计模式实现 2.4 成功克服 三、工作原理 3.1 结构图和说明 3.2 工作原理详解 3.3 实现步骤 四、 优势 4.1 好处和优势 4.2 应用示例 4.3 系统性优势

    2024年02月19日
    浏览(55)
  • 密码学学习笔记(二十三):哈希函数的安全性质:抗碰撞性,抗第一原象性和抗第二原象性

    在密码学中,哈希函数是一种将任意长度的数据映射到固定长度输出的函数,这个输出通常称为哈希值。理想的哈希函数需要具备几个重要的安全性质,以确保数据的完整性和验证数据的来源。这些性质包括抗碰撞性、抗第一原象性和抗第二原象性。 抗碰撞性指的是在合理的

    2024年02月05日
    浏览(50)
  • 数字安全观察·数据安全分析方向

    政策形势方面,全球均在加快制定并完善数字经济与数据安全相关政策法规。国际方面,欧盟、美国、英国、印度、俄罗斯等国家持续完善数据安全方面的法律政策,并且尤其关注数据跨境传输方面的问题。同时世界各国都着力关注人工智能数据安全风险,强化人工智能领域

    2024年02月12日
    浏览(69)
  • 冲量在线亮相英特尔隐私计算研讨会,基于可信执行环境技术构建更安全的数据流通方案

    近日,冲量在线受邀参与由英特尔(中国)联合上海国创科技产业创新发展中心于上海召开的“隐私计算技术研讨会——安全与效率”会议,同各位隐私计算领域的前沿技术专家共同畅谈数据智能时代隐私计算的技术及应用价值。 冲量在线联合创始人CTO陈浩栋于此次活动中发

    2024年02月12日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包