Перейти к содержимому
LEGIT AIDOCS
Открыть консоль

Мониторинг Linux-серверов по SSH

Добавьте сервер с адресом и учётной записью — платформа каждые 30 секунд следит за входами, портами, администраторами, критичными файлами и своими canary-файлами, ничего не устанавливая.

Серверы наблюдаются без агента. У каждого тенанта своя пара ключей Ed25519; платформа входит с ней и читает то, что администратор прочитал бы через uname, last, w, ss и sha256sum. Мониторинг рассчитан на Linux: сигналы читаются стандартными командами Linux, поэтому другие системы с SSH-сервером подключаются, но сообщают меньше.

  1. Откройте Серверы. Ключ платформы — вверху страницы, в сейфе: отпечаток видят все, сам ключ открывает администратор — Показать ключ и текущий код аутентификатора — на 60 секунд. Скопируйте строку.

  2. Добавьте эту строку в ~/.ssh/authorized_keys учётной записи, которую платформа будет использовать на сервере. Строка ограничена: no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty — ключ может выполнять команды платформы и ничего больше; украденной копией нельзя открыть оболочку или туннель. Можно также привязать её к адресу Legit AI через from= (сейф предложит адрес, который видят серверы): тогда копия бесполезна в другом месте, но при смене адреса серверы перестанут отвечать.

    Либо введите в форме пароль этой учётной записи: платформа один раз войдёт с ним и установит ключ сама. Пароль используется только для этого входа и нигде не сохраняется.

  3. Введите 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 дней сейф предложит замену.