Sistemas Electrónicos de Votación
Transcripción
Sistemas Electrónicos de Votación
Universidad Técnica Federico Santa Marı́a Departamento de Informática Sistemas Electrónicos de Votación Helios Voting Server Integrantes Rodrigo Fernández Gaete Tel: +56 9 8419 3413 [email protected] En éste trabajo se detallará la implementación del sistema de votación Helios en el departamento de informática de la UTFSM. 3 de junio de 2011 Seminario de Sistemas Distribuidos 1. 1.1. Sistemas Electrónicos de Votación Descripción del sistema Proceso de votación de Helios 1. Creación de la votación El creador queda como administrador de la votación. El sistema (Helios) mantiene una llave el-gammal privada y el administrador se queda con el par público de la misma. El administrador puede elegir dejar la votación identificando cada voto con su votante o dejarla anónima. 2. Registro de los votantes Se utiliza el nombre y correo para inscribir a cada votante. A cada votante se le genera una contraseña de 10 caracteres aleatorios y se les envı́a al correo de cada uno. 3. Término de Inscripción de votantes Se congela la inscripción de votantes y se abre la posibilidad de votación a todos los inscritos en el paso anterior. 4. Votación a) El servidor envı́a su llave pública junto a las preguntas de la votación al votante. b) El usuario selecciona sus preferencias sin que éstas se envı́en al servidor (no requiere de conexión en éste paso, puede seleccionar todo estando offline). c) El votante puede “sellar” su voto, encriptando su selección con SHA1. d ) Antes enviar el voto ya sellado, puede elegir corroborar la información del mismo (ver auditorı́a). e) Una vez que decide que es momento de enviar su voto, se le pide autenticarse con su mail y contraseña dada. f ) Esto lo puede hacer cuantas veces quiera. 5. Auditorı́a Una vez teniendo el voto sellado, el usuario puede elegir descargar toda la información encriptada en conjunto con su llave privada para corroborar la información contenida en él. Al hacer esto el voto deja de estar sellado y debe encriptarse nuevamente. Una vez ya realizado el voto, al finalizar la votación uno puede comprobar que éste se encuentre dentro de los votos realizados en el sistema con la información que el sistema le envı́a una vez realizado el voto. Es crucial para el sistema, ya que es la principal forma de asegurar la integridad de la votación. Es importante destacar que todo votante puede comprobar su voto. 6. Finalización de la votación Se cierran las votaciones y se procede a realizar el algoritmo mixnet a los votos. Los votos quedan públicos, dejando abierto a que cualquier votante audite el sistema. 1 Seminario de Sistemas Distribuidos 1.2. Sistemas Electrónicos de Votación Caracterı́sticas 1. Integridad del sistema de votación. Su principal fortaleza es que pone la integridad de la votación por sobre todo. Cualquier votante puede comprobar su voto antes y después de votar, por lo que aunque se vean comprometidos los sistemas, basta con que una parte de los involucrados revise sus votos para comprobar la integridad del mismo. 2. Resistencia a la coerción. No considera defensas en contra de la coerción. De hecho, considera que intentar combatir contra ella es una pelea perdida. Incluye un botón “coarce me” para que la gente tome conciencia del asunto (y que permite enviarle el comprobante del voto al correo de otra persona). 3. Escalabilidad de la solución. Está pensado para votaciones de pequeña escala, en donde se considera que la coerción que puedan sufrir las personas es despreciable (organizaciones pequeñas, centros de alumnos, universidades, etc.). El mayor costo computacional está al mezclar los votos y realizar una auditorı́a completa de la votación, ya que los algoritmos que se utilizan para éstas etapas son de orden cuadrático. Aún ası́, al igual que en Civitas, este tipo de algoritmos es altamente paralelizable y puede escalar de ésta forma sin muchos problemas. 4. Costos de implementación. El sistema de votación es completamente por internet, y basta con tener un servidor web para su implementación. 5. Proyección en el tiempo. Hasta el dı́a de hoy es mantenido por un grupo de desarrolladores[2] y ha sido usado en diferentes universidades. 2. Requerimientos Se ha determinado que para la realización del proyecto se deberá contar con los siguientes recursos: Servidor: Se necesitará un computador que actúe de proveedor del servicio. El sistema operativo del servidor debe ser GNU Linux. Computador de Escritorio: Se requerirá de un computador que actúe de cliente del servicio en donde realizar las pruebas del sistema de votación. No requiere más que de una conexión segura con el servidor. Conectividad entre los dispositivos: Los sistemas de votación electrónica requieren de una red segura para interconectar cada componente del sistema. Es por ello que serı́a ideal contar con la posibilidad de crear redes virtuales para las pruebas entre el cliente y servidor. 2 Seminario de Sistemas Distribuidos Sistemas Electrónicos de Votación Vale la pena mencionar que éstos recursos ya están disponibles en el departamento de Informática de la UTFSM, por lo que sólo quedarı́a coordinar su uso con los administradores de sistemas del departamento. 2.1. Hardware utilizado 1. Máquina virtual con 1024 MB RAM y 2 procesadores virtuales de 2GH. 2.2. Dependencias de Software 1. PostgreSQL 8.3+ 2. Python 2.5+ 3. Django 1.1+ 4. RabbitMQ 1.8+ 5. Celery 2.0.2+ 6. Django-Celery 2.0.2+ 2.3. Software usado Ubuntu Server x86 64 kernel 2.6.38-8-server python 2.7.1-0ubuntu5 python-django 1.2.5-1ubuntu1 postgresql 8.4.8-0ubuntu0.11.04 python-psycopg2 2.2.1-1ubuntu2 rabbitmq-server 2.3.1-1ubuntu1 celery-2.2.6 django celery-2.2.4 South-0.7.3 postfix 2.8.2-1ubuntu2.1 3. Instalación Los pasos siguientes son los llevados a cabo en un sistema Ubuntu Server. 3.1. $ $ $ $ Instalación de dependencias apt-get apt-get apt-get apt-get install install install install postgresql python-psycopg2 python-django rabbitmq-server 3 Seminario de Sistemas Distribuidos 3.1.1. Sistemas Electrónicos de Votación Python setup tools Instalamos Python setup tools, luego celery y django celery[3]. $ apt-get install python-setuptools $ easy_install celery $ easy_install django-celery Para celery necesitamos installar django-openid-auth y south. $ aptitude install python-django-openid-auth $ easy install south 3.2. Configuración de la base de datos Crear un usuario y la base de datos de helios. $ su - postgres $ createuser --superuser helios $ createdb -O helios heliosdb Debes recordar contraseña del usuario creado. En caso que se te olvide, puedes cambiar la contraseña después haciendo: $ psql # ALTER USER helios WITH PASSWORD ’heliospass’; 3.3. Instalación y configuración de servicio de correo Helios utiliza un servicio de correo a través de celeryd. A continuación se utilizará postfix como servidor de correo, utilizando el puerto que trae configurado por defecto (25).[8] $ apt-get install postfix // se habre una pantalla de configuración del servicio. // se pide el tipo de servidor (Internet Site) // y el dominio del servidor (votacion.inf.utfsm.cl) 3.4. 3.4.1. Instalación de Helios (master branch, 30 Mayo 2011) Instalación de helios-server $ git clone git://github.com/benadida/helios-server.git $ cd helios-server 3.4.2. Instalación de los submódulos Helios-server requiere de los proyectos jscrypto, helios-booth y helios-verifier. Para ello, hay que modificar .git/config y .gitmodules dentro del directorio base de helios-server, cambiando la siguiente linea: url = [email protected]:benadida/jscrypto por: url = git://github.com/benadida/jscrypto.git Y pasar a iniciar y actualizar los proyectos: 4 Seminario de Sistemas Distribuidos Sistemas Electrónicos de Votación $ git submodule init $ git submodule update Por último, hay que hacer un procedimiento similar para el subproyecto helios-booth: $ cd heliosbooth // modificar la url de jscrypto.git en .git/config y .gitmodules $ git submodule init $ git submodule update 3.4.3. Configuración de Helios 1. Para comenzar, copiar settings.py.sample a settings.py: $ cp settings.py.sample settings.py 2. Actualizar los parámetros de settings.py: DATABASE_NAME = ’heliosdb’ DATABASE_USER = ’helios’ DATABASE_PASSWORD = ’heliospass’ DATABASE_HOST = ’127.0.0.1’ DATABASE_PORT = ’5432’ DEFAULT_FROM_EMAIL = ’Ben Adida for Helios <[email protected]>’ URL_HOST = "http://votacion.inf.utfsm.cl:80" SECURE_URL_HOST = "https://votacion.inf.utfsm.cl:443" SOCIALBUTTONS_URL_HOST = "http://votacion.inf.utfsm.cl:80" SITE_TITLE = ’Helios Server’ # FOOTER links FOOTER_LINKS = [{’url’:’http://usg.princeton.edu/elections’, ’text’:’USG Elections Center’}] WELCOME_MESSAGE = "welcome" # email server EMAIL_HOST = ’localhost’ EMAIL_PORT = 25 EMAIL_HOST_USER = ’’ EMAIL_HOST_PASSWORD = ’’ EMAIL_USE_TLS = False 3. Actualizar reset.sh e indicar la base de datos y usuario utilizado: #!/bin/bash dropdb heliosdb -U helios -W createdb heliosdb -U helios -W python manage.py syncdb python manage.py migrate echo "from auth.models import User; User.update_or_create(user_type=’password’,user_id=’be 5 Seminario de Sistemas Distribuidos Sistemas Electrónicos de Votación 4. Ponemos un logo por defecto y listo: $ cd server_ui/media/ $ cp logo.gif.sample logo.gif $ cp footer-logo.gif.sample footer-logo.gif 3.4.4. Iniciar el servidor Helios Inicializamos la base de datos y cargamos los modelos: sh ./reset.sh Por último, se inicia el servidor RabbitMQ utilizando celeryd y corremos a modo de prueba el servidor de desarrollo (Nota: Ambos servicios requieren de permisos de acceso de los puertos de red que utilizan): $ python manage.py celeryd $ python manage.py runserver 0.0.0.0:80 Para poder dejar a ambos corriendo en consola, se puede utilizar el programa screen: $ apt-get install screen $ screen $ python manage.py celeryd [presionar ctrl + a, d] $ screen $ python manage.py runserver 0.0.0.0:80 [preseionar ctrl + a, d] Luego, para volver a una de las consolas, simplemente se utiliza el comando screen -r. Helios puede funcionar de forma autónoma utilizando el comando runserver del framework de django, lo cual es muy útil para el desarrollo de la aplicación. Ahora, lo recomendable es utilizar un servidor web como apache[1] una vez que el periodo de testing y desarrollo halla finalizado. A continuación se explica como dejar andando el servicio utilizando apache: 1. Instalar apache y el módulo para cargar el proyecto de django[5][6][7]: $ apt-get install libapache2-mod-wsgi 2. Crear un certificado ssl para apache[9]: $ sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem 3. Configurar apache para que utilize ssl: sudo a2enmod ssl 4. Modificar el path al certificado de apache creado en el paso anterior en el archivo /etc/apache2/sitesenabled/default-ssl SSLCertificateFile /etc/apache2/ssl/apache.pem 5. Modificar el archivo django.wsgi del proyecto helios-server[4]: sys.path.append(’/home/votamelo/helios-server’) 6 Seminario de Sistemas Distribuidos Sistemas Electrónicos de Votación 6. Agregar la dirección del proyecto al archivo /etc/apache2/httpd.conf : SGIScriptAlias / /home/votamelo/helios-server/django.wsgi 7. Darle permisos de acceso a apache de helios-server: $ chown www-data.www-data -R helios-server 8. Reiniciar apache: sudo /etc/init.d/apache2 force-reload 7 Seminario de Sistemas Distribuidos Sistemas Electrónicos de Votación Referencias [1] Apache web server configuration. httpd.html. https://help.ubuntu.com/10.04/serverguide/C/ [2] Equipo de desarrollo de helios. http://heliosvoting.org/about-us/. [3] Helios install documentation. http://documentation.heliosvoting.org/install. [4] How to use django with apache and mod wsgi. https://docs.djangoproject.com/en/1. 2/howto/deployment/modwsgi/. [5] libapache2-mod-wsgi info. libapache2-mod-wsgi. http://packages.debian.org/unstable/python/ [6] Modwsgi django integration. IntegrationWithDjango. http://code.google.com/p/modwsgi/wiki/ [7] Modwsgi quick install. QuickInstallationGuide. http://code.google.com/p/modwsgi/wiki/ [8] Postfix installation. https://help.ubuntu.com/community/Postfix. [9] Ssl install method in apache. apache2/SSL. https://help.ubuntu.com/community/forum/server/ 8