Ноутбук остался в такси вечером пятницы. Машина уходит в локдаун из панели, там же видно, включено ли шифрование диска и где устройство было последний раз, а решение о стирании принимается в понедельник. Панель — это Go Guard, система управления парком рабочих машин, которую я разрабатываю; в интерфейсе она называет себя MDM Platform.
Почему своё, а не Intune или Jamf, разобрано в материале про собственный MDM вместо Intune и Jamf. Здесь — как оно устроено внутри.
- Что это и три способа управления
- Путь одной команды
- Четыре слоя и почему выбран каждый
- Шесть барьеров и приоритет второго фактора
- Что работает сегодня: Windows, Android, Linux
- Честные ограничения
- Частые вопросы
- Почему агент опрашивает сервер, а не получает команду?
- Что уже работает на Android?
- Можно ли войти более слабым вторым фактором?
- Нужен ли для сервера Docker?
- Нужна консультация?
Что это и три способа управления

На каждой машине живёт агент, который слушает задания и молча их выполняет; всё остальное на сервере: панель, очередь, хранилище и бот. Обзор — на сайте проекта, работа вживую — в демо-ролике. Каналов управления три:
- Веб-панель. Устройства и их состояние, карта, отчёты, роли — свыше 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
Здесь важно не преувеличивать, и матрица это показывает:
| Возможности | Windows | Android | Linux |
|---|---|---|---|
| Статус | Production | Базовый модуль | В планах |
| Агент и доставка | mdm-agent.exe ~12 МБ, v3.7; gRPC + mTLS, опрос :2053 | APK, 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 на вашу инфраструктуру, запишитесь на бесплатную консультацию.


