Skip to content

Instantly share code, notes, and snippets.

@kyxap1
Last active February 11, 2021 23:03
Show Gist options
  • Save kyxap1/ff4dbfcfb9ef5beabbf5b0b4d874fc1e to your computer and use it in GitHub Desktop.
Save kyxap1/ff4dbfcfb9ef5beabbf5b0b4d874fc1e to your computer and use it in GitHub Desktop.
Auditbeat autodiscover

Auditbeat autodiscover

Все beats используют библиотеку libbeat, в которой есть механизм autodiscover для различных провайдеров.
Бит подключается к сокету докера и ждет событий create, delete от контейнеров.
Для каждого из событий он вычитывает описание контейнера и формирует набор значений,
которые можно использовать для динамического темплейтинга в конфигурационном файле.

Список полей для динамической конфигурации

host
port
docker.container.id
docker.container.image
docker.container.name
docker.container.labels
{
  "host": "10.4.15.9",
  "port": 6379,
  "docker": {
    "container": {
      "id": "382184ecdb385cfd5d1f1a65f78911054c8511ae009635300ac28b4fc357ce51"
      "name": "redis",
      "image": "redis:3.2.11",
      "labels": {
        "io.kubernetes.pod.namespace": "default"
        ...
      }
    }
  }
}

Пример конфига auditbeat для провайдера kubernetes

# When using containerd as runtime, a configuration like the following one
# can be used to monitor files in containers using autodiscover.
auditbeat.autodiscover:
  providers:
  - type: kubernetes
    host: ${NODE_NAME}
    templates:
      - config:
        - module: 'file_integrity'
          paths:
            - '/run/containerd/io.containerd.runtime.v1.linux/k8s.io/${data.kubernetes.container.id}/rootfs/bin'
            - '/run/containerd/io.containerd.runtime.v1.linux/k8s.io/${data.kubernetes.container.id}/rootfs/etc'
          scan_at_start: false
          recursive: true

Проблема

Контейнеры в ECS используют файловую систему overlayfs, которую нельзя напрямую
использовать в конфигурационном файле без предварительного резолва маппинга.

# docker ps -l
CONTAINER ID        IMAGE                                           COMMAND                  CREATED             STATUS              PORTS               NAMES
5f41347ea415        docker.elastic.co/beats/packetbeat-oss:7.10.2   "/usr/local/bin/dock…"   19 hours ago        Up 19 hours                             ecs-tuolumne-devops2-beats-10-packetbeat-9eb08ef7f587deace801
# docker inspect 5f41347ea415 | jq '.[].GraphDriver.Data'
{
  "LowerDir": "/var/lib/docker/overlay2/44e7f5efff174a4248f2edcb687a50517e7a3c446eb513ad1c092509f9950a79-init/diff:/var/lib/docker/overlay2/36c25512b05d9d2a71d1cedff04fde88e12bdf6817cc64c995c5e2836af80ca5/diff:/var/lib/docker/overlay2/fcfbe3a67485508f61678d045aacb7dd6f62ca52fc284549e50597761972b350/diff:/var/lib/docker/overlay2/8118b7b62475c350896c8ae20edaf9d209720c991f93a1fe4bcc40664416e328/diff:/var/lib/docker/overlay2/6541a66868d6dc370835bc05e5882130e391b7c7b0727710348e8ea1cc83bf2b/diff:/var/lib/docker/overlay2/dcfbd175f579abbfd3ec63cdd7144bb8f20e5dfcf1f2fa73499f8c01baad1d23/diff:/var/lib/docker/overlay2/a4bd10056dc40d1cc54b690cf0f6f6c2a6350feda2f7e4d7beaf1eff16a024df/diff:/var/lib/docker/overlay2/f38cab79e5fd86ac0886f9e80ffdc83635521df66afaf979006579395c8712f1/diff:/var/lib/docker/overlay2/010bdcedb21f9a6b8498e6d70a6310d6b2325a854eb56eefc6dc3e934fcc4990/diff:/var/lib/docker/overlay2/d549fca530398dc9d3531d1da97f1074062d2ce542c1170b9efd937c3382f125/diff:/var/lib/docker/overlay2/0605b190d09361308fa341e2de0c8d8a918a0e8956ed9beed7963fb20d78a606/diff",
  "MergedDir": "/var/lib/docker/overlay2/44e7f5efff174a4248f2edcb687a50517e7a3c446eb513ad1c092509f9950a79/merged",
  "UpperDir": "/var/lib/docker/overlay2/44e7f5efff174a4248f2edcb687a50517e7a3c446eb513ad1c092509f9950a79/diff",
  "WorkDir": "/var/lib/docker/overlay2/44e7f5efff174a4248f2edcb687a50517e7a3c446eb513ad1c092509f9950a79/work"
}

