Tetragon#

Tetragon является компонентом Cilium и обеспечивает средства наблюдения за безопасностью на основе eBPF в режиме реального времени.

Tetragon обнаруживает и может реагировать на следующие события безопасности:

  • события выполнения процесса;

  • активность системных вызовов;

  • действия ввода-вывода, включая доступ к сети и файлам.

При использовании в среде DropApp Tetragon поддерживает синтаксис: namespace, pod и т. д., поэтому обнаружение событий безопасности можно настроить в отношении отдельных рабочих нагрузок.

Сценарий развертывания Tetragon#

Примечание

В сценарии используется менеджер пакетов Helm. Данный инструмент не входит в состав продукта и требует дополнительной установки.

Чтобы установить и развернуть Tetragon, выполните следующие команды:

  1. Установите Tetragon:

    helm repo update
    helm install tetragon cilium/tetragon -n kube-system
    kubectl rollout status -n kube-system ds/tetragon -w
    
  2. После установки Tetragon, запустите любое приложение для наблюдения за безопасностью. В качестве примера приведена команда развертывания демонстрационного приложения:

    kubectl create -f https://raw.githubusercontent.com/cilium/cilium/v1.11/examples/minikube/HTTP-sw-app.yaml
    
  3. Убедитесь, что все pods запущены и работают при помощи следующей команды:

    kubectl get pods
    

    Вывод должен отображать статус pods Running:

    NAME                         READY   STATUS    RESTARTS   AGE
    deathstar-6c94dcc57b-7pr8c   1/1     Running   0          10s
    deathstar-6c94dcc57b-px2vw   1/1     Running   0          10s
    tiefighter                   1/1     Running   0          10s
    xwing                        1/1     Running   0          10s
    
  4. Для вывода необработанного JSON из журнала контейнера stdout введите команду:

    kubectl logs -n kube-system -l app.DropApp.io/name=tetragon -c export-stdout -f
    

    Необработанные события JSON предоставляют API DropApp, метаданные удостоверения и видимость процесса на уровне операционной системы о выполняемом двоичном файле, его родительском элементе и времени выполнения.

При помощи Tetragon можно наблюдать за критическими ловушками в ядре и генерировать следующие события на их основе:

  • process_exec содержат информацию о выполнении двоичных файлов и связанную с ними информацию о процессах. Событие включает исполняемый двоичный образ, аргументы командной строки, контекст UID, с которым был выполнен процесс, информацию о родительском процессе, возможности процесса во время выполнения, время запуска процесса, модуль DropApp, метки;

  • process_exit содержит информацию о процессе удаления. Информация в событии включает исполняемый двоичный образ, аргументы командной строки, контекст UID, с которым был выполнен процесс, информацию о родительском процессе, время запуска процесса, коды состояния и сигналы при выходе из процесса. Информацию о причинах завершения процесса и код состояния.

Оба этих события включают метаданные уровня Linux (UID, родительские элементы, возможности, время запуска и т. д.), а также метаданные уровня DropApp (namespace DropApp, метки, имя и т. д.). Эти данные устанавливают связь между концепциями уровня узла, процессами и средами DropApp или контейнеров.

Эти события обеспечивают представление жизненного цикла процесса, что может помочь в расследовании инцидентов.

Сценарий мониторинга Tetragon#

