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…