Sichere, verschlüsselte Off-Site-Backups - die Empfängerseite

Vor einem Jahr hatte ich be­schrie­ben, wie ich ein ver­schlüs­sel­tes Back­up auf einen Rech­ner im Netz mit Du­pli­ci­ty mache. Du­pli­ci­ty er­le­digt die ei­gent­li­che Back­up-Auf­ga­be und die Ver­schlüs­se­lung mit gpg. An­schlie­ßend wer­den diese Daten per sftp auf das ent­fern­te Sys­tem ge­scho­ben. Was man hier­bei be­ach­ten kann, möch­te ich hier quasi als Fol­low-Up-Ar­ti­kel do­ku­men­tie­ren.

Au­then­ti­sie­rung per ssh-Key

Das Na­he­lie­gends­te zu­erst: Für ein au­to­ma­tisch lau­fen­des Back­upskript soll­te es na­tür­lich nicht nötig sein, ein Pass­wort ein­zu­ge­ben. Für die­sen Zweck habe ich einen ssh-Key ge­ne­riert, wel­cher auf dem zu si­chern­den Rech­ner un­ver­schlüs­selt vor­liegt und des­sen Pu­blic-Key-Ge­gen­stück auf dem Ser­ver in die Datei `~/.ssh/aut­ho­ri­ze­d_keys` ein­ge­tra­gen wurde. Mit Hilfe des Pa­ra­me­ters `--ssh-op­ti­ons="-oIden­ti­ty­Fi­le=/root/.ssh/id_d­sa-back­up"` wird du­pli­ci­ty an­ge­wie­sen, die ent­spre­chen­de Op­ti­on für die Schlüs­sel­ver­wen­dung an ssh durch­zu­rei­chen.

Zu­griffs­be­schrän­kung auf dem Da­ten­ser­ver

Im Fall, daß das Sys­tem kom­pro­mit­tiert wird, ist ein un­ver­schlüs­sel­ter ssh-Key na­tür­lich das Sprung­brett auf ein wei­te­res Sys­tem. Um dem ent­ge­gen­zu­tre­ten, habe ich auf der Da­ten­ser­ver-Sei­te den zu­ge­hö­ri­gen Ac­count durch fol­gen­de Ein­trä­ge in der ssh-Kon­fi­gu­ra­ti­on `/etc/ssh/ssh­d_­con­fig` ein­ge­schränkt:

Match Group re­mo­te­bak
  Chroot­Di­rec­to­ry /var/back­ups/re­mo­te/%u/chroot
  Force­Com­mand in­ter­nal-sftp

Alle sol­chen Back­up-Ac­counts habe ich der Grup­pe "re­mo­te­bak" hin­zu­ge­fügt und ihre Ho­me-Ver­zeich­nis­se in `/var/back­ups/re­mo­te/user­na­me` an­ge­legt. Durch die obige Kon­fi­gu­ra­ti­on wird für alle User der Grup­pe er­zwun­gen, daß nur ein Zu­griff via sftp er­fol­gen kann (also keine in­ter­ak­ti­ven Shell-Zu­grif­fe); au­ßer­dem wird der Zu­griff durch eine Chan­ge-root-Um­ge­bung auf das Un­ter­ver­zeich­nis `chroot` ein­ge­schränkt.
Wieso aber der Klimm­zug mit dem wei­te­ren Un­ter­ver­zeich­nis? Grund hier­für ist die Be­din­gung für die chroot-Um­ge­bung, daß das chroot-Ver­zeich­nis samt all sei­ner Stamm­ver­zeich­nis­se root ge­hö­ren muß. Ich woll­te aber si­cher­stel­len, daß über den sftp-Zu­gang aus­schlie­ß­lich die Back­up-Da­ten zu­greif­bar sind, gleich­zei­tig woll­te ich aber das Ho­me­ver­zeich­nis (mit dem .ssh-Ver­zeich­nis) der Über­sicht­lich­keit wegen an der­sel­ben Stel­le haben. Daher sieht die Ver­zeich­nis- und Da­tei­struk­tur für den Back­up-User ser­ver1 wie folgt aus:

Ver­zeich­nis/Datei Owner
/var/back­ups/re­mo­te/ser­ver1 root
/var/back­ups/re­mo­te/ser­ver1/.ssh/... ser­ver1
/var/back­ups/re­mo­te/ser­ver1/chroot root
/var/back­ups/re­mo­te/ser­ver1/chroot/data ser­ver1

So ist ssh mit der Ow­nership des ssh-Keys und des chroot-Ver­zeich­nis­ses glück­lich, gleich­zei­tig ist si­cher­ge­stellt, daß der User über sftp aus­schlie­ß­lich in das da­ta-Ver­zeich­nis schrei­ben kann.

Mehr Pa­ra­noia: Back­up-Da­ten in Si­cher­heit brin­gen

Bis hier­her ist si­cher­ge­stellt, daß ein An­grei­fer, der den zu si­chern­den Rech­ner kom­pro­mit­tiert hat, kei­nen pro­blem­lo­sen Shell­zu­griff auf den Da­ten­rech­ner er­hält. Die Mög­lich­keit des Van­da­lis­mus ist damit al­ler­dings noch nicht aus­ge­schlos­sen - er kann sämt­li­che Back­up-Da­ten lö­schen und so ein Wie­der­her­stel­len des Sys­tems un­mög­lich ma­chen.
Eine Mög­lich­keit wäre es, die Daten täg­lich au­to­ma­tisch weg­zu­ko­pie­ren - was al­ler­dings eine er­heb­li­che Platz­ver­schwen­dung wäre. Eine Mög­lich­keit wäre es, neue Me­ta­da­ten zu ko­pie­ren und die ei­gent­li­chen Daten in ein an­de­res Ver­zeich­nis au­ßer­halb der Chan­ge­root-Um­ge­bung weg­zu­schie­ben. Al­ter­na­tiv kann man (so­fern das Da­tei­sys­tem er­wei­ter­te At­tri­bu­te er­laubt) die Da­tei­en gegen jeg­li­che Ver­än­de­rung schüt­zen:

cd /var/back­ups/re­mo­te
for i in * ; do
  pushd $i > /dev/null
  cd chroot/data
  for j in * ; do
    chmod +i $j
  done
  popd > /dev/null
done

Das Skript ist nur eine Skiz­ze, es muß als root aus­ge­führt wer­den, Feh­ler­fäl­le wer­den hier nicht ab­ge­fragt, Un­ter­ver­zeich­nis­se von data nicht be­rück­sich­tigt (du­pli­ci­ty legt von sich aus keine an)... aber ich denke, es ver­mit­telt die Idee :-)
Ein­zi­ger Wehr­muts­trop­fen: Die Ex­pi­ry von Du­pli­ci­ty-Back­ups (Lö­schen alter Daten) funk­tio­niert nun na­tür­lich nicht mehr rein cli­ent­sei­tig, da die Da­tei­en gegen Lö­schen ge­schützt sind. Ein­zi­ge Lö­sung ist ein wei­te­res Skript, was sol­che alten Daten weg­räumt - oder ge­le­gent­li­che Hand­ar­beit.