В статье покажу, как защитить локальную сеть с помощью Wazuh — платформы для мониторинга безопасности с открытым исходным кодом на Raspberry Pi. Кроме того, мы расширим возможности системы защиты локальной сети используя Telegram для получения уведомлений.
Еще по теме: HoneyPI — ханипот для хакеров на Raspberry Pi
Защита локальной сети используя Wazuh на Raspberry Pi
Вы получите надежное и бюджетное решение, которое будет следить за безопасностью вашей сети и информировать вас об изменениях с помощью уведомлений в реальном времени.
Возьмите свой Raspberry Pi и пристегнитесь — пришло время сделать локальную сеть более защищенной.
Для защиты домашней сети нам понадобится следующее железо:
- Raspberry Pi 4 Model B — 8 ГБ оперативной памяти.
- Карта памяти Micro SD — в идеале 125 Гб, но можно обойтись и 32 Гб.
- Для Raspberry мы будем использовать Ubuntu Server 22.04.5 LTS (64-bit).
Для установки образа можно использовать программу Raspberry Pi Imager, которая значительно упрощает процесс, поскольку она сама предоставит полный список и вам не придется искать подходящий образ в Интернете.
Если будете использовать Raspberry Pi Imager, тогда:
- Выберите OS —> Other general-purpose OS (Другие ОС общего назначения) —> Ubuntu —> Ubuntu Server 22.04.5 LTS (64-bit)
- Выберите Хранилище —> Выберите SD-карту
- Прежде чем нажать кнопку Write (Записать), зайдите в настройки в правом нижнем углу:
Здесь можно предварительно настроить доступ к ssh, а также подключение Raspberry Pi к Wifi, что избавит вас от необходимости создавать вручную все эти openssh-серверные штуки.
В плане безопасности использование парольной аутентификации для SSH, конечно, не является лучшей практикой, чем защита паролем открытого ключа, но давайте упростим задачу для наших новичков.
Изначально я бы не стал использовать Wazuh в качестве имени хоста, так как это может помочь кому-то идентифицировать ваше устройство.
Наконец, нажимайте кнопку Write (Записать).
После того как вы установили новую ОС в Raspberry Pi, вы можете дать ему несколько минут на подключение к сети.
Чтобы найти Raspberry Pi в сети можно использовать Nmap:
1 |
nmap 192.168.1.1-254 |
В списке устройств локальной сети должно быть указано имя хоста wazuh.
Установка Wazuh с помощью Elastic Stack
Есть несколько вещей, которые необходимо знать об установке Wazuh на Raspberry Pi.
Изначально компания Wazuh проделала большую работу, предоставив готовый скрипт, позволяющий установить пакет Wazuh за несколько минут, что в основном применимо для архитектуры amd, а в Raspberry, как вы знаете, используется arm.
В нашем случае скрипт не подходит, но не беда, можно заюзать Elastic Stack — набор инструментов для обработки, анализа и визуализации больших данных в реальном времени. Включает Elasticsearch для хранения и поиска данных, Kibana для визуализации, и Logstash для сбора, обработки и трансформации данных перед их загрузкой в Elasticsearch и многое другое.
Описанные ниже шаги и инструкции (ссылки) действительны для Wazuh 4.4:
- Для установки необходимы дополнительные пакеты, такие как curl или unzip, которые будут использоваться в дальнейших шагах. Однако этот шаг можно пропустить, если curl и unzip уже установлены на сервере.
- Elasticsearch представляет собой масштабируемый механизм полнотекстового поиска и аналитики.
- Wazuh Server собирает и анализирует данные от развернутых агентов. На нем работают менеджер Wazuh, Wazuh API и Filebeat. Первым шагом в настройке Wazuh является добавление на сервер репозитория Wazuh, затем — самого менеджера.
- Filebeat — этот инструмент обеспечивает безопасную пересылку оповещений и архивных событий в Elasticsearch.
- Kibana представляет собой гибкий и интуитивно понятный веб-интерфейс для поиска и визуализации событий и архивов, хранящихся в Elasticsearch.
Ознакомьтесь с этими пошаговыми руководствами и убедитесь, что выбрали правильный менеджер пакетов, а также менеджер систем и сервисов.
В данном случае, так как мы используем Ubuntu Server, можно использовать apt с systemctl.
Развертывание агентов
Теперь у нас есть сервер Wazuh Server с панелью управления:
Пришло время установить агенты.
Хорошая новость — установка агентa происходит с использованием GUI в MacOs или Windows.
В обоих случаях нужно просто запустить исполняемый файл.
Теперь нужно будет разобраться с агентом, кому он должен докладывать.
В моем случае IP-адрес Raspberry Pi — 192.168.1.43.
Для регистрации агента есть два способа:
Мы выберем первый способ.
MacOS и Linux
1. Запустите терминал от имени пользователя root, отредактируйте файл конфигурации агента Wazuh /Library/Ossec/etc/ossec.conf.
2. Добавьте IP-адрес менеджера Wazuh:
1 2 3 4 5 |
<client> <server> <address>MANAGER_IP</address> (Ваш IP-адрес 192.168.1.43) </server> </client> |
Windows
Сценарий тот же самый, разница лишь в расположении агента, так как каталог установки агента Wazuh зависит от архитектуры хоста:
Для 64-битных систем:
1 |
C:\Program Files (x86)\ossec-agent |
Для 32-разрядных систем:
1 |
C:\Program Files\ossec-agent |
Используя учетную запись администратора, измените конфигурационный файл агента Wazuh ossec.conf в каталоге установки.
Подожддите несколько минут на получение данных Wazuh.
Настройка уведомлений с помощью Telegram
Теперь, когда у вас есть SIEM, пришло время настроить систему уведомлений. Wazuh обеспечивает интеграцию в виде Slack, Jira или электронной почты, но давайте будем честными, это определенно не самый удобный способ получить уведомление о событии безопасности в вашем доме.
Возможно, вы считаете, что создание бота потребует от вас кодинг и многочасового изучения документации по API. На самом деле это так же просто, как отправить сообщение в Telegram: достаточно обратиться к BotFather.
Запустив бота вы увидите простые команды, которые позволят управлять вашим ботом:
Затем создайте своего бота и получите свой HTTP API Token:
Управление пользовательской интеграцией с Telegram
Для решения этой задачи важно понимать два момента:
- Локальная конфигурация: /var/ossec/etc/ossec.conf — где находится конфигурация Wazuh.
- Расположение интеграции: /var/ossec/integrations/ — где находятся ваши интеграции.
Чтобы упростить задачу, после создания интеграции необходимо сообщить локальной конфигурации о существовании этой пользовательской интеграции, обратившись к ней.
Для работы скрипта необходимо выполнить два требования:
Установить пакет requests, поскольку наш Python-скрипт будет обращаться к API Telegram
1 |
pip3 install requests |
Понадобится Telegram ChatID.
Прежде чем найти этот идентификатор, отправьте своему боту небольшое сообщение «hello«, чтобы между вами был создан чат.
1 |
https://api.telegram.org/bot<YOUR-BOT-TOKEN>/getUpdates |
Вы получите результат, аналогичный этому:
1 |
{"ok":true,"result":[{"update_id":534302469,"message":{"message_id":2,"from":{"id":38475931,"is_bot":false,"first_name":"xxxxxx","last_name":"xxxxxx","username":"xxxxxx" ,"language_code":"ua"}, |
Скрипт для пользовательской интеграции
Перейдите в каталог /var/ossec/integrations/ и выполните следующие команды:
1 |
nano custom-telegram |
Скопируйте/вставьте следующий скрипт (не забудьте изменить ChatID):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Импортирование необходимых библиотек import sys import json # Попытка импортировать модуль requests, если он доступен try: import requests except Exception: print("Модуль 'requests' не найден. Установите: pip3 install requests") sys.exit(1) # Идентификатор чата CHAT_ID = "xxxxxxxx" # Функция для создания сообщения на основе алерта def create_message(alert_json): # Получение информации об алерте title = alert_json['rule']['description'] if 'description' in alert_json['rule'] else '' description = alert_json['full_log'] if 'full_log' in alert_json else '' description.replace("\\n", "\n") alert_level = alert_json['rule']['level'] if 'level' in alert_json['rule'] else '' groups = ', '.join(alert_json['rule']['groups']) if 'groups' in alert_json['rule'] else '' rule_id = alert_json['rule']['id'] if 'rule' in alert_json else '' agent_name = alert_json['agent']['name'] if 'name' in alert_json['agent'] else '' agent_id = alert_json['agent']['id'] if 'id' in alert_json['agent'] else '' # Форматирование сообщения с использованием markdown msg_content = f'*{title}*\n\n' msg_content += f'_{description}_\n' msg_content += f'*Группы:* {groups}\n' if len(groups) > 0 else '' msg_content += f'*Правило:* {rule_id} (Уровень {alert_level})\n' msg_content += f'*Агент:* {agent_name} ({agent_id})\n' if len(agent_name) > 0 else '' msg_data = {} msg_data['chat_id'] = CHAT_ID msg_data['text'] = msg_content msg_data['parse_mode'] = 'markdown' # Отладочная информация with open('/var/ossec/logs/integrations.log', 'a') as f: f.write(f'MSG: {msg_data}\n') return json.dumps(msg_data) # Чтение параметров конфигурации alert_file = open(sys.argv[1]) hook_url = sys.argv[3] # Чтение файла с алертом alert_json = json.loads(alert_file.read()) alert_file.close() # Отправка запроса msg_data = create_message(alert_json) headers = {'content-type': 'application/json', 'Accept-Charset': 'UTF-8'} response = requests.post(hook_url, headers=headers, data=msg_data) # Отладочная информация with open('/var/ossec/logs/integrations.log', 'a') as f: f.write(f'ОТВЕТ: {response}\n') sys.exit(0) |
Давайте рассмотрим его пошагово.
- В начале используется шебанг #!/usr/bin/env python3 для указания на то, что скрипт должен выполняться с использованием Python версии 3.x.
- Устанавливается кодировка UTF-8 для обработки символов в коде.
- Импортируются необходимые модули: sys, json, и, при наличии, requests.
- Определяется переменная CHAT_ID, которая представляет собой идентификатор чата.
- Создается функция create_message, которая формирует сообщение на основе входных данных.
- Чтение конфигурационных параметров из аргументов командной строки: пути к файлу с данными алерта и адресу для отправки уведомлений.
- Чтение алерта из файла и его преобразование из JSON в объект Python.
- Формирование сообщения с помощью функции create_message.
- Отправка запроса сформированным сообщением на указанный адрес с использованием модуля requests.
- Вывод отладочной информации в файл.
Сделайте скрипт исполняемым и назначьте ему соответствующие права:
1 2 |
chmod 750 /var/ossec/integrations/custom-telegram chown root:wazuh /var/ossec/integrations/custom-telegram |
И последнее, но не менее важное — пора завершить обновление: /var/ossec/etc/ossec.conf следующим образом:
1 2 3 4 5 |
<integration> <name>custom-telegram</name> <hook_url>https://api.telegram.org/bot<YOUR-BOT-TOKEN>/sendMessage</hook_url> <alert_format>json</alert_format> </integration> |
Перезапустите менеджер Wazuh:
1 |
systemctl restart wazuh-manager |
После перезапуска вы увидите первые уведомления:
Заключение
Поздравляю вы настроили Wazuh на Raspberry Pi с получениеми уведомлений через Telegram.
Надеюсь статья поможет защитить локальную сеть.
ПОЛЕЗНЫЕ ССЫЛКИ:
- Настройка VPN на Raspberry Pi
- Поддельная точка доступа на ESP8266
- Точка доступа WiFi с анонимизацией через Tor
- Вот что произойдет если пробросить RDP через роутер