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)
Вот так достаточно просто мы можем взять под контроль практически любое действие в системе, причём как на хосте, так и в контейнерах.
- Больше примеров и правил можно найти на соответствующей странице проекта.
- Ещё, очень рекомендую заглянуть на katacoda.com и пройти там короткий курс по работе в Sysdig Falco.
- Ещё несколько видео с примерами работы.