Moduuli 8 · 8.2
Varmuuskopiot resticillä
Moduuli 8: Varmuuskopiot ja valvonta · Lukuaika: 12 minuuttia
Tavoite: Tämän oppitunnin jälkeen osaat tehdä resticillä salattuja varmuuskopioita palvelimen ulkopuoliseen tallennustilaan, siivota vanhat versiot säilytyssuunnitelman mukaan, tarkistaa varmuuskopion ja palauttaa tiedostoja sekä ajaa kaiken automaattisesti.
Keskeiset käsitteet: restic, repository, init, salasana(tiedosto), backend (sftp, S3, rest-server), backup, snapshots, forget, --keep-daily/--keep-weekly/--keep-monthly, prune, check, restore, mount, deduplikointi, append-only, systemd-ajastin
Miksi restic?
Varmuuskopio-ohjelmia on paljon. restic on hyvä valinta omalle palvelimelle, koska se:
- salaa kaiken ennen kuin tiedot lähtevät palvelimelta; tallennustila näkee vain lukukelvottomia lohkoja;
- deduplikoi: muuttumatonta tiedostoa ei tallenneta uudelleen, joten päivittäiset varmuuskopiot vievät vähän tilaa;
- tukee monenlaista tallennustilaa: kansiota, toista palvelinta SFTP:n kautta, S3-yhteensopivaa tallennustilaa ja omaa rest-serveriä;
- on yksi ohjelma, joka löytyy Debianin ja Ubuntun pakettilähteestä (
apt install restic).
Vaihtoehto, jolla on samanlaiset ominaisuudet, on BorgBackup. Tämän oppitunnin periaatteet pätevät myös siihen.
Käsitteet
- Repository: paikka, johon restic tallentaa varmuuskopiot. Aina sen palvelimen ulkopuolella, jota varmuuskopioit.
- Snapshot: yksi varmuuskopio yhdeltä hetkeltä. (Huomaa: tämä on eri asia kuin palveluntarjoajasi snapshot oppitunnilta 8.1.)
- Salasana: jokaisella repositorylla on salasana, jolla kaikki salataan. Resticin dokumentaatio sanoo asian selvästi: jos salasana katoaa, tiedot menetetään peruuttamattomasti.
Repositoryn luominen
Oletetaan, että sinulla on tallennuspalvelin backup.example.net, johon pääset SFTP:n kautta avaimella käyttäjänä web1. Luo ensin palvelimelle salasanatiedosto (ja tallenna sama salasana salasanojen hallintaan, oppitunti 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.Ympäristömuuttujien RESTIC_REPOSITORY ja RESTIC_PASSWORD_FILE ansiosta sinun ei tarvitse kirjoittaa valitsimia -r ja --password-file joka kerta.
Varmuuskopion tekeminen
Ensin tietokantavedos (oppitunti 8.1), sitten varmuuskopio:
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 savedSeuraavana päivänä se on paljon nopeampi: mukaan lähtee vain se, mikä on muuttunut.
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 snapshotsSiivoaminen: forget ja prune
Kun joka päivä tulee uusi snapshot, vuoden päästä niitä on 365. forget-komennolla päätät säilytyssuunnitelman avulla, mitkä säilytetään:
root@web1:~# restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --pruneSuunnitelma toimii näin:
--keep-daily 7: katso seitsemää viimeisintä päivää, joilta on snapshot, ja säilytä kultakin päivältä uusin;--keep-weekly 4: sama neljälle viimeisimmälle viikolle (maanantaista sunnuntaihin);--keep-monthly 6: sama kuudelle viimeisimmälle kuukaudelle.
Snapshot säilyy, jos se täyttää vähintään yhden säännöistä. Kaikki, mikä ei täytä yhtään sääntöä, unohdetaan. Kokeile uutta suunnitelmaa ensin valitsimella --dry-run: näet, mitä poistuisi, mutta mitään ei muuteta.
Tärkeä ero: forget poistaa vain viittauksen snapshotiin. Tiedot jäävät repositoryyn, kunnes prune siivoaa lohkot, joita mikään snapshot ei enää käytä. Valitsin --prune komennossa forget tekee tämän samalla kertaa. Prune vie aikaa ja lukitsee repositoryn, joten älä ajoita sitä samaan aikaan varmuuskopioinnin kanssa.
Tarkistaminen: check
Huomaamatta vioittuneen varmuuskopion huomaat vasta palauttaessa. Anna resticin tarkistaa repository säännöllisesti:
root@web1:~# restic check
...
no errors were found
root@web1:~# restic check --read-data-subset=5%Pelkkä check tarkistaa rakenteen. Valitsimella --read-data-subset se myös oikeasti lukee osan tiedoista takaisin ja tarkistaa sisällön. Tee näin esimerkiksi viikoittain muutamalle prosentille; ajan mittaan kaikki tulee luettua kertaalleen.
Palauttaminen: restore ja mount
Palauta erilliseen kansioon, älä koskaan suoraan alkuperäisen päälle:
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
gelijklatest on uusin snapshot; voit käyttää myös tunnistetta (restic restore 3c7e91d4 ...). Komennolla restic mount /mnt/restic (vaatii FUSEn) näet kaikki snapshotit kansioina ja voit selata niitä ja kopioida yksittäisiä tiedostoja. Lopeta painamalla Ctrl+C.
Tietokannan palautat hakemalla vedoksen takaisin ja tuomalla sen, esimerkiksi gunzip < alles.sql.gz | mariadb.
Automaattisesti joka yö
Tee skripti ja systemd-ajastin (oppitunti 6.3). Skripti:
#!/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 --pruneTee .service, jossa on Type=oneshot ja ExecStart=/usr/local/sbin/backup.sh, sekä .timer, jossa on OnCalendar=*-*-* 03:10:00 ja Persistent=true. set -eu pysäyttää skriptin ensimmäiseen virheeseen, jolloin systemd näkee ajon epäonnistuneena. Liitä mukaan ilmoitus (oppitunti 8.3), muuten et huomaa epäonnistunutta varmuuskopiota.
Kiristyshaittaohjelmia vastaan: append-only
Yllä olevassa skriptissä palvelin voi itse myös poistaa varmuuskopion (forget ja prune). Jos hyökkääjä kaappaa palvelimen, hänkin voi siis tehdä niin. Kaksi tapaa estää tämä:
- rest-server append-only-tilassa: aja tallennuspalvelimella resticin omaa rest-serveriä valitsimella
--append-only. Verkkopalvelin voi silloin lisätä varmuuskopioita, mutta ei poistaa mitään. Siivouksen (forget --prune) teet toiselta, hyvin suojatulta koneelta täysin oikeuksin. - Versionhallintaa tai objektilukitusta tukeva tallennustila S3-palveluntarjoajalla, jolloin poistetut objektit voi vielä jonkin aikaa palauttaa.
Huomaa hienovarainen sudenkuoppa, jonka resticin dokumentaatio itse mainitsee: hyökkääjä, joka lisää valesnapshoteja, voi saada suunnitelman kuten --keep-weekly unohtamaan oikeita snapshoteja. Valitsimella --keep-within (esimerkiksi --keep-within 30d) kaikki kyseiseltä ajalta säilyy, oli se valetta tai aitoa.
Yhteenveto
- restic salaa, deduplikoi ja osaa tallentaa monenlaiseen palvelimen ulkopuoliseen tallennustilaan; jos salasana katoaa, kaikki katoaa.
initluo repositoryn,backupsnapshotin jasnapshotsnäyttää ne.forgetyhdessä--keep-*:n kanssa määrää, mitä säilytetään; vastaprune(tai--prune) siivoaa tiedot oikeasti. Kokeile ensin valitsimella--dry-run.check(valitsimella--read-data-subset) tarkistaa,restore --targetpalauttaa erilliseen kansioon jamountantaa selata.- Automatisoi ajastimella ja ilmoituksella, ja pidä vähintään yksi repository palvelimen ulottumattomissa (append-only).
Tietovisa (quiz)
Tehtävä
Tehtävä Z8.2: Mikä jää jäljelle forgetin jälkeen? Esimerkkitiedostossa restic-snapshots.txt on luettelo snapshoteista ja säilytyssuunnitelma. Selvitä, mitkä snapshotit jäävät jäljelle komennon restic forget jälkeen tällä suunnitelmalla. Ohjelma vertaa vastaustasi kiinteään avaimeen.
Tehtävä O8.2: Palautustesti. Luo omalla palvelimellasi restic-repository palvelimen ulkopuolelle, tee varmuuskopio kohteesta /etc ja tiedoistasi, ja palauta yksi kansio kohteeseen /tmp/terug. Vertaa komennolla diff, kirjaa ylös, kuinka kauan se kesti, ja vastaa, missä salasanasi ja tallennustilan tunnukset säilytetään palvelimen ulkopuolella.
Tehtävä O8.2: Palautustesti
Tämän tehtävän teet itse, kukaan ei tarkista sitä. Merkitse tekemäsi kohdat ja merkitse tehtävä tehdyksi.
Repository on eri palveluntarjoajalla kuin palvelin. diff ei näytä eroja tai näyttää vain tiedostot, jotka muuttuivat varmuuskopion jälkeen. Salasana salasanojen hallintaohjelmassa ja paperilla; append-only-kopio suojaa siltä, että tunkeutuja poistaa kopiot.
Merkintäsi ja muistiinpanosi pysyvät vain tässä selaimessa, emme lähetä niitä minnekään. Jos olet kirjautunut sisään, tallennamme kohtaan Omat kurssit vain sen, että olet tehnyt tehtävän.
Lue lisää
- Varmuuskopiointistrategia: 3-2-1-sääntö omalle yrityksellesi
- Resticin dokumentaatio, Preparing a new repository: https://restic.readthedocs.io/en/stable/030_preparing_a_new_repo.html
- Resticin dokumentaatio, Removing backup snapshots (forget ja prune): https://restic.readthedocs.io/en/stable/060_forget.html
- Resticin dokumentaatio, Restoring from backup: https://restic.readthedocs.io/en/stable/050_restore.html
- rest-server (append-only): https://github.com/restic/rest-server
