Olen joskus
postannut pitkästi miten tehdään asennus, jossa muutama rinnakkaisasennus tehdään yhden ja saman LUKS-säiliön sisään niin, että myöskin /boot tulee salatuksi -- ei tarkoituksella, mutta sen takia ettei ikinä tulisi tarvetta muuttaa jakoa levyn salatun ja salaamattoman osan välillä.
Tällä välin tarvittava menettely on ehtinyt vaihtua, kun cryptsetup-initramfs -integraatio ei enää tue
keyscript-menettelyä, ja Ubuntun oletusasennuksessa luodaan nyt LUKS2-säiliö, jonka kanssa Grub edelleen nikottelee niin, että jos /boot täytyy salata, niin sille täytyy luoda LUSK1-säiliö.
Help Ubuntu Wikissä on artikkeli
Full_Disk_Encryption_Howto_2019, jossa kuvataan yksityiskohtaisesti, mitä kaikkea /boot-hakemiston salaus vaatii. Siinä vain on yksi asia, jonka tekisin toisin: sen sijaan, että avaintiedosto luodaan ja lisätään LUKS-säiliön avaimeksi asennuksen jälkeen chroot-häkissä, kirjoitan avaintiedoston ja istutan sen LUKS-avaimeksi mieluummin jo ennen asennusta. Siltä varalta, että asennusmediaa tehdessä on valittu pysyvyys, talletan tiedoston eksplisiittisesti virtuaalimuistiin, ettei se kirjoitu asennustikulle.
Kun istutus on jo valmiiksi tehty, voin sitten asennuksen aikana viedä avaintiedoston virtuaalimuistista levylle ja viedä muutkin tarvittavat asetukset ihan samalla tavalla, jolla wiki-artikkelissa lisätään /etc/crypttab ja Grub-asetus paikalleen asennuksen aikana, eli sitä mukaa kun kohdeasennuksen hakemistot on luotu. Näin update-initramfs ja update-grub asennuksen lopussa leipovat kaikki lisäykset mukaan ilman että minun itse täytyy käyttää chroot-häkkiä.
Koska kaikki muu on jo selostettu Wikissä, näytän tässä vain muunnetun osan komentosarjasta sellaisenaan. Oletuksena on, että osiointi on tehty, LUKS-säiliöt on avattu, LVM-taltioryhmä on luotu valmiiksi, ja komentoja suoritetaan "sudo -i bash" -tilassa. Olen testannut tämän kahden LUKS-säiliön asennuksen Ubuntu 22.04 (Jammy Jellyfish) -versiolla.
Ensin luodaan ja istutetaan avaintiedosto:
# Recollect keyfile naming scheme:
keydir=/etc/luks
keyfile=$keydir/boot_os.keyfile
keypat=$keydir/*.keyfile
# Write keyfile into RAM:
mkdir -p -m go=,u=rwx $keydir
mount -t tmpfs -o size=1m tmpfs $keydir # 5k RAM would be enough
(umask go=,u=rx
dd if=/dev/urandom of=$keyfile bs=1 count=64
)
# Recollect partition paths:
pnum2path()
{
echo $1$(case $1 in /dev/nvme*) echo p ;;
esac)$2
}
disk=/dev/nvme0n1
luks1dev=$(pnum2path $disk 1)
luks2dev=$(pnum2path $disk 5)
# Plant the keyfile as LUKS key in both containers:
cryptsetup luksAddKey $luks1dev $keyfile # type in passphrase
cryptsetup luksAddKey $luks2dev $keyfile # type in passphrase
Sitten upotetaan lisäykset /target-hakemiston alle paikalleen asennuksen aikana.
Upotuksen valmistelu:
# Recollect details to include in encryption enablers:
luks1name=LUKS_BOOT
luks2name=${$luks2dev##*/}_crypt
cryptopt="luks$(lsblk -dn -o rota $disk | sed -n 's/ *0/,discard/p')" # SSD?
# Define helper routine:
wait-write()
{
local d=${1%/*}
until [ -d $d ]; do sleep 1; done
(set -x; echo "$2" >> $1)
}
(Uudelleenohjauksen ">>" takia valitetavasti tiedoston nimi putoaa pois komennosta, jonka "set -x" näyttää.)
Upotus asennuksen aikana:
Seuraavat komennot voi kopioida ja liittää päätteeseen kokonaisena sarjana (tai kirjoittaa tiedostoon ja ajaa sen scriptinä). Komentosarjan ehtii vielä suorittaa heti kun on vastannut kaikkiin Ubiquityn kysymyksiin. Jos suoritus käynnistetään samaan aikaan kun Ubiquity avataan eri ikkunaan, niin koko sarja on jo valmis ennen kuin olet ehtinyt vastata kaikkiin kysymyksiin (omalla koneella, SSD-levyllä, suoritus alkoi suunnilleen siinä vaiheessa, kun olin syöttämässä nimeä käyttäjätunnukselle ja koneellle, ja oli ohi ennen kuin ehdin kirjoittaa salasanan toiseen kertaan).
# During installation, inject encryption enablers into /target directories:
umask go=r,u=rw
etc=/target/etc
wait-write $etc/crypttab "# Both /boot and rootfs are encrypted.
$luks1name UUID=$(cryptsetup luksUUID $luks1dev) $keyfile $cryptopt
$luks2name UUID=$(cryptsetup luksUUID $luks2dev) $keyfile $cryptopt"
(set -x; cp -ar $keydir $etc/) # from RAM to disk
wait-write $etc/default/grub.d/local.cfg "GRUB_ENABLE_CRYPTODISK=y"
wait-write $etc/initramfs-tools/initramfs.conf "UMASK=0077"
wait-write $etc/cryptsetup-initramfs/conf-hook "KEYFILE_PATTERN=\"$keypat\""
Asennuksen päättyessä voit heti antaa Ubiquitylle luvan käynnistää kone uudelleen.
PS.
Uudella koneellani joudun nyt valitsemaan, jatkanko yhden säiliön käytäntöä, jolloin sidon itseni LUKS1:een niin kauan kun Grub ei osaa käynnistää alkumuistia LUKS2-säiliöstä, vai yritänkö arvioida, mikä tila LUKS2-säiliön ulkopuolelta täytyy varata muutaman Ubuntun /boot-hakemistoille, salattuna tai ei.
Paitsi tilanvarauksen hallinta, yhden säiliön tapauksessa on kätevää sekin, että avaintiedostoa ei tarvitse edes luoda asennustikulta käynnistetyssä Ubuntussa. Voin kirjoittaa /etc/crypttab-tiedostoon sanan ”none” avaintiedoston sijaan, ja lisätä Grub-asetukset (kryptaus ja os-proberin salliminen). Muita lisäyksiä ei ole pakko tehdä vielä. Juodun kyllä syöttämään salalauseen kahteen kertaan kun ekan kerran kirjaudun juuri asennettuun Ubuntuun sisään, mutta sen jälkeen voin tehdä kaikki avaintiedostoon liittyvät jutut kaikessa rauhassa – ja rinnakkaisasennuksessa samaan säiliöön voin kopioida avaintiedoston toisesta asennuksesta väliaikaisen liitoksen kautta.