Содержание статьи
Как ты помнишь, первый этап любой кибератаки — это разведка. От нее‑то мы и будем защищаться. На некоем граничном маршрутизаторе MikroTik у нас настроены правила Firewall против стандартного скана портов (например, всеми уважаемым сканером Nmap).
Все правила настроены в таблице Raw для обработки трафика до попадания в Connection Tracking и меньшей нагрузки на процессор. В правилах задействована цепочка Prerouting, логика работы правил основана на флагах TCP (tcp-flags). Если нам с одного IP-адреса поочередно на разные порты маршрутизатора прилетает несколько пакетов TCP с флагами SYN (полуоткрытые соединения), то можно сделать вывод, что работает сканер портов. Добавляем IP-адрес в Address List и в конце делаем drop
всего листа. Эти сигнатуры не претендуют на уникальность. Так что, как говорит мой начальник, «совершенствуй и улучшай».
info
Детальный разбор этих правил выходит за рамки статьи. Чтобы вникнуть подробнее, читай цикл статей «Стена огня» и изучай, как работают сканеры портов.
Первый этап оптимизации жизнедеятельности сисадмина
Итак, нам нужно вести учет количества IP-адресов, которые сканируют сеть, и ежедневно отправлять Address List в отдел безопасности предприятия для дальнейшего анализа и предотвращения атак. Как известно, системный администратор существо ленивое занятое, и каждый день заходить на маршрутизатор и скидывать файл с адресами для него нерентабельно. Начал я с того, что написал скрипт для RouterOS, который ежедневно сохранял Address List в файл и отправлял письмо на электронную почту.
Пример локального скрипта на маршрутизаторе MikroTik RouterOS
:local sysname [/system identity get name];:local sysdate [/system clock get date];:local d [:pick $sysdate begin=4 end=6];:local m [:pick $sysdate begin=0 end=3];:local y [:pick $sysdate begin=7 end=11];########SAVE_ADDRESS_LIST_TO_FILE#############/ip firewall address-list print from=[ find where list=port_scanners] \file="$sysname_$d$m$y_port_scanners_list.txt";:delay 3s;########SEND_ADDRESS_LIST_TO_MAIL############/tool e-mail send to=tester025@protonmail.com from=tester075@protonmail.com \subject=([/system identity get name] . " Port_scanners_address_list " . \[/system clock get date]) body=("Port scanners address-list of $sysname\nTime and Date stamp: " . \[/system clock get time] . " " . [/system clock get date] . "\n ") \file="$sysname_$d$m$y_port_scanners_list.txt";
Скрипт брал основную информацию по оборудованию, имя устройства, дату, месяц и год, искал соответствующий Address List и сохранял файл.
А затем отправлял сообщение с вложенным файлом на почту.
Добавление этого скрипта в Scheduler немного облегчило жизнь, но нужно было заходить на почту сохранять логи и еженедельно подсчитывать IP-адреса.
Второй этап оптимизации. Учим сервер делать работу за нас
План действий будет следующий.
- Мы напишем на Bash скрипт, который будет заходить на маршрутизатор по SSH, сохранять файл из Address List и по SCP забирать файл себе.
- Напишем еще один Bash-скрипт, который будет вести еженедельный подсчет IP-адресов и отправлять безопасникам эту информацию по почте, прикладывая сам список.
- Выполним всякие вспомогательные задачи: настройку cron и почтового клиента на сервере, генерацию ключей SSH и, конечно, настройку телеграм‑бота для получения служебных сообщений и (при некоторой доработке) управления работой скрипта.
Из инструментов нам понадобится Unix-образная система (я тестировал на Ubuntu, Armbian и Manjaro), прямые руки и баночка пива (опционально). Приступаем к работе!
Сначала создаем директорию для хранения наших скриптов и служебных файлов:
mkdir /home/user/.scripts/cyber
И еще одну — для хранения списка адресов, с которых происходило сканирование:
mkdir /home/user/.scripts/cyber/port_scanners
Также нужно на сервере сгенерировать ключи SSH:
ssh-keygen
И вручную найти публичный ключ (id_rsa.
) в каталоге ~/.
. На маршрутизаторе создаем пользователя (например, uServer
) и кладем публичный ключ SSH (id_rsa.
) в директорию Files
. Далее открываем вкладку System → Users → SSH Keys и выбираем публичный ключ SSH (id_rsa.
) для созданного пользователя.
info
Не забывай, что после того, как мы положили ключ для пользователя, нужно первый раз зайти на маршрутизатор под этим пользователем по протоколу SSH.
Для мониторинга работы скриптов мы будем использовать телеграм‑бота. Его код я здесь приводить не буду, но смастерить его несложно — ищи бота BotFather и дерзай.
info
Подробнее о том, как писать ботов для Telegram, читай в статье «Телеграфирует робот. Пишем бота для Telegram на Python».
Дальше создаем группу или канал, даем ей соответствующее название (например, MikrotControl
). Добавляем бота в группу и даем ему права для публикации сообщений.
Дальше узнаем chat
нашей группы. Для этого открываем специальный URL:
https://api.telegram.org/bot<ваш_токен_телеграм_бота>/getUpdates
В ответе нас интересует параметр message
→ chat
→ id
, в нем хранится уникальный идентификатор чата группы с нашим ботом.
Вывод в формате JSON:
"chat": { "id": -1524684857943, "title": "MikrotControl", "type": "supergroup"},
Теперь отправим тестовое сообщение от бота в группу или канал. Для этого есть специальный URL:
https://api.telegram.org/bot<ваш_токен_телеграм_бота>/sendMessage?chat_id=<ідентифікатор_групи>&text=test123
В нашем случае chat ID -1524684857943
. Именно так, со знаком минус.
В группе мы должны получить сообщение от бота с текстом test123
. Дальше нужно настроить бота на сервере. Я возьму за основу готовый скрипт monit2telegram.
Устанавливаем клиент Git:
sudo pacman -S git
Переходим в директорию /
:
cd /usr/src
Загружаем необходимые ресурсы с GitHub и переходим в загруженную директорию:
sudo git clone https://github.com/matriphe/monit2telegram.git
cd monit2telegram
Затем необходимо скопировать файл конфигурации и скрипты в соответствующие директории файловой системы и дать скриптам права на исполнение:
sudo cp telegramrc /etc/telegramrc
sudo cp sendtelegram.sh /usr/local/bin/sendtelegram
sudo chmod +x /usr/local/bin/sendtelegram
sudo cp monit2telegram.sh /usr/local/bin/monit2telegram
sudo chmod +x /usr/local/bin/monit2telegram
Установить необходимые зависимости (jq
):
cd /usr/src
sudo wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
sudo ln -s /usr/src/jq-linux64 /usr/bin/jq
В первоначальном конфиге /
нужно указать уникальный TOKEN
бота и CHATID
нашей группы:
TOKEN='...'CHATID='...'
Проверить, приходят ли сообщения, можно так:
sendtelegram -m "test message from server"
В нашей группе мы должны получить сообщение от бота с указанным текстом.
Ну и наконец, пишем наш скрипт.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»