Пред­ставь, что у нас есть обо­рудо­вание MikroTik, для которо­го написа­ны пра­вила фай­рво­ла про­тив ска­ниро­вания пор­тов. Нам нуж­но вес­ти ежед­невный учет IP-адре­сов и отправ­лять пись­мо с отче­том для отде­ла безопас­ности. Сегод­ня мы в духе извес­тной ци­таты с «Баша» о прог­раммис­те, который авто­мати­зиро­вал все, что занима­ло у него боль­ше 90 секунд, напишем скрипт, что­бы он выпол­нял всю эту работу. По дороге поуп­ражня­емся в адми­нис­три­рова­нии сетей на осно­ве MikroTik.

Как ты пом­нишь, пер­вый этап любой кибера­таки — это раз­ведка. От нее‑то мы и будем защищать­ся. На неко­ем гра­нич­ном мар­шру­тиза­торе MikroTik у нас нас­тро­ены пра­вила Firewall про­тив стан­дар­тно­го ска­на пор­тов (нап­ример, все­ми ува­жаемым ска­нером Nmap).

Правила Firewall против скана портов
Пра­вила Firewall про­тив ска­на пор­тов

Все пра­вила нас­тро­ены в таб­лице Raw для обра­бот­ки тра­фика до попада­ния в Connection Tracking и мень­шей наг­рузки на про­цес­сор. В пра­вилах задей­ство­вана цепоч­ка Prerouting, логика работы пра­вил осно­вана на фла­гах TCP (tcp-flags). Если нам с одно­го IP-адре­са пооче­ред­но на раз­ные пор­ты мар­шру­тиза­тора при­лета­ет нес­коль­ко пакетов TCP с фла­гами SYN (полу­откры­тые соеди­нения), то мож­но сде­лать вывод, что работа­ет ска­нер пор­тов. Добав­ляем IP-адрес в Address List и в кон­це дела­ем drop все­го лис­та. Эти сиг­натуры не пре­тен­дуют на уни­каль­ность. Так что, как говорит мой началь­ник, «совер­шенс­твуй и улуч­шай».

Экспорт правил Firewall против скана портов
Эк­спорт пра­вил Firewall про­тив ска­на пор­тов

info

Де­таль­ный раз­бор этих пра­вил выходит за рам­ки статьи. Что­бы вник­нуть под­робнее, читай цикл ста­тей «Сте­на огня» и изу­чай, как работа­ют ска­неры пор­тов.

Список адресов с названием port scanners
Спи­сок адре­сов с наз­вани­ем port scanners
 

Первый этап оптимизации жизнедеятельности сисадмина

Итак, нам нуж­но вес­ти учет количес­тва 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-адре­са.

Планировщик и наш скрипт
Пла­ниров­щик и наш скрипт
 

Второй этап оптимизации. Учим сервер делать работу за нас

План дей­ствий будет сле­дующий.

  1. Мы напишем на Bash скрипт, который будет заходить на мар­шру­тиза­тор по SSH, сох­ранять файл из Address List и по SCP забирать файл себе.
  2. На­пишем еще один Bash-скрипт, который будет вес­ти еже­недель­ный под­счет IP-адре­сов и отправ­лять безопас­никам эту информа­цию по поч­те, прик­ладывая сам спи­сок.
  3. Вы­пол­ним вся­кие вспо­мога­тель­ные задачи: нас­трой­ку cron и поч­тового кли­ента на сер­вере, генера­цию клю­чей SSH и, конеч­но, нас­трой­ку телег­рам‑бота для получе­ния слу­жеб­ных сооб­щений и (при некото­рой доработ­ке) управле­ния работой скрип­та.

Из инс­тру­мен­тов нам понадо­бит­ся Unix-образная сис­тема (я тес­тировал на Ubuntu, Armbian и Manjaro), пря­мые руки и баноч­ка пива (опци­ональ­но). Прис­тупа­ем к работе!

Сна­чала соз­даем дирек­торию для хра­нения наших скрип­тов и слу­жеб­ных фай­лов:

mkdir /home/user/.scripts/cyber

И еще одну — для хра­нения спис­ка адре­сов, с которых про­исхо­дило ска­ниро­вание:

mkdir /home/user/.scripts/cyber/port_scanners

Так­же нуж­но на сер­вере сге­нери­ровать клю­чи SSH:

ssh-keygen

И вруч­ную най­ти пуб­личный ключ (id_rsa.pub) в катало­ге ~/.ssh. На мар­шру­тиза­торе соз­даем поль­зовате­ля (нап­ример, uServer) и кла­дем пуб­личный ключ SSH (id_rsa.pub) в дирек­торию Files. Далее откры­ваем вклад­ку System → Users → SSH Keys и выбира­ем пуб­личный ключ SSH (id_rsa.pub) для соз­данно­го поль­зовате­ля.

Создание нового пользователя
Соз­дание нового поль­зовате­ля

info

Не забывай, что пос­ле того, как мы положи­ли ключ для поль­зовате­ля, нуж­но пер­вый раз зай­ти на мар­шру­тиза­тор под этим поль­зовате­лем по про­токо­лу SSH.

Для монито­рин­га работы скрип­тов мы будем исполь­зовать телег­рам‑бота. Его код я здесь при­водить не буду, но смас­терить его нес­ложно — ищи бота BotFather и дер­зай.

info

Под­робнее о том, как писать ботов для Telegram, читай в статье «Те­лег­рафиру­ет робот. Пишем бота для Telegram на Python».

Даль­ше соз­даем груп­пу или канал, даем ей соот­ветс­тву­ющее наз­вание (нап­ример, MikrotControl). Добав­ляем бота в груп­пу и даем ему пра­ва для пуб­ликации сооб­щений.

Даль­ше узна­ем chat id нашей груп­пы. Для это­го откры­ваем спе­циаль­ный URL:

https://api.telegram.org/bot<ваш_токен_телеграм_бота>/getUpdates

В отве­те нас инте­ресу­ет параметр messagechatid, в нем хра­нит­ся уни­каль­ный иден­тифика­тор чата груп­пы с нашим ботом.

Вы­вод в фор­мате 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

Пе­рехо­дим в дирек­торию /usr/src:

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

В пер­воначаль­ном кон­фиге /etc/telegramrc нуж­но ука­зать уни­каль­ный TOKEN бота и CHATID нашей груп­пы:

TOKEN='...'
CHATID='...'

Про­верить, при­ходят ли сооб­щения, мож­но так:

sendtelegram -m "test message from server"

В нашей груп­пе мы дол­жны получить сооб­щение от бота с ука­зан­ным тек­стом.

Ну и наконец, пишем наш скрипт.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    1 Комментарий
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии