Мониторинг Linux-серверов по SSH
Добавьте сервер с адресом и учётной записью — платформа каждые 30 секунд следит за входами, портами, администраторами, критичными файлами и своими canary-файлами, ничего не устанавливая.
Серверы наблюдаются без агента. У каждого тенанта своя пара ключей Ed25519; платформа входит с ней и читает то, что администратор прочитал бы через uname, last, w, ss и sha256sum. Мониторинг рассчитан на Linux: сигналы читаются стандартными командами Linux, поэтому другие системы с SSH-сервером подключаются, но сообщают меньше.
Добавление сервера
Заголовок раздела «Добавление сервера»-
Откройте Серверы. Ключ платформы — вверху страницы, в сейфе: отпечаток видят все, сам ключ открывает администратор — Показать ключ и текущий код аутентификатора — на 60 секунд. Скопируйте строку.
-
Добавьте эту строку в
~/.ssh/authorized_keysучётной записи, которую платформа будет использовать на сервере. Строка ограничена:no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty— ключ может выполнять команды платформы и ничего больше; украденной копией нельзя открыть оболочку или туннель. Можно также привязать её к адресу Legit AI черезfrom=(сейф предложит адрес, который видят серверы): тогда копия бесполезна в другом месте, но при смене адреса серверы перестанут отвечать.Либо введите в форме пароль этой учётной записи: платформа один раз войдёт с ним и установит ключ сама. Пароль используется только для этого входа и нигде не сохраняется.
-
Введите
username@hostилиusername@host:port, необязательное название и нажмите Добавить и проверить.
Прежде чем принять сервер, платформа проверяет, что по этому адресу и порту кто-то отвечает, — опечатка в адресе отклоняется сразу, а не тихо проваливается в фоне бесконечно.
Учётная запись, с которой добавлен сервер, автоматически попадает в список разрешённых пользователей сервера.
При добавлении сервера порт проходит, только если на нём отвечает сервер SSH; любой другой порт получает тот же ответ, что и закрытый. В облаке учётная запись может проверить 10 неработающих адресов за 15 минут, 60 адресов в час и 5 паролей на одном сервере за 15 минут. Повтор того же адреса не считается.
Добавить много серверов
Заголовок раздела «Добавить много серверов»Под формой добавления Добавить несколько серверов принимает список — по одному user@host или user@host:port в строке, как они уже записаны в инвентаре или в hosts-файле Ansible, — и добавляет и проверяет каждый по очереди, с одной строкой результата на сервер.
Рядом есть команда, которая сначала раскладывает ключ платформы на все серверы. Выполните её на машине, которая уже заходит на них по SSH, с их адресами в hosts.txt:
while read -r host; do ssh -n "$host" "mkdir -p ~/.ssh && chmod 700 ~/.ssh && grep -qF '<ключ>' ~/.ssh/authorized_keys 2>/dev/null || echo '<ограниченная строка>' >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"done < hosts.txtКонсоль подставит строку после показа ключа (администратор, свежий код); сервер, у которого ключ уже есть, не трогается.
Сканирование сети
Заголовок раздела «Сканирование сети»В разделе Карта сети → Обнаружение кнопка Сканировать эту сеть проверяет всю сеть с самого подключённого сервера: какие устройства отвечают, какие порты открыты и что они объявляют. Ничего не устанавливается, root не нужен: на сервере достаточно python3.
| Метод | Что даёт | Что нужно |
|---|---|---|
| TCP-соединение, ARP | Активные устройства, MAC, открытые порты | Ничего |
| Баннеры, HTTP | Версия SSH, заголовок веб-страницы, заголовок Server |
Ничего |
| NetBIOS, DNS, NTP, mDNS | Имя устройства, UDP-службы | Ничего |
| UPnP/SSDP | Производитель, модель, тип устройства | UPnP на устройстве |
| SNMP v2c/v3 | Прошивка, имя, время работы, интерфейсы, подключённые устройства, соседи LLDP | Доступ только для чтения от вас; для v3 net-snmp на сервере |
nmap |
Версии служб, ОС | nmap на сервере. Для ОС: root или setcap cap_net_raw,cap_net_admin,cap_net_bind_service+eip /usr/bin/nmap |
Каждый факт помечен как подтверждено (сообщило устройство) или предположение (префикс MAC, порты, TTL), с методом и доказательством. То, что прочитать не удалось, показано как неизвестно, с указанием, что поможет.
Границы. Только внутренние диапазоны, до 4096 адресов за сканирование, с ограниченной скоростью. Для запуска нужны ADMIN, новый код аутентификатора и подтверждение, что сеть ваша; это пишется в журнал аудита. Сканирование только читает: не подбирает пароли, не использует уязвимости и ничего не меняет. Остановить завершает его сразу. Первое сканирование становится базой; затем новое устройство или критически открытая служба открывают оповещение.
Чтение маршрутизатора изнутри
Заголовок раздела «Чтение маршрутизатора изнутри»Сканирование видит маршрутизатор снаружи. С логином Доступ к маршрутизатору читает его собственные списки: подключённые устройства и их аренды, прошивку, модель, серийный номер, время работы, интерфейсы, маршруты и соседние устройства. Эти факты помечаются как подтверждено, а устройство, известное только маршрутизатору, попадает в список и на карту. Чтение повторяется при каждом сканировании, а появившееся позже устройство вызывает оповещение.
| Тип | Как читается | На чём проверено |
|---|---|---|
| MikroTik | REST (RouterOS 7), бинарный API (RouterOS 6 и 7) или SSH | RouterOS 7.16.2. Вход с запросом для версий до 6.43 реализован по протоколу, на устройстве не проверялся |
| OpenWrt | API ubus или SSH | OpenWrt 24.10.4 |
| OPNsense | Ключ API | OPNsense 25.7 |
| UniFi | Вход на контроллер или UniFi OS либо ключ API | Вход и сайты на UniFi Network 9.0.114 без подключённых устройств. Строки устройств и клиентов, UniFi OS и ключ API соответствуют форматам Ubiquiti, на устройстве не проверялись |
| FortiGate | Токен REST API | По документации Fortinet, на устройстве не проверялся |
| Cisco IOS, Huawei VRP, Juniper, VyOS, EdgeOS, FortiOS | SSH: фиксированный список команд типа show |
По формату вывода каждого производителя, на устройстве не проверялись. Если модель отвечает иначе, соответствующая таблица остаётся пустой |
На домашних маршрутизаторах и устройствах провайдера (ZTE, Huawei HG и подобные) обычно нет открытого API, а SSH выключен. Включите SNMP, а SSH, если провайдер разрешает; иначе остаётся внешний вид сканирования.
К очень старым маршрутизаторам, которые предлагают только алгоритмы SSH на SHA-1, подключения нет: такая сессия не защитит пароль. Обновите прошивку или используйте SNMP.
Используйте учётную запись только для чтения. На MikroTik: /user add name=legit group=read password=.... Если логин может менять маршрутизатор, Legit AI предупредит.
Как это защищено.
- Только чтение. Команды и вызовы API заданы фиксированным списком, от людей команды не принимаются. Рабочая конфигурация не читается: в ней хеши паролей и ключи.
- Пароль не попадает на ваш сервер. Сессия SSH или TLS идёт от Legit AI до маршрутизатора; на сервере работает небольшой ретранслятор, который только передаёт байты, ему нужен
python3. - Ключ или сертификат маршрутизатора закрепляется при первом подключении и проверяется до отправки пароля. Если он изменился, пароль не отправляется, создаётся оповещение, и чтение ждёт, пока ADMIN не подтвердит изменение новым кодом.
- Отклонённый логин пробуется один раз и не повторяется, пока вы его не измените, поэтому учётная запись не блокируется, а пароль не подбирается.
- Незашифрованный вход отклоняется, пока вы не включите его для этого маршрутизатора; тогда Legit AI предупреждает при каждом чтении.
- Только частные адреса. Для выдачи логина нужны ADMIN, новый код аутентификатора и подтверждение, что маршрутизатор ваш. Логин шифруется, больше не показывается, удаляется вместе с сервером, а каждое изменение и чтение попадает в журнал аудита.
Что отслеживается
Заголовок раздела «Что отслеживается»Каждые 30 секунд, за одно подключение, платформа читает:
| Сигнал | Что поднимает |
|---|---|
Последние входы (last, w) |
Critical-алерт на любой вход учётной записи, которой нет в списке разрешённых: сразу собираются криминалистические данные и проверяется адрес источника |
Члены группы sudo (или wheel) |
Critical-алерт при добавлении кого-либо (T1098) |
| Прослушиваемые порты | High-алерт при открытии нового порта (T1571) |
SHA-256 файлов /etc/passwd, /etc/ssh/sshd_config, /etc/crontab, /etc/hosts и authorized_keys учётной записи |
Алерт при изменении любого из них |
| Inode, время изменения и число строк журнала auth | Алерт, если строк стало меньше или время изменения ушло назад без ротации (T1070.002) |
| Canary-файлы, которые вы разместили на сервере | Алерт, если файл прочитан, изменён или удалён |
| Маршрут по умолчанию, таблица соседей, открытые TCP-соединения, DNS-серверы | Карта сети: маршрутизатор (адрес, MAC и производитель), устройства, с которыми связывался сервер, и соединения, проверенные по разведке угроз. Это то, что знает сервер, а не сканирование сети |
| ОС, ядро, CPU, память, диск, самые тяжёлые процессы, установленные пакеты, версия OpenSSH | Карточка сервера и история его изменений |
Сервер, который перестал отвечать или которому не хватает памяти или диска, записывается в его историю состояния. Это эксплуатационное состояние, а не атака, поэтому оно не попадает в очередь алертов.
Разрешённые пользователи
Заголовок раздела «Разрешённые пользователи»Редактировать сервер → Разрешённые пользователи (ADMIN) — список учётных записей, входы которых ожидаемы, при необходимости с указанием диапазона сети. Их входы проходят тихо; любой другой вход — алерт.
Проверки по запросу
Заголовок раздела «Проверки по запросу»| Проверка | Как |
|---|---|
| Известные уязвимости OpenSSH сервера из NVD с вероятностью эксплуатации EPSS | Кнопка Сканировать на карточке сервера. Нужны разрешённые внешние запросы за данными об угрозах, поэтому в air-gap развёртывании не работает. |
Закрепление: задания cron, запущенные службы systemd, SUID-файлы, /etc/ld.so.preload |
POST /api/ssh/servers/{id}/scan-persistence |
Ключи хоста
Заголовок раздела «Ключи хоста»Первое подключение к серверу закрепляет его ключ хоста. Любое последующее подключение, которому предъявлен другой ключ, отклоняется и записывается в журнал аудита, — так машина на сетевом пути не сможет выдать себя за сервер. Если сервер действительно переустановлен, ADMIN снимает закрепление (DELETE /api/ssh/servers/{id}/host-key), и следующее подключение закрепит новый ключ.
Смена ключа платформы
Заголовок раздела «Смена ключа платформы»Заменить (администратор, свежий код и последние шесть символов текущего отпечатка) отправляет новый ключ на каждый сервер, который онлайн, и перед переключением входит с ним. Новый ключ занимает строку старого вместе с её параметрами — привязка from= сохраняется. Если хотя бы на один сервер войти не удалось, смена останавливается, и продолжает использоваться старый ключ. Через 90 дней сейф предложит замену.