GELI + ZFS als "NAS" -> nur einmal PW eingeben

userlr

Member
Eben angemeldet und somit mein erster Post :-)

Ich habe mich nun entschlossen mittels FreeBSD und ZFS mein neuen Fileserver aufzubauen. Wichtig ist mir hier vor allem Verschlüsselung - deshalb auch GELI. Nach einigen einlesen finde ich die Lösungen die immer davon ausgehen beim Booten für jede Platte ein Passwort einzugeben, einwenig unbefriedigend. Gibt es hier eine bessere Lösung? Z.B. kann man ein USB Stick zuerst entschlüsseln (per PW) und mit auf diesen liegenden Schlüssel (File) dann die restlichen Laufwerke "entsperren"? Oder gibt es hier eine elegantere Lösung?

PS: stimmt es, das es keine Möglichkeit gibt ebenfalls die Boot Partition zu verschlüsseln?

Danke schon mal vorab!
 
Ich hab mir ein kleines Skript geschrieben, welches mit dem einmal eingegebenen PW alle Platten entschlüsselt. Du kannst natürlich auch einene Schlüssel auf 'nen Stick legen und den dann verschlüsseln... aber um ein Skript kommst du wohl nicht rum.

Zum P.S. kann ich nichts sagen. Ich habe /boot jedenfalls immer unverschlüsselt gelassen. Ist für mich ehrlich gesagt nur schwer vorstellbar, wie der kleine MBR oder GPT loader geli entschlüsseln soll, ich schätze man muss halt schon 'nen Kernel laden von /boot. (Oder 'nen kleines OS wie Grub davor hängen)
 
Speziell hierüber (geli bootloader) habe ich vor ein paar Wochen nachgedacht.

Angesichts der Tatsache, dass ZFS in den Bootloader integriert wurde,
scheint es jedenfalls möglich. GPT hat ja eigene boot-partitionen und so ist das
MBR Größenlimit dort hinfällig.

Ein gptzfsgeliboot sozusagen :)

Wenn man die Selbstverständlichkeit betrachtet, mit der die BSD Community ihre
Platten verschlüsselt, halte ich das für ein strategisch vorteilhaftes Projekt.

Leider bin ich ein miserabler Low-Level Programmier (Geschmacksache),
sonst hätte ich wohl dann und da angefangen zu frickeln.
 
kann man dieses Script sich irgend wo anschauen? :-)

Kann man sicher viel dran verbessern und kürzen, aber funktioniert für mich. Ich hatte ehrlich gesagt nicht gedacht, dass ich das mal irgendwo posten würde... habe noch fix die Pool- und GPT-Namen oben einstellbar gemacht. Die Idee ist:
  • Ein verschlüsselter Pool (bei mir "grave", wie "Datengrab" :-) )
  • Mehrere devices (Partitionen von HDDs), die einen GPT-Namen haben mit common prefix (bei mir auch "grave").
  • Das heißt, die erste Festplatte hat eine Partition mit GPT-Namen "grave0", die zweite "grave1" usw...
  • GPT-Prefix und Pool-Name sind ganz oben einstellbar.
Code:
#!/bin/sh

# change this
POOL=grave
GPT_BASE=$POOL

# do not change the rest

set -e

OPT="$1"

PW=

enter_pw()
{
  printf "please enter password: "
  stty -echo
  read PW
  stty echo
  echo
}

check_pool()
{
  if zpool list | grep $POOL | grep ONLINE 2>&1 >/dev/null; then
   echo "...pool \"${POOL}\" is ready."
   exit 0
  fi
}

# may be inported
check_pool

enter_pw

for i in `seq 0 9`; do

  # skip non existing disks
  if [ ! -e /dev/gpt/${GPT_BASE}${i} ]; then
   continue
  fi

  # always try using stored pw the first time for each device
  FIRST='y'
  # then, ask for pw as long as its wrong
  while true; do
   # if device is not yet up, we used wrong pw, except first time
   if ! geli status | grep ${GPT_BASE}${i} > /dev/null; then
    if test -n "$FIRST"; then
     FIRST=
    else
     printf "%s%d is not ready yet, enter right pw..\n  " "$GPT_BASE" "${i}"
     enter_pw
    fi
   else # gpt this device is ready, end for this device
    printf 'successfully mounted: %s%s\n' "$GPT_BASE" "${i}"
    break
   fi
   # enter password
   printf "%s" "$PW" | geli attach -j- gpt/${GPT_BASE}${i} || true
  done
done

zfs mount -a || true
check_pool

zpool import $POOL || true
sleep 1
# try again, it helped at least one time (might try to remove)
zfs mount -a || true
 
Zurück
Oben