SIEM (ElasticSearch)
Компоненты
ElasticSearch | Серверная часть - бэкенд обработки данных |
Агенты | На клиентах, агрегируют и отправляют данные |
Kibana | Визуализация данных ElasticSearch, возможно на отдельном |
Fleet | Бэкенд для управления агентами, фронт через kibana. Управление через политики. |
Установка ElasticSearch
Ubuntu, 4 ядра, 8ГБ, 30ГБ
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
apt-get install apt-transport-https
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://mirror.yandex.ru/mirrors/elastic/8/ stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update && sudo apt install elasticsearch
В консоли отобразится пароль суперюзера, его нужно сохранить.
The generated password for the elastic built-in superuser is : b0kLYdJDYetVHoPQafmc
Затем изменяем конфиг java vm, устанавливаем 8ГБ лимит. nano /etc/elasticsearch/jvm.options
## heap to 4 GB, create a new file in the jvm.options.d
## directory containing these lines:
##
-Xms8g
-Xmx8g
##
## See https://www.elastic.co/guide/en/elasticsearch/reference/8.19/heap-size.html
## for more information
Перегружаем службы
sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service
Установка kibana
sudo apt install kibana
sudo systemctl daemon-reload
sudo systemctl enable kibana.service
sudo systemctl start kibana.service
sudo systemctl status kibana.service
Генерируем пароль для пользователя kibana
sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u kibana_system
Password for the [kibana_system] user successfully reset.
New value: QiF9U+blQujOvEg+jHyB
Настраиваем сертификаты
sudo cp -R /etc/elasticsearch/certs /etc/kibana
sudo chown -R root:kibana /etc/kibana/certs
Настраиваем параметры kibana в файле /etc/kibana/kibana.yml
server.host: "192.168.1.184"
elasticsearch.username: "kibana_system"
elasticsearch.password: "QiF9U+blQujOvEg+jHyB"
elasticsearch.ssl.certificateAuthorities: [ "/etc/kibana/certs/http_ca.crt" ]
elasticsearch.hosts: ["https://192.168.1.184:9200"]
Входим по адресу http://192.168.1.184:5601/ и там логин elastic пароль b0kLYdJDYetVHoPQafmc
Fleet
Желательно ставить на отдельном сервере. Настраивается через Kibana Management - Fleet
Взаимодействие компонентов:
Fleet настраивается через Policy в Kibana, настройки(policy) хранятся в Elasticsearch, а агенты регистрируются на Fleet Server, получают через него конфигурацию, и отправляют данные в Elasticsearch.
Установка Fleet server
Ставим Debian.
Сначала с ElasicSearch копируем сертификат на будущий сервер
sudo scp /etc/elasticsearch/certs/http_ca.crt user@<fleet_server_host>:/tmp/
На Fleet
sudo mkdir -p /etc/elastic/certs
sudo mv /tmp/http_ca.crt /etc/elastic/certs/
sudo chmod 644 /etc/elastic/certs/http_ca.crt
sudo chown -R root:root /etc/elastic/certs
sudo chmod 755 /etc/elastic
sudo chmod 644 /etc/elastic/certs/http_ca.crt
В kibana создаем новый сервер. Указываем отображаемое имя и URL будущего Fleet server. Обязательно установить порт, иначе будет стучаться на 443 по умолчанию и почему-то не поедет.
Нажимаем Generate... ELK сгенерирует набор команд, которые необходимо выполнить на будущем Fleet сервере для установки. Можно выбрать ОС для команды. В качестве localhost нужно указать адрес elastic сервера.
И к установочной строке нужно добавить ссылку на сертификат. Итоговая строка:
sudo ./elastic-agent install --fleet-server-es=https://192.168.1.184:9200 --fleet-server-service-token=AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE3NjA2MTgzNzk5MjQ6U2tNMlRSczRRcW00emV6aXZkR1JmZw --fleet-server-policy=fleet-server-policy --fleet-server-port=8220 --certificate-authorities=/etc/elastic/certs/http_ca.crt
И еще - токен имеет время жизни, поэтому при ошибке его нужно обновить.
Управление конфигурацией агентов
С помощью политикПолитики Fleet мы можем управлятьуправляют конфигурацией агентов elastic. Давайте настроим наши агенты на сбор системных логов. Перейдем в раздел Agent policies:
В разделе "Add Integrations" можно добавить в политику модули для сбора данных.
Интеграции(Integrations) это модули для сбора данных из различных источников. С актуальным списком доступных интеграций можно ознакомиться по адресу https://www.elastic.co/integrations
Давайте добавим интеграцию System. Для этого введем название интеграции в стоке поиска, откроем ее и нажмем Add System:System. В настройках модуля System есть опция добавить или изменить файлы логов, которые будут мониториться на системах linux, типы журналов Windows
ELK-запросы. KQL
Для составления запросов в Kibana используется KQL(Kibana Query Language). Подробнее по ссылке.
Рассмотрим основной интерфейс вкладки Discover в Kibana:
- Окно выбора временного периода для ограничения поиска.
- Выбор индекса с данными. Данные с различных источников могут иметь разный формат и записываться в разные индексы(базы).
- Строка запросов KQL.
- Доступные в текущем поиске поля данных.
- Результаты поиска.
Выбор времени и индекса
Выбирается абсолютный /относительный диапазоны времени. Список доступных индексов находится в левой части экрана.
Поля с данными
После выполнения запроса в левой части экрана Kibana покажет доступные в результатах поиска поля данных, например такие как имя агента, IP и прочие. Имена полей можно искать с помощью строки поиска, если кликнуть на поле, Kibana покажет статистику.
Для удобной работы с чтением логов имеет смысл выбрать интересующие специалиста поля для отображения в результатах поиска(5). Для выбора необходимо нажать на символ (+) рядом с именем поля. Поле timestamp выбрано по умолчанию.
Результаты поиска с выбранными полями host.ip, host.name, host.os.family и message. Полученный вид можно сохранить для дальнейшего использования нажав кнопку "Save" в правом верхнем углу экрана.
Это очень удобно для работы с разными наборами данных, например, для изучения сетевого трафика имеет смысл выбрать поля связанные с src/dst портами, IP/MAC адресами и протоколами, для изучения логов веб-сервера добавить url, http response code, XFF, user-agent, для изучения поведения процессов - command line, process.pid, process.parent.pid, user, итд.
Примечание: по умолчанию Kibana показывает 500 последних документов в результатах поиска.
KQL.
KQL использует логические операторы и ключевые слова для составления запроса. Также в запросе можно фильтровать результаты по полям. Например, запрос message: error будет искать ключевое слово error в поле message.
Оператор (:) обозначает, что мы ищем полное совпадение ключевого слова "error" среди текста в поле message.
Если мы попробуем найти неполное совпадение, например message:err , то результат поиска будет пустым. Для поиска частичного совпадения можно использовать символ (*), message:err* . Помимо поиска совпадений в KQL также доступны операторы <,>, >=, <= и логические AND, NOT, OR. Рассмотрим следующий пример:
(host.name: web*) AND (NOT http.response.status_code: 200) AND (http.response.status_code: *)
В данном примере мы ищем результаты которые содержат http.response.status_code и где http.response.status_code не равняется 200 на машинах с именем начинающимся на web.
http.response.status_code оказался в запросе дважды, поскольку в результаты запроса
(NOT http.response.status_code:200)попадут все данные, в которых поле http.response.status_code не существует в принципе. Чтобы это исправить, мы ищем данные, где это поле имеется (http.response.status_code: *) и сужаем фильтр до результатов, где значение поля не равняется 200.