Site icon Tosolini.info

Backup su Cloud (quasi) da Linux

Non tutte le ciambelle riescono con il buco. Una massima che debbo citare in questa circostanza. Mi ero posto la domanda “ma con tutti questi cloud a disposizione, li posso usare per mettere al sicuro dei backup di un server Linux?“. A questa domanda ho cercato di fornire una risposta, che inizialmente sembrava aver dato anche una risposta positiva. Nel senso che alla fine del processo sono effettivamente riuscito a fare quello che mi ero preposto… ma ci stava la fregatura.

Andiamo con ordine, visto che ho un terabyte di spazio su Onedrive ho ben pensato di utilizzarlo per metterci dentro lo storico dei backup di alcuni applicativi che girano su un server Linux. Lo scopo era quello di avere un disaster recovery a costo zero o quasi. Ho quindi cercato, prima di mettermi a re-inventare la ruota con script in Bash, qualcosa già creato da altri. Questo qualcosa esiste e risponde al nome di Rclone.

E’ necessaria un po’ di conoscenza dell’ambiente Bash in Linux perché potrebbero verificarsi alcune situazioni che richiedono di adattare comandi o argomenti, quindi la guida sottostante non è adatta a tutti.

Partiamo con la base, è necessario un account su un servizio storage in cloud, come anticipato nel nostro caso è Onedrive. Ma la lista di cloud supportati è piuttosto ampia e sicuramente quelli più noti sono presenti. Di base è necessario riuscire ad ottenere un Client ID e un Client Secret dal gestore. Le modalità per reperire queste informazioni variano di caso in caso. Alla pagina di documentazione di RClone per quel servizio cloud è contenuta una spiegazione adeguatamente dettagliata su come creare e reperire queste chiavi sul servizio che ci interessa.

Non tratterò quindi la parte di creazione e reperimento delle chiavi su Onedrive poiché questa può variare a seconda della tipologia di abbonamento; cioè esistono differenti tipi di Onedrive, quello Home, quello business, enterprise, eccetera.

Una volta ottenute queste informazioni fondamentali, ci spostiamo sul nostro server Linux. La situazione tipica è quella in cui abbiamo un solo accesso SSH e la macchina è protetta da un firewall, quindi non desideriamo aprire porte al di fuori di quelle che già abbiamo operative e strettamente necessarie.

Configurazione lato Server

La prima fase sul server è l’installazione di Rclone ed è piuttosto semplice. Richiede l’utilizzo di “curl” che generalmente è già presente di base.

curl https://rclone.org/install.sh | sudo bash

Quello che si ottiene al termine del processo è un nuovo comando in Bash. A video ci viene immediatamente proposto di configurare rclone con il comando:

rclone config

si attiverà una sorta di Wizard via linea di comando:

server:~# rclone config
 NOTICE: Config file "/home/myself/.config/rclone/rclone.conf" not found - using defaults
 No remotes found - make a new one
 n) New remote
 s) Set configuration password
 q) Quit config
 n/s/q> n
 name> onedrive
 Type of storage to configure.
 Enter a string value. Press Enter for the default ("").
 Choose a number from below, or type in your own value

La scelta del nome è importante, perché sarà il nome dell’endpoint remoto che andremo ad utilizzare nei comandi. Questo per dire che non conviene scrivere nomi astrusi, ma qualcosa di immediato e facile da identificare come appunto il nome del servizio.

Segue una lunga lista di servizi già pre-configurati per essere utilizzati con Rclone, tra i quali scegliere il nostro. Il sistema ci chiederà di immettere il Client ID e il Client Secret che avevamo preparato in precedenza.

Storage> 26
 ** See help for onedrive backend at: https://rclone.org/onedrive/ **
 OAuth Client Id
 Leave blank normally.
 Enter a string value. Press Enter for the default ("").
 client_id> MIO-CLIENT-ID
 OAuth Client Secret
 Leave blank normally.
 Enter a string value. Press Enter for the default ("").
 client_secret> MIO-CLIENT-SECRET
 Choose national cloud region for OneDrive.
 Enter a string value. Press Enter for the default ("global").
 Choose a number from below, or type in your own value
  1 / Microsoft Cloud Global
    \ "global"
  2 / Microsoft Cloud for US Government
    \ "us"
  3 / Microsoft Cloud Germany
    \ "de"
  4 / Azure and Office 365 operated by 21Vianet in China
    \ "cn"
 region> 1
 Edit advanced config? (y/n)
 y) Yes
 n) No (default)
 y/n> n

Quindi ci viene chiesto quale server di Onedrive usare, Global va bene.

Remote config
 Make sure your Redirect URL is set to "http://localhost:53682/" in your custom config.
 Use auto config?
 Say Y if not sure
 Say N if you are working on a remote or headless machine
 y) Yes (default)
 n) No
 y/n> n

Come vedete alla fine del processo, viene attivata una nuova porta, la 53682 ma su localhost, in cui ci viene chiesta una conferma di autenticazione. E qui sorge un problemino…

For this to work, you will need rclone available on a machine that has
 a web browser available.
 For more help and alternate methods see: https://rclone.org/remote_setup/
 Execute the following on the machine with the web browser (same rclone
 version recommended):
 rclone authorize "onedrive" -- "mio_client_id" "mio_secret_id"
 Then paste the result below

In sostanza per poter proseguire nell’attivazione del servizio è necessario istanziare un comando via web browser dalla medesima macchina, che però non è raggiungibile… Ora su bash ci sono dei browser testuali, ma oggettivamente installarne uno di questi significa portarsi dietro una considerevole dose di librerie non necessarie, specie in considerazione del fatto che il processo di fatto dovrebbe servirci una volta sola.

Quindi la soluzione ideale che ho trovato è quella di effettuare un reverse proxy sulla connessione SSH. Cioè andremo a mappare la porta 53682 remota sulla nostra “localhost”, in modo tale da replicare i comandi che daremo al server ma sul nostro computer. Più facile a farsi che a spiegarlo…

 ssh -L 53682:localhost:53682 utente@server

Si accenderà come di solito una sessione SSH (questo però potrebbe variare dal client SSH e dal sistema operativo) dove appunto potremo dare il comando proposto, o meglio una parte di esso. Sopra infatti oltre al comando viene scritto, separato dal simbolo “–“, il Client ID e il Secret… a me personalmente la cosa ha dato problemi, ma ho risolto dando il comando semplificato:

rclone authorize "onedrive"

A questo punto a video vedrete comparire un messaggio tra le cui righe sarà presente un link simile a questo: http://127.0.0.1:53682/auth?state=CODICE_CASUALE

Siccome abbiamo agganciato la porta 53682 in reverse proxy sul nostro computer, copiamo e incolliamo il link sul nostro browser che ci indirizzerà ad una pagina del servizio Cloud dove ci potrebbe esserci richiesto di immettere nuovamente le credenziali (del cloud).

Se la procedura è andata a buon fine nel nostro server possiamo effettuare una richiesta per scegliere il tipo di Onedrive che stiamo utilizzando (personal, business, eccetera. La risposta va adattata alla vostra tipologia di abbonamento che avete rispetto a Microsoft. La procedura è virtualmente completata.

Test di connessione

Per prima cosa vediamo se riusciamo ad avere la lista delle directory:

rclone lsd onedrive:

Il risultato potrebbe variare in base alla tipologia di cloud utilizzato, nel senso che alcuni servizi utilizzando una finta cartella di root, mentre nel caso di Onedrive vedremo l’interno della nostra struttura.

server:~# rclone lsd onedrive:
           -1 2020-09-17 09:26:22         1 Blocchi appunti
           -1 2021-02-02 18:00:43         0 Caricamenti di OneNote
           -1 2021-03-17 16:27:01         1 Documenti
           -1 2020-10-07 15:14:15         8 File di chat di Microsoft Teams
           -1 2020-09-17 09:26:22         1 Microsoft Teams Data

Se tutto funziona non ci resta che fissare tutto quanto sul server remoto, con un comando, che andrà a scrivere per noi la configurazione fin qui testata:

rclone config file

Copiare i file

Quindi come possiamo copiare un contenuto sul cloud? molto semplice, e sarebbe possibile inserirlo su uno script in bash, come ad esempio la copia di un database o di un tar.gz.

rclone copy /path/file onedrive:/default/nomecartella

Se nomecartella non esiste sulla posizione remota, rclone lo andrà a creare per noi.

Conclusioni

Tutto bello, salvo che… Dopo test, caricamenti. e prove andate a buon fine, dopo un ora non funzionava più nulla. In sostanza il token utilizzato (quello incollato a video sulla fine della procedura) era scaduto. In effetti non avevo fatto caso, ma nel codice del token era specificata una scadenza, appunto di un’ora. Durante la creazione del client, e secretID, il servizio aveva chiesto una scadenza che avevo prontamente immesso in anni. Dopo una serie di ricerche sui forum Microsoft scopro che la scadenza del token dopo una sola ora non è un parametro che posso modificare!

Nella pratica questo vuol dire che tocca ripetere la procedura di “rclone config” che richiede anche la procedura di autenticazione con il browser, quindi di fatto non automatizzatile, ogni volta che si desidera utilizzare il servizio…

Ho trovato seccante il fatto che come al solito i servizi di queste grandi aziende si “dimenticano” di evidenziare questi dettagli, ad esempio nella creazione della chiave. E’ chiaro che a quel punto mi sarei fermato in anticipo, ed invece ho dovuto scoprirlo leggendo il post di un utente qualunque sul loro forum.

Nonostante questo ho deciso di pubblicare lo stesso questo articolo, magari viene utile ad altri nel caso vadano ad utilizzare servizi diversi da Onedrive. Fate attenzione alla scadenza scritta in chiaro sul token da incollare nella bash quando richiesto d Rclone. Se è di un’ora e non avete modo di cambiarla sul gestore, il servizio è di fatto inutile.

Exit mobile version