Bilancio online con Gnucash + MySQL + SSH

    Schermata avvio GnuCash
    Image credits: by laboratorio linux

    Gnucash è un’ottimo strumento per tenere un bilancio familiare, e dalla versione 2.4.0 supporta il collegamento ad un database SQLite, MySQL o PostgreSQL per l’archiviazione dei dati. Usando un database locale sono tuttavia legato ad un computer specifico per il suo utilizzo. Io voglio invece poter aprire una sessione di Gnucash da qualsiasi computer e collegarmi sempre ad un’unica base dati remota.

    Aprire il database alla rete è decisamente poco sicuro, ma un tunnel SSH mi offre una alternativa leggera e affidabile. Per implementare il tutto ho usato:

    Lato server:

    Lato client:

    Tutti questi software girano indifferentemente su piattaforme Linux, Windows e Mac, il che offre un’ampia flessibilità. Per me che ho a casa un server Linux collegato alla rete il tutto è stato molto semplice, ma non escludo che anche un hosting non troppo costoso offra un supporto sufficiente per implementare il tutto.

    Server

    La configurazione del server SSH non richiede niente di particolare, se non assicurarsi che il firewall sia correttamente configurato per permettere l’accesso alla porta 22, o qualunque altra voi abbiate impostato. Se volete una sicurezza maggiore consiglio di usare un’autenticazione tramite chiavi, come descritto qui.

    Il prossimo passo è creare il database e l’utente che dovrà utilizzarlo. Dato che creeremo un tunnel SSH è anche possibile usare phpMyAdmin da remoto come spiegato ad esempio https://shallop.com/2011/04/howto-use-phpmyadmin-to-remote-admin-mysql-dbs-via-ssh-tunnel/, ma la procedura è così semplice che io decido di farlo da terminale. Dopo aver ottenuto l’accesso al server la sequenza è la seguente:

    # mysql -u root -p
    Enter password:
    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 4012
    Server version: 5.1.49-3 (Debian)
    
    Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
    This software comes with ABSOLUTELY NO WARRANTY. This is free software,
    and you are welcome to modify and redistribute it under the GPL v2 license
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> create database gnucash;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> grant all on gnucash.* to gnucash@localhost identified by 'PASSWORD' with grant option;
    Query OK, 0 rows affected (0.12 sec)
    
    mysql> flush privileges;
    Query OK, 0 rows affected (0.13 sec)
    
    mysql> exit
    Bye
    #
    

    Il che significa che, dopo aver ottenuto l’accesso come utente root a mysql creo il database gnucash e con il comando GRANT creo direttamente l’utente gnucash, gli assegno i permessi per l’uso del datatbase e imposto la PASSWORD di accesso. Nella documentazione di Gnucash non ho trovato nulla riguardo i permessi necessari all’utente per l’utilizzo del programma, quindi li assegno tutti, anche se probabilmente è possibile limitarli e migliorare la sicurezza dell’accesso.

    Client

    Prima di avviare Gnucash su un qualsiasi client è necessario creare il tunnel SSH, che si esegue abbastanza semplicemente su qualsiasi piattaforma.

    OpenSSH Client (Linux e Mac)

    Da un terminale si digita:

    ssh -L 3307:localhost:3306 -i /media/USB/private.key utente@miosito.com
    

    l’opzione -i specifica la posizione della chiave privata per l’autenticazione, se necessaria, che io tengo nella chiavetta USB, mentre con l’opzione -L creo il tunnel fino al mio server che si trova in miosito.com, specificando tre parametri:

    3307 è la porta locale a cui mi dovrò collegare per entrare nel tunnel

    localhost è l’indirizzo dove è disponibile il server MySQL. Dato che il mio tunnel “esce” sulla stessa macchina l’indirizzo è localhost.

    3306 è la porta alla quale collegarmi per accedere al server MySQL

    Putty (Windows)

    Nella finestra di configurazione di Putty inserisco i seguenti dati:

    Session: inserisco l’host name, miosito.com, e la porta del server SSH, 22 o altro.

    Connection->Data: in Login details posso inserire il nome utente per il collegamento SSH, per evitare che mi venga chiesto ogni volta.

    Connection->SSH->Auth: specifico la posizione del file contenente la private key per l’autenticazione, se necessaria.

    Connection->SSH->Tunnels: in source port inserisco la porta locale di accesso, e in destination inserisco l’indirizzo del server MySQL e la porta di destinazione con la sintassi localhost:3306

    Prima di aprire la connessione ho la possibilità, ritornando alla finestra Session, di salvare i parametri della sessione per poterli richiamare senza reinserirli nuovamente. Clicco su Open e dopo aver inserito la password il prompt del terminale mi indicherà che il tunnel è attivo.

    Gnucash

    Ora posso lanciare Gnucash e aprire un nuovo file indicando come formato dei dati mysql, come host la macchina da cui abbiamo aperto il tunnel e la porta di accesso, nel nostro caso 127.0.0.1:3307, il nome del database, gnucash, il nome dell’utente MySQL, gnucash, e la PASSWORD di accesso. Il programma crea in autmatico tutte le tabelle necessarie a seconda della struttura dei conti da noi indicata.

    Come nome di host ho indicato l’indirizzo IP perchè su macchine Linux, per motivi che ignoro, se indico localhost:3307 mi viene restituito un errore e il collegamento abortisce. Su macchine Windows funzionano entrambe le sintassi.

    Sono pronto ora per inserire i dati. Ogni volta che vorrò modificarli da qualsiasi posto mi trovi sarà sufficiente aprire il tunnel e da Gnucash aprire il file esistente inserendo gli stessi parametri sopra indicati.

    Se utilizzate una chiave privata è sconsigliabile sparpagliarla su tutte le macchine dove lavorate, mentre è pratico e abbastanza sicuro tenerla su una chiavetta USB dove può trovare posto anche Putty, che non necessita di installazione e occupa pochissimo spazio.

    Auguro un buon pareggio di bilancio a tutti 🙂

    Edit me on Gitea