Ενότητα 8 · 8.2
Αντίγραφα ασφαλείας με το restic
Ενότητα 8: Αντίγραφα ασφαλείας και παρακολούθηση · Χρόνος ανάγνωσης: 12 λεπτά
Στόχος μαθήματος: Μετά από αυτό το μάθημα μπορείτε να δημιουργείτε με το restic κρυπτογραφημένα αντίγραφα ασφαλείας σε αποθηκευτικό χώρο εκτός του server σας, να καθαρίζετε παλιές εκδόσεις σύμφωνα με ένα σχήμα διατήρησης, να ελέγχετε το αντίγραφο ασφαλείας και να επαναφέρετε αρχεία, καθώς και να ρυθμίζετε όλη τη διαδικασία ώστε να εκτελείται αυτόματα.
Βασικές έννοιες: restic, repository, init, κωδικός πρόσβασης (αρχείο κωδικού πρόσβασης), backend (sftp, S3, rest-server), backup, snapshots, forget, --keep-daily/--keep-weekly/--keep-monthly, prune, check, restore, mount, deduplication (αφαίρεση διπλοτύπων), append-only, systemd timer
Γιατί το restic;
Υπάρχουν πολλά προγράμματα αντιγράφων ασφαλείας. Το restic είναι καλή επιλογή για έναν δικό σας server, επειδή:
- κρυπτογραφεί τα πάντα πριν φύγουν από τον server· ο αποθηκευτικός χώρος βλέπει μόνο μη αναγνώσιμα μπλοκ·
- κάνει deduplication: ένα αρχείο που δεν έχει αλλάξει δεν αποθηκεύεται ξανά, οπότε τα ημερήσια αντίγραφα ασφαλείας καταλαμβάνουν λίγο χώρο·
- υποστηρίζει πολλά είδη αποθηκευτικού χώρου: έναν φάκελο, έναν άλλο server μέσω SFTP, αποθηκευτικό χώρο συμβατό με S3, έναν δικό σας rest-server·
- είναι ένα μόνο πρόγραμμα, διαθέσιμο στο αποθετήριο πακέτων του Debian και του Ubuntu (
apt install restic).
Μια εναλλακτική με παρόμοια χαρακτηριστικά είναι το BorgBackup. Οι αρχές αυτού του μαθήματος ισχύουν και εκεί.
Οι έννοιες
- Repository: το σημείο όπου το restic αποθηκεύει τα αντίγραφα ασφαλείας. Πάντα εκτός του server του οποίου κρατάτε αντίγραφο.
- Snapshot: ένα αντίγραφο ασφαλείας σε μία συγκεκριμένη στιγμή. (Προσοχή: αυτό είναι κάτι διαφορετικό από το snapshot του παρόχου σας από το μάθημα 8.1.)
- Κωδικός πρόσβασης: κάθε repository έχει έναν κωδικό πρόσβασης με τον οποίο κρυπτογραφούνται τα πάντα. Η τεκμηρίωση του restic είναι σαφής σε αυτό: όποιος χάσει τον κωδικό πρόσβασης, χάνει τα δεδομένα οριστικά.
Δημιουργία repository
Ας υποθέσουμε ότι έχετε έναν server αποθήκευσης backup.example.net, στον οποίο έχετε πρόσβαση μέσω SFTP με κλειδί, ως χρήστης web1. Δημιουργήστε πρώτα ένα αρχείο κωδικού πρόσβασης στον server (και αποθηκεύστε τον ίδιο κωδικό πρόσβασης στον διαχειριστή κωδικών πρόσβασης σας, μάθημα 8.1):
root@web1:~# install -m 600 /dev/null /root/.restic-wachtwoord
root@web1:~# openssl rand -base64 32 > /root/.restic-wachtwoord
root@web1:~# export RESTIC_REPOSITORY=sftp:web1@backup.example.net:/srv/restic/web1
root@web1:~# export RESTIC_PASSWORD_FILE=/root/.restic-wachtwoord
root@web1:~# restic init
created restic repository 5f1a9c2e3b at sftp:web1@backup.example.net:/srv/restic/web1
Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.Με τις μεταβλητές περιβάλλοντος RESTIC_REPOSITORY και RESTIC_PASSWORD_FILE δεν χρειάζεται να πληκτρολογείτε κάθε φορά τις επιλογές -r και --password-file.
Δημιουργία αντιγράφου ασφαλείας
Πρώτα το dump της βάσης δεδομένων (μάθημα 8.1), έπειτα το αντίγραφο ασφαλείας:
root@web1:~# restic backup /etc /var/www /opt /var/backups/db \
--exclude /var/www/*/cache --tag dagelijks
repository 5f1a9c2e opened (version 2, compression level auto)
...
Files: 8421 new, 0 changed, 0 unmodified
Dirs: 1203 new, 0 changed, 0 unmodified
Added to the repository: 612.338 MiB (402.117 MiB stored)
processed 8421 files, 1.204 GiB in 0:41
snapshot 3c7e91d4 savedΤην επόμενη μέρα η διαδικασία είναι πολύ πιο γρήγορη: αποθηκεύεται μόνο ό,τι άλλαξε.
root@web1:~# restic snapshots
ID Time Host Tags Paths
-----------------------------------------------------------------------
3c7e91d4 2026-11-08 03:10:02 web1 dagelijks /etc /opt /var/backups/db /var/www
a18f0b77 2026-11-09 03:10:05 web1 dagelijks /etc /opt /var/backups/db /var/www
-----------------------------------------------------------------------
2 snapshotsΚαθαρισμός: forget και prune
Ένα νέο snapshot κάθε μέρα σημαίνει 365 snapshots μετά από έναν χρόνο. Με το forget καθορίζετε ποια θα διατηρήσετε, με ένα σχήμα διατήρησης:
root@web1:~# restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --pruneΤο σχήμα λειτουργεί ως εξής:
--keep-daily 7: εξετάζει τις τελευταίες επτά ημέρες για τις οποίες υπάρχει snapshot και κρατά το νεότερο κάθε ημέρας·--keep-weekly 4: το ίδιο για τις τελευταίες τέσσερις εβδομάδες (Δευτέρα έως και Κυριακή)·--keep-monthly 6: το ίδιο για τους τελευταίους έξι μήνες.
Ένα snapshot διατηρείται αν ικανοποιεί τουλάχιστον έναν από τους κανόνες. Ό,τι δεν ικανοποιεί κανέναν κανόνα, ξεχνιέται. Δοκιμάστε ένα νέο σχήμα πρώτα με --dry-run: έτσι βλέπετε τι θα διαγραφόταν χωρίς να αλλάξει τίποτα.
Σημαντική διαφορά: το forget αφαιρεί μόνο την αναφορά σε ένα snapshot. Τα δεδομένα παραμένουν στο repository μέχρι το prune να καθαρίσει τα μπλοκ που δεν χρησιμοποιούνται πλέον από κανένα snapshot. Η επιλογή --prune στο forget τα κάνει αυτά με μία κίνηση. Το prune χρειάζεται χρόνο και κλειδώνει το repository· γι' αυτό μην το προγραμματίζετε ταυτόχρονα με το αντίγραφο ασφαλείας σας.
Έλεγχος: check
Ένα αντίγραφο ασφαλείας που καταστρέφεται αθόρυβα, το καταλαβαίνετε μόνο κατά την επαναφορά. Αφήστε το restic να ελέγχει τακτικά το repository:
root@web1:~# restic check
...
no errors were found
root@web1:~# restic check --read-data-subset=5%Το απλό check ελέγχει τη δομή. Με --read-data-subset διαβάζει επίσης πραγματικά ένα μέρος των δεδομένων και ελέγχει το περιεχόμενο. Κάντε το για παράδειγμα κάθε εβδομάδα με ένα μικρό ποσοστό· έτσι, μετά από κάποιο διάστημα, όλα θα έχουν διαβαστεί τουλάχιστον μία φορά.
Επαναφορά: restore και mount
Επαναφέρετε σε έναν ξεχωριστό φάκελο, ποτέ απευθείας πάνω από το πρωτότυπο:
root@web1:~# restic restore latest --target /tmp/terug --include /etc/nginx
restoring snapshot a18f0b77 of [/etc /opt /var/backups/db /var/www] at 2026-11-09 03:10:05 ...
Summary: Restored 41 files/dirs (88.104 KiB) in 0:00
root@web1:~# diff -r /tmp/terug/etc/nginx /etc/nginx && echo gelijk
gelijkΤο latest είναι το νεότερο snapshot· μπορείτε επίσης να χρησιμοποιήσετε ένα ID (restic restore 3c7e91d4 ...). Με restic mount /mnt/restic (απαιτεί FUSE) βλέπετε όλα τα snapshots ως φακέλους και μπορείτε να περιηγηθείτε και να αντιγράψετε μεμονωμένα αρχεία. Τερματίζετε με Ctrl+C.
Μια βάση δεδομένων την επαναφέρετε ανακτώντας το dump και εισάγοντάς το, για παράδειγμα gunzip < alles.sql.gz | mariadb.
Αυτόματα, κάθε νύχτα
Δημιουργήστε ένα script και ένα systemd timer (μάθημα 6.3). Το script:
#!/bin/sh
# /usr/local/sbin/backup.sh
set -eu
export RESTIC_REPOSITORY=sftp:web1@backup.example.net:/srv/restic/web1
export RESTIC_PASSWORD_FILE=/root/.restic-wachtwoord
mariadb-dump --single-transaction --all-databases | gzip > /var/backups/db/alles.sql.gz
restic backup /etc /var/www /opt /var/backups/db --tag dagelijks
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --pruneΈνα .service με Type=oneshot και ExecStart=/usr/local/sbin/backup.sh, και ένα .timer με OnCalendar=*-*-* 03:10:00 και Persistent=true. Το set -eu φροντίζει ώστε το script να σταματά στο πρώτο σφάλμα, ώστε το systemd να θεωρεί την εκτέλεση αποτυχημένη. Συνδέστε μια ειδοποίηση (μάθημα 8.3), αλλιώς δεν θα αντιληφθείτε ένα αποτυχημένο αντίγραφο ασφαλείας.
Κατά του ransomware: append-only
Στο παραπάνω script ο ίδιος ο server μπορεί επίσης να διαγράψει το αντίγραφο ασφαλείας (forget και prune). Αν ένας εισβολέας αποκτήσει τον έλεγχο του server, μπορεί λοιπόν να το κάνει κι αυτός. Δύο τρόποι για να το αποτρέψετε:
- rest-server σε λειτουργία append-only: στον server αποθήκευσης εκτελείτε τον δικό rest-server του restic με την επιλογή
--append-only. Ο web server μπορεί τότε να προσθέτει αντίγραφα ασφαλείας, αλλά να μη διαγράφει τίποτα. Τον καθαρισμό (forget --prune) τον κάνετε από ένα άλλο, καλά προστατευμένο μηχάνημα με πλήρη δικαιώματα. - Αποθηκευτικός χώρος με διαχείριση εκδόσεων ή κλείδωμα αντικειμένων σε έναν πάροχο S3, ώστε τα διαγραμμένα αντικείμενα να μπορούν να ανακτηθούν για κάποιο διάστημα.
Προσέξτε μια λεπτή παγίδα που αναφέρει η ίδια η τεκμηρίωση του restic: ένας εισβολέας που προσθέτει ψεύτικα snapshots μπορεί να παρασύρει ένα σχήμα όπως το --keep-weekly να ξεχάσει πραγματικά snapshots. Με --keep-within (για παράδειγμα --keep-within 30d) διατηρούνται όλα όσα ανήκουν σε εκείνη την περίοδο, ψεύτικα ή πραγματικά.
Σύνοψη
- Το restic κρυπτογραφεί, κάνει deduplication και μπορεί να αποθηκεύει σε πολλά είδη αποθηκευτικού χώρου εκτός του server σας· αν χάσετε τον κωδικό πρόσβασης, τα χάνετε όλα.
- Το
initδημιουργεί το repository, τοbackupένα snapshot, τοsnapshotsτα εμφανίζει. - Το
forgetμε--keep-*καθορίζει τι διατηρείτε· μόνο τοprune(ή το--prune) καθαρίζει πραγματικά τα δεδομένα. Δοκιμάστε με--dry-run. - Το
check(με--read-data-subset) ελέγχει, τοrestore --targetεπαναφέρει σε ξεχωριστό φάκελο, τοmountσας επιτρέπει να περιηγηθείτε. - Αυτοματοποιήστε με ένα timer και μια ειδοποίηση, και κρατήστε τουλάχιστον ένα repository εκτός εμβέλειας του server (append-only).
Κουίζ
Άσκηση
Άσκηση Z8.2: Τι απομένει μετά το forget; Στο αρχείο παραδείγματος restic-snapshots.txt υπάρχει μια λίστα με snapshots και ένα σχήμα διατήρησης. Προσδιορίστε ποια snapshots απομένουν μετά το restic forget με αυτό το σχήμα. Το πρόγραμμα συγκρίνει με το καθορισμένο κλειδί απαντήσεων.
Άσκηση O8.2: Μια δοκιμή επαναφοράς. Δημιουργήστε στον δικό σας server ένα restic repository εκτός του server, πάρτε αντίγραφο ασφαλείας του /etc και των δεδομένων σας, και επαναφέρετε έναν φάκελο στο /tmp/terug. Συγκρίνετε με diff, σημειώστε πόσο διήρκεσε και απαντήστε πού φυλάσσονται εκτός του server ο κωδικός πρόσβασης και τα στοιχεία του αποθηκευτικού χώρου σας.
Άσκηση O8.2: Μια δοκιμή επαναφοράς
Αυτή την άσκηση την κάνετε μόνοι σας: κανείς δεν την ελέγχει. Σημειώστε τι έχετε κάνει και επισημάνετε την άσκηση ως ολοκληρωμένη.
Το repository βρίσκεται σε άλλον πάροχο από αυτόν του server. Το diff δεν δείχνει διαφορές ή μόνο αρχεία που άλλαξαν μετά το αντίγραφο ασφαλείας. Κωδικός πρόσβασης στον διαχειριστή κωδικών και σε χαρτί· ένα αντίγραφο append-only προστατεύει από διαγραφή από εισβολέα.
Τα τικ και οι σημειώσεις σας παραμένουν μόνο σε αυτό το πρόγραμμα περιήγησης· δεν τα στέλνουμε πουθενά. Αν έχετε εγγραφεί, αποθηκεύουμε στο Τα μαθήματά μου μόνο ότι έχετε ολοκληρώσει την άσκηση.
Για περαιτέρω μελέτη
- Στρατηγική δημιουργίας αντιγράφων ασφαλείας: ο κανόνας 3-2-1 για τη δική σας επιχείρηση
- Τεκμηρίωση του restic, Preparing a new repository: https://restic.readthedocs.io/en/stable/030_preparing_a_new_repo.html
- Τεκμηρίωση του restic, Removing backup snapshots (forget και prune): https://restic.readthedocs.io/en/stable/060_forget.html
- Τεκμηρίωση του restic, Restoring from backup: https://restic.readthedocs.io/en/stable/050_restore.html
- rest-server (append-only): https://github.com/restic/rest-server
