aboutsummaryrefslogtreecommitdiff
path: root/content/Informatique/2022-09-cold.rst
blob: 00c265c0b17318be7d908ddbeb69e01f40044b51 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
.. -*- mode: rst -*-
.. -*-  coding: utf-8 -*-

====================================
Les sauvegarde avec ovh et duplicity
====================================

:date: 3020-09-02
:tags: sauvegarde, gpg
:status: draft

Le problème avec les sauvegardes est de savoir où les mettre. La plupart du
temps nous n’en avons pas besoin (et le plus longtemps possible souhaitons le…)
et les supports sur lesquels nous les entreposons vieillissent. À noter qu’il
est également recommandé de réaliser doubler les sauvegardes (principe 3-2-1),
ce qui s’avère fastidieux si l’on fait cela nous même à la maison.

Une solution est de mettre les sauvegarde dans le cloud, mais cela implique
alors un problème de sécurité : tout ce qui est en ligne est publique. De plus,
cela met dans la balance la question du cout des sauvegardes, toutes les
solutions ne se valent pas, et le volume n’et pas négligeable…

Une solution pour cela est d’utiliser le principe des sauvegardes à froid : les
sauvegardes sont en quelque sorte *givrées* et ne sont pas disponibles de
suite en cas de besoin (quelques heures sont nécessaires pour les récupérer).
Par contre, l’avantage est le cout qui est beaucoup moins onéreux qu’un espace
de stockage disponible en ligne. Voici par exemple les tarifs pour le stockage
à froid chez OVH :

=========================== ========================
Action                      Prix
=========================== ========================
Stockage froid sécurisé     0,002 € HT/mois/Go
Trafic entrant              0,01 € HT/Go
Trafic sortant              0,01 € HT/Go
=========================== ========================

L'inconvénient étant une non-disponibilité immédiate des fichiers archivés.
Cela en soit ne pose pas de problème pour sauvegarder ses photos, mais cela
empêche de mettre en place une sauvegarde incrémentale, puisqu'il est
nécessaire pour l'outil de sauvegarde de pouvoir comparer la liste des fichiers
archivés afin de savoir lesquels mettre à jour.

Il faut donc trouver une solution qui, en plus de chiffrer les données avant de
les envoyer en ligne, conserve un moyen de mettre à jour les sauvegardes sans
avoir besoin de les dégeler avant.

.. contents::
  :depth: 1

Présentation de la solution
===========================

Utiliser le stockage à froid pour y mettre les archives, et le stockage à chaud
pour toutes les données d'index. De cette manière l'application est capable de
récupérer les métadonnées afin d'identifier les données à mettre à jour en
temps réel, et la récupération des sauvegardes, elle, se fera uniquement sur
les données ayant été dégelées.

Voir le guide d'OVH disponible à l'adresse suivante : https://docs.ovh.com/gb/en/storage/pca/duplicity/

Création des accès
==================

Création
--------

Commencer par se créer un compte sur l'environnement d'OVH

.. image:: {static}/images/ovh_cold/user.png
    :class: floatright
    :alt: Création d’un nouvel utilisateur

Lors de la création de l'utilisateur, s'assurer que le role `ObjectStore
Operator` est bien activé. Il n'est pas nécessaire que notre utilisateur ait
tous les roles (nous voulons juste faire une sauvegarde).

Identifiant
-----------

.. image:: {static}/images/ovh_cold/config.png
    :class: floatleft
    :alt: Récupération de l’identifiant

L'ensemble des informations du compte peuvent ensuite être récupérées dans un
fichier texte (sauf le mot de passe qui est à noter), ce fichier va nous servir
à générer la configuration de duplicity

Configuration
=============

Pour générer la configuration, le script `gen_config.sh` va produire le fichier
json avec les valeurs nécessaires (URL, mot de passe, identifiant etc)

.. admonition:: Sécurité
  :class: danger

  Attention ! Le fichier json contient le mot de passe en clair, attention à ne
  pas conserver le fichier, ou restreindre les droits afin d’empêcher que
  celui-ci ne soit exposé.

.. figure:: {static}/images/mimetypes/application-x-executable.png
    :alt: get the file
    :align: center
    :target: {static}/resources/backup/gen_config.sh

    Télécharger

Il faut lui donner en paramètre le fichier téléchargé, et la configuration à
lancer :

.. code-block:: console

 $ ./gen_config.sh ./user_duplicity.sh config.json backup_name
 Please enter your OpenStack Password: XXXXX
 $

