Введение

Привет, Хабр! В данной статье я постарался максимально подробно описать создание данной системы, при этом параллельно предоставить читателю хорошую теоретическую базу и понимание происходящего. Также хотел бы уточнить, что поскольку в статье объясняются достаточно базовые вещи и задействован относительно маленький спектр инструментов, то статья будет полезна в большей степени новичкам.

Как результат, в конце мы получим систему, которая каждый указанный промежуток времени будет запускать скрипт с сканером портов и проверять список IP-адресов, отправляя сообщение о всех открытых портах на указанных адресах.

Создание системы сканирования портов

Небольшое отступление: все действия я производил на виртуальной машине, так как мне было удобно. Виртуальная машина была установлена с AlmaLinux на VM VirtualBox. Если вам будет удобнее выполнять это на вашей домашней операционной системе (Linux, разумеется), вас никто не ограничивает.

Немного о VM Virtual Box

VM VirtualBox - свободная и открытая система виртуализации, разработанная и поддерживаемая компанией Oracle. Она позволяет пользователям создавать и запускать виртуальные машины на своих компьютерах, эмулируя аппаратное обеспечение и позволяя установить и запустить различные операционные системы внутри виртуальных сред.

Основные возможности VM VirtualBox включают создание и управление виртуальными машинами, настройку параметров аппаратного обеспечения виртуальной машины (например, количество процессоров, объем памяти, виртуальный жесткий диск и другие устройства), установку операционных систем и приложений внутри виртуальных машин, обмен файлами и ресурсами между хостом и гостевыми системами, а также возможность делать снимки состояния виртуальных машин и восстанавливаться к ним при необходимости.

Для запуска AlmaLinux на виртуальной машине нам необходимо скачать образ ISO нужной операционной системы из Интернета. Затем мы можем создать виртуальную машину в меню VM VirtualBox.

Меню создания виртуальной машины в VM VirtualBox
Меню создания виртуальной машины в VM VirtualBox

Важной настройкой для нашей задачи является настройка адаптера виртуальной машины в режиме "сетевого моста". Когда виртуальная машина настроена в режиме сетевого моста, она получает собственный IP-адрес, аналогичный другим устройствам в сети. Это позволяет ей полноценно взаимодействовать с другими устройствами в сети, включая обмен данными, доступ к сетевым ресурсам, использование сетевых служб и т.д.

Меню настройки сети виртуальной машины в VM VirtualBox
Меню настройки сети виртуальной машины в VM VirtualBox

Знакомство и установка Alma Linux

Alma Linux - это свободная и открытая операционная система на базе Linux, разработанная с целью предоставить стабильную и надежную альтернативу коммерческому дистрибутиву CentOS. Alma Linux создана на основе исходного кода Red Hat Enterprise Linux и предлагает совместимость с пакетами, инструментами и приложениями RHEL.

Из приятного в данной ОС можно выделить следующее:

  • Базовую совместимость с RHEL и его пакетами

  • Долгосрочная поддержка

  • Открытый исходный код

  • Alma Linux является полностью бесплатным дистрибутивом

Почему именно Alma Linux?

Выбор Alma Linux в рамках нашей задачи не имеет объективных обоснований. Можно использовать широкий спектр операционных систем из Linux семейства. Мне же просто удобнее работать с Alma.

Первое взаимодействие с ОС

При первом запуске виртуальной машины мы встречаем понятное визуальное меню установки. Далее мы выбираем язык, настраиваем время и дату, а также задаем пароль для пользователя root, выполняя базовую настройку, требуемую системой. В рамках нашей задачи я ограничился установкой минимального пакета операционной системы без графической оболочки.

Когда установка прошла успешно, первым делом мы обновляем пакеты операционной системы с помощью следующей команды в командной строке:

sudo dnf update

Построение этой команды выглядит следующим образом:

  1. "sudo" - команда, которая позволяет выполнить следующую за ней команду с привилегиями суперпользователя (root). Суперпользователь имеет полные права доступа и может выполнять системные операции, включая установку и обновление пакетов.

  2. "dnf" - это инструмент управления пакетами, используемый в дистрибутивах Fedora и связанных с ними. Раньше использовали инструмент "yum", но сейчас dnf предлагает более современный и быстрый способ управления пакетами.

  3. "update" - это команда, передаваемая в dnf, указывающая ему на выполнение операции обновления пакетов.

