Torino ITA)
+39 01119115797
info@netpic.it

SYNCTHING: il cloud P2P opensource

SYNCTHING: il cloud P2P opensource

Cosa intendiamo per Cloud Storage?

Tra i servizi che offriamo ai nostri clienti ci sono quelli per la gestione e scambio di dati in cloud, in particolare per effettuare backup remoti, sicuri ed efficienti fuori sede oppure servizi per la sincronizzazione dei file, anche tra più dispositivi e modalità differenti.

Spesso, nelle aziende, specie se si utilizzano più computer, può diventare impellente  avere un servizio di sincronizzazione per gestire i dati su macchine e dispositivi mobili diversi. Una delle soluzioni più utilizzate  è quella di fare uso di servizi di storage online, i famosi servizi Cloud,  davvero ormai molto diffusi, come DropboxGoogle Drive. OneDrive o Amazon s3 con i quali è possibile trasferire e sincronizzare i file da un dispositivo ad un altro. Il grosso limite di questi servizio è che una copia dei file risiederà necessariamente sul server del fornitore del servizio.

Ma come è possibile creare e gestire il proprio servizio di sincronizzazione file, senza coinvolgere utenti tersi, magari su dispositivi propri?
E’ possibile  la tecnologia P2P, come quella famosa di  BitTorrent Sync e sincronizzare i file direttamente tra computer senza bisogno di intermediari. Siamo in grado di offrire questo servizio ai clienti usando nostri server o mettendo a disposizione dei clienti host virtuali a loro dedicati, sia remoti che locali, per consentire questo meccanismo di sincronizzazione dati tra dispostivi, utilizzando ambienti ristretti al loro ambito. Un’ottima ed indipendente soluzione in questo caso è e è sicuramente Syncthing.

Syncthing per il nostro cloud storage personale

E’ importante far notare come Syncthing,  non sia un vero programma per effettuare backup, ma piuttosto un sistema che consente la sincronizzazione P2P dei file. Ho voluto in questo documento cercare di utilizzarlo come sistema di backup, ma in realtà Syncthing non prevede un nodo centrale ma è un puro programma di peer to peer, anche se modificando le direzioni di sincronizzazione è possibile, mantenere una sorta di copie dei file remoti. Questo è bene che sia chiaro fina dall’inizio.

Obiettivo esplicito del progetto è quello di rendere il programma accessibile universalmente. E’ disponibile infatti, oltre che su GNU/Linux, anche su MacOS, Windows, Solaris FreeBSD, e OpenBSD. Inoltre è disponibile una versatile applicazione ufficiale per Android e distribuita tramite Play Store.

Per quel che concerner la sicurezza, elemento essenziale quando i dati transitano sulla rete, occorre subito notare come tutte le comunicazioni tramite Syncthing sono crittografate (protette tramite TLS) e ogni dispositivo è identificato da uno specifico certificato crittografico per garantire un’autenticazione sicura. È possibile configurare e monitorare le operazioni di sincronizzazione tramite un’interfaccia utente (UI) potente e reattiva accessibile tramite un browser web.
Syncthing è un programma che può funzionare in modo semplice ed efficace, ma è importante capire alcune sue logiche onde evitare spiacevoli sorprese. Nel nostro esempio vediamo i passaggi essenziali per installare il servizio su tre dispositivi diversi, un sistema Ubuntu, Windows e uno smartphone Android. Tutti questi tre dispostivi possono sincronizzare e “condividere” dati tra loro, ma nella nostra configurazione vediamo come usare questo utile servizio come area di cloud storage, ovvero i dispositivi Windows e Android effettuano una sincronizzazione dei loro dati sul server Ubuntu, che in questo caso fa un po’ da contenitore dei dati, in una configurazione più vicina ad un sistema di backup.

Installiamo Syncthing sul server Ubuntu

Aggiungendo ai nostri repository la fonte della stable release lanciamo i seguenti comandi:
# echo "deb https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list
# curl -s https://syncthing.net/release-key.txt | sudo apt-key add -
# apt-get update

# apt-get install syncthing

Avviare automaticamente la sincronizzazione con Systemd

