Геолокация офисных ноутбуков «своими руками»


Предыдущая | Следующая

Итак, мы (офисные повелители и техно-шаманы) хотим знать, где наши кровные, корпоративные ноутбуки. Где они вот сейчас. И где были вчера.

 

Зачем? Что за вопрос!

Ноутбуки выдаются на руки. Они мобильны, в этом их суть. Выдаются они под роспись... или нет? Культура обязательного бумажного учёта может быть не внедрена, заброшена, или предоставляемые данные вызывают сомнения. Но даже имея данные "с кого спрашивать", хорошо иметь и данные "где искать". Никто не отменял уволившихся "одним запойным днём" сотрудников, забывчивых сотрудников, воровство третьими лицами и много чего ещё. Даже если мобильный хост имеет постоянное и обязательное для эксплуатации подключение к серверу компании, а сотрудник авторизуется индивидуальным цифровым ключом, вопрос "где" по-прежнему актуален.

Значит, надо. Но как? Идеальный вариант: когда ноутбук всё делает сам. Желательно — независимо от включения, и данные передаёт на сервер организации. К сожалению или к счастью, вариант этот весьма экзотический и встречается очень редко. И стоит, как чугунный мост. Давайте кратко вспомним, с помощью каких данных вообще можно установить местонахождение объекта:

  1. Спутниковые системы навигации.

Всё.

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

То есть, воткнём куда-нибудь в корпус ноута GPS-трекер для скота от братского китайского народа, и проблема решена? Нет, конечно. Во-первых, нужно обеспечить модуль энергией для работы. Можно использовать:

Во-вторых, данные нужно передавать. Это значит, что:

В-третьих, спутниковые системы не работают сквозь крыши и вообще закрытые помещения (так что большую часть данных от такого модуля мы не получим — он просто "не найдётся", если не будет иметь дополнительных источников данных о местоположении).

Рассмотрим дополнительные источники данных:

Понятно, что нужна база данных. Которую кто-то собрал и актуализирует. То есть, опять расходы.

Рассмотрим решение максимально простое, дешёвое и быстрое.
Условия:

Будем использовать геолокацию по видимым точкам доступа Wi-Fi. Есть вот такие варианты: https://en.wikipedia.org/wiki/Wi-Fi_positioning_system#Public_Wi-Fi_location_databases,
а также сервисы Google, Yandex, Mozilla и внезапно встроенный в Windows начиная 7 сервис от Microsoft.

Алгоритм действий:

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

  2. Отсылаем данные на наш сервер, кладём в базу данных.

Разберём первый пункт. Лично мне решение "иметь сырые данные" видится более надёжным. Под Windows это можно сделать даже при помощи cmd:

netsh wlan show all

или

netsh wlan show networks mode=bssid

Результат придётся пропарсить , а для надёжности — предварительно включить все имеющиеся беспроводные адаптеры (код грубый, но найти решение на чём-нибудь вроде Powershell мне найти не удалось — везде используется netsh).

Под Ubuntu это будет что-то вроде
nmcli dev wifi

В целом, ничего сложного.

Теперь пункт 2 — данные нужно передать. Тут ориентируемся на уже имеющиеся возможности: можно и на Zabbix в виде "сырой строки" (под Windows могут быть проблемы с кодировками, как всегда), на самописный сервер, даже на специальную почту. Конкретику описывать не будем, исходя из принципа security through obscurity.

Осталось конвертировать данные о сетях в координаты, а в идеале — и в адрес. Что касается адреса, тут всё просто и бесплатно: проект https://www.openstreetmap.org делает "обратный" перевод координат в адрес и возвращает результат в формате json, запрос вроде:

https://nominatim.openstreetmap.org/reverse?lat=x&lon=y&zoom=z&addressdetails=1&format=json

В зависимости от точности координат и района результат может быть разным по содержанию (только район, или не будет номера дома, или что-то ещё).

С конвертацией данных о видимых точках доступа Wi-Fi в координаты сложнее. Большинство сервисов является платными для коммерческого использования. Самый адекватный из явно разрешённых для коммерческого использования вариант: 100 запросов в сутки и ссылка на проект https://unwiredlabs.com/pricing. Якобы свободный сервис от Mozilla, на который я возлагал большие надежды, открыт только для пополнения. Сервис от Яндекса "Локатор", насколько мне удалось разобраться, не имеет на данный момент объявленной цены для коммерческого использования https://yandex.ru/legal/locator_api и предоставялется по принципу "свободный, как есть, для всех", но это не точно.

Конвертация, к примеру, для сервиса Яндекса, проходит через посылку файла с данными в формате JSON через POST:
wget --post-file=data.txt http://api.lbs.yandex.net/geolocation

В ответе получаем координаты. Точные или примерные, если данных недостаточно. Во втором случае, как я понимаю, используется "геолокация по IP"

причём

с точностью до города или хуже.

Остаётся малость — визуальное представление. Если есть сервер Zabbix, можно показывать ноутбуки на карте прямо внутри интерфейса. У меня было готовое решение на Leaflet, которое можно быстро адаптировать:

 

Также не поленился и сделал прокручиваемую историю местоположений каждого ноутбука:

 
Особенный повод для гордости — "больной сотрудник" отдыхает за границей с офисным ноутбуком
Особенный повод для гордости — "больной сотрудник" отдыхает за границей с офисным ноутбуком

В целом, на самом простом уровне задача реализуется доступно любому грамотному сисадмину.

P.S. Приношу свои извинения за изменение опроса "пост-фактум". Первоначальный вариант был слишком общим. Будем считать, что до сего момента отвечали только сисадмины.

https://habr.com/ru/post/579314/