Вот небольшой список основных команд, которые можно использовать с командой dnf:

sudo dnf install <package_name>
# устанавливает указанный пакет и его зависимости

sudo dnf update
# обновляет все установленные пакеты на последние версии, если они доступны

sudo dnf remove <package_name>
# удаляет указанный пакет из системы

dnf search <keyword>
# поиск пакетов по ключевому слову или шаблону

dnf list installed
# вывод списка всех установленных пакетов в системе

dnf info <package_name>
# подробная информация о указанном пакете, включая его версию, описание и зависимости

Далее нам нужно установить сканер портов nmap:

sudo dnf install nmap

А так же, для удобства работы, текстовый редактор nano:

sudo dnf install nano

Знакомство с текстовым редактором nano

Nano - простой в использовании текстовый редактор командной строки, доступный в Alma Linux и других дистрибутивах Linux. Он предоставляет простой и интуитивно понятный интерфейс для редактирования текстовых файлов.

Редактор разбит на 4 основные части: верхняя строка содержит версию программы, текущее имя файла, который редактируется, и были ли внесены изменения в текущий файл. Вторая часть это главное окно редактирования в котором был отображен редактируемый файл. Строка состояния - 3 строка снизу - показывает разные важные сообщения. Две строки внизу показывают наиболее часто используемые комбинации клавиш и их функционал.

Интерфейс редактора nano
Интерфейс редактора nano

Комбинации с Control обозначены символом (^) и вводятся при помощи нажатой кнопки (Cntrl) или двойном нажатии Еsсаре (Esc). Комбинации с Еsc обозначены символом Мета (М) и могут быть введены при помощи кнопок Еsc, Alt или Meta в зависимости от используемой клавиатуры. Также нажатие Еsc дважды, затем ввод трёхзначного числа от 000 до 255 вставит символ с соответствующим кодом.

Немного о Nmap

Nmap (Network Mapper) - это мощный и популярный инструмент для сканирования сети, разработанный для исследования и анализа устройств, портов, служб и сетевой инфраструктуры. Он предоставляет возможности для активного и пассивного сканирования сети, а также множество функций для обнаружения уязвимостей и анализа безопасности. Так же nmap широко используется администраторами сетей, пентестерами и аналитиками безопасности.

Вот несколько основных команд, которые можно использовать с Nmap:

nmap <целевой хост или IP-адрес>
# базовое сканирование портов на указанном хосте или IP-адресе 

nmap -sV <целевой хост или IP-адрес>
# сканирует порты на указанном хосте или IP-адресе и пытается определить версии служб

nmap -O <целевой хост или IP-адрес>
# сканирует порты на указанном хосте или IP-адресе и пытается определить операционную систему

nmap -sC <целевой хост или IP-адрес>
# сканирование с применением скриптов Nmap

nmap -sS <целевой хост или IP-адрес>
# TCP SYN-сканирование для определения открытых портов

nmap -PE <целевой хост или IP-адрес>
# ICMP-сканирование для определения доступности и отклика хоста

Вводная теория про порты

Порты - это числовые идентификаторы, используемые в сетевых протоколах для обмена данных между компьютерами или устройствами. Когда компьютер или устройство подключается к сети, ему назначается уникальный сетевой адрес, известный как IP-адрес. Порты, с другой стороны, идентифицируют конкретные приложения или службы, которые работают на этом устройстве.

Всего существует 65535 доступных портов, которые могут быть использованы для обмена данными. Порты могут быть разделены на три основных типа:

  1. Известные порты: Известные порты имеют номера от 0 до 1023 и зарезервированы для широко используемых служб и протоколов, таких как HTTP (порт 80), HTTPS (порт 443), FTP (порт 21), SSH (порт 22) и другие. Эти порты широко известны и часто используются в сетевых приложениях.

  2. Зарегистрированные порты: Зарегистрированные порты имеют номера от 1024 до 49151 и предназначены для приложений, которые не являются широко известными, но все еще требуют уникального порта для обмена данными. Множество приложений и служб, разработанных сторонними разработчиками, используют зарегистрированные порты.

  3. Динамические (или частные) порты: Динамические порты имеют номера от 49152 до 65535 и используются для временных соединений и динамического назначения портов клиентами. Когда клиентское приложение устанавливает сетевое соединение с сервером, оно часто использует динамический порт для отправки данных.

