PeterZhizhin / moscow_deg2021_local_exec

Репозиторий с заглушками для отсутствующих компонентов ДЭГ в Москвы

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Заглушки и инструкции к запуску Московского ДЭГ

Заявление

На мой взгляд, ДЭГа в России быть не должно.

Система ДЭГ, использовавшаяся в Москве на выборах в 2021 году неподконтрольна для наблюдения. В системе присутствует приватный блокчейн, о наличии которого члены комиссии осведомлены не были и не инструментов за ним наблюдать. Подсчёт голосов был произведён с существенной задержкой, которая не может быть объяснена объективными причинами.

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

Анализ исходного кода системы ДЭГ был сильно затруднён тем, что до недавнего времени, было невозможно запустить локально своё собственное электронное голосование. Часть исходных кодов опубликована не была, а для опубликованной части отсутствуют конфигурационные файлы, без которых работа системы невозможно. Запуск системы был осложнён многоичисленными ошибками, зависаниями и тд.

Этот репозиторий призван решить эту проблему и упростить анализ системы.

Инструкция по запуску через докер.

  1. Создайте бота для регистрации на голосование, для этого напишите в Телеграме @BotFather. Скопируйте токен для бота.
  2. Устанавливаем Docker и поднимаем все сервисы через TELEGRAM_BOT_TOKEN=<токен телеграма> docker-compose up --detach.
  3. Перейдите по адресу http://localhost/arm чтобы создать голосование.
  4. Кликаем "Create voting". Указываем публичный ключ. Его можно создать вручную при помощи утилиты, но можно указать и тестовый: adea9c89fb882c10d9e87e9f506bc1413cf7a9826a6f0ed6e3f6ec4d60c65724. В поле Candidates указываем ФИО кандидатов (надо хотя бы 2). Одна строка - один кандидат. Кликаем "Create Voting". Голосование должно создаться. На открывшейся странице кликаем "Stop Registration". Это запустит голосование.
  5. Переходим по адресу http://localhost/election и пробуем голосовать.
  6. Вас переадресует на страницу входа. Заходим в созданный Телеграм бот и вводим /register. Копируем номер телефона и вводим его с символом + в начале. Кликаем Login. Выбираем галочку "Consent" и заходим на страницу голосования.
  7. Запрашиваем код подтверждения. Он придёт в телеграм.
  8. Голосуем как обычно.
  9. Проверяем что голос попал в p_ballot, для этого переходим на http://localhost:8082/ и указываем
system: PostgreSQL
server: postgres
username: deg_user
password: deg_user_password
database: deg_ballot_db

Дальше можно проверить, что голос есть в p_ballot, перейдя на эту таблицу, там на вкладку "Select data".

  1. Голос должен попасть в блокчейн, для этого можно открыть Exonum Blockchain Explorer по адресу http://localhost:3000. Там должна быть ваша транзакция. Выбирите фильтр "Skip Empty Blocks".

Локальное исполнение

  1. Поднимаем заглушки, базы и очереди RabbitMQ через docker compose up --detach. Перед этим надо убрать все сервисы deg_<имя>.
  2. Настраиваем PHP окружение для запуска необходимых компонентов ДЭГ (ниже подробнее).
  3. Клонируем код с репозиторием ДЭГ с необходимыми для работы изменениями. Их можно найти в этой ветке: https://github.com/PeterZhizhin/blockchain-voting_2021_extracted/tree/fix_deg
  4. Ставим PHP Composer и в каждом из сервисов делаем php composer install.
  5. Копируем файлы .env и папки config в каждый из сервисов из компоненты form, конфигурацию можно найти в папке sample_deg_configs.
  6. В каждом из компонентов ДЭГ (form, ballot, componentX, encryptor) запускаем php artisian swoole:http start.

Настройка окружения PHP

Окружение настраивается примерно таким образом (Ubuntu):

sudo apt-get install php-fpm php-pgsql php-redis php-dev php-xml

