Sysdig Falco

Sysdig Falco — инструмент для обнаружения аномалий и мониторинга активности в системе. Работает как на хосте, так и в контейнерах, если потребуется.

Sysdig Falco

Состоит Falco из двух частей — модуль ядра falco_probe, и непосредственно сам демон, который обрабатывает собранную информацию, генерирует отчёты и т. д. Настройка выполняется из нескольких .yaml файлов. Мы на Falco в рамках этой заметки посмотрим в CentOS 7.

Установка и базовая настройка.

Для установки, выполняем одну команду. В процессе, скрипт доустановит заголовки ядра, необходимые для сборки модуля пакеты, соберёт модуль ядра и запустит его в работу:

# curl -s https://s3.amazonaws.com/download.draios.com/stable/install-falco | sudo bash

Как только процесс будет завершён, убеждаемся что модуль работает:

# lsmod | grep falco
falco_probe 614337 0

Далее заглянем в основной конфигурационный файл — /etc/falco/falco.yaml Здесь мы можем указать какие файлы с правилами необходимо использовать при мониторинге, в каком формате выводить уведомления, куда выводить их и с каким приоритетом. По умолчанию, уведомления отправляются в stderr, stdout и syslog. Если мы хотим настроить запись уведомлений в отдельный лог, обращаем внимание на секцию:

file_output:
enabled: false
keep_alive: false
filename: ./events.txt

Для настройки уведомлений на email, спускаемся в нижнюю часть конфига и там находим соответствующую возможность:

program_output:
enabled: false
keep_alive: false
program: mail -s "Falco Notification" someone@example.com

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

Правила Sysdig Falco.

Посмотрим сразу на простой пример — правило, для мониторинга сетевой активности системных бинарников:

- rule: system_binaries_network_activity
  desc: network activity by system binaries that are not expected generate any network traffic
  condition: ((inbound or outbound) and (fd.sockfamily = ip)) and (fd.name != '')
  output: "Binary generate network traffic by (user=%user.name command=%proc.cmdline connection=%fd.name type=%evt.type)"
  priority: WARNING
  tags: [filesystem, network]
  • Начинается правило с rule, далее указывается название, которое будет использоваться falco при обработке.
  • desc — описание правила в свободной форме.
  • condition — условие для срабатывания правила. Пишется с использованием синтаксиса sysdig.
  • output — строка, которая будет записываться в лог.
  • priority — приоритет для правила.
  • tags — теги для правила.

О самом Sysdig я уже писал ранее, в отдельной заметке.

Мониторинг сетевой активности.

При установке Falco на сервер, в файле /etc/falco/falco_rules.yaml уже прописано некоторое количество правил, стоит заглянуть туда, прежде чем писать что-то своё. Наши кастомные правила мы будем записывать в /etc/falco/falco_rules.local.yaml.

Сохраним приведённое выше правило, перезапустим сервис:

# systemctl restart falco

Теперь просто пингуем любой домен, а затем проверяем /var/log/messages. Там у нас обнаружится следующее:

Oct 11 12:59:50 centos-2gb-hel1-1 falco: 12:59:50.343148030: Warning Binary generate network traffic by (user=root command=ping -c1 ya.ru connection=95.216.162.218:32820->213.133.98.98:53 type=connect)
Oct 11 12:59:50 centos-2gb-hel1-1 falco: 12:59:50.343197498: Warning Binary generate network traffic by (user=root command=ping -c1 ya.ru connection=95.216.162.218:32820->213.133.98.98:53 type=sendto)
Oct 11 12:59:50 centos-2gb-hel1-1 falco: 12:59:50.345198065: Warning Binary generate network traffic by (user=root command=ping -c1 ya.ru connection=95.216.162.218:32820->213.133.98.98:53 type=ioctl)
Oct 11 12:59:50 centos-2gb-hel1-1 falco: 12:59:50.345205363: Warning Binary generate network traffic by (user=root command=ping -c1 ya.ru connection=95.216.162.218:32820->213.133.98.98:53 type=recvfrom)

Мониторинг файловой системы.

В стандартном наборе правил добавлены условия, позволяющие выполнить мониторинг изменений в директории /etc:

- rule: Write below etc
  desc: an attempt to write to any file below /etc
  condition: write_etc_common
  output: "File below /etc opened for writing (user=%user.name command=%proc.cmdline parent=%proc.pname pcmdline=%proc.pcmdline file=%fd.name program=%proc.name gparent=%proc.aname[2] ggparent=%proc.aname[3] gggparent=%proc.aname[4])"
  priority: ERROR
  tags: [filesystem]

Для проверки его работоспособности можно, например, модифицировать /etc/resolv.conf, а затем проверить /var/log/messages, где осядет запись:

Oct 11 13:16:46 centos-2gb-hel1-1 falco: 13:16:46.994403084: Error File below /etc opened for writing (user=root command=nano -w /etc/resolv.conf parent=bash pcmdline=bash file=/etc/resolv.conf program=nano gparent=sshd ggparent=sshd gggparent=systemd)
Oct 11 13:16:48 centos-2gb-hel1-1 falco: 13:16:48.967124902: Error File below /etc opened for writing (user=root command=nano -w /etc/resolv.conf parent=bash pcmdline=bash file=/etc/resolv.conf program=nano gparent=sshd ggparent=sshd gggparent=systemd)

Мониторинг работы в контейнере.

Для этой заметки я работаю на тестовом сервере, так что ставим Docker, и запускаем простой контейнер с CentOS:

# yum install docker
# systemctl restart docker
# docker pull centos

Возьмём приведённое выше правило, и немного модифицируем его, для мониторинга сетевой активности в контейнере:

- rule: system_binaries_network_activity_docker
  desc: network activity by system binaries that are not expected generate any network traffic in container
  condition: ((inbound or outbound) and (fd.sockfamily = ip)) and fd.name != '' and container
  output: "Binary generate network traffic from container %container.id by (user=%user.name command=%proc.cmdline connection=%fd.name type=%evt.type)"
  priority: WARNING
  tags: [container, network]

Добавим правило в /etc/falco/falco_rules.local.yaml, сохраним изменения, перезапустим сервис.

# systemctl restart falco

Теперь просто зайдём в контейнер, попингуем ya.ru и выйдем обратно в ОС на хосте.

# docker run --rm -it centos /bin/bash
[root@0a6ed013ee29 /]# ping -c1 ya.ru
...
[root@0a6ed013ee29 /]# exit
exit
#

В очередной раз проверим /var/log/messages, где по указанному нами правилу будут доступны предупрждения:

Oct 11 13:43:58 centos-2gb-hel1-1 falco: 13:43:58.887939368: Warning Binary generate network traffic from container 0a6ed013ee29 by (user=root command=ping -c1 ya.ru connection=172.17.0.2:49217->213.133.98.98:53 type=sendto)
Oct 11 13:43:58 centos-2gb-hel1-1 falco: 13:43:58.888361623: Warning Binary generate network traffic from container 0a6ed013ee29 by (user=root command=ping -c1 ya.ru connection=172.17.0.2:49217->213.133.98.98:53 type=ioctl)
Oct 11 13:43:58 centos-2gb-hel1-1 falco: 13:43:58.888382571: Warning Binary generate network traffic from container 0a6ed013ee29 by (user=root command=ping -c1 ya.ru connection=172.17.0.2:49217->213.133.98.98:53 type=recvfrom)

Вот так достаточно просто мы можем взять под контроль практически любое действие в системе, причём как на хосте, так и в контейнерах.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *