Pools

Von der Installation sind noch die leeren Partitionen virt & data übrig.

Verschlüsseln

Keys erzeugen:

mkdir /root/keys
chmod 700 /root/keys

dd count=1 bs=256k if=/dev/random of=/root/keys/virt.key
dd count=1 bs=256k if=/dev/random of=/root/keys/data.key

Passphrases ohne Newlines in Files schreiben:

printf '…' > /root/keys/virt.pass
printf '…' > /root/keys/data.pass

chmod 600 /root/keys/*

Partitionen verschlüsseln:

geli init -s 4096 -l 256 -J /root/keys/virt.pass -K /root/keys/virt.key gpt/virt0
geli init -s 4096 -l 256 -J /root/keys/virt.pass -K /root/keys/virt.key gpt/virt1

geli init -s 4096 -l 256 -J /root/keys/data.pass -K /root/keys/data.key gpt/data0
geli init -s 4096 -l 256 -J /root/keys/data.pass -K /root/keys/data.key gpt/data1

Alles ist hoffentlich gut notiert.

Entsperren

Key plus Passphrase ist gleich entschlüsselte Partition:

geli attach -j /root/keys/virt.pass -k /root/keys/virt.key gpt/virt0
geli attach -j /root/keys/virt.pass -k /root/keys/virt.key gpt/virt1

geli attach -j /root/keys/data.pass -k /root/keys/data.key gpt/data0
geli attach -j /root/keys/data.pass -k /root/keys/data.key gpt/data1

Unter /dev/gpt sollten jetzt die *.eli Devices auftauchen.

Pools & Datasets

Jetzt darauf die Pools erstellen:

zpool create \
  -f -m none \
  -O compression=lz4 \
  -O atime=off \
  virt mirror gpt/virt0.eli gpt/virt1.eli

zfs create -o mountpoint=none virt/ROOT

zfs create -o mountpoint=/usr/jails virt/jails

zfs create virt/jails/proxy
zfs create -o canmount=off virt/jails/proxy/usr
zfs create -o canmount=off virt/jails/proxy/var

zfs create virt/jails/asset
zfs create -o canmount=off virt/jails/asset/usr
zfs create -o canmount=off virt/jails/asset/var

zfs create virt/jails/thing
zfs create -o canmount=off virt/jails/thing/usr
zfs create -o canmount=off virt/jails/thing/var
zpool create \
  -f -m none \
  -O compression=lz4 \
  -O atime=off \
  data mirror gpt/data0.eli gpt/data1.eli

zfs create -o mountpoint=none data/ROOT
zfs create -o mountpoint=/var/data data/ROOT/default

zfs create -o mountpoint=/var/data/share data/share
zfs create -o atime=on data/share/cert
zfs create data/share/cert/dkim
zfs create data/share/cert/http
zfs create -o setuid=off data/share/static

zfs create -o mountpoint=/var/data/store data/store
zfs create -o atime=on data/store/sync
zfs create data/store/media

Remote unlock

Wir haben das System soweit, Platten sind verschlüsselt. Jedoch muss man nach jedem reboot wieder die Partitionen von Hand mit geli attach entsperren. Auch schlimm: Der Ordner /root/keys liegt im unverschlüsselten Bereich!

Später nicht einfach dort liegen lassen - sonst ist die ganze Plattenverschlüsselung umsonst, wenn einem der Server aus dem Rack geschraubt wird.

Ein offsite Backup machen (USB-Stick im Tresor oder so), und danach /root/keys löschen.

geli remote unlock

Hab mir geli remote unlock gedängelt. Die Keys, und Passphrases dazu werden verschlüsselt von einem anderen Host via ssh geholt.

Keys & Passphrases verschlüsseln:

openssl enc -aes-256-cbc -a -pbkdf2 -salt \
  -in /root/keys/virt.key \
  -out /root/keys/machine.virt.key.aes \
  --pass "pass:…"
openssl enc -aes-256-cbc -a -pbkdf2 -salt \
  -in /root/keys/virt.pass \
  -out /root/keys/machine.virt.pass.aes \
  --pass "pass:…"

openssl enc -aes-256-cbc -a -pbkdf2 -salt \
  -in /root/keys/data.key \
  -out /root/keys/machine.data.key.aes \
  --pass "pass:…"
openssl enc -aes-256-cbc -a -pbkdf2 -salt \
  -in /root/keys/data.pass \
  -out /root/keys/machine.data.pass.aes \
  --pass "pass:…"

Die pass:… Strings sind bitte andere Passwörter als für die .eli Partitionen. Brauchen wir im rc Script.

Die *.aes files werden an der Gegenstelle hinterlegt…

Wie wo und wann genau im Repo nachlesen.

Die /etc/rc.conf wird bisschen umfangreich:

# geliremoteunlock
geliremoteunlock_enable="YES"

geliremoteunlock_pools="virt data"
geliremoteunlock_virt_devices="gpt/virt0 gpt/virt1"
geliremoteunlock_data_devices="gpt/data0 gpt/data1"

geliremoteunlock_keyfile_host="user@example.org"
geliremoteunlock_keyfile_ident="/root/.ssh/machine_unlock_ed25519"
geliremoteunlock_virt_keyfile_name="machine.virt.key.aes"
geliremoteunlock_virt_keyfile_password="…"
geliremoteunlock_data_keyfile_name="machine.data.key.aes"
geliremoteunlock_data_keyfile_password="…"

geliremoteunlock_passphrase_host="user@example.org"
geliremoteunlock_passphrase_ident="/root/.ssh/machine_unlock_ed25519"
geliremoteunlock_virt_passphrase_name="machine.virt.pass.aes"
geliremoteunlock_virt_passphrase_password="…"
geliremoteunlock_data_passphrase_name="machine.data.pass.aes"
geliremoteunlock_data_passphrase_password="…"

Von der Setup Seite das rc Script für geliremoteunlock nicht vergessen…

last update: 2025-02-07 14:35:53 +0100