Pull to refresh

Кибервыборы v1.0: как создавалась система блокчейн-голосования в Москве

Reading time15 min
Views25K
Восьмого сентября мы провели в трех избирательных округах — в Чертаново, Бибирево и в Зеленограде — электронное голосование в Мосгордуму.
У этого голосования было сразу две особенности. Во-первых, выбрать своего кандидата можно было не выходя из дома, а во-вторых, в процессе мы использовали технологию блокчейн: она обеспечивает анонимность и прозрачность процесса.
Ниже — рассказ о том, как мы тестировали систему и доводили ее до совершенства.

Дисклеймер
В нашем материале мы описываем непосредственно сам процесс электронного голосования, этапы тестирования и практическое применение технологии блокчейн.
Процесс организации голосования (выбор дат, списка кандидатов, их назначение по итогам выборов) не относится к вопросам создания системы, поэтому не раскрывается в данной статье.
Технические подробности реализации других систем мы раскрываем в меньшей степени по нескольким причинам.
Во-первых, мы — это структурное подразделение ДИТа, которое разрабатывает технологию блокчейн в рамках системы голосования.
Во-вторых, нам интересно поделиться историей создания системы «с нуля», а не рассказывать о компонентах, которые существуют уже давно и преимущественно дорабатываются и интегрируются в общие процессы.
Разработанная нами система голосования на блокчейне — это экспериментальный проект. Поэтому во время сентябрьских выборов к ней не предъявлялись требования, характерные для систем, которые уже находятся в промышленной эксплуатации.
Зачем и как создавался проект
Функциональным заказчиком блокчейн-проекта выступил ЦИК — орган, который отвечает за проведение всех выборов на территории РФ. Основной целью было проведение экспериментального голосования, публичного и абсолютно прозрачного.
Блокчейн стал основой для эксперимента по нескольким причинам. Для начала, с помощью шифрования на блокчейне кодируются промежуточные результаты, а использование электронных подписей гарантирует секретность и анонимность избирателя. Вторая причина — высокий уровень доверия к блокчейну со стороны ИТ-специалистов. Кроме того, эта технология с 2017 года меняет принципы работы во многих отраслях — от юридической до финансовой, гарантирует прозрачность всех транзакций, которые невозможно подделать.
После того как в конце мая вышел федеральный закон, регулирующий ход электронного голосования на выборах в Мосгордуму, мы приступили к разработке системы. Источником финансирования проекта был исключительно внутренний бюджет департамента.
В это же время Общественная палата создала техническую рабочую группу, специалисты которой оценивали нашу работу и активно участвовали в разработке решения. Мы еженедельно получали фидбэк и обсуждали возможные корректировки работы системы после ее тестирования. По мере приближения сентябрьского голосования встречи проводились еще чаще.
Создание системы дистанционного голосования на блокчейне стало в России прецедентом. Главная трудность для нас заключалась не столько в применении новой технологии, сколько в том, чтобы наша разработка соответствовала всем требованиям законодательства, в том числе имела публичную прозрачность и открытость.
Мы отдаем себе отчет в том, что наше решение не является тру-блокчейном. Чтобы оно стало таковым, правильным было бы сделать открытый блокчейн с возможностью разворачивания своего узла сети жителями с активной позицией, общественными организациями, политическими партиями. Также важна возможность отправки «слепков» данных в публичную сеть, например, Ethereum. Но эти доработки затрагивают огромное число законодательных и нормативных вопросов, на решение которых у нас не было времени. Это был эксперимент, основной целью которого было протестировать гипотезу о применимости технологии. В таких условиях мы стремились сделать решение максимально надежным и отказоустойчивым.
Кирилл Поляков, руководитель продукта «Блокчейн», ДИТ Москвы
Чтобы открыто рассказывать профессиональному сообществу о нашей работе, мы размещали код в мастер на GitHub.
Все данные мы старались выгружать максимально быстро, по мере получения информации от каждой из команд разработчиков. Полный код появился на веб-сервисе 6 сентября — за два дня до официальных выборов в Мосгордуму.
Всего над проектом трудилось больше 10 распределенных команд (около 100 человек) внутри ДИТа без привлечения сторонних специалистов. Из-за сложности задачи мы решили, что каждая из команд будет заниматься разработкой решения в своей части, а на последнем этапе мы сведем все системы воедино с помощью интеграционных, нагрузочных и многофункциональных тестирований.
Основной пласт работы пришелся на взаимодействие с площадкой для проведения выборов — сайтом mos.ru. Поскольку он объединяет множество информационных систем, то одна команда занималась вопросами авторизации, другая — идентификацией пользователей, третья — транспортом, четвертая — самой «услугой» голосования.
Следует сказать, что к этому времени у нас уже имелся опыт реализации блокчейн-проектов: эта технология, в частности, используется на площадке «Активный гражданин» (уже 2 года в действии) и при подаче заявок на ярмарки выходного дня.
Как это работает
Перед началом голосования пользователь мог ознакомиться с тем, как организован весь процесс, на специальной посадочной странице.
Для участия в голосовании нужно было оставить заявку на включение в реестр избирателей на сайте mos.ru.
Во время обработки заявки все необходимые данные, которые указал избиратель, проходят проверку.
После этого он получает результат рассмотрения в личном кабинете. Если данные заявителя достоверны и соответствуют условиям включения в реестр электронных избирателей, то вся процедура занимает в среднем 3 дня.
Полный список полей для включения в реестр избирателей
  • фамилия;
  • имя;
  • отчество;
  • дата рождения;
  • мобильный телефон;
  • СНИЛС;
  • серия и номер паспорта;
  • дата выдачи;
  • код подразделения;
  • кем выдан;
  • место рождения;
  • адрес дома по месту регистрации;
  • квартира.