Grazie a Systemd,  non è più necessario avviare Syncthing manualmente, si può infatti creare un servizio che avvii in automatico la sincronizzazione P2P. Bisogna creare l’apposito demone tramite l’istruzione:

# nano /etc/systemd/system/syncthing@.service

e, nel file appena aperto, inserite il seguente codice:

[Unit]
Description=Syncthing - Open Source Continuous File Synchronization for %I
Documentation=man:syncthing(1)
After=network.target

[Service]
User=%i
ExecStart=/usr/bin/syncthing -no-browser -gui-address="0.0.0.0:8384" -no-restart -logflags=0
Restart=on-failure
SuccessExitStatus=3 4
RestartForceExitStatus=3 4

# Hardening
ProtectSystem=full
PrivateTmp=true
SystemCallArchitectures=native
MemoryDenyWriteExecute=true
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

Date, infine, le classiche istruzioni per abilitare il servizio, come vi ho spiegato in questa guida:

# systemctl daemon-reload
# systemctl start syncthing@$USER
# systemctl enable syncthing@$USER

In caso di esito positivo, dovreste avere un output simili digitando l’istruzione systemctl status syncthing@$USER

l# systemctl status syncthing@$USER
 syncthing@root.service - Syncthing - Open Source Continuous File Synchronization for root
Loaded: loaded (/etc/systemd/system/syncthing@.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2021-02-27 18:45:07 UTC; 33ms ago
Docs: man:syncthing(1)
Main PID: 24678 (syncthing)
Tasks: 4 (limit: 2287)
Memory: 1.0M
CGroup: /system.slice/system-syncthing.slice/syncthing@root.service
└─24678 /usr/bin/syncthing -no-browser -gui-address=0.0.0.0:8384 -no-restart -logflags=0

Feb 27 18:45:07 vps-systemd[1]: syncthing@root.service: Scheduled restart job, restart counter is at 7.
Feb 27 18:45:07 vps-systemd[1]: Stopped Syncthing - Open Source Continuous File Synchronization for root.
Feb 27 18:45:07 vps-systemd[1]: Started Syncthing - Open Source Continuous File Synchronization for root.

Avviare e accedere alla Web GUI di amministrazione

Syncthing presenta una coma interfaccia CLI per gestire il servizio senza accedere all’interfaccia Web che però è caldamente consigliata specie in fase di configurazione: Per avviare come servizio remoto, ricordarsi di impostare la password:

# syncthing -gui-address=X.Y.Z.K:8384
Dove X.Y.Z.K: è l’indirizzo IP su il servizio effettuerà il binding.
Ora possiamo accedere alla nostra interfaccia di amministrazione. nella nostra configurazione utilizzeremo la logica per cui questo sarà il CLODU SERVER e riceverà solamente dati, mentre i dispositivi REMOTI li invieranno e basta. Vedremo dopo il significato delle differenze delle politiche di definizione del tipo di cartella.
I dispositivi remoti nella logica del peer to peer vengono identificati attraverso un processo di scansione (locale e globale). Usando la direttiva “dynamic” che è l’opzione di default, il sistema esegue il rilevamento automatico dell’indirizzo. ma se conosciamo l’indirizzo IP e la porta su cui si annuncia il nodo remoto (in questo caso il nostro server), possiamo specificarla direttamente.
La logica di funzionamento prevede di avere dalla parte sinistra le cartelle locali e a destra i dispositivi remoti connessi. Per ogni tentativo di connessione viene fatta una esplicita richiesta che deve essere accettata. Ovviamente per connettersi è indispensabile avere la ID Key e deve comunque essere sempre il server ad accettare la connessione.
Ma quello che è importante sapere quando si condivide una DIRECTORY è il modo con cui si intende scambiare i dati
Ci sono TRE MODALITA’ del Tipo di cartella e del metodo di sincronizzazione voluto, vediamole nel dettaglio perchè sono una parte importante per capire la logica di sincronizzazione applicata:
  • Invia& Ricevi: i file vengono scambiati e sincronizzati in ENTRAMBE LE DIREZIONI, tra i due dispositivi (peer to peer puro). Soluzione utile se si salvano i dati su più dispositivi e li si vuole sincronizzati localmente tutti allo stesso modo.
  • Invia Soltanto: i file verranno sincronizzati solo sul dispositivo di destinazione. In questo modo i file sono protetti dalle modifiche effettuate negli altri dispositivi, ma le modifiche effettuate in questo dispositivo verranno inviate al server. E’ una modalità sincrona monodirezionale più simile alle procedure di backup.
  • Ricevi solo: Le directory condivise sul server riceveranno solo i file, ma eventuali modifiche apportate localmente (in questo caso sul server) non verranno inviate ad altri dispositivi.

Attenzione!!

  • Per usare il cloud storage con Syncthing in modalità backup, è consigliabile che i dispositivi remoti (client) usino l’opzione “Invia soltanto” ed il server quella “Ricevi Solo”.
    • Ricordo che la definizione client e server è utilizzata impropriamente e solo per fare capire il tipo di configurazione adottato in questo esempio, ma sarebbe sempre e comunque più corretto parlare di nodi peer to peer.
  • Se invece intendete usare Syncthing per condividere e gestire tra più dispositivi gli stessi file sincronizzati occorre lasciare selezionato il metodo “Invia & Ricevi”-

Installare il servizio su Windows

Il metodo più efficace ed elegante per usare Syncthing su Windows è usare SyncTrayzor: Windows tray utility, filesystem watcher & launcher). Installa l’applicazione ed gestibile tramite l’icona nella status bar, come i migliori e più moderni cloud