Notre fichier json va devenir la destination de nos sauvegardes. Puisqu’il
contient toutes les directives nécessaires, il suffit d’indiquer à duplicity de
l’utiliser comme emplacement de sauvegarde et l’application sera capable
d’orienter les fichiers vers le stockage à froid ou non automatiquement.

Sauvegarder et consulter les sauvegardes
========================================

Sauvegarde
----------

Une fois le script généré, on peut lancer une syncronisation complète avec la
commande suivante :

.. code-block:: bash

 duplicity \
    --encrypt-key ${enc_key} \
    --sign-key ${sign_key} \
    --file-prefix-manifest 'hot_' \
    --file-prefix-signature 'hot_' \
    --file-prefix-archive 'cold_' \
    full ${source} \
    "multi:$(realpath config.json)?mode=mirror&onfail=abort"

Les mises à jour (delta) uniquement sont lancé en remplaçant :literal:`full` par
:literal:`incremental` :

.. code-block:: bash

 duplicity \
    --encrypt-key ${enc_key} \
    --sign-key ${sign_key} \
    --file-prefix-manifest 'hot_' \
    --file-prefix-signature 'hot_' \
    --file-prefix-archive 'cold_' \
    incremental ${source}" \
    multi:$(realpath config.json)?mode=mirror&onfail=abort"

Lister les sauvegardes
----------------------

Une fois la sauvegarde fait, nous avons la possibilité de consulter les
sauvegarde réalisées en accédant juste aux métadonnées avec la commande
:literal:`collection-status` :

.. code-block:: console

 $ duplicity \
    --file-prefix-manifest 'hot_' \
    --file-prefix-signature 'hot_' \
    --file-prefix-archive 'cold_' \
    collection-status \
    "multi://$(realpath config.json)?mode=mirror&onfail=continue"
 MultiBackend: pca://duplicity: 7 files
 MultiBackend: swift://duplicity_hot: 14 files
 Last full backup date: Wed Sep  2 09:36:13 2020
 Collection Status
 -----------------
 Connecting with backend: BackendWrapper
 Archive dir: …

 Found 2 secondary backup chains.
 

 Found primary backup chain with matching signature chain:
 -------------------------
 Chain start time: Wed Sep  2 09:36:13 2020
 Chain end time: Wed Sep  2 12:01:17 2020
 Number of contained backup sets: 5
 Total number of contained volumes: 0
  Type of backup set:                            Time:      Num volumes:
          Incremental         Wed Sep  2 09:38:09 2020                 0
          Incremental         Wed Sep  2 11:32:19 2020                 0
          Incremental         Wed Sep  2 12:00:56 2020                 0
          Incremental         Wed Sep  2 12:01:17 2020                 0
 -------------------------
 No orphaned or incomplete backup sets found.

Contrôles et restauration
=========================

Pour les opérations de contrôles et de restauration, je propose de commencer
par récupérer les fichiers gelés et les conserver en local. De cette manière
nous pourrons :

1. Contrôler l’intégriter de la sauvegarde
2. Procéder à une restauration de test de celle-ci.

Dégeler les fichiers en masse
-----------------------------

L’interface d’OVH permet de dégeler un fichier, mais celle-ci n’est pas
pratique pour procéder à cette opération en masse. Pour ce faire, nous allons
nous connecter en SFTP directement, pour lancer l’opération de récupération.

.. image:: {static}/images/ovh_cold/degel.png
    :class: floatright
    :alt: Attente du dégel des données

Il faut se connecter au serveur suivant :

.. code-block:: bash

  . user_duplicity.sh
  sftp pca@gateways.storage.${OS_REGION_NAME}.cloud.ovh.net

Le mot de passe de l'utilisateur est composé ainsi :

.. code-block:: bash

  ${OS_TENANT_NAME}.${OS_USERNAME}.${OS_PASSWORD}

.. admonition:: Compte d’accès
  :class: note

  L’utilisateur est toujours :literal:`pca`, c’est à travers le mot de passe
  qu’OVH identifie les ressources auxquelles nous sommes censer accéder.

Une fois connecté en sftp, il est possible de lancer le dégel de l'ensemble des
fichiers dans un répertoire donné sans passer par l'interface. Cela peut être
utile pour préparer une restauration (duplicity stocke ses fichiers en lots de
200Mo)

