Go Guard: как устроена MDM-платформа | Илья Арестов
ИТ

Go Guard: как устроена собственная MDM-платформа

Ноутбук остался в такси вечером пятницы. Машина уходит в локдаун из панели, там же видно, включено ли шифрование диска и где устройство было последний раз, а решение о стирании принимается в понедельник. Панель — это Go Guard, система управления парком рабочих машин, которую я разрабатываю; в интерфейсе она называет себя MDM Platform.

Почему своё, а не Intune или Jamf, разобрано в материале про собственный MDM вместо Intune и Jamf. Здесь — как оно устроено внутри.

Что это и три способа управления

Go Guard: панель, агент и Telegram-бот

На каждой машине живёт агент, который слушает задания и молча их выполняет; всё остальное на сервере: панель, очередь, хранилище и бот. Обзор — на сайте проекта, работа вживую — в демо-ролике. Каналов управления три:

  • Веб-панель. Устройства и их состояние, карта, отчёты, роли — свыше 130 функций.
  • Telegram-бот. Те же действия кнопками в чате: блокировка, перезагрузка, снимок экрана, гео, одобрение устройств.
  • Массовые команды. Одно действие на группу: раскатить программу на отдел или проверить шифрование по парку.

Команд больше тридцати пяти; локдаун среди них особый — блокировка, переживающая перезагрузку: она отличает «заблокировал экран» от «заблокировал устройство».

Путь одной команды

От MDM ждут, что сервер «дотянется» до машины. Здесь наоборот, «заблокировать экран» идёт так:

  • Панель вызывает SendCommand(cmd=lock), задание встаёт в очередь со статусом pending.
  • Агент сам обращается к серверу: PollCommand() — обычный цикл, независимо от наличия заданий.
  • Сервер отдаёт cmd: lock, агент выполняет executeCommand(), экран заблокирован.
  • Агент отчитывается: ReportResult(status=ok).
  • Панель и бот забирают результат через SubscribeNotifications, в Telegram приходит push.

Соединение инициирует устройство, поэтому входящие порты открывать не нужно: управление работает и в офисе, и дома, и в гостиничном Wi-Fi — за NAT и файрволом, куда push не дошёл бы. Исключение — Android: доставку берёт Firebase.

Четыре слоя и почему выбран каждый

  • Интерфейс: AdminLTE 3.2 на Bootstrap 4, карты Leaflet, графики ApexCharts, живые обновления на HTMX и WebSocket.
  • Логика: Django 5.2 на Python 3.10 держит панель и роли (Daphne, :8000); сервер команд (:2053) и бот (:8081) — Go 1.23, протокол gRPC с Protobuf v3.
  • Данные: PostgreSQL 14 (:5432) как база панели, Redis 7 (:6379) как кэш, данные агентов в JSON, гео через GeoIP2.
  • Основа: Nginx с TLS 1.2+ и Let’s Encrypt, Ubuntu Linux, systemd. Снаружи доступны Nginx (:80 и :443) и порт агентов :2053, остальные службы слушают localhost.

Go компилируется в один бинарник: агент занимает около 12 МБ и не тянет ни рантайма, ни установщика — для программы, которую раскатывают на сотни машин, аргумент решающий. gRPC с Protobuf компактнее JSON поверх HTTP, а systemd без Docker — меньше слоёв, в которых что-то ломается ночью.

Шесть барьеров и приоритет второго фактора

Кто получил панель — получил все машины, поэтому проверок шесть:

  • TLS и mTLS. С агентами — взаимная сверка сертификатов x509: команду отдаёт только доверенный сервер, а не любой, кто знает адрес.
  • Фильтр адресов. ACL по IP и подсетям CIDR — до формы входа.
  • Вход и второй фактор. Пять методов: PIV, FIDO2, TOTP, Email, Telegram, плюс резервные коды.
  • Роли. RBAC с организациями, отделами и тегами: руководитель видит отдел, сотрудник — свои машины.
  • Шифрование. Пароли и ключи восстановления BitLocker хранятся зашифрованными (AES, PBKDF2).
  • Журнал. AuditLog, CommandHistory, ACLLog, LoginAttempt: кто, откуда, когда и с каким результатом.

Второй фактор выстроен по приоритету: YubiKey (PIV или FIDO2), затем TOTP, Email, Telegram. При активном ключе система не даёт откатиться на более слабый метод — иначе достаточно нажать «войти другим способом» и увести код из почты. Резервные коды остаются на случай потери.

Что работает сегодня: Windows, Android, Linux

Здесь важно не преувеличивать, и матрица это показывает:

ВозможностиWindowsAndroidLinux
СтатусProductionБазовый модульВ планах
Агент и доставкаmdm-agent.exe ~12 МБ, v3.7; gRPC + mTLS, опрос :2053APK, push через Firebase
МониторингПроцессор, память, диск, ПО, IPМодель, Android, батарея, Wi-Fi, IP
Питание и сессия7 команд: ping, lock, unlock, reboot, shutdown, notify, renameБлокировка экрана
Стирание и локдаунlockdown on/off, wipe, TOTP-разблокировкаwipe
ПО и удалённый доступinstall_software, run_script, подписанная библиотека, RustDesk, HelpDesk
Диски и бэкап15 команд: BitLocker ×10, Veeam ×5, лицензии
Отчёты и геоСнимок экрана, гео GPS/Wi-Fi/IP, карта, PDF

Дальше — Android до уровня Windows, затем Linux, потом Telegram Mini App и масштабирование до 10 000+ устройств. Даты не называю.

Честные ограничения

  • Опрос — это не мгновенно. Команда ждёт до следующего обращения агента: цена работы за NAT, и обмен выгодный.
  • Android — мониторинг, блокировка и стирание. Ни скриптов, ни установки ПО, ни отчётов: строить на нём мобильный парк рано. Linux ждёт своей очереди после Android.
  • Права на машине. Агент включает BitLocker, ставит программы и стирает диск — такие операции требуют повышенных прав на устройстве. Отсюда подпись скриптов, которую система сверяет перед запуском; и всё же кто владеет сервером, владеет парком.

Управление устройствами — один из блоков услуг по информационной безопасности, рядом с периметром и SIEM.

Частые вопросы

Почему агент опрашивает сервер, а не получает команду?

Агент забирает задание из очереди вызовом PollCommand и возвращает результат. Входящие порты открывать не нужно: управление работает за NAT и файрволом.

Что уже работает на Android?

Мониторинг (модель, версия Android, батарея, Wi-Fi, IP), блокировка экрана и стирание. Команды идут через Firebase, агент ставится из APK.

Можно ли войти более слабым вторым фактором?

Нет. Приоритет: YubiKey (PIV или FIDO2), затем TOTP, Email, Telegram. При активном ключе откат на слабый метод запрещён; на случай потери есть резервные коды.

Нужен ли для сервера Docker?

Нет, сервер работает нативно на Ubuntu под systemd: снаружи доступны Nginx и порт агентов :2053, остальные службы слушают localhost.


Нужна консультация?

Если вы выбираете, чем управлять парком машин, или хотите понять, ложится ли Go Guard на вашу инфраструктуру, запишитесь на бесплатную консультацию.

Оцените статью