IT-инфраструктура штабов Навального и сбор подписей: железо и сети
В предыдущем посте мы рассказали, что такое сбор подписей и почему его бессмысленно вести без специализированной IT-инфраструктуры. А эта глава про сетевое и компьютерное оборудование федеральной сети штабов Навального, а также про разработку собственного сканера документов.
Какие задачи мы решали
Оборудовать рабочие места сотрудников, обеспечить каждый штаб стабильным и защищенным доступом к служебным веб-приложениям, сделать видеонаблюдение за помещениями штабов, организовать сканирование документов для проверки документов подписантов.
Ожидаемые трудности:
— кража оборудования до инициализации комплекта оборудования;
— кража оборудования после инициализации;
— отключение интернета (отрезали провод, создали помехи в канале);
— человеческий фактор (любые некорректные действия с оборудованием);
— токсичные работники штаба;
— быстрый переезд (который хуже пожара);
— собственно пожар (и другие способы физического уничтожения штаба).
Мы подобрали оборудование так, что любой элемент инфраструктуры легко заменяется, и его не обязательно везти из центрального штаба, а можно купить в местных магазинах. Сборка оборудования состоит из простейших операций уровня «вставьте провод в разъем». Последовательность действий подробно описана в инструкции (с гифками!).
Все конфигурации можно обновить удаленно, пока работает интернет. Если интернет не работает, сотрудники штаба могут по инструкции сбросить все настройки, используя скрипты на операторских устройствах.
Доступ в штабную VPN-сеть выдается на основе нескольких факторов, чтобы кража оборудования (с сертификатом, ключами PSK) или утечка пароля не приводили к утечке данных. Все устройства отслеживаются в специальном приложении и могут быть заблокированы удаленно.
Ниже описаны основные принципы без глубокой детализации. Скрипты и конфигурации пока не выкладываем в открытый доступ по соображениям безопасности.
Элементы инфраструктуры
Гипервизор — сервер, на котором работают KVM-виртуалки с нужными приложениями.
Owl — виртуальная машина с приложением для операторских рабочих станций.
Video-сервер — виртуальная машина, на которой крутится ivideon-server и захватывает поток с камер.
Штабной комп — личный компьютер работника штаба, с которого можно получать доступ к закрытой части наших приложений и выходить в интернет.
R-station — операторская станция на базе Raspberry Pi 3 Model B.
Камера — наружная или внутренняя ip-камера для видеонаблюдения в штабе. Питается через PoE-адаптер, подключением занимаются местные специалисты.
Роутер — MikroTik, который используется в штабе для раздачи интернета и маршрутизации трафика между элементами инфраструктуры.
3G-модем — USB-модем Huawei в режиме LTE, обеспечивает резервный канал.
Dashboard — система регистрации, автоматизации и мониторинга состояния элементов штабной инфраструктуры.
Сканер документов, он же Коробка — DIY-сканер документов на базе USB-камеры.
Dashboard
Dashboard — это приложение, которое управляет конфигурациями роутеров и позволяет наблюдать за работой штабной сети. Отсюда можно следить за состоянием всех устройств и быстро отключать доступ в случае изъятия оборудования или других проблем. Для каждого штаба видно состояние его каналов связи и подключенных устройств. Есть логи состояния роутеров и действий с ними, uptime всех клиентов сети.
Еще Dashboard управляет конфигурацией роутеров и камер (ниже будут подробности).
Роутеры
В качестве штабных роутеров мы используем SOHO-модели MikroTik. Они недорогие, есть в любом городе, гибко конфигурируются и позволяют реализовать необходимую нам конфигурацию сети, включая VPN-туннель, резервирование канала и сложную маршрутизацию между устройствами.
Инициализация нового роутера организована так, чтобы минимизировать риск постороннего подключения к нашей сети:
— штаб сообщает сотрудникам поддержки mac-адрес роутера;
— роутер подключается проводом к операторской станции;
— на станции запускается скрипт инициализации роутера;
— скрипт сбрасывает настройки роутера и загружает нашу прошивку;
— роутер отключается от станции и подключается к интернету;
— скрипты прошивки делают всю остальную работу.
При появлении интернета Mikrotik устанавливает временное VPN-соединение, забирает с нашего сервера свою индивидуальную конфигурацию, устанавливает ее, поднимает постоянное VPN-соединение, конфигурирует свой DHCP-сервер и подключает штабные устройства.
При каких-то проблемах с прошивкой можно перезапустить весь процесс удаленно или, если проблемы фатальные, попросить сотрудников штаба повторить инициализацию.
Mikrotik подключен по двум каналам: по проводу, который приходит в офис, и по собственному 3G/LTE-модему. Модем используется в качестве резервного канала. В прошивке роутера есть код, который следит за состоянием канала и переключается на резервный канал, если основной не работает.
Роутер управляет маршрутизацией трафика между штабными устройствами и ограничивает доступ. Операторские станции могут ходить только к определенному серверу, на котором запущено приложение сбора подписей. Камеры вообще никуда не ходят, но видеосервер может забирать с них поток. Станции одного штаба могут обращаться друг к другу внутри подсети и забирать видеопоток сканера.
Изначально мы планировали подключать к своей сети компьютеры сотрудников штаба, но потом решили, что это небезопасно для остальной инфраструктуры, поэтому личные компьютеры подключаются к другому роутеру и никак с данной инфраструктурой не пересекаются.
Операторские компьютеры
Операторам верификации нужны компьютеры, чтобы сканировать документы, вносить в систему данные подписантов и проверять корректность этих данных. Компьютеры должны быть дешевыми, надежными, простыми в обслуживании и неинтересными для всяких там правоохранительных органов.
Настоящий «тонкий клиент» с сетевой загрузкой мы сделать не могли, т. к. достаточно надежного интернета во многих штабах нет и быть не может. Да и опыта такого ни у кого не было. Решили использовать традиционную загрузку операционной системы и во всех своих приложениях не выходить за пределы браузера. Такой подход позволяет быстро восстановить работу операторов, даже если со стандартными комплектами что-то не так. И веб-приложения мы точно умеем делать.
Для нашей задачи хватало характеристик современных одноплатных компьютеров. Испытания нескольких моделей показали, что браузер и достаточно сложные веб-приложения работают без каких-либо проблем и что за производительностью можно не гоняться, поэтому была выбрана одна из самых популярных моделей — Raspberry Pi 3 Model B. Там четырехъядерный ARM-процессор, 1 ГБ оперативной памяти, WiFi и HDMI-выход.
Raspberry Pi можно найти практически в любом крупном городе. Вся полезная информация находится на одной micro-SD-карте, которую в случае набега ОМОНа можно быстро вытащить и съесть.
В качестве операционной системы взяли стандартный Raspbian. Браузер — предустановленный Chromium.
Мониторы выбрали самые дешевые, у которых есть HDMI и разрешение 1920×1080.
Сканеры документов
Для исключения ошибок и на случай судебных разбирательств с избиркомом мы должны получить электронную копию документа, удостоверяющего личность гражданина, который оставляет подпись. Под документами мы в первую очередь понимаем паспорт гражданина РФ. На этапе верификации сканировали еще и согласие на обработку персональных данных тех посетителей, которые не записывались заранее через сайт. Бланк согласия мы сделали размером с разворот паспорта, чтобы упростить задачу.
Существует множество сканеров, специально предназначенных для удостоверений личности, но у них есть два недостатка. Во-первых, чаще всего они сканируют одну страницу паспорта, а нам нужен разворот. Во-вторых, стоимость даже самых дешевых вариантов начинается от нескольких сотен долларов, что при нашем количестве штабов и сканеров превращается в несколько миллионов рублей.
Планшетные сканеры занимают много места на столе (формат A4 + корпус + питание), медленно сканируют (типичное время — больше 15 секунд, а мы экономим каждую секунду, т. к. от этого зависит пропускная способность штаба) и не показывают картинку до запуска сканирования.
Кроме того, непонятно, как любой из этих сканеров соединить с браузерным приложением. Чаще всего сканеры подключаются по USB и работают через TWAIN-интерфейс. Есть реализация такого подключения на HTML5 Web Scanning SDK, но под Raspbian ее завести не удалось.
Мы связались с Smart Engines, которые публикуют на Хабре статьи про сканирование и автоматическое распознавание паспортов, но они не заинтересовались поставкой только сканеров, а за весь комплекс (с автораспознаванием) попросили слишком большую для нас сумму.
В итоге мы решили сделать свой сканер на основе USB-камеры. Камера показывает изображение в реальном времени, а картинка доступна из браузера. Корпус сканера можно сделать точно под размер паспорта, чтобы он не занимал лишнее место и не было проблем с позиционированием документа.
Нашли производителя, вместе с ним сделали пару прототипов и после тестирования начали производство. Корпус сканера изготовлен из алюминиевых композитных панелей и стекла. Электронная начинка закрыта пластиковой крышкой.
Детали сканеров, готовые к сборке
Распознавание паспортных данных
Мы рассматривали вариант автоматического распознавания паспортных данных, но в итоге от него отказались. На реальных сканах паспортов (мятых, грязных, заполненных от руки) даже коммерческие решения по точности уступали ручному вводу.
Самая важная для нас информация — адрес постоянной регистрации — вообще не распознается автоматически, т. к. половина паспортов содержит штампы, заполненные от руки. Не некоторых штампах нет информации о субъекте РФ, его нужно узнавать у владельца.
Кроме того, мы посчитали важным, чтобы оператор, которому через 20 секунд предстоит внести паспортные данные в подписной лист, своими глазами прочитал их в паспорте и вбил в компьютер, уточнив непонятное у владельца паспорта. Это уменьшает количество ошибок оператора.
Вот так мы не стали разрабатывать систему компьютерного зрения.
Видеонаблюдение
После открытия нескольких штабов начались нападения и сомнительные обыски (это когда приходят полицейские и выносят все содержимое штаба под предлогом поиска экстремистского текста в листовках). Для съемки подобных набегов и фиксации процесса сбора подписей мы сделали систему видеонаблюдения. В штабах установили три камеры — две в помещении и одну у входа.
Сбором и хранением записей с камер занимается один относительно мощный сервер. Подсчеты показали, что за месяц набирается около 40 ТБ архивных записей. Сервер с десятью SATA дисками по 6 ТБ каждый и 50 ТБ трафика обходится нам менее чем в 200 евро в месяц.
Можно сэкономить место в архиве и сделать работу с камерами немного более удобной, включив программный детектор движения (сохранять только те интервалы, где есть движение), но в таком случае потребуется 3–4 аналогичных сервера из-за нагрузки на процессор. Мы решили сохранять потоки полностью. Это проще, надежнее и дешевле.
Для сбора потоков с видеокамер используется ivideon-server, который бесплатно распространяет компания Ivideon. Для просмотра используется их же десктопное приложение, подключаемое к нашему серверу.
Конфигурацией устройств штабной сети мы управляем через собственное приложение Dashboard. В его базе есть информация о штабах и ip-адресах устройств. Dashboard создает конфигурационные файлы для каждого демона и единую конфигурацию для их запуска через supervisor, где каждому демону указан путь к его индивидуальным настройкам:
command=/opt/ivideon/videoserver -c /video/vs_0001.conf --v=5bccd2a043c14e
Параметр --v — это контрольная сумма файла настроек (vs_0001.conf). После сохранения новых конфигураций достаточно запустить supervisorctl update, чтобы перезапустились все процессы, конфиг которых поменялся. Supervisor видит изменения параметра с контрольной суммой и понимает, что данный процесс нужно перезапустить.
Отдельный скрипт занимается удалением записей, когда они становятся старше определенного возраста. Еще один скрипт обходит все sqlite-базы ivideon-server, собирает таймлайны камер (интервалы, когда есть запись с данной камеры) и складывает в PostgreSQL, чтобы их можно было показать в отчете на Dashboard.
Вот примерно и все, что нужно для организации своего сервиса видеонаблюдения на 230 камер.
Шеринговые сканеры
Если у вас есть USB-сканер, им может пользоваться один оператор. Как быть, если операторов больше, чем сканеров? Наладить стриминг изображения по сети!
Мы даже думали о покупке ip-камер, которые сами умеют стримить изображение, но работать с ними значительно сложнее: им нужно питание, дополнительное сетевое оборудование (порты роутера уже заняты, да и столько PoE-портов там нет). Ip-камеры настраиваются через какой-то свой интерфейс, очень плохой в дешевых камерах, это сложно автоматизировать. Тяжело найти модуль ip-камеры (без корпуса) с подходящими характеристиками (широкий угол, высокое разрешение, хорошая оптика с минимальными искажениями по краям). Кроме того, ip-камеры заметно дороже. Использование одного сканера несколькими операторами — это не основной сценарий, а «план Б», поэтому не хотелось на него тратить много сил и средств.
От стриминга нам нужна была низкая коммуникационная задержка (latency) и минимальное использование дефицитных ресурсов Raspberry Pi. Мы протестировали несколько решений:
— ffmpeg/ffserver (avconv);
— nginx + nginx-rtmp-module + ffmpeg;
— motion (https://motion-project.github.io/ — программный детектор движения);
— MJPG-Streamer (https://github.com/jacksonliam/mjpg-streamer);
— vlc.
Компиляция всего этого под Raspbian в сумме заняла, наверное, пару дней. Самым удобным и быстрым (low-latency) решением оказался MJPG-Streamer. Он забирал картинку с камер в нужном разрешении и без транскодинга отдавал через встроенный веб-сервер. Картинка была доступна в браузере без каких-либо дополнительных действий. Загрузка процессора при этом оказалась значительно меньше, чем с другими решениями.
Не у всех разработчиков были под рукой сканеры или веб-камеры. Для отладки мы использовали трансляцию Interactive Online Biology из Стэнфорда. Там используется тот же сервер MJPG-streamer, что и у нас.
В третьей главе будет описан процесс создания приложений для сбора подписей и все, что касается работы с физическими подписными листами. Еще там рассказано про изобретение формы подписного листа, которая позволила удобно синхронизировать физические носители с электронной базой, и оставаться при этом в рамках закона.