restic auf KNF.Storage

Dies ist eine Kurzbeschreibung der Konfiguration von restic speziell für die Benutzung mit dem KNF.Storage.

Unpriviligierter Benutzer

Als 'root' auf dem Storage legen wir zunächst einen neuen Benutzer bob an:

adduser bob

Zur Nutzung des selben ssh-Schlüssels wie für root, kann die 'authorized_keys' Datei kopiert werden und die Rechte entsprechen vergeben werden:

mkdir /home/bob/.ssh

cp ~/.ssh/authorized_keys /home/bob/.ssh

chown -R bob:bob /home/bob/.ssh

chmod 700 /home/bob/.ssh

chmod 600 /home/bob/.ssh/authorized_keys

Alle anderen Schlüssel, außer dem eigenen sollten gelöscht werden.

restic

Wir verwenden 'sftp' als Protokoll - hier muss auf dem storage nichts weiter installiert werden. Möglich wäre z.B. noch 'rclone', siehe hier auch die entsprechende restic Dokumentation.

Jetzt konfigurieren wir restic auf dem Host.

gopass für Passphrases und Repositorypfade

Das Speichern des Passworts bzw. der Passphrase im Klartex ist ein no-go. Ich nutze 'gopass' (siehe auch 'pass'), um die Passphrases und auch die repository locations zu speichern, da dies kein Mehraufwand mehr ist.

In der gopass Struktur landen bei mir alle restic bezogenen Informationen unterhalb des Hostnamens.

gopass insert $(hostname)/restic_pw

⚠Ohne dieses Passwort kommt man nicht mehr an die Daten! stating the obvious...

gopass insert $(hostname)/restic_repo

Für das restic-Repository muss die sftp-URL angegeben werden, die folgende Form hat:

sftp://<user>@<server>:<port>/<absolute_path>

Nehmen wir an, der ssh-Port ist 12345 (siehe die Begrüßungsmail mit euren Daten) und ihr wollt, dass euer restic-Repository einfach im Ordner 'restic_repo' landet, dann ergibt sich die URL:

sftp://bob@storage.franken.de:12345//data/restic_repo

Als Alternative könnte eine Hostkonfiguration für ssh in der '.ssh/config' angelegt werden

Restic kennt diverse Umgebungsvariablen und CLI Optionen, die wir verwenden können.

In einer Datei 'env.bash' (alle restic bezogenen Skripte liegen unter '~/.restic'), exportieren wir ein paar Umgebungsvariablen. 'gopass -o' liefert nur das 'Passwort' und nicht alles was innerhalb des Eintrages gespeichert ist:

#!/bin/bash

#set -euo pipefail

RESTIC_HOST="$(hostname)"
RESTIC_REPOSITORY="$(gopass -o "$RESTIC_HOST"/restic_repo)"
RESTIC_PASSWORD_COMMAND="gopass -o "$RESTIC_HOST"/restic_pw"

export RESTIC_HOST RESTIC_REPOSITORY RESTIC_PASSWORD_COMMAND
    

Mit

source ~/.restic/env.bash

befüllen wir diese Umgebungsvariablen, die restic kennt und direkt verwenden kann. Mit

echo $RESTIC_REPOSITORY

können wir überprüfen, ob die Variable richtig gesetzt ist.

restic Repository initialisieren

restic init

Wenn restic erfolgreich war, sollte so etwas ähnliches erscheinen:

created restic repository 1a7c3cf0 at sftp://bob@storage.franken.de:12345//data/restic_repo

restic Backup erstellen

In einem Shell-Skript 'backup-knf.sh' rufen wir den eigentlichen Befehl für das restic Backup auf:

#!/bin/bash

set -euo pipefail

source ~/.restic/env.bash

restic backup \
    --compression max \
    --cleanup-cache \
    --tag restic,home \
    --group-by 'host,tags' \
    --exclude-caches \
    --files-from ~/.restic/include \
    --exclude-file ~/.restic/exclude
    

Hierbei soll es sich nur um ein Beispiel handeln. Die Beschreibung der Optionen findet sich in der restic manpage und in der Doku auf der restic Webseite.

Insbesondere mit den Optionen '--files-from' und '--exclude-file' lohnt es sich länger zu befassen.

Als einfaches Beispiel könnte in der 'include'-Datei für '--files-from' folgendes stehen:

/home/bob
    

In der 'exclude'-Datei für '--exclude-file':

*.o
/home/bob/.cache
    

Das heißt, hier würde das ganze home Verzeichnis von bob gebackupt werden, das .cache Verzeichnis, sowie alle Dateien mit der Endung '.o' würden ignoriert werden.

Mehrere Repositories und Passphrases

In der env.bash können gleich mehrere Repositories exportiert werden. Zum Beispiel für ein lokales und eines für das KNF.Storage Backup:

RESTIC_REPOSITORY_LOCAL="$(gopass -o "$RESTIC_HOST"/restic_repo_local)"
RESTIC_REPOSITORY_KNF="$(gopass -o "$RESTIC_HOST"/restic_repo_knf)"
    

Das Repository muss dann entsprechend dem 'restic backup' (oder auch 'restic init') Befehl als Option mitgegeben werden, da 'RESTIC_REPOSITORY_KNF' natürlich keine Umgebungsvariable ist, die restic kennt:

restic backup \
    --repo "$RESTIC_REPOSITORY_KNF"\
    --compression max \
    [...]
    

Will man verschiedene Passphrases nutzen, können diese mit '--password-command' an den restic Befehl übergeben werden, z.B.:

restic backup \
    --repo "$RESTIC_REPOSITORY_KNF" \
    --password-command "gopass -o "$RESTIC_HOST"/restic_pw_knf" \
    --compression max \
    [...]
    

Natürlich muss dann restic_pw_knf existieren.