Затем необходимо установить PHP Swoole:

sudo pecl install swoole

Потом нужно добавить модуль через phpenmod примерно вот так:

sudo bash -c "cat > /etc/php/7.4/mods-available/swoole.ini << EOF
; Configuration for Open Swoole
; priority=30
extension=swoole
EOF"
sudo phpenmod -s cli swoole

Далее нужно установить Стрибог расширение для PHP. Для этого воспользуемся инструкциями из вот этого репозитория: https://github.com/sjinks/php-stribog.

Почему этот репозиторий существует

В исходных кодах московского ДЭГ (оригинальный репозиторий, перезалитый в распакованном виде) отсутсвует часть необходимых сервисов, необходимых для запуска ДЭГ.

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

На данный момент идентифицировано, что не опубликованы исходные коды следующих компонентов (галочкой отмечены реализованные в этом репозитории части)

  • АРМ Председателя.
  • Сервис записи в блокчейн.
  • СУДИР -- Система управления доступа к информационным ресурсам.
  • MDM (Реестр участников голосования) -- Реестр избирателей, осуществляющий проверку активного избирательного права. Также он выдаёт group id пользователям (уникальный ID, одинаковый для каждого избирателя), который используется для учёта переголосований.
  • Сервис, который раздаёт настройки голосования (URL хостов, публичный ключ шифрования бюллетеней для передачи на фронт, имена кандидатов и тд).
  • Сервис рассылки SMS.
  • Сервис рассылки Email.

Реализованные заглушки

Сервис по раздаче настроек

При первом запуске компоненты componentX, ballot и form запрашивают настройки с сервера. В них указываются технические характеристики голосования (например, публичный ключ для шифрования), имена кандидатов и тд.

В заглушках для этого используется NGINX, который отдаёт необходимые JSON. По-хорошему туда надо дописать ещё и проверку хэдеров SYSTEM и SYSTEMTOKEN, но я этого не сделал.

СУДИР (fake_sudir)

Чтобы пользователь мог сделать запросы к форме голосования -- ему нужно авторизироваться. Используется протокол authorization_code из OAuth2.

fake_sudir предоставляет базовую функциональность авторизации. Сервис доступен по адресу http://localhost:8025.

При первом старте сервера создаётся пользователь admin и OAuth2 клиент для компонента form. Можно зайти в него, если ввести в поле user просто admin.

При заходе на компонент form -- пользователя редиректит на fake_sudir для авторизации.

У пользователя должны стоять поля телефона и Email, для этого на странице авторизации нужно ввести их в поля.

MDM (fake_mdm)

Данный должен проверять наличие активного избирательного права, то есть должен проверять, что пользователь имеет одобренную заявку на ДЭГ. Компонент form обращается по вот этим двум ссылкам этого компонента:

  1. POST /checkBallot -- на вход приходит JSON с полем ssoID -- ID пользователя, должен вернуть sha256 "подпись" и статус, имеет ли человек право голосовать. Например, он может сообщить что превышен лимит числа переголосований. В fake_mdm просто возвращается, что всё ОК и человек может голосовать.
  2. POST /getBallot -- как checkBallot, но должен по идее как-то помечать, что пользователю выдали бюллетень. В fake_mdm просто возвращается, что всё ОК.

Также этот сервис реализует выдачу group id для пользователей. На вход приходит хэш ssoId, на выход должны вернуть group id этого пользователя.

About

Репозиторий с заглушками для отсутствующих компонентов ДЭГ в Москвы

License:BSD 3-Clause "New" or "Revised" License


Languages

Language:JavaScript 29.4%Language:PHP 27.3%Language:Smarty 22.2%Language:Rust 9.6%Language:CSS 7.6%Language:Python 3.3%Language:HTML 0.2%Language:Blade 0.2%Language:Dockerfile 0.1%Language:Shell 0.1%Language:Makefile 0.0%