Нас интересует значение MergedDir.
MergedDir: this is the result of the overlay filesystem. Docker effectively chroot's into this directory when running the container.

# ls -l /var/lib/docker/overlay2/44e7f5efff174a4248f2edcb687a50517e7a3c446eb513ad1c092509f9950a79/merged
total 12
-rw-r--r-- 1 root root 12114 Nov 13 01:55 anaconda-post.log
lrwxrwxrwx 1 root root     7 Nov 13 01:53 bin -> usr/bin
drwxr-xr-x 1 root root    43 Feb 11 03:10 dev
drwxr-xr-x 1 root root    81 Feb 11 20:14 etc
drwxr-xr-x 2 root root     6 Apr 11  2018 home
lrwxrwxrwx 1 root root     7 Nov 13 01:53 lib -> usr/lib
lrwxrwxrwx 1 root root     9 Nov 13 01:53 lib64 -> usr/lib64
drwxr-xr-x 1 root root    24 Jan 12 22:37 licenses
drwxr-xr-x 2 root root     6 Apr 11  2018 media
drwxr-xr-x 2 root root     6 Apr 11  2018 mnt
drwxr-xr-x 2 root root     6 Apr 11  2018 opt
drwxr-xr-x 2 root root     6 Nov 13 01:53 proc
dr-xr-x--- 1 root root    27 Feb 11 20:11 root
drwxr-xr-x 1 root root     6 Feb 11 20:13 run
lrwxrwxrwx 1 root root     8 Nov 13 01:53 sbin -> usr/sbin
drwxr-xr-x 2 root root     6 Apr 11  2018 srv
drwxr-xr-x 2 root root     6 Nov 13 01:53 sys
drwxrwxrwt 1 root root     6 Jan 12 21:56 tmp
drwxr-xr-x 1 root root    19 Nov 13 01:53 usr
drwxr-xr-x 1 root root    41 Nov 13 01:54 var

Решение

Расширить набор конфигурационных параметров дополнительнымdocker.container.fs,
который будет содержать путь к MergedDir.

auditbeat.autodiscover:
  providers:
  - type: docker
    templates:
      - condition:
         contains:
           docker.container.name: app
      - config:
        - module: 'file_integrity'
          paths:
            - '${data.kubernetes.container.fs}/rootfs/bin'
            - '${data.kubernetes.container.fs}/rootfs/etc'
          scan_at_start: false
          recursive: true

Недостатки

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

Описание конфигурации для autodiscover

https://www.elastic.co/guide/en/beats/filebeat/current/configuration-autodiscover.html

Описание полей overlayfs в Docker API

https://stackoverflow.com/questions/56550890/docker-image-merged-diff-work-lowerdir-components-of-graphdriver

Код libbeat

https://github.com/elastic/beats/blob/master/libbeat

Код docker provider

https://github.com/elastic/beats/blob/master/libbeat/autodiscover/providers/docker/docker.go

Код docker watcher

https://github.com/elastic/beats/blob/master/libbeat/common/docker/watcher.go

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment