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