IT-инфраструктура штабов Навального и сбор подписей: железо и сети

В предыдущем посте мы рассказали, что такое сбор подписей и почему его бессмысленно вести без специализированной IT-инфраструктуры. А эта глава про сетевое и компьютерное оборудование федеральной сети штабов Навального, а также про разработку собственного сканера документов.

1dd2c4fdb8b7d3c41e37e223c09485a1.jpg

Какие задачи мы решали


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

Ожидаемые трудности:

— кража оборудования до инициализации комплекта оборудования;
 — кража оборудования после инициализации;
 — отключение интернета (отрезали провод, создали помехи в канале);
 — человеческий фактор (любые некорректные действия с оборудованием);
 — токсичные работники штаба;
 — быстрый переезд (который хуже пожара);
 — собственно пожар (и другие способы физического уничтожения штаба).

Мы подобрали оборудование так, что любой элемент инфраструктуры легко заменяется, и его не обязательно везти из центрального штаба, а можно купить в местных магазинах. Сборка оборудования состоит из простейших операций уровня «вставьте провод в разъем». Последовательность действий подробно описана в инструкции (с гифками!).

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

Доступ в штабную 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 всех клиентов сети.

df6d0584eef78adbfc5e41bf909b7cce.png
Еще Dashboard управляет конфигурацией роутеров и камер (ниже будут подробности).

Роутеры


В качестве штабных роутеров мы используем SOHO-модели MikroTik. Они недорогие, есть в любом городе, гибко конфигурируются и позволяют реализовать необходимую нам конфигурацию сети, включая VPN-туннель, резервирование канала и сложную маршрутизацию между устройствами.

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

При появлении интернета Mikrotik устанавливает временное VPN-соединение, забирает с нашего сервера свою индивидуальную конфигурацию, устанавливает ее, поднимает постоянное VPN-соединение, конфигурирует свой DHCP-сервер и подключает штабные устройства.

При каких-то проблемах с прошивкой можно перезапустить весь процесс удаленно или, если проблемы фатальные, попросить сотрудников штаба повторить инициализацию.

Mikrotik подключен по двум каналам: по проводу, который приходит в офис, и по собственному 3G/LTE-модему. Модем используется в качестве резервного канала. В прошивке роутера есть код, который следит за состоянием канала и переключается на резервный канал, если основной не работает.

73baa1c78e756f27a17bbdbc9ee27025.png

Роутер управляет маршрутизацией трафика между штабными устройствами и ограничивает доступ. Операторские станции могут ходить только к определенному серверу, на котором запущено приложение сбора подписей. Камеры вообще никуда не ходят, но видеосервер может забирать с них поток. Станции одного штаба могут обращаться друг к другу внутри подсети и забирать видеопоток сканера.

2bdf8141ed0308908494893f4cbf8cc5.png
Изначально мы планировали подключать к своей сети компьютеры сотрудников штаба, но потом решили, что это небезопасно для остальной инфраструктуры, поэтому личные компьютеры подключаются к другому роутеру и никак с данной инфраструктурой не пересекаются.

Операторские компьютеры
Операторам верификации нужны компьютеры, чтобы сканировать документы, вносить в систему данные подписантов и проверять корректность этих данных. Компьютеры должны быть дешевыми, надежными, простыми в обслуживании и неинтересными для всяких там правоохранительных органов.

Настоящий «тонкий клиент» с сетевой загрузкой мы сделать не могли, т. к. достаточно надежного интернета во многих штабах нет и быть не может. Да и опыта такого ни у кого не было. Решили использовать традиционную загрузку операционной системы и во всех своих приложениях не выходить за пределы браузера. Такой подход позволяет быстро восстановить работу операторов, даже если со стандартными комплектами что-то не так. И веб-приложения мы точно умеем делать.

Для нашей задачи хватало характеристик современных одноплатных компьютеров. Испытания нескольких моделей показали, что браузер и достаточно сложные веб-приложения работают без каких-либо проблем и что за производительностью можно не гоняться, поэтому была выбрана одна из самых популярных моделей — Raspberry Pi 3 Model B. Там четырехъядерный ARM-процессор, 1 ГБ оперативной памяти, WiFi и HDMI-выход.

70151e8290b15051730cd9b8fd022428.jpg

Raspberry Pi можно найти практически в любом крупном городе. Вся полезная информация находится на одной micro-SD-карте, которую в случае набега ОМОНа можно быстро вытащить и съесть.

