Televotare

di Leonardo Boselli  leo@dicea.unifi.it Nucleo Informatico e Telematico,
Dipartimento di Ingegneria Civile,Università degli Studi di Firenze

Summary: About a system used in our department to allow students to elect their representatives in the department council, with warrantees of  uniqueness, secrecy, without having to install a poll booth, and forcing them to come to the department .
It uses an existing server used for e-mail using a couple of custom programs to accomplish the duty.

 

prerequisiti

Il regolamento del nostro dipartimento prevede, nel consiglio, oltre alla presenza di tutto il personale docente di una rappresentanza del personale tecnico amministrativo, dei dottorandi e degli studenti "interni".
Mentre le rappresentanze del PTA hanno validità biennale quelle degli studenti debbono essere rinnovate ogni anno.
Poiché la votazione con tecniche tradizionali (scheda e cabina, con riconoscimento dell'elettore) ha un costo non indifferente (principalmente in termini di personale per il controllo della votazione e lo scrutinio, nonché per la stampa delle schede) e comunque richiede all'elettore di presentarsi di persona, quindi tagliando fuori tutti coloro che per i motivi più vari fossero furori sede nei giorni della votazione, non si prestava bene a un elezione di questo tipo, de tenersi con relativa frequenza, ho pensato di predisporre un sistema telmatico.
I requisiti che un tale sistema avrebbe dovuto avere erano stati individuati nei seguenti:

Funzionamento

In base a queste  esigenze è stato ideato il seguente sistema:
Si è utilizzato il sever che normalmente è utilizzato per la posta elettronica, in questo modo è assicurato il requisito 3 in quanto tutti gli utenti hanno il loro account su tale server.
La autenticazione viene fatta con la password di sistema, dal file passwd.
Poiché non tutti gli utenti della macchina (ad esempio gli amministratori e i content-manager, ma anche studenti che hanno perso i requisiti, visto che l'account in certi casi può essere mantenuto fino a 18 mesi dopo la laurea) sono elettori è stata necessaria una seconda lista su cui sono riportati tutti gli username degli elettori e quindi soddisfa il requisito 1.
Una alternativa presa in considerazione era quella di utilizzare un file del tipo .htaccess ricavando username e password dlla lista e dl file passwd. Tuttavia anche se avrebbe consentito un più veloce controllo e sarebbe stata compatibile con shadow password, tale file avrebbe avuto l'inconveniente che se un utente cambiava la password quella in questo file ausiliario risultava la vecchia.. Poiché non è infrequente che l'utente se la dimentichi, di fatto questo avrebbe costretto a mettere le mani su quel file, cosa che non si voleva assolutamente fare. Fra l'altro il tenere due file separati è anche conveniente in quanto la eventuale aggiunta di un votante omesso (in genere perché non era giunta in tempo la comunicazione dell'avvenuto rinnovo della iscrizione) non implica l'inserimento di un utente, ed è sufficiente un append al file (quindi senza toccare i dati esistenti) (requisito 8).
Il sistema del lookup su un file formato .htaccess è invece indispensabile se i votanti non hanno tutti l'account sulla macchina sulla quale viene fatta la votazione. in questo caso però deve essere individuato un metodo sicuro per la trasmissione delle password.
Sul server è installato un sistema operativo linux 2.4 con server apache-ssl e perl  .
Il server http gira con permission www-data:www-data e tutti i dati relativi alla elezione sono inseriti in una directory in cui solo tale utente ha permessi di lettura e scrittura e tutti gli altri nessun accesso (negli scrip allegati è /var/studenti ).
Tutte le operazioni su tale directory debbono quindi avvernire tramite web, con script che possono essere inseritio solo da root.
L'elettore al momento del voto chiama uno script cgi generato da uno script perl  che mostra a schermo una scheda elettorali in cui l'elettore può segnare i voti. a seconda del regolamento elettorale in luogo di selezioni multiple è possibile una selezione unica, oppure indicare un nominativo, o altro. Le modifiche vengono comunque fatte sempre in questo file, per cui è agevole riciclarlo per regole diverse. Qualora vanga utilizzato spesso anche i nomi dei candidati o le opzioni potrebbero essere prese da un file di configurazione.
L'accesso avviene tramite https: via internet , con ciò soddisfando i requisiti 5 e 6 . Riguardo alla accessibilità l'output è di puro testo e può essere utilizzato anche con browser testuali o a sintesi sonora., sia da tastiera che con mouse.
Intesta alla pagina sono riportate in modo sommario le regole per il voto (così come sulla scheda cartacea) .
Per evitare che l'elettore prema accidentalmente il tasto invio prima del completamento se desidera votare un numero inferiore di nominativi rispetto al numero massimo deve selezionare una casella apposita in modo tale che il sitema riconosca che il numero ridotto di voti è una scelta deliberata, lo stesso per quanto riguarda la scheda bianca.
Per votare l'elettore si deve identificare inserendo username e password negli appositi spazi, soddisfando il requisito 3 e inviando con un POST il form compilato. La scelta del matodo POST è data dal fatto che il server non registra in nessun caso sul log i dati inviati (requisito 7).
Qualora il voto sia irregolare (voti in difetto o in eccesso, elettore non in lista, identificazione errata) lo script ripropone la scheda, indicando in testa quali sono le incongruenze. Se il voto invece è valido lo script lancia il programma di registrazione del voto passandogli come parametri il voto [come una stringa alfanumerica], il votante [username] e iun campo commento [nel nostro caso è stato usato per indicare l'ora del voto e la macchina da cui il voto è stato inviato, l'uso è a scelta, tale campo serve comunque in quanto in caso di funzionamenti anomali del sistema la presenza di tale record a lunghezza 0 consente di riabilitare l'elettore in quanto il suo voto non è stato registrato].
Nel caso si sia in presenza di elezioni contemporanee il programma andrebbe modificato aggiungendo un quarto campo col nome della elezione (a sostituire o ad accodarsi alla variabile registro  - nel programma di esempio tale opdione non è presente)
Il programma va a creare un file con il nome dell'elettore. Se il file ha lunghezza zero significa che l'elettore non ha votato (il contenuto di questo file è l'equivalente della controfirma sul registro elettorale). se invece c'è qualcosa il programma lo mostra all'elettore e esce senza modificare altro. (requisito 2 )
Se il requisito è soddisfatto allora tenta di aprire in modo esclusivo l'«urna» ossia un file che contiene i voti (all'inzio è un file che contiene 1024 record formati da null), se non ci riesce riprova fino a che non riesce [essendo che più votanti possono mandare simultamentamente il voto da più postazioni, seppur rara una concorrenza è possibile]. Non appena ci riesce genera un numero casuale da 0 a 1023 (il numero massimo va scelto della forma 2n-1 in base al numero dei votanti) e esamina se in tale record è già presente un voto, se c'è allora genera un altro numero casuale e così via fino a che non trova un voto libero [è l'equivalente digitale dello scuotere  l'urna quando è quasi colma per fare entrare nuove schede] (per soddisfare al requisto 7).
Quando ha trovato una cella libera allora vi scrive il voto e quindi immediatamente richiude l'urna digitale e scrive sul registro digitale dei votanti [un file con lo username del votante] il contenuto del terzo campo [come già detto la controfirmna sul registro].,
Stampa inoltre sullo schemo "registrato voto xx alla posizione yyy".
Questo è l'unico momento in cui appare all'esterno un abbinamento votante-voto. lo scopo è di consentrire al votante di controllare al momento dello scrutinio che il suo voto sia correttamente registrato. (requisito 9).
Il requisito 10 è stato quello che ha più dato da pensare, in quanto la segretezza del voto (requisito 7) potrebbe essere inficiata da "sbirciamenti" da parte dell'amministratore del sistema. Un sistema preso in esame era quello di disabilitare l'accesso da root dall'esterno, di mettere la macchina in un sacco e sigillarlo lasciando fuori solo cavo di alimentazione e di rete. In questo modo le uniche operazioni possibili sarebbero state solo quelle tramite web, sufficioneti per inserire nuovi elettori tramite script appositi, o leggere il numero degli elettori ma non ad esempio manipolare il file dei voti
Ripensandoci poi è stata utilizzata una soluzione meno drastica, ossia le uniche persone ad avere la password di root erano i componenti della commissione elettorale, che avevano pure la chiave di accesso ai locali del server. Di fatto il livello di sicurezza è anche in questo modo più soft lo stesso che per una elezione "reale" in cui si sigilla l'urna e si chiude la porta a chiave. Nulla impedirebbe anche in questo caso che la commissione rientri dopo la chiusura, apra l'urna, sbirci e richiuda tutto.

Lo scrutino

Per il termine della votazione mi sono trovato di fronte a un dilemma: il regolamento delle elezioni  in genere prevede che chi è presente nel seggio elettorale all'ora di scadenza possa votare. nel nostro caso la cosa non era praticabile. in quianto essendo in rete con una connessione stateless come quella https è impossibile sapere se qualcuno sia in attesa di votare, e anche chiuedendo un login questo non avrebbe potuto escludere che qualcuno si collegasse, non votasse e non si sconnettesse.
La scelta è stata, visto anche che il termine delle votazioni era di 48 ore consecutive, di inserire un comando at 12:00 che al termine dell'orario previsto lanciasse un programma di scrutino che inviasse via e-mail a tutta la commissione elettorale e ai candidati il risultato.