Si può scaricare da qui:
Al primo accesso dovremo:
  1. impostare la password di protezione della Web GUI
  2. Aggiungere il dispositivo remoto o quello con cui intendiamo sincronizzare dati (cloud storage server)
  3. Condividere una o più directory da sincronizzare impostando il metodo di sincronizzazione voluto (Tipo di cartella)
Per aggiungere il dispositivo remoto (cloud storage server) occorre avere ovviamente il suo ID oppure avere il QR code, molto comodo per effettuar l’operazione da smartphone o da tablet.
Sul pannello di controllo clicchiamo su “Aggiungi Dispositivo” e inseriamo il nome del dispositivo remoto il suo ID Dispositivo.
Una volta creata la condivisione, che sia quella di default o altre da noi aggiunte, dobbiamo decidere per ognuna di esse con quale dispositivo vogliamo condividere i dati. Questo va specificato selezionando con un segno di spunta sotto la scheda “Condivisone” il dispositivo con cui vogliamo effettuare lo sharing della cartella:
Ovviamente sul server Cloud Storage dovremo accettare l’ADD del dispositivo, di cui comunque avremo sempre il totale controllo:
Successivamente al momento in cui il dispositivo locale termina la scansione della cartella a questo punto, arriva la richiesta per la condivisone della cartella sul cloud storage server.
Possiamo accettare questa nuova condivisone e stabilire le politiche con cui sincronizzeremo i file (Tipo di Cartella) che nel nostro case è del tipo “Ricevi solo”.
Adesso sul dispositivo Windows possiamo gestire le cartelle condivise, con chi vogliamo condividerle e le politiche di sincronizzazione che vogliamo adottare. Ricordiamo che è possibile inviar e ricevere file da dispositivi diversi e con politiche diverse, questa è una delle grandi potenzialità di questo strumento, la totale indipendenza da piattaforma esterne ed il totale controllo dei dati tra i nostri dispositivi.
Per il dispositivo remoto, che vuole depositare e mantenere sincronizzati i propri files sul cloud storage server, la configurazione “Tipo di Cartella” deve essere “Invia Soltanto”.

Installare ed utilizzare la  App su Android

Una colta installata l’APP è necessario richiedere i permessi richiesti.  Di default su Android verrà condivisa la cartella Camera o comunque quella delle foto, tipico share per i cloud sui dispositivi mobili. Nulla vitra di aggiungere le cartelle desiderate.

