www.dr-lotz.de

Verschlüsseltes Backup auf einer Maschine an einem anderen Ort

System: SUSE Leap 42.1

Ich möchte meine privaten Daten auf einem root-Server im Internet sichern, aber sicher sein, dass die Daten dort verschlüsselt auf der Platte liegen.

Die verschlüsselte Partition soll nur während des Backups gemountet werden.

Meine Lösung beinhaltet ein Skript auf dem root-Server und eines auf dem Rechner, dessen Daten gesichert werden sollen.

Das Passwort soll nicht auf dem root-Server liegen, aber ich möchte es nicht immer von Hand eingeben müssen. Deshalb ist es in dem Skript auf dem Client, denn wer da Zugriff drauf hat, hat auch Zugriff auf die Daten. Auf dem Rootserver ist das Passwort vermutlich während des Backups über ps zu sehen, aber wenn jemand dort während des Backups unerlaubten root-Zugriff hat, kommt er auch an die Daten und habe ich vermutlich noch andere Probleme mit dem root-Server. Da ist das mit dem ps auch egal.

Im Wesentlichen will ich sicher sein, dass die Backup-Partition nur beim Backup gemountet ist und bei ausgebauten Platten die Daten nicht lesbar sind. Wenn jemand just beim Backup unberechtigt Zugriff auf den Rechner hat - dumm gelaufen.

Skript auf dem Client (Rechner, dessen Daten gesichert werden sollen):

#!/bin/bash

# SSH-Key, falls einer verwendet wird:
# ssh-agent und ssh-add sollte verwendet werden, sonst muss man für jedes
# zu sicherndes Verzeichnis die Passphrase vom SSH-Key eingeben
SHKEY="/home/user1/.ssh/id_ed25519-derbackupschluessel"

# Was nicht gesichert werden soll
EXCLUDEFILE=$(mktemp -t excludebackup.XXXXXXXXXX)
# echo $TMPFILE

# Dateien, die nicht ins Backup sollen:
cat > $EXCLUDEFILE <<EOF 
.cache/
[cC]ache/
.thumbnails/
.ssh/
.pgp/
.gnupg/
Trash/
lost+found/
EOF

function mountcrypt {
# Set up the crypt device and mount it:
ssh -A -i $SSHKEY root@1.2.3.4 "/root/bin/backup-server-mount.sh passwortfuerdiepartition"
}
# exit 0

function rsyncbackup {
# Backup the directories
for i in /home/user1 /home/user2 /more/directories
do
   rsync -e "ssh -i $SSHKEY" --exclude-from="$EXCLUDEFILE" -axR -v --del $i  root@1.2.3.4:/backup
done
}

function umountcrypt {
# Umount the crypt device and close it
ssh -A -i $SSHKEY root@1.2.3.4 "/root/bin/backup-server-umount.sh"

# Clean up
sleep 2
rm -f $TMPFILE
}

trap umountcrypt SIGINT SIGTERM EXIT

# Here we go:
mountcrypt
rsyncbackup

# nicht nötig, trap macht das schon:
# umountcrypt

Skripte auf dem Server (Rechner, auf dem die Daten gesichert werden sollen):

Das Skript heißt z.B. backup-mount.sh, und es gibt ein Sym-Link mit backup-umount.sh darauf.

Je nach dem, wie es aufgerufen wird, wird die eine oder die andere Funktion ausgeführt.

#!/bin/bash

BASENAME=$(basename $0)
# echo $BASENAME

case $BASENAME in

*-mount.sh)
  # LUKS-Device entschluesseln und mounten
  if cryptsetup status backup | grep backup | grep -v "is active and is in use"
  then
    echo -n "$1" | cryptsetup luksOpen --key-file - /dev/blockdevice backup
    mount /dev/mapper/backup /backup
  fi
;;

*-umount.sh)
  # LUKS-Device unmounten und schließen
  umount /dev/mapper/backup
  cryptsetup luksClose backup
;;

*)
  echo "Something went wrong"
;;

esac