Что такое Bash-скрипты?

Скрипт - это последовательность команд, записанных в текстовом файле, который выполняется с помощью интерпретатора командной оболочки или другого интерпретатора скриптов. Скрипты используются для автоматизации задач, выполнения определенных действий и обработки данных.

Скрипты позволяют создавать последовательности команд, которые выполняются по порядку, с возможностью добавления условий, циклов и других конструкций программирования. Они предоставляют удобный способ объединить несколько команд в одну операцию или выполнить определенную последовательность действий.

Скрипты могут быть написаны на различных языках программирования, в зависимости от интерпретатора, используемого для их выполнения. Например, скрипты командной оболочки могут быть написаны на Bash, PowerShell, Python, Perl и других языках. Каждый язык программирования предоставляет свой набор синтаксических правил и функций для написания скриптов.

Bash (Bourne Again SHell) - командная оболочка, интерпретатор командной строки и сценариев, используемая в операционных системах Unix и Linux. Bash является одной из самых популярных командных оболочек и поставляется по умолчанию в большинстве дистрибутивов Linux.

Bash предоставляет пользователю интерфейс для взаимодействия с операционной системой и выполнения различных команд. Он обеспечивает возможности, такие как запуск программ, управление файлами и каталогами, настройка переменных окружения, управление процессами и многое другое.

Написание Bash-скрипта

Для реализации нашей задачи Bash-скрипт должен выполнить следующие действия:

  1. Запустить сканирование с помощью Nmap

  2. Сохранить отчеты сканирования в файл

  3. Перезаписать файл с отчетами сканирования при каждом выполнении скрипта

  4. Отправить отчеты сканирования через API Telegram бота в наш чат

Прежде чем приступить к написанию самого скрипта, давайте создадим рабочую директорию с помощью следующей команды:

mkdir sсaner

Переместимся в нее:

cd scaner/

В директории "scanner" я создал еще одну папку под названием "script". Внутри этой папки были созданы два текстовых файла: "adresa.txt" и "openports.txt". Также был создан скрипт с именем "scaner.sh". Для создания файла можно использовать следующую команду:

touch example.example

Таким образом, в файле "adresa.txt" содержится список IP-адресов, которые нужно отсканировать. Скрипт "scaner.sh" выполняет сканирование и записывает результаты в файл "openports.txt". Затем результаты отправляются в чат Telegram.

Код скрипта "scaner.sh" с комментариями:

#!/bin/bash
nmap -iL adresa.txt | grep -e ‘open’ -e ‘for’ --> openports.txt
#cканирeм IP-адреса из adresa.txt используя Nmap
#оставляем только строки, содержащие слова 'open' или 'for'
#выводим в другой openports.txt
BOT_TOKEN=
#переменная отвечающая за токен бота
CHAT_ID=
#перееменная отвечающая за чат ID

FILE_PATH=/root/scaner/script/openports .txt
#переменная с указанием пути к предаваемуому txt файлу

FILE_CONTENTS-$(cat $FILE_PATH | sed 's/\\/\\\\/g; s/\//\\\//g; s/\n/\\n/3;')
# экранируем обратные косые черты, косые черты и символы новой строки

curl -s -X POST https://api.telegram.org/bot$B0T_TOKEN/sendMessage -d chat_id=$CHAT_ID -d text="$FILE_CONTENTS"
#через api бота передаем содержимое подготовленного txt файла сообщением 

SELinux

SELinux (Security-Enhanced Linux) - это набор механизмов безопасности для контроля доступа на уровне ядра операционной системы Linux. Он предоставляет дополнительный уровень защиты, который дополняет классические механизмы контроля доступа, такие как пользователи и группы.

Основной принцип SELinux состоит в принятии политик безопасности на уровне ядра, которые определяют, какие операции разрешены для различных процессов и ресурсов системы. SELinux работает на основе принципа наименьших привилегий, что означает, что процессы получают только минимальные привилегии, необходимые для выполнения своих задач.

