diff --git a/installazione.md b/installazione.md index 2f3b06f..9017dbb 100644 --- a/installazione.md +++ b/installazione.md @@ -1,153 +1,138 @@ -### ZFS +# How to rosa -Installiamo zfs nel sistema live (lo script è fornito direttamente da hetzner, -l'ho copiato in questa repo) - -``` -./install_zfsonlinux.sh -``` - -Lanciamo lo script `create_pools.sh` - -``` -./create_pools.sh -``` - -(per importare delle pool già esistenti, facciamo `zfs import -f `). +## ATTENZIONE: +Se vuoi solo loggarti sulla macchina, vai [qui](./login.md). ### Installazione debian base -Dal live system, ci segnamo l'output del seguente comando +Dal live system, usiamo `imageinstall -e` provvisto da Hetzner per installare un +sistema debian buster base, in cui configuriamo i dischi con il seguente layout: ``` -blkid -s PARTUUID -o value +NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +sda 8:0 0 2.7T 0 disk +├─sda1 8:1 0 1G 0 part +│ └─md0 9:0 0 1022M 0 raid1 /boot +├─sda2 8:2 0 2.7T 0 part +│ └─md1 9:1 0 2.7T 0 raid1 +│ └─vg0-root 253:1 0 300G 0 lvm / +└─sda3 8:3 0 1M 0 part +sdb 8:16 0 2.7T 0 disk +├─sdb1 8:17 0 1G 0 part +│ └─md0 9:0 0 1022M 0 raid1 /boot +├─sdb2 8:18 0 2.7T 0 part +│ └─md1 9:1 0 2.7T 0 raid1 +│ └─vg0-root 253:1 0 300G 0 lvm / +└─sdb3 8:19 0 1M 0 part ``` -dove `` corrisponde al valore puntato da `${DISK1}-part1` -nello script lanciato nello step precedente. Installiamo nella directory target -il sistema base +Il sistema provvede ad installare un sistema con ssh già avviato e l'utente root +con la chiave ssh già configurata (se l'abbiamo impostata nel pannello del +rescue system). + +### Cryptoroot + +A questo punto, riavviamo di nuovo nel rescue system. Creiamo un disco in ram +abbastanza grande da contenere il tarball di tutto il contenuto della root: ``` -debootstrap buster /mnt +mkdir /ramdisk +mount -t tmpfs -o size=10G /ramdisk ``` -Entriamo in chroot con systemd-nspawn +Montiamo la root ``` -systemd-nspawn -D /mnt +mount /dev/vg0/root /mnt ``` -Modificare le `/etc/apt/sources.list` per includere i seguenti +Facciamo un backup della root ``` -deb http://deb.debian.org/debian buster main non-free contrib -deb http://deb.debian.org/debian buster-updates main non-free contrib -deb http://deb.debian.org/debian buster-backports main non-free contrib -deb http://security.debian.org buster/updates main non-free contrib +cd /mnt +tar czvf /ramdisk/root.tar.gz /mnt/* ``` -Facciamo il pinning (ovvero diciamo ad apt di prendere certi pacchetti da una -specifica repository) per i pacchetti relativi a ZFS, mettendo questo contenuto -in `/etc/apt/preferences.d/90_zfs` +Eliminiamo il contenitore vg0 (un volume group LVM) in questa brutale maniera, +creando così uno strato di cifratura ``` -Package: libnvpair1linux libuutil1linux libzfs2linux libzfslinux-dev libzpool2linux python3-pyzfs pyzfs-doc spl spl-dkms zfs-dkms zfs-dracut zfs-initramfs zfs-test zfsutils-linux zfsutils-linux-dev zfs-zed -Pin: release n=buster-backports -Pin-Priority: 990 +cryptsetup luksFormat /dev/md1 ``` -Per lo scopo dell'installazione +Ci viene chiesta la conferma, e di immettere due volte la nuova passphrase. Dopo +di questo, montiamo il nuovo contenitore cifrato ``` -ln -s /proc/self/mounts /etc/mtab -apt update +cryptsetup open /dev/md1 crypta ``` -Configurare il locale e la timezone (io ho selezionato `en_US.UTF-8` e locale -`Europe/Berlin`) +creiamo un nuovo volume group e un logical group per la partizione di root ``` -apt install --yes locales -dpkg-reconfigure locales -dpkg-reconfigure tzdata +vgcreate /dev/mapper/crypta vg0 +lvcreate -L 300G --name root vg0 ``` -Installiamo i pacchetti relativi a ZFS nel nuovo sistema +lo montiamo e ci riversiamo dentro il backup della root ``` -apt install --yes dpkg-dev linux-headers-amd64 linux-image-amd64 -apt install --yes zfs-initramfs -apt install --yes console-setup -echo REMAKE_INITRD=yes > /etc/dkms/zfs.conf +mount /dev/vg0/root /mnt +tar xzvf /ramdisk/root.tar.gz -C /mnt ``` -Aggiungiamo la seguente riga nell'`/etc/fstab` +Il nuovo layout dovrebbe essere questo ``` -PARTUUID= /boot/efi vfat nofail,x-systemd.device-timeout=1 0 1 +NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +sda 8:0 0 2.7T 0 disk +├─sda1 8:1 0 1G 0 part +│ └─md0 9:0 0 1022M 0 raid1 /boot +├─sda2 8:2 0 2.7T 0 part +│ └─md1 9:1 0 2.7T 0 raid1 +│ └─crypta 253:0 0 2.7T 0 crypt +│ └─vg0-root 253:1 0 300G 0 lvm / +└─sda3 8:3 0 1M 0 part +sdb 8:16 0 2.7T 0 disk +├─sdb1 8:17 0 1G 0 part +│ └─md0 9:0 0 1022M 0 raid1 /boot +├─sdb2 8:18 0 2.7T 0 part +│ └─md1 9:1 0 2.7T 0 raid1 +│ └─crypta 253:0 0 2.7T 0 crypt +│ └─vg0-root 253:1 0 300G 0 lvm / +└─sdb3 8:19 0 1M 0 part ``` -(dove `` è la stringa ottenuta nel primo passo di questa -sezione) e preoccupiamoci di ciò che riguarda il boot +(dove `` si può ottenere da `lsblk -o +UUID`, alla riga +corrispondente di `/dev/md0`). +Montiamo tutto insieme e facciamo il chroot dentro ``` -apt install dosfstools -apt install --yes grub-efi-amd64 shim-signed -dpkg --purge os-prober +mount /dev/vg0/root /mnt +mount /dev/md0 /mnt/boot +mount -t proc /proc /mnt/proc +for fs in dev sys run; do mount --rbind /${fs} /mnt/${fs}; done +chroot /mnt /bin/bash --login ``` -Impostiamo la password root +Ci assicuriamo che `/etc/fstab` abbia questa forma ``` -passwd +proc /proc proc defaults 0 0 +UUID= /boot ext3 defaults 0 0 +UUID= none swap sw 0 0 +/dev/vg0/root / ext4 defaults 0 0 ``` -(Forse non serve) creiamo e abilitiamo questa unit systemd (in -`/etc/systemd/system/zfs-import-bpool.service`) per forzare l'import della pool -di `/boot` - -```ini -[Unit] -DefaultDependencies=no -Before=zfs-import-scan.service -Before=zfs-import-cache.service - -[Service] -Type=oneshot -RemainAfterExit=yes -ExecStart=/sbin/zpool import -N -o cachefile=none bpool - -[Install] -WantedBy=zfs-import.target -``` - -Adesso installiamo e configuriamo grub +e che `/etc/crypttab` sia fatto così ``` -grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian --recheck - -perl -i -pe 's/(GRUB_CMDLINE_LINUX=")/${1}root=ZFS=rpool /' /etc/default/grub -echo 'GRUB_DISABLE_OS_PROBER=true' >> /etc/default/grub -update-grub +# +crypta /dev/md1 none luks ``` -I seguenti passi servono a configurare il boot - -``` -umount /boot/efi -umount /boot -zfs set mountpoint=legacy bpool -echo "bpool /boot zfs nodev,relatime,x-systemd.requires=zfs-import-bpool.service 0 0" >> /etc/fstab -``` - -e disabilitiamo il suspend/resume (questo è un server) - -``` -echo RESUME=none > /etc/initramfs-tools/conf.d/resume -``` - -### Dropbear +### Dropbear nell'initram Installiamo dropbear nell'initramfs @@ -165,6 +150,7 @@ echo 'DROPBEAR_OPTIONS="-s -j -k -p 4747"' >> /etc/dropbear-initramfs/config disabilita il remote port forwarding; `-p` è la porta a cui bindarsi) Copiamo la chiave pubblica generata in `/etc/dropbear-initramfs/authorized_keys` +(ATTENZIONE: **non** può essere una chiave ellittica, usate una RSA) ``` cat >> /etc/dropbear-initramfs/authorized_keys @@ -176,27 +162,9 @@ Configuriamo la rete echo 'IP="144.76.80.140::144.76.80.129:255.255.255.224:::off"' >> /etc/initramfs-tools/initramfs.conf ``` - -### Stunt per far funzionare zfs al boot in dropbear - -Copiamo lo script da [qui][zfsunlock] e mettiamolo in -`/usr/share/initramfs-tools/scripts/zfsunlock` e diamogli l'eseguibilità: - -``` -chmod +x /usr/share/initramfs-tools/scripts/zfsunlock -``` - -Poi modifichiamo `/usr/share/initramfs-tools/scripts/zfs` come in [questo -commit][commit] (si può usare la patch in `zfs.patch`, copiandola in -`/tmp/zfs.patch` e invocando `patch < /tmp/zfs.patch`). - -Infine, aggiorniamo l'initramfs +Infine, aggiorniamo l'initramfs e grub ``` update-initramfs -u -v +update-grub ``` - - - -[zfsunlock]: https://raw.githubusercontent.com/openzfs/zfs/1cc635a2dd0379181950a1458255ea8ae8b9c1e0/contrib/initramfs/zfsunlock -[commit]: https://github.com/openzfs/zfs/commit/1cc635a2dd0379181950a1458255ea8ae8b9c1e0#diff-98a21a3fd74b681e806ecbd958c2352bL409 diff --git a/login.md b/login.md new file mode 100644 index 0000000..8511eb2 --- /dev/null +++ b/login.md @@ -0,0 +1,41 @@ +# How to login + +Per loggarti devi avere accesso a due chiavi ssh diverse. Si trovano entrambe +nel pass condiviso. Quella per loggarsi al boot è `unit/rosa_dropbear_key` e +quella per loggarsi sul sistema avviato è `unit/server_common_key`. + +Queste vanno decifrate e messe in un posto adeguato + +``` +pass unit/rosa_dropbear_key >> $HOME/.ssh/rosa_boot +pass unit/server_common_key >> $HOME/.ssh/unit +chmod 600 $HOME/.ssh/rosa_boot +chmod 600 $HOME/.ssh/unit +``` + +### Decifrare il disco cifrato + +Alla partenza, la macchina non è in uno stato utilizzabile: la partizione di +root è ancora cifrata. Il server espone ssh sulla porta `4747`, quindi per +loggarsi + +``` +ssh -i $HOME/.ssh/rosa_boot -p 4747 root@144.76.80.140 +``` + +A questo punto, per decifrare il disco e avviare definitivamente la macchina si +può usare lo script + +``` +cryptroot-unlock +``` + +che chiede la passphrase del disco (`pass unit/rosa_root_passphrase`). Una volta +immessa e premuto invio, la connessione ssh si chiude e il server termina il +processo di avvio. + +### Per loggarsi normalmente + +``` +ssh -i $HOME/.ssh/unit root@144.76.80.140 +```