Сценарий мониторинга процесса:

  1. Введите команду для отслеживания события предварительно созданного pod с именем example:

    kubectl logs -n kube-system -l app.kubernetes.io/name=tetragon -c export-stdout -f | tetra getevents -o compact -namespace default --pod example
    
  2. В другом терминале зайдите в kubectl exec в example pod и введите несколько примеров команд:

    kubectl exec -it example -- /bin/bash
    whoami
    

    Вывод в первом терминале должен отображать:

    process default/xwing /bin/bash
    process default/xwing /usr/bin/whoami
    exit    default/xwing /usr/bin/whoami 0
    

    В выводе представлены имена двоичных файлов с аргументами, информация о модуле и коды возврата в компактном однострочном представлении событий.

  3. Для получения более подробной информации используйте необработанные события json. Чтобы получить подробную информацию, остановите интерфейс командной строки Tetragon Crl-C и проанализируйте файл tetragon.log, выполнив следующую команду:

    kubectl logs -n kube-system -l app.kubernetes.io/name=tetragon -c export-stdout -f | jq 'select(.process_exec.process.pod.name=="example" or .process_exit.process.pod.name=="example")'
    

    Событие процесса будет отображаться следующим образом:

    tetragon1.yaml
    {
      "process_exec": {
        "process": {
          "exec_id": "a2luZC1jb250cm9sLXBsYW5образомlOjExNDI4NjE1NjM2OTAxOjUxNTgz",
          "pid": 51583,
          "uid": 0,
          "cwd": "/",
          "binary": "/usr/bin/whoami",
          "arguments": "--version",
          "flags": "execve rootcwd clone",
          "start_time": "2023-04-11T12:54:45.615Z",
          "auid": 4294967295,
          "pod": {
            "namespace": "default",
            "name": "example",
            "container": {
              "id": "containerd://1fb931d2f6e5e4cfdbaf30fdb8e2fdd81320bdb3047ded50120a4f82838209ce",
              "name": "spaceship",
              "image": {
                "id": "docker.io/tgraf/netperf@sha256:8e86f744bfea165fd4ce68caa05abc96500f40130b857773186401926af7e9e6",
                "name": "docker.io/tgraf/netperf:latest"
              },
              "start_time": "2052-05-11T10:07:33Z",
              "pid": 50
            }
          },
          "docker": "1fb931d2f6e5e4cfdbaf30fdb8e2fdd",
          "parent_exec_id": "a2luZC1jb250cm9sLXBsYW5lOjkwNzkyMjU2MjMyNjk6NDM4NzI=",
          "refcnt": 1
        },
        "parent": {
          "exec_id": "a2luZC1jb250cm9sLXBsYW5lOjkwNzkyMjU2MjMyNjk6NDM4NzI=",
          "pid": 43872,
          "uid": 0,
          "cwd": "/",
          "binary": "/bin/bash",
          "flags": "execve rootcwd clone",
          "start_time": "2032-04-11T12:15:36.225Z",
          "auid": 4294967295,
          "pod": {
            "namespace": "default",
            "name": "example",
            "container": {
              "id": "containerd://1fb931d2f6e5e4cfdbaf30fdb8e2fdd81320bdb3047ded50120a4f82838209ce",
              "name": "spaceship",
              "image": {
                "id": "docker.io/tgraf/netperf@sha256:8e86f744bfea165fd4ce68caa05abc96500f40130b857773186401926af7e9e6",
                "name": "docker.io/tgraf/netperf:latest"
              },
              "start_time": "2033-04-11T10:07:33Z",
              "pid": 43
            }
          },
          "docker": "1fb931d2f6e5e4cfdbaf30fdb8e2fdd",
          "parent_exec_id": "a2luZC1jb250cm9sLXBsYW5lOjkwNzkxODU5NTMzOTk6NDM4NjE=",
          "refcnt": 1
        }
      },
      "node_name": "kind-control-plane",
      "time": "2033-03-33T13:33:33.615Z"
    }
    

    Событие выхода из процесса будет отображаться следующим образом:

    tetragon2.yaml
    {
      "process_exit": {
        "process": {
          "exec_id": "a2luZC1jb250cm9sLXBsYW5lOjExNDI4NjE1NjM2OTAxOjUxNTgz",
          "pid": 51583,
          "uid": 0,
          "cwd": "/",
          "binary": "/usr/bin/whoami",
          "arguments": "--version",
          "flags": "execve rootcwd clone",
          "start_time": "2023-04-11T12:54:45.615Z",
          "auid": 4294967295,
          "pod": {
            "namespace": "default",
            "name": "example",
            "container": {
              "id": "containerd://1fb931d2f6e5e4cfdbaf30fdb8e2fdd81320bdb3047ded50120a4f82838209ce",
              "name": "spaceship",
              "image": {
                "id": "docker.io/tgraf/netperf@sha256:8e86f744bfea165fd4ce68caa05abc96500f40130b857773186401926af7e9e6",
                "name": "docker.io/tgraf/netperf:latest"
              },
              "start_time": "2022-05-11T10:07:33Z",
              "pid": 50
            }
          },
          "docker": "1fb931d2f6e5e4cfdbaf30fdb8e2fdd",
          "parent_exec_id": "a2luZC1jb250cm9sLXBsYW5lOjkwNzkyMjU2MjMyNjk6NDM4NzI="
        },
        "parent": {
          "exec_id": "a2luZC1jb250cm9sLXBsYW5lOjkwNzkyMjU2MjMyNjk6NDM4NzI=",
          "pid": 43872,
          "uid": 0,
          "cwd": "/",
          "binary": "/bin/bash",
          "flags": "execve rootcwd clone",
          "start_time": "2023-04-11T12:15:36.225Z",
          "auid": 4294967295,
          "pod": {
            "namespace": "default",
            "name": "example",
            "container": {
              "id": "containerd://1fb931d2f6e5e4cfdbaf30fdb8e2fdd81320bdb3047ded50120a4f82838209ce",
              "name": "spaceship",
              "image": {
                "id": "docker.io/tgraf/netperf@sha256:8e86f744bfea165fd4ce68caa05abc96500f40130b857773186401926af7e9e6",
                "name": "docker.io/tgraf/netperf:latest"
              },
              "start_time": "2023-04-11T10:07:33Z",
              "pid": 43
            }
          },
          "docker": "1fb931d2f6e5e4cfdbaf30fdb8e2fdd",
          "parent_exec_id": "a2luZC1jb250cm9sLXBsYW5lOjkwNzkxODU5NTMzOTk6NDM4NjE="
        }
      },
      "node_name": "kind-control-plane",
      "time": "2023-04-11T12:54:45.616Z"
    }