В качестве операционной системы взяли стандартный Raspbian. Браузер — предустановленный Chromium.

Мониторы выбрали самые дешевые, у которых есть HDMI и разрешение 1920×1080.

Сканеры документов


Для исключения ошибок и на случай судебных разбирательств с избиркомом мы должны получить электронную копию документа, удостоверяющего личность гражданина, который оставляет подпись. Под документами мы в первую очередь понимаем паспорт гражданина РФ. На этапе верификации сканировали еще и согласие на обработку персональных данных тех посетителей, которые не записывались заранее через сайт. Бланк согласия мы сделали размером с разворот паспорта, чтобы упростить задачу.

9c9464b7ff445b1208bf232134b25b38.png

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

Планшетные сканеры занимают много места на столе (формат A4 + корпус + питание), медленно сканируют (типичное время — больше 15 секунд, а мы экономим каждую секунду, т. к. от этого зависит пропускная способность штаба) и не показывают картинку до запуска сканирования.

Кроме того, непонятно, как любой из этих сканеров соединить с браузерным приложением. Чаще всего сканеры подключаются по USB и работают через TWAIN-интерфейс. Есть реализация такого подключения на HTML5 Web Scanning SDK, но под Raspbian ее завести не удалось.

Мы связались с Smart Engines, которые публикуют на Хабре статьи про сканирование и автоматическое распознавание паспортов, но они не заинтересовались поставкой только сканеров, а за весь комплекс (с автораспознаванием) попросили слишком большую для нас сумму.

В итоге мы решили сделать свой сканер на основе USB-камеры. Камера показывает изображение в реальном времени, а картинка доступна из браузера. Корпус сканера можно сделать точно под размер паспорта, чтобы он не занимал лишнее место и не было проблем с позиционированием документа.

3f72416777fc85976139edacccaa0161.jpg

Нашли производителя, вместе с ним сделали пару прототипов и после тестирования начали производство. Корпус сканера изготовлен из алюминиевых композитных панелей и стекла. Электронная начинка закрыта пластиковой крышкой.

9a2b152a5b536900b7788cb5b3021ac4.jpg
Детали сканеров, готовые к сборке

Распознавание паспортных данных


Мы рассматривали вариант автоматического распознавания паспортных данных, но в итоге от него отказались. На реальных сканах паспортов (мятых, грязных, заполненных от руки) даже коммерческие решения по точности уступали ручному вводу.

956e1a4b12f2c382cd3727cd51ee277b.jpg

Самая важная для нас информация — адрес постоянной регистрации — вообще не распознается автоматически, т. к. половина паспортов содержит штампы, заполненные от руки. Не некоторых штампах нет информации о субъекте РФ, его нужно узнавать у владельца.

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

Вот так мы не стали разрабатывать систему компьютерного зрения.

Видеонаблюдение


После открытия нескольких штабов начались нападения и сомнительные обыски (это когда приходят полицейские и выносят все содержимое штаба под предлогом поиска экстремистского текста в листовках). Для съемки подобных набегов и фиксации процесса сбора подписей мы сделали систему видеонаблюдения. В штабах установили три камеры — две в помещении и одну у входа.

4601037103901990dc8ae67a0ec46e4e.gif

Сбором и хранением записей с камер занимается один относительно мощный сервер. Подсчеты показали, что за месяц набирается около 40 ТБ архивных записей. Сервер с десятью SATA дисками по 6 ТБ каждый и 50 ТБ трафика обходится нам менее чем в 200 евро в месяц.

Можно сэкономить место в архиве и сделать работу с камерами немного более удобной, включив программный детектор движения (сохранять только те интервалы, где есть движение), но в таком случае потребуется 3–4 аналогичных сервера из-за нагрузки на процессор. Мы решили сохранять потоки полностью. Это проще, надежнее и дешевле.

Для сбора потоков с видеокамер используется ivideon-server, который бесплатно распространяет компания Ivideon. Для просмотра используется их же десктопное приложение, подключаемое к нашему серверу.

4ef1289a1133e02daa60825f09c8a459.jpg

Конфигурацией устройств штабной сети мы управляем через собственное приложение 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.

8be106584d86fa44af6022f634464089.png

Вот примерно и все, что нужно для организации своего сервиса видеонаблюдения на 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, что и у нас.

ecdf8338b419399393331aca1f7f7d47.gif


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

© Habrahabr.ru