.. code-block:: console


  > cd backup_name
  > get *

La commande va échouer (impossible de récupérer les fichiers car ceux-ci sont
gelés), mais la demande sera transmise, et les fichiers vont passer en
préparation pour restauration.

Création d’une configuration locale
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

De la même manière que nous avions préparé un script pour générer un fichier de
configuration pour duplicity afin de sauver nos données, nous allons générer un
fichier qui va créer une configuration *locale* dans laquelle l’ensemble des
données seront chargées à partir du répertoire dans lequel nous aurons sauvé
nos fichiers.

De cette manière, nous nous affranchissons des contraintes de temps (et du
réseau) pour toutes les opérations qui ont besoin de charger chaque archive.

.. figure:: {static}/images/mimetypes/application-x-executable.png
    :alt: get the file
    :align: center
    :target: {static}/resources/backup/gen_config_local.sh

    Télécharger

Afficher les fichiers sauvegardés
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Pour lancer cette commande, il est nécessaire que les fichiers soient dégelés,
ou travailler sur les fichiers locaux.

.. code-block:: console

 $ duplicity \
    --file-prefix-manifest 'hot_' \
    --file-prefix-signature 'hot_' \
    --file-prefix-archive 'cold_' \
    list-current-files \
    "multi:$(realpath config.json)?mode=mirror"
 MultiBackend: pca://duplicity: 7 files
 MultiBackend: swift://duplicity_hot: 14 files
 Synchronizing remote metadata to local cache...
 GnuPG passphrase for decryption:
 MultiBackend: pca://duplicity: 7 files
 MultiBackend: swift://duplicity_hot: 14 files
 Last full backup date: Wed Sep  2 09:36:13 2020
 Wed Sep  2 09:28:55 2020 .
 Sat Jan 27 17:44:34 2018 fichier1
 Sat Jan 27 17:44:34 2018 fichier2

.. admonition:: Mot de passe GPG
  :class: note

  Lors de la restauration, duplicity demande le mot de passe GPG. Nous pouvons
  valider dans rien saisir à ce moment là car nous utilisons la clef GPG pour
  déchiffrer le contenu des archives.

Il est possible d'ajouter une version spécifique en précisant l'heure de la
sauvegarde souhaitée :

.. code-block:: console

 $ duplicity \
    --file-prefix-manifest 'hot_' \
    --file-prefix-signature 'hot_' \
    --file-prefix-archive 'cold_' \
    list-current-files --time 20200902T072859Z \
    "multi:$(realpath config.json)?mode=mirror"

Restauration
------------

Sans paramètre donnés, c’est la restauration de la dernière sauvegarde qui
est exécutée :

.. code-block:: console

 $ duplicity \
    --encrypt-key ${enc_key} \
    --sign-key ${sign_key} \
    --file-prefix-manifest 'hot_' \
    --file-prefix-signature 'hot_' \
    --file-prefix-archive 'cold_' \
    "multi:$(realpath config.json)?mode=mirror&onfail=continue" \
    $(path/to/restore)

.. admonition:: Restauration d’une version donnée
  :class: note

  Là encore, si nous ajouter la date de la sauvegarde, nous allons récupérer
  une version donnée :

  .. code-block:: console

   $ duplicity \
      --encrypt-key ${enc_key} \
      --sign-key ${sign_key} \
      --file-prefix-manifest 'hot_' \
      --file-prefix-signature 'hot_' \
      --file-prefix-archive 'cold_' \
      --time 20200902T072859Z \
      "multi:$(realpath config.json)?mode=mirror&onfail=continue" \
      $(path/to/restore)


Utiliser duply
==============

Duply est une application de sauvegarde basée sur duplicity. Elle permet de
faciliter les commandes et la configuration en fournissant une interface plus
simple — basée sur des fichiers de configuration plutôt que des lignes de
commande à rallonge. Les commandes qui sont présentes ci-dessus restent
valide !

Duply permet par contre de sauver sa configuration dans un fichier unique, qui
sera complété à l'aide de variables d'environnement dans bash. Cela permet donc
de le configurer de manière assez simple.

Restauration
------------

Pour restaurer, il suffit de récupérer les fichiers *gelés* les fichiers
d'index peuvent rester sur le cloud.

Le script de génération des fichiers de configuration a un cas particulier lors
de la commande `RESTORE`, il va en effet génerer un fichier allant chercher les
fichier en local plutôt que sur le serveur d'OVH.