SELinux имеет три режима работы:

  1. "Enforcing" - SELinux активен и строго применяет политику безопасности, запрещая все действия, которые не разрешены. Нарушения политики регистрируются в журнале безопасности и блокируются.

  2. "Permissive" - SELinux активен, но не запрещает недопустимые действия. Вместо этого, нарушения политики регистрируются в журнале безопасности, но действия разрешаются.

  3. "Disabled" - SELinux полностью отключен, и классические механизмы контроля доступа используются вместо него.

Для выполнения нашей задачи временно отключим SELinux. Для этого откроем файл конфигурации:

sudo nano /etc/selinux/config

Далее найдем строку "SELINUX=enforcing" в файле конфигурации и изменить ее на "SELINUX=disabled". Это позволит полностью отключить SELinux.

Не забудьте сохранить изменения , а так же перезагрузить систему, чтобы изменения вступили в силу:

sudo reboot

Chmod

Chmod - команда которая используется в Linux для изменения прав доступа к файлам и директориям. Она позволяет устанавливать разрешения для чтения, записи и выполнения для владельца файла, группы и других пользователей.

Формат команды chmod выглядит следующим образом:

chmod <права_доступа> <имя_файла>

Устанавливать права можно двумя способами: с помощью буквенного обозначения прав (rwx) и с помощью числового в восьмеричной системе счисления.

Памятка по установке прав доступа командой chmod
Памятка по установке прав доступа командой chmod

Для нашей задачи нам необходимо предоставить права на чтение и выполнение скрипта "scaner.sh". Для этого мы можем использовать следующую команду:

chmod +rx scaner.sh

Далее предоставим права на чтение текстового файла "adresa.txt" и выполнение скрипта "scaner.sh":

chmod +r adresa.txt

Запуск скрипта с помощью systemd

Systemd - это системный менеджер и инициализационная система для операционных систем на базе Linux. Он заменяет предыдущую инициализационную систему init и предоставляет мощный инструментарий для управления процессами, службами, монтирования файловых систем и другими аспектами системы.

В systemd нам понадобятся файлы с расширениями .service и .timer, которые используются для описания служб и таймеров соответственно. Обычно эти файлы размещаются в директории etc/systemd/system/. Давайте сразу перейдем в эту директорию:

cd etc/systemd/system/

Файлы типа example.service

Файлы данного типа представляют собой юниты, которые описывают службы в системе. Они содержат информацию о том, как запускать и управлять определенным процессом или приложением. В файле .service определяются параметры, такие как исполняемый файл, аргументы командной строки, окружение, зависимости, права доступа и другие настройки, которые необходимы для правильного функционирования службы.

Разберемся с кодом файла "scaner.service":

[Unit] # указывается общая информация о службе
Description=scaner # предоставляет описание службы "scaner"
# данное описание будет отображаться при использовании команды systemctl

[Service] # настройки для выполнения службы
User=root # указывает, что служба будет запущена от имени пользователя "root"
Type=oneshot # определяет тип службы как "oneshot", что означает, что служба будет запущена только один раз и завершится после выполнения основной команды
WorkingDirectory=/root/scaner/script # указывает рабочую директорию, в которой будет выполняться служба
ExecStart=/bin/bash /root/scaner/script/scaner.sh # определяет команду, которая будет запущена при старте службы

[Unstall] # определяет зависимости и настройки установки службы
WantedBy=milti-user target # указывает на целевую точку, в которой служба должна быть включена

Файлы типа example.timer

Данные файлы являются юнитами, используемыми для описания таймеров в системе. Таймеры в systemd позволяют планировать запуск определенных задач или служб в заданное время или с определенной периодичностью. Файлы .timer определяют настройки таймера, такие как интервал, время запуска, точность и другие параметры. Когда таймер срабатывает, он может запустить связанный с ним .service-файл или выполнить определенное действие.

Разберемся с кодом файла файла "scaner.timer":

[Unit]
Description=scaner
Requires=scaner.service

[Timer] #  указываются настройки для таймера
Unit=scaner.service # определяет имя службы, которую необходимо активировать ("scaner.service")
OnCalendar=*-*-* *:*:00 # указывает на расписание срабатывания таймера(в нашем случае каждую минуту)

[Install]
WantedBy=timers.target