Для участия в электронном голосовании 8 сентября избиратели должны были подать заявку с 24 июля по 4 сентября.
Валидация данных проводилась не нами, а органами власти, которые верифицируют ту или иную информацию. Например, данные СНИЛС проверяет ФМС, номер паспорта — МВД, адрес регистрации — БТИ.
После того как пользователи вводили свои данные, они передавались по каналу межведомственного взаимодействия СМЭФ в соответствующие органы власти, проходили этап верификации и в автоматизированном порядке приходили в ДИТ.
Мы разработали сервис, который анализирует ответы всех ведомств и, исходя из суммы положительных ответов («данные верны»), включает или не включает человека в реестр избирателей.
Каждый отказ наши сотрудники проверяли вручную. Риска ошибочного ввода данных не было, так как в голосовании могли участвовать только владельцы подтвержденных аккаунтов на mos.ru.
Тем не менее человеку могли отказать в регистрации на онлайн-голосование, например, из-за того, что он сменил фамилию или адрес регистрации, но эта информация не была обновлена в его профиле на сайте. В этих случаях (их было около сотни) наша команда по идентификации пользователей занималась ручной проверкой данных, общалась с органами власти, отказавшими в верификации пользователя, выявляла причины несоответствия и устраняла их.
После проверки избиратель включается в реестр электронных избирателей, а его заявка в личном кабинете получает соответствующий статус.
В день голосования избиратель переходит в раздел «Услуги» электронных выборов и получает доступ к форме голосования.
До перехода на эту форму ему предлагается скачать бланк бюллетеня и ознакомиться с ним, но этот шаг можно пропустить.
Бюллетень может не поместиться на экране целиком, а пользователь может этого не заметить. Поэтому сначала форма голосования обязательно отображается в режиме показа полной страницы бюллетеня на экране — таково требование законодательства.
Только потом бюллетень отображается на ширину страницы, и можно начинать голосовать. Избиратель проставляет галочки напротив выбранных вариантов ответа и нажимает «Проголосовать».
После общения с технической рабочей группой появилось дополнительное требование к системе — избирателю нужна была возможность проверить, как учитывается его голос в блокчейне.
Мы протестировали фичу с возможностью сохранения идентификатора транзакций, но в результате решили отказаться от нее на сентябрьских выборах: на наш взгляд, фича могла бы стать потенциальным вектором для манипуляции избирательным правом. Например, могли возникнуть ситуации, когда начальство принуждает сотрудников подтвердить их участие в выборах с помощью скриншота и т. д.
Архитектура решения
Система состоит из нескольких компонентов, которые размещаются в разных подсистемах города Москвы.
Авторизация через ПГУ (Портал государственных услуг или раздел услуг mos.ru) — привычный способ получения услуг для москвичей.
С технической точки зрения, mos.ru — это совокупность информационных систем, интегрированных между собой и осуществляющих обмен данными на основании различных протоколов информационного обмена.
Мы решили использовать mos.ru как площадку для нашего решения не только ради удобства для избирателей, но и из-за законодательных особенностей. Онлайн-голосование в данном случае — это юридически значимая услуга, ответственность за проведение которой лежит в том числе на исполнительной власти Москвы.
Именно поэтому ни одна внешняя площадка не может авторизовать пользователя для участия в муниципальных выборах: все данные избирателей хранятся в системах разных государственных органов.
Избиратель мог обратиться в территориальную избирательную комиссию (ТИК) и участвовать в привычном, «бумажном», а не электронном голосовании.
Сквозную авторизацию пользователей на порталах города Москвы осуществляет СУДИР — Система управления доступом к информационным системам и ресурсам города Москвы. Именно через СУДИР проходит аутентификация, авторизация и верификация пользователя на сайте mos.ru.
Система управления данными пользователей Master Data Management (МДМ) обеспечивает прохождение информации о голосовании к блокчейну с использованием API. Во время голосования МДМ используется для передачи данных, основанных на результатах проверки допуска пользователя к голосованию.
Автоматизированная система государственных услуг и функций (АСГУФ) возвращает результаты обращения пользователя к странице государственной услуги. С помощью АСГУФ пользователь переадресуется на бюллетень для голосования.
Анонимайзер генерирует ссылку и доступ к анонимному бюллетеню через личный кабинет mos.ru: такая ссылка создается всего один раз. Код формы голосования выглядит так.
Блокчейн обеспечивает сохранение данных в ходе голосования и их интерпретацию по завершении голосования. Он размещается в отдельном защищенном сегменте сети внутри центра обработки данных (ЦОД ДИТ).
Система печати бюллетеней отвечает за вывод данных на ленту в ходе голосования.
И блокчейн, и система печати бюллетеней — это новые системы, которые никогда раньше не использовались в работе с пользователями mos.ru. Данные компоненты разрабатывались специально для голосования, поэтому являются узкоспециализированными.
Как взаимодействуют элементы системы
Взаимодействие всех компонентов системы проходит в несколько этапов.
Сначала пользователь оставляет заявку на включение в реестр избирателей. Данные в его заявке верифицируют ведомственные системы, МДМ и АСГУФ.
Когда проверка заканчивается, пользователь получает результат рассмотрения заявки в личном кабинете.
Если пользователь получает отказ во включении в реестр избирателей, то он, скорее всего, либо ошибся в данных, либо указанные им данные не соответствуют фактическим. Отказ в получении услуг отображается как статус в личном кабинете пользователя.
Если включение в реестр прошло успешно, то пользователь принимает участие в голосовании.
Как устроена работа в блокчейне
Процесс электронного голосования в блокчейне включает несколько дополнительных элементов.
Экран параметров голосования (дэшборд) отображает текущие параметры хода голосования из блокчейна и смежных систем.
АРМ председателя участковой избирательной комиссии (УИК) позволяет председателю в режиме реального времени мониторить списки избирателей, зарегистрированных на электронные выборы.
Принтеры для печати бюллетеней работают по принципу кассового аппарата: на термоленту наносятся результаты голосования каждого отдельного избирателя, потом принтер обрезает их, они попадают в ящик для сбора бюллетеней.
До начала голосования на принтер загружается конфигурационный файл, который определяет, какие поля выводятся на печать и какая длина должна быть у бюллетеня.
Устройства печатают результаты электронного голосования, так как бумажное подтверждение — это требование закона: для проверки голоса можно пересчитать вручную.
Во время выборов 8 сентября на избирательных участках стояло 3 типа принтеров. Первый печатал информацию о факте получения избирателем бюллетеня, второй фиксировал факт голосования в зашифрованном виде, а третий по завершении голосования публиковал расшифрованные голоса. Все принтеры были опечатаны на весь день голосования — это обеспечивало безопасность распечатанных данных.
Как хранятся данные в блокчейне
Код смарт-контрактов выглядит следующим образом. В процессе работы в блокчейне создается 2 реестра: один из них — так называемый «реестр избирателей», а второй — «реестр бюллетеней».
Первый помогает проверить и сравнить количество избирателей, принявших участие в выборах, с количеством избирателей, подавших свои заявки на участие в выборах. Второй представляет собой цифровой аналог ящика для голосования, в который «падают» бюллетени. Там они хранятся в зашифрованном виде до момента завершения голосования. С помощью этого реестра также можно проверить, соответствует ли количество людей, принявших участие в голосовании, количеству избирателей из реестра избирателей.
Как мы тестировали систему
Всего мы провели четыре предварительных тестирования с участием жителей Москвы и одно открытое тестирование для программистов и специалистов по информационной безопасности. Расскажем о наиболее показательных случаях.
11 июля 2019 года в тестировании участвовали студенты 93 московских вузов, которые выбирали лучшего председателя студенческого совета города.
Ориентировочно в 16:30 мы зафиксировали высокую пользовательскую активность, связанную с DDOS-атакой на форму голосования. Как оказалось позже, один из студентов с опытом веб-разработки попытался обмануть систему: с ХХ IP-адресов он отправил YY запросов с попыткой подобрать IP-адрес формы голосования. Но так как у каждого бюллетеня есть своя уникальная URL-ссылка, то ее просто невозможно подобрать.
Попытку вмешательства в процесс выборов мы пресекли с помощью внутренней системы безопасности: она заблокировала сетевую связность между компонентами. На избирательном участке это выглядело следующим образом: в указанный промежуток времени принтеры перестали печатать бюллетени, при этом в личных кабинетах голосовавших никаких сбоев не возникло. Голоса принимались вплоть до 20:00.
Бюллетени, поступившие в систему в промежуток с 16:30 до 20:00, находились в очереди в блокчейне и не записывались. К моменту завершения голосования разработчики справились с причиной нарушения сетевой связности и восстановили взаимодействие между компонентами системы. Тогда очередь дошла до голосов в блокчейне, и все они были успешно зафиксированы.
После мы запустили расшифровку голосов, параллельно контролируя корректность декодирования информации. Мы также провели дополнительную проверку соответствия количества «зависших» и расшифрованных голосов: разобрали бюллетени вручную и сопоставили их количество по размеру стопок.
При разборе бюллетеней мы также просматривали номера блоков и время их печати. Так мы оценили соответствие объема поданных голосов с их распределением по времени.
При проектировании архитектуры блокчейн-решения мы отталкивались от существующего процесса голосования. Мы поставили перед собой задачу переложить бизнес-функции, которые решает процесс голосования, на то, что умеет делать блокчейн. Именно так и родились «реестр избирателей» и «реестр бюллетеней», по сути, повторяющие привычные для бумажного голосования сущности. Решение получилось простым и в то же время надежным. Мы получили ценную обратную связь по результатам публичных тестирований и голосования 8 сентября, которую мы обязательно будем использовать для дальнейшего развития проекта.
Андрей Бороденков, руководитель проектов, продукт «Блокчейн», ДИТ Москвы
К моменту открытого тестирования системы мы разобрали ошибки июльского эксперимента и конфигурировали систему с учетом проблемы блокировки сетевой связности. В этот раз мы создали отдельный тестовый контур, полностью воспроизводящий систему, в которой голосовали пользователи 8 сентября. Мы также опубликовали документ с пятью сценариями тестирования, которые моделировали основные риски в процессе голосования, чтобы выявить уязвимые места в системе электронного голосования и повысить информационную безопасность.
В рамках этого тестирования Общественная палата объявила международный конкурс на взлом нашей системы с денежным вознаграждением в случае успеха. Более 40 независимых экспертов по информационной безопасности и криптографии смогли проверить защиту инфраструктуры портала mos.ru и серверов от возможных DDoS-атак, протестировать алгоритмы шифрования.
В начале эксперимента мы размещали на GitHub папку с зашифрованными данными и открытым ключом шифрования, а через 12 часов — расшифрованные данные и закрытый ключ. Задача участников заключалась в том, чтобы опередить выкладку данных.
Дальше всех продвинулся французский криптограф Пьеррик Годри. Он обнаружил, что приватный ключ 256×3 не обеспечивал достаточную стойкость шифрования, и выложил математический код, который осуществляет расшифровку данных. Но при этом он не выполнил основное условие — взломать систему за 12 часов.
После публикации доклада и рекомендаций к длине ключа шифрования, которые он дал, мы увеличили приватный ключ шифрования в 4 раза — до 1024 бит. Как уже упоминалось, фактический взлом системы онлайн-голосования не состоялся, однако за свои рекомендации Годри получил приз в 1 миллион рублей. Вторую половину призового фонда разделили другие участники эксперимента: они сделали важные замечания по работе формы и выявили потенциальные уязвимости системы.
Во время тестирования, проходившего 21 августа, мы решили устроить небольшой краш-тест для нашей системы и отработали сценарии, имитирующие разные виды сбоев.
Сначала мы сымитировали перебои с электричеством и отключение интернет-сети в помещении избирательного участка. Члены комиссии перестали получать данные о голосах участников эксперимента, хотя они продолжали поступать в систему — после устранения проблемы все данные поступили, их удалось распечатать.
После этого мы воспроизвели ошибку, при которой связь пропадает внутри самой системы. Пользователи неполадок не заметили, продолжили получать бюллетени и голосовать. Однако эксперты отметили, что статистика голосов перестала обновляться. После устранения неполадок все оставленные в очереди голоса дошли до блокчейн-сети и были учтены системой.
Потом мы посчитали бюллетени и сравнили данные с количеством проголосовавших в системе. Итоговые цифры полностью сошлись.
Как работала система в день выборов
В каждом из округов, где проходило электронное голосование — в Чертанове, Бибиреве и Зеленограде — была своя участково-избирательная комиссия и присутствовало по одному сотруднику из ДИТа для оперативной поддержки в ходе работы.
Избиратели на всех участках пользовались компьютерами, закрытыми ширмой, если у них не получилось проголосовать дома. В основном этот способ выбрали люди с невысокой компьютерной грамотностью и технические специалисты, которые хотели вживую увидеть оборудование для электронного голосования.
В течение всего дня система электронного голосования работала стабильно, за исключением одного часа, но мы смогли оперативно устранить неполадку. В итоге из тех, кто столкнулся с трудностями из-за сбоя, 85% (462 избирателя) после нашего уведомления вернулись к системе, получили бюллетени и проголосовали.
Проблема возникла в процессе взаимодействия компонентов, обеспечивающих шифрование на одном из этапов выдачи электронного бюллетеня. Она носила абсолютно технический характер без какого-либо внешнего воздействия на эту часть инфраструктуры: это была не проблема сетевого доступа или настроек оборудования — иначе ни один голос в систему попросту не попал бы.
Сейчас мы вместе с производителями средства шифрования, компанией «КриптоПро», анализируем ситуацию и продолжаем разбираться в причинах сбоя. Точного ответа на вопрос, что случилось, у нас пока нет.
Все жалобы и обращения, которые приходили в этот день, мы обработали индивидуально в ручном режиме с помощью технической поддержки. Для этого мы предварительно разработали многоканальную систему обработки сообщений, состоящую из следующих компонентов:
  • Служба операторов. Избиратели могли обратиться к нам за помощью по общегородскому номеру 7777777 или же по отдельной линии с голосовыми операторами. Мы создали базу знаний на основании 43 вопросов, которые перед голосованием поступили нам на электронную почту, добавили еще несколько потенциальных вариантов и обучили наших сотрудников.
  • Форма обратной связи на mos.ru.
  • Электронный адрес support-vybory@mos.ru.
