Da diverso tempo utilizzo una semplice ed efficace procedura di backup per i miei dispositivi Android. Il sistema si basa sui ben conosciuti programmi rsync e SSH affiancati dall’onnipresente scheda Raspberry Pi. In questa prima parte illustrerò come realizzare il tutto tramite Termux, l’emulatore di terminale per Android. Nei prossimi giorni seguirà una seconda parte dove vedremo come automatizzare completamente la procedura utilizzando il programma Tasker.
Indice
Note iniziali
Esistono diversi programmi per effettuare il backup, in locale o remoto, dei dati dei dispositivi Android: Google Photo, Google Drive, Dropbox, Syncthing solo per citarne alcuni dei più famosi. Quindi perché utilizzare un sistema come quello che andremo qui a vedere? Prima di tutto per divertimento, poi perché l’uso di un sistema del genere è completamente nelle nostre mani: è adattabile e malleabile, con veramente pochi limiti. Se siete interessati, quindi, proseguite con la lettura.
Prerequisiti
- Una scheda Raspberry Pi con già installata una qualsiasi distribuzione supportata (in questo caso ho utilizzato Raspbian Jessie Lite) e con tutte le operazioni di post-installazione effettuate (espansione file-system, cambio nome host,cambio password, abilitazione SSH, impostazione locale, ecc.). La scheda dovrà essere configurata con IP statico e connessione ad Internet abilitata.
- Un dispositivo Android (tablet o smartphone) aggiornato almeno a Lollipop e compatibile con i software sotto elencati. Per poter usufruire delle opzioni di backup il device dovrà essere connesso alla stessa rete dove è collegata la Raspberry Pi.
N.B. la scheda Raspberry Pi può essere sostituita con un qualsiasi computer dove sia stato installato Linux e che sia collegato in rete.
Principali programmi utilizzati
- Termux per Android: emulatore di terminale gratuito che non necessita di root e che mette a disposizione gran parte dei comandi normalmente presenti nella shell Linux (es: ssh, rsync e molti altri). E’ inoltre dotato del package manager Advanced Packaging Tool (APT) che ne estende enormemente le funzionalità.
- OpenSSH: (Open Secure Shell) un insieme di programmi Open Source che rendono disponibili sessioni crittografate di comunicazione in una rete di computer usando il protocollo SSH.
- rsync: programma che permette la sincronizzazione del contenuto di due cartelle.
Preparazione della scheda Raspberry Pi
Come prima cosa accertiamoci di avere installato un paio di programmi fondamentali:
sudo apt-get install rsync openssh-server
Ora creiamo l’utente testuser con cui effettueremo i backup dal dispositivo Android alla scheda Raspberry Pi:
sudo useradd -m testuser
(rimpiazzate testuser con un nome a vostra scelta)
Assegniamogli una password:
sudo passwd testuser
In /home/testuser
creiamo la directory nascosta .ssh
che conterrà le chiavi pubbliche per la connessione SSH che effettueremo da Android:
sudo mkdir /home/testuser/.ssh
Impostiamo correttamente la directory:
sudo chmod 700 /home/testuser/.ssh
sudo chown -R testuser: /home/testuser/.ssh
Daremo per scontato che l’Hard Disk o la risorsa di rete dove salveremo i nostri backup sia montata ed accessibile all’utente testuser. Non utilizzate direttamente lo spazio della SD/MicroSD dove è installata Raspbian in quanto potreste esaurirne immediatamente la capacità durante il primo backup. In questa guida farò riferimento a questa directory/risorsa come /media/usbstorage/
.
Ora passiamo al dispositivo Android: torneremo dopo alla Raspberry Pi per rendere più sicura la connessione al server OpenSSH.
Configurazione del dispositivo Android
Termux
Installiamo Termux sullo smartphone/tablet di cui vogliamo gestire i backup. L’interfaccia del programma è minimale, ma nasconde numerose funzioni aggiuntive che ne rendono più semplice l’utilizzo. Consiglio una veloce lettura della guida all’interfaccia prima di continuare. Inoltre abilitate fin da subito la Extra keys view (la parte sopra la tastiera touch con i caratteri “ESC CTRL ALT TAB – / |”) che renderà molto più comodo l’utilizzo del terminale.
L’applicazione necessita di un minimo di configurazione, ma niente di complicato: dobbiamo semplicemente lanciare alcuni comandi per aggiornarne i binari e configurarne l’ambiente di lavoro. Una volta avviato il programma digitiamo:
apt update
Attendiamo che vengano aggiornati repository e poi eseguiamo l’upgrade:
apt upgrade
Andiamo avanti rispondendo “Y” o semplicemente premendo invio quando verrà richiesto di continuare. Ora Termux è aggiornato e pronto per essere utilizzato.
N.B. le due operazioni appena viste di update ed upgrade dovranno venire eseguite periodicamente così da mantenere aggiornati i programmi installati nell’emulatore.
Dobbiamo ora concedere all’applicazione il permesso di accedere allo storage interno del dispositivo, quindi:
termux-setup-storage
Apparirà una richiesta da parte del sistema Android per concedere a Termux l’accesso allo storage interno del dispositivo: confermiamo ed avremo finito la configurazione iniziale, ma prima di proseguire consiglio di leggere la breve guida su come Termux gestisce lo storage interno di Android.
Configurazione di rsync e SSH in Termux
Ora installiamo SSH e rsync:
apt install openssh rsync
Confermiamo l’installazione ed in pochi secondi i due pacchetti saranno pronti per essere utilizzati. Proviamo subito che rsync sia effettivamente in grado di collegarsi al server OpenSSH sulla Raspberry Pi: per ora effettueremo una connessione utilizzando la password dell’utente testuser, ma in seguito vedremo come collegarsi in maniera sicura e senza password. Quindi da Termux digitiamo:
rsync -avzz -e ssh ~/storage/shared/downloads/ testuser@192.168.1.160:/media/usbstorage/
(consiglio: per digitare il carattere tilde ~ in Termux utilizzate la combinazione Volume Su + h
)
~/storage/shared/downloads/
: è la directory del dispositivo Android DA cui effettuare il backup.testuser@192.168.1.160:/media/usbstorage/
: nome utente con cui collegarsi, IP della Rasberry Pi e directory IN cui copiare i file.
Invece della cartella ~/storage/shared/downloads/
possiamo scegliere qualsiasi directory presente nella sdcard interna, purché Termux possa accedervi.
Se è tutto ok ci verrà richiesto di confermare l’host (digitando yes) e poi la password dell’utente testuser, dopo di ché rsync inizierà la copia dei file da Android alla Raspberry Pi.
Ora che abbiamo verificato che la connessione tra dispositivo Android e Raspberry funziona correttamente, possiamo eliminare la richiesta della password e rendere il procedimento di connessione automatico. Per farlo utilizzeremo l’autenticazione tramite chiavi di SSH. Nel terminale di Termux digitiamo il seguente comando:
ssh-keygen
Accettiamo il valore di default per il nome del file della chiave. Verrà in seguito richiesto l’inserimento di una password per la chiave che stiamo generando: lasciamo il campo in bianco e confermiamo due volte. La chiave privata id_rsa
e la chiave pubblica id_rsa.pub
verranno create nella directory ~/.ssh/
.
Copiamo la chiave pubblica nella Raspberry utilizzando il comando ssh-copy-id
:
ssh-copy-id -i ~/.ssh/id_rsa.pub testuser@192.168.1.160
La chiave verrà installata automaticamente nella directory standard dell’utente con cui abbiamo effettuato la connessione (/home/testuser/.ssh
) sulla Raspberry Pi (possiamo ignorare eventuali messaggi di warning).
N.B. non cedete mai a nessuno la vostra chiave privata! In caso di perdita o compromissione della chiave, dovrete immediatamente dismettere le vostre chiavi, creare una nuova chiave privata e reimpostare il tutto.
Ora proviamo a connetterci tramite SSH ed accertiamoci che non venga richiesta la password:
ssh testuser@192.168.1.160
A questo punto possiamo richiamare nuovamente la stessa riga di comando rsync che abbiamo visto in precedenza:
rsync -avz -e ssh ~/storage/downloads/ testuser@192.168.1.160:/media/usbstorage/
La sincronizzazione sarà effettuata automaticamente, senza prima passare per la richiesta di password.
Creiamo uno script da richiamare alla bisogna e per rendere più pratico il backup. Termux viene fornito con l’editor vi
, ma per comodità possiamo installare anche nano
o qualsiasi altro editor presente nei repository:
apt install nano
Creiamo quindi un file testbackup.sh
nella directory corrente:
nano testbackup.sh
Copiamo il comando rsync che abbiamo utilizzato in precedenza, salviamo ed usciamo da nano (CTRL+O e CTRL+X
) e rendiamo eseguibile il file con chmod
:
chmod a+x testbackup.sh
A questo punto possiamo eseguire il backup semplicemente richiamando il file appena creato:
./testbackup.sh
Come in una qualsiasi sistema Linux nulla ci vieta di creare script complessi per rendere ancora più comodo il nostro backup, il mio metodo preferito è utilizzare Termux in accoppiata con Tasker, così da poter gestire ed automatizzare il backup direttamente da quest’ultimo programma. Nella seconda parte della guida, che verrà pubblicata nei prossimi giorni, vedremo come integrare i due programmi.
OPZIONALE: Aumentare la sicurezza della connessione SSH
Vediamo alcune semplici operazioni che possiamo effettuare sulla Raspberry Pi per rendere più sicure le connessioni SSH.
N.B. prima di apportare qualsiasi modifica accertatevi di avere sempre un metodo di connessione alla Raspberry, fisico o remoto che sia. Prima di uscire dall’eventuale sessione remota con cui state effettuando i cambiamenti, aprite un nuovo terminale e provate a collegarvi con i nuovi parametri. Nel caso non riusciste a collegarvi, eliminate le modifiche e cercate di capire l’errore e non uscite dalla sessione remota originale finché tutto non funzioni alla perfezione
Utilizzare le chiavi SSH
Utilizzate preferibilmente le chiavi pubbliche e private per collegarvi via SSH. Se avete bisogno che la connessione sia disponibile per più utenti (es: pi e testuser), generate le chiavi per tutti. Il metodo di generazione delle chiavi è quello indicato nella sezione dedicata a Termux.
Modificare la porta di default per la connessione SSH
Normalmente il serve SSH è in ascolto sulla porta 22. Eventuali tentativi di intrusione prenderanno ripetutamente di mira questa porta. Modificare la porta di default è un sistema semplice ed efficace per scoraggiare la maggior parte degli attacchi al nostro server SSH. Scegliete quindi una porta che non sia già utilizzata da un altro servizio e ricordatevi che i nuovi collegamenti dovranno fare riferimento esplicitamente a questa porta. Quindi modifichiamo il file di configurazione con nano:
sudo nano /etc/ssh/sshd_config
Cambiamo la riga:
Port 22
in
Port 1234
1234
sarà la nuova porta di ascolto del server SSH.
Riavviamo il server:
sudo service ssh restart
Proviamo ora a collegarci con una nuova sessione dichiarando la porta con l’opzione -p nr-porta
:
ssh -p 1234 testuser@192.168.1.160
Eliminare il banner SSH
Il banner SSH è una stringa che identifica in maniera chiara la versione del sistema operativo dove gira il server SSH. Dichiarare esplicitamente il sistema operativo favorisce eventuali attacchi che vanno a sfruttarne i bug noti. Per controllare come si comporta il server SSH collegatevi via telnet:
telnet 192.168.1.160 22
Dovreste ottenere una stringa del tipo SSH-2.0-OpenSSH_6.7p1 Raspbian-5+deb8u3
. Quindi modificate con un editor di testo il file di configurazione /etc/ssh/sshd_config
ed aggiungete alla fine la riga:
DebianBanner no
Riavviate il server e controllate nuovamente tramite Telnet: questa volta dovreste ottenere solamente la versione di OpenSSH.
Specificiare gli utenti che possono collegarsi al server OpenSSH (AllowUsers)
Se la Raspberry Pi è configurata con più utenti può tornare utile specificare quali tra questi possano effettivamente collegarsi via SSH. Aggiungiamo la seguente opzione alla fine del solito file di configurazione:
AllowUsers pi testuser
Riavviamo il server e da questo momento in poi solo i due utenti indicati potranno collegarsi via SSH.
Eliminare l’acceso tramite password
Visto che precedentemente abbiamo impostato l’accesso tramite chiavi, è buona norma revocare il permesso di accedere al server SSH tramite password. Cerchiamo la seguente riga nel file di conf:
#PasswordAuthentication yes
Decommentiamola e modifichiamola in:
PasswordAuthentication no
Ora l’accesso sarà consentito solo tramite chiavi.
Impedire l’accesso all’utente root
Anche se in Raspbian, per ragioni di sicurezza, l’utente root è bloccato (così come nella maggior parte delle derivate da Debian), è sempre consigliabile impedirne l’accesso anche al nostro server SSH. Cerchiamo la riga
PermitRootLogin without-password
Modifichiamola in:
PermitRootLogin no
Con questo è tutto. Ci vediamo per la seconda parte!
Buon divertimento! 😉
Complementi per l’articolo. Ho eseguito il tutto e funziona!!! Ho solo un problema: quando creo il file script per lanciare testbackup.sh creato con nano, il file non viene riconosciuto. Mi sfugge qualcosa? Ho eseguito il seguente script
#!bin/bash
rsync -avz e tutto il resto
dopodiche lo rendo eseguibile
chmod +x testbackup.sh
Ciao Giorgio,
lo shebang che stai utilizzando è sbagliato. Per semplificare basta che lo cancelli (per questo esempio lo puoi pure omettere), oppure puoi utilizzare:
#!/usr/bin/bash
Ma così facendo prima di eseguire lo script lo devi “passare” per termux-fix-shebang (maggiori info: https://termux.com/linux.html):
termux-fix-shebang nomefile.sh
Fammi sapere se così ti funziona.