При настройке конфигурация параметра OnCalendar= помните, что значения даты и времени следуют формату YYYY-MM-DD и HH:MM:SS соответственно.

Ниже приведу несколько примеров конфигурации для лучшего понимания:

OnCalendar=*-*-* *:*:* #каждую минуту

OnCalendar=2023-06-01 *-*-* *:*:* #один раз в указанную дату и каждую минуту после этого

OnCalendar=Mon,Tue,Wed *-*-* 18:30:00 #каждый понедельник, вторник и среду в 18:30:00

OnCalendar=15:00 #каждый день в 15:00:00

OnCalendar=*-06-* 12:00:00 #каждый день в 12:00:00 в июне (любого года)

OnCalendar=*-*-* 0/5:00:00 #каждые 5 часов начиная с полуночи

OnCalendar=*-*-* 10:30:00 #каждый день в указанное время (10:30:00)

При использовании параметра OnCalendar= убедитесь, что часовой пояс вашей системы правильно настроен, чтобы таймер срабатывал в ожидаемое время.

Создание telegram бота

Как вы могли заметить из выше прочитанного текста, в целом нам всего лишь необходимо получить токен нового бота и узнать ID чата, в который мы будем добавлять этого бота.

Получение токена

Для получения токена необходимо отправить официальному боту команду "/newbot" и указать имя и имя пользователя для будущего бота. После этого вы получите сообщение:

Сообщение об успешной регистрации бота с токеном в нем
Сообщение об успешной регистрации бота с токеном в нем

Получение ID чата

Существует множество различных способов узнать ID чата, но я пойду по пути наименьшего сопротивления и добавлю специального бота в существующую группу. Поскольку этот бот не является официальным, ссылку я вам не дам.

Сообщение от бота с ID чата
Сообщение от бота с ID чата

Запуск системы сканирования портов

После получения токена бота и ID чата необходимо внести соответствующие значения в переменные в нашем скрипте "scan.sh":

BOT_TOKEN= 0000000000 : AAAAAAAAAAAFFFFFFFFFF
CHAT_ID= -0000000000000

Далее, для обновления конфигурации демона systemd и инициализации таймера, который будет автоматически запускаться при загрузке системы, используем следующие команды:

sudo systemctl daemon-reload
#перезагрузка демона systemd

sudo systemctl enable scaner.timer
#включение таймера при заупске системы

sudo systemctl start mytimer.timer
#непосредственный запуск

Запрашиваем статус "scaner.timer" командой:

sudo systemctl status scaner.timer

Если все прошло успешно, таймер scaner.timer будет находиться в состоянии "active".

Пример успешного запуска таймера
Пример успешного запуска таймера

Результат

После запуска таймера, в чат было отправлено первое сообщение, а таймер начал отсчет до следующей отправки. Ниже приведен пример сообщения после работы системы:

Сообщение отсылаемое ботом
Сообщение отсылаемое ботом

Заключение

В данной статье я, на примере разработки простой системы оповещения о открытых портах, постарался ознакомить читателя с используемыми инструментами и предоставить обширную теоретическую базу для понимания процесса. Благодарю вас за прочтение.

Комментарии (5)


  1. Cruzlik
    03.06.2023 06:08

    Отличная статья для новичка. Все подробно расписано.


  1. leech001
    03.06.2023 06:08

    Можно немного все это упростить с использованием контейнеров. Вот писал на GO для этого приложение https://github.com/grfc-ru/nmap-telegram-bot


  1. 3ycb
    03.06.2023 06:08

    OnCalendar=*-*-* *:*:00 # указывает на расписание срабатывания таймера(в нашем случае каждую минуту)

    Тут понятно почему каждую минуту(:00)
    А тут то почему? Ведь (:*)


    OnCalendar=*-*-* *:*:* #каждую минуту
    OnCalendar=2023-06-01 *-*-* *:*:* #один раз в указанную дату и каждую минуту после этого

    Может быть, каждую секунду?
    Прокомментируйте пожалуйста.


    1. levgorb Автор
      03.06.2023 06:08

      Здравствуйте, я опечатался, действительно каждую секунду! Спасибо за поправку.


  1. DKuksenok
    03.06.2023 06:08

    Типичная проблема мануалов на системы с selinux. Если уж начали писать подробно, то почему selinux просто отключили?