За все время наши специалисты зафиксировали всего 48 смс о доступе на форму голосования, которые были доставлены адресату не с первого раза. В каждом из случаев мы все проговорили с избирателем лично и помогли ему в работе с системой.
В день голосования мы оповещали о приостановке голосования из-за технического сбоя и о возобновлении процесса, а также отправили приглашения к голосованию в конце дня. Окончательная явка по итогам дня составила 92,3%.
Промежуточные итоги
Мы понимаем, что сейчас наша система голосования выглядит не совсем как классический блокчейн-кейс, так как она контролируется со стороны органов исполнительной власти. Тем не менее это наш первый эксперимент и большой шаг навстречу «прозрачной» технологии в ее идеальном представлении.
Пока сложно представить систему голосования на государственном уровне, которая не нуждается в централизованной проверке со стороны органов власти. Также определенные вопросы вызывает стабильность публичных сетей, если говорить о возможной интеграции системы с популярными блокчейн-сетями вроде Bitcoin и Ethereum.
Что дальше
Следующим этапом нашего экспериментального проекта станет электронное голосование в Троицке, которое пройдет с 15 по 16 декабря. Жители округа проголосуют, где лучше построить новую станцию метро.
По формату электронное голосование будет идентично сентябрьским выборам депутатов в Московскую Государственную Думу.
В день голосования в московской Общественной палате установят принтеры для печати зашифрованных голосов и экран для отображения динамики процесса электронного голосования, здесь же разместится группа наблюдателей. В Троицке разместят пункты электронного голосования, оснащенные АРМами для участников голосования.
Всю техническую поддержку при регистрации на участие и непосредственно в процессе голосования мы возьмем на себя: голосующим помогут наши служба технической поддержки и call-центр.
В 2020 году мы посвятим еще больше времени развитию уже существующих блокчейн-решений в Москве. В столице ДИТ применяет эту технологию уже два года, но сейчас это только пилотные проекты, а в новом году мы хотим выпускать решения на настоящем, «трушном» блокчейне. В будущем мы бы хотели дать участникам взаимодействия возможность включать данные в сеть и размещать узлы.
Мы также рассматриваем возможность последовать рекомендациям Виталика Бутерина, которые он дал команде ДИТа в Твиттере, и, быть может, сделать anchoring данных в Ethereum. Публичная сеть могла бы гарантировать неизменяемость данных в связанной с ней системе, а аудируемость информации осуществлялась бы в форк этой сети в органе власти.
Мы также с интересом наблюдаем за созданием блокчейнов третьего поколения, способных обмениваться данными между собой. На наш взгляд, у этого тренда есть большой потенциал, который добавит технологии еще больше доверия со стороны специалистов.
Tags:
Hubs:
+8
Comments70