A questo punto Cliccando su DISPOSITIVI e poi sul + per aggiungere il nostro cloud storage server, possiamo usare il QR code cliccando sull’icona e inquadrando con lo smartphone il QR Code del nostro dispositivo server, o accedendo all’interfaccia oppure ricevendo come immagine attraverso un canale di comuhciazi9one sicuro.

Adesso sul nostro cloud storage server arriverà la richiesta di autorizzazione del dispositivo come visto per il client Windows. Ovviamente dovremo acquetarla per consentire di usare il servizio di sincronizzazione.

Una volta aggiunto il dispositivo possiamo impostare il tipo di politica per la sincronizzazione della cartella.

A questo punto partirà la sincronizzazione della cartella impostata

Attenzione!!

  • L’App sullo smartphone è molto utile ma può consumare parecchia batteria, per cui valutarne l’uso solo in determinati momenti
  • Può consumare molta banda per cui è bene tenere attiva la sincronizzazione solo quando si è connessi ad una rete Wifi e disattivarla quando si usano i dati mobili.

Installare Syncthing su QNAP

Una cosa che apprezzo sempre molto è la possibilità di installare il programma anche sui QNAP e sui Synology, tramite l’App disponibile su Qnapclub. Basta scaricare l’App e installarla dall’interfaccia di gestione del QNAP

A questo punto viene caricata l’interfaccia che risponderà su http://IP-QNAP:8384/ ed il programma potrà essere gestito allo stesso modo degli altri sistemi operativi, mostrando la grande versatilità e distribuzione di questo sistema.

La sicurezza in Syncthing

Per quel che riguarda la sicurezza del processo di sincronizzazione tutte le comunicazioni tramite Syncthing sono crittografate e ogni dispositivo è identificato da uno specifico certificato crittografico per garantire un’autenticazione sicura. Ma come possiamo irrobustire lo stato della sicurezza del nostro dispositivo. Nella mia esperienza avendo su dei server esposti su internet dei dati di utenti, per questo potenzialmente appetibili è importante seguire queste indicazioni, che sono poi le best practice consigliate dai creatori del prodotto.
E’ molto importante seguire queste regole:
  1. Impostare subito una robusta password al servizio (sempre e comunque) in qualsiasi ambiente giri il servizio.
  2. Utilizzare il protocollo HTTPS al posto dell’HTTP impostato di default
  3. Attivare un firewall sul sistema (o a monte se disponibile) per limitare l’accesso solo alle porte del servizio e in casi particolari solo ad indirizzi IP certificati.
  4. Utilizzare il servizio di Tunnel SSH se non si vuole aprire la porta del servizio di amministrazione a tutti.
  5. Installare il servizio fail2ban in grado di respingere in modo dinamico tentativi di attacco bruteforce
  6. Effettuare un monitoraggio attivo degli accessi al sistema, dei logo di Syncthing e dello stato generale del sistema, come consumo delle risorse e utilizzo della banda che sono spesso spia di tentavi di attacco
Impostazione Password e protocollo HTTPS
Questi passaggi sono indispensabili e vanno effettuati per primi
:

Impostazione Firewall

 

Se a bordo del sistema è presente un firewall è necessario aprire le seguenti porte in ingresso ed uscita, a seconda del tipo di firewall dovrete utilizzare i comandi appropriati
  • Porta 22000/TCP: TCP based sync protocol traffic
  • Porta 22000/UDP: QUIC based sync protocol traffic
  • Porta 21027/UDP: for discovery broadcasts on IPv4 and multicasts on IPv6

Maggiori informazioni possono essere reperite sulle FAQ ufficiali

 

Tunneling tramite SSH

Se si dispone dell’accesso SSH alla macchina che esegue Syncthing ma si preferisce non aprire la porta della GUI Web al mondo esterno, è possibile accedervi tramite un tunnel SSH. Puoi avviare un tunnel con un comando come il seguente:

# ssh -L 9999: localhost: 8384 IP IP_Server

Questo si collegherà alla tua porta locale 9999 e inoltrerà tutte le connessioni da lì alla porta 8384 sulla macchina di destinazione. Funziona ancora anche se Syncthing è destinato all’ascolto solo su localhost.

Risorse  e documentazione