Two-factor LUKS met Ubuntu 10.10
Tuesday, October 19th, 2010De post van laatst over two-factor LUKS met Ubuntu blijkt ook prima te werken met Ubuntu 10.10 “Maverick Meerkat”.
De post van laatst over two-factor LUKS met Ubuntu blijkt ook prima te werken met Ubuntu 10.10 “Maverick Meerkat”.
Zojuist heb ik een nieuwe PGP- en SSH-sleutel in gebruik genomen. Ziehier de vingerafdruk van de nieuwe PGP-sleutel:
$ gpg --fingerprint 0xF21901EE pub 3072R/F21901EE 2010-07-29 [expires: 2015-07-28] Key fingerprint = D67C 1746 9547 95E8 9BC8 573E 8329 D25F F219 01EE uid Kornelis (Kees) Hendricus Franciscus Meijs <kees@kumina.nl> uid Kornelis (Kees) Hendricus Franciscus Meijs <post@keesmeijs.nl> uid Kornelis (Kees) Hendricus Franciscus Meijs <kees@bommelnetworks.nl> sub 3072R/0FB8D05C 2010-07-29 [expires: 2015-07-28] sub 3072R/B4F99451 2010-07-29 [expires: 2015-07-28]
En van de SSH-sleutel:
$ ssh-add -l 3072 8c:36:b2:e0:4f:9c:b3:aa:bf:3f:31:cc:24:19:ed:e7 cardno:00050000057D (RSA)
In Ubuntu 10.04 LTS “Lucid Lynx” wordt LUKS standaard prima ondersteund. Dit is een erg handige functionaliteit, zeker als je naar wat extra beveiliging op zoek bent. Maar wat als je nu naar een oplossing met two-factor op zoek bent?
We gebruiken op de zaak al een hele tijd OpenPGP-kaarten om gegevens van met name onze klanten te beveiligen. Het leek me wel wat om de onlangs beschikbaar gekomen USB-versie van de OpenPGP-kaart te gebruiken in combinatie met LUKS. Enerzijds erg practisch omdat je alleen een PIN-code nodig hebt om je systeem te starten en anderzijds érg veilig (zeker met een 2048- of 3072-bits sleutel).
Gemakshalve doe ik even de aanname dat je al een OpenPGP-kaart hebt (al dan niet een USB-versie) en weet hoe je met bijvoorbeeld GnuPG om moet gaan. Mooi, maar hoe gaat de rest?
Start je systeem op van een Ubuntu Live CD of Live DVD en kies voor Try Ubuntu without installing. Open als het systeem is opgestart een nieuwe Terminal en maak nieuwe partities op je vaste schijf (of SSD…) aan.
$ sudo cfdisk -z
Zelf heb ik een partitie van 250 MiB gemaakt voor /boot en de rest vrijgehouden om met LUKS te beveiligen:
$ sudo fdisk -l Disk /dev/sda: 251.0 GB, 250999144448 bytes 64 heads, 32 sectors/track, 239371 cylinders Units = cylinders of 2048 * 512 = 1048576 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00092b99 Device Boot Start End Blocks Id System /dev/sda1 * 1 238 243696 83 Linux /dev/sda2 239 239371 244872192 da Non-FS data
Installeer vervolgens de benodigde pakketten voor LUKS en LVM:
$ sudo apt-get --force-yes --yes install cryptsetup lvm2 Reading package lists... Done Building dependency tree Reading state information... Done cryptsetup is already the newest version. The following extra packages will be installed: libdevmapper-event1.02.1 watershed The following NEW packages will be installed: libdevmapper-event1.02.1 lvm2 watershed 0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. Need to get 0B/463kB of archives. After this operation, 1,266kB of additional disk space will be used. Selecting previously deselected package libdevmapper-event1.02.1. (Reading database ... 165628 files and directories currently installed.) Unpacking libdevmapper-event1.02.1 (from .../libdevmapper-event1.02.1_1.02.39-1ubuntu4_amd64.deb) ... Selecting previously deselected package watershed. Unpacking watershed (from .../watershed_5_amd64.deb) ... Selecting previously deselected package lvm2. Unpacking lvm2 (from .../lvm2_2.02.54-1ubuntu4_amd64.deb) ... Processing triggers for man-db ... Setting up libdevmapper-event1.02.1 (2:1.02.39-1ubuntu4) ... Setting up watershed (5) ... update-initramfs is disabled since running on read-only media Setting up lvm2 (2.02.54-1ubuntu4) ... update-initramfs is disabled since running on read-only media Processing triggers for libc-bin ... ldconfig deferred processing now taking place
Laad nu de benodigde modules in voor LUKS, AES en XTS:
$ sudo modprobe dm-crypt aes xts
Genereer een sleutel om het LUKS-volume straks mee te beveiligen:
$ dd if=/dev/urandom | tr -d '\n' | dd bs=1 count=64 of=/dev/shm/luks-key.txt 64+0 records in 64+0 records out 64 bytes (64 B) copied, 0.000253039 s, 253 kB/s
Maak een nieuw LUKS-volume:
$ sudo cryptsetup -c aes-xts-plain -s 512 luksFormat /dev/sda2 /dev/shm/luks-key.txt WARNING! ======== This will overwrite data on /dev/sda2 irrevocably. Are you sure? (Type uppercase yes): YES
Start vervolgens het LUKS-volume:
$ sudo cryptsetup luksOpen -d /dev/shm/luks-key.txt /dev/sda2 crypto Key slot 0 unlocked.
De flexibiliteit van LVM is wenselijk. Dit kan bijvoorbeeld zo:
$ sudo pvcreate /dev/mapper/crypto Physical volume "/dev/mapper/crypto" successfully created $ sudo vgcreate vg /dev/mapper/crypto Volume group "vg" successfully created $ sudo lvcreate -L 4G -n vg/swap Logical volume "swap" created $ sudo lvcreate -L 40G -n vg/root Logical volume "root" created $ sudo lvs LV VG Attr LSize Origin Snap% Move Log Copy% Convert root vg -wi-a- 40.00g swap vg -wi-a- 4.00g
De installatieprogrammatuur raakt enigszins in de war door bovengenoemde voorbeeld, dus is het noodzakelijk om alvast te formatteren:
$ sudo mkswap -f /dev/vg/swap Setting up swapspace version 1, size = 4194300 KiB no label, UUID=ac1c5001-428b-49d3-9c1e-ce213a4b8b9e $ sudo mkfs.ext3 /dev/vg/root mke2fs 1.41.11 (14-Mar-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 2621440 inodes, 10485760 blocks 524288 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=4294967296 320 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 23 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
Start nu het installatieprogramma op:
Het installatieproces verloopt zoals je gewend bent:
Kies een taal, en vervolgens je tijdzone:
Kies de juiste instellingen voor je toetsenbord:
Kies vervolgens voor handmatig partitioneren:
Let vervolgens goed op dat je de juiste logische volumes en /boot gebruikt:
Geef je persoonlijke gegevens in:
Klik nog even op Advanced… om te controleren of alles goed gaat:
LET OP! Als de installatie is voltooid, sluit het scherm dan niet af:
Open een nieuwe Terminal en voer het volgende uit:
$ sudo mount -o bind /proc /target/proc $ sudo mount -o bind /dev /target/dev $ sudo mount -o bind /dev/pts /target/dev/pts $ sudo mount -o bind /sys /target/sys
Parkeer vervolgens je pubring.gpg en secring.gpg ergens en codeer /dev/shm/luks-key.txt. Het resultaat /dev/shm/luks-key.txt.gpg hebben zometeen nog nodig.
Haal decrypt_luks.sh en gpg_luks op en parkeer ook deze bestanden even. Zet vervolgens de bestanden op de juiste plek neer:
$ sudo mkdir /target/etc/gpg_luks $ sudo cp decrypt_luks.sh /target/usr/local/sbin $ sudo cp gpg_luks /target/etc/initramfs-tools/hooks $ sudo cp pubring.gpg /target/etc/gpg_luks $ sudo cp secring.gpg /target/etc/gpg_luks $ sudo cp /dev/shm/luks-key.txt.gpg /target/etc/gpg_luks
Zet ook de permissies goed:
$ sudo chmod 700 /target/etc/gpg_luks $ sudo chmod 700 /target/usr/local/sbin/decrypt_luks.sh $ sudo chmod 755 /target/etc/initramfs-tools/hooks/gpg_luks $ sudo chmod 600 /target/etc/gpg_luks/pubring.gpg $ sudo chmod 600 /target/etc/gpg_luks/secring.gpg $ sudo chmod 600 /target/etc/gpg_luks/luks-key.txt.gpg
En maak een crypttab zoals bijvoorbeeld:
$ cat /target/etc/crypttab # <target name> <source device> <key file> <options> crypto /dev/sda2 none luks,keyscript=/usr/local/sbin/decrypt_luks.sh
Op het nieuwe systeem ontbreken helaas een paar benodigde pakketten. Installeer deze als volgt:
$ sudo chroot /target su -
# apt-get install --force-yes --yes cryptsetup lvm2 Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: libdevmapper-event1.02.1 watershed The following NEW packages will be installed: cryptsetup libdevmapper-event1.02.1 lvm2 watershed 0 upgraded, 4 newly installed, 0 to remove and 242 not upgraded. Need to get 606kB of archives. After this operation, 1,831kB of additional disk space will be used. Get:1 http://nl.archive.ubuntu.com/ubuntu/ lucid/main cryptsetup 2:1.1.0~rc2-1ubuntu13 [143kB] Get:2 http://nl.archive.ubuntu.com/ubuntu/ lucid/main libdevmapper-event1.02.1 2:1.02.39-1ubuntu4 [28.5kB] Get:3 http://nl.archive.ubuntu.com/ubuntu/ lucid/main watershed 5 [11.5kB] Get:4 http://nl.archive.ubuntu.com/ubuntu/ lucid/main lvm2 2.02.54-1ubuntu4 [423kB] Fetched 606kB in 1s (591kB/s) Selecting previously deselected package cryptsetup. (Reading database ... 124603 files and directories currently installed.) Unpacking cryptsetup (from .../cryptsetup_2%3a1.1.0~rc2-1ubuntu13_amd64.deb) ... Selecting previously deselected package libdevmapper-event1.02.1. Unpacking libdevmapper-event1.02.1 (from .../libdevmapper-event1.02.1_2%3a1.02.39-1ubuntu4_amd64.deb) ... Selecting previously deselected package watershed. Unpacking watershed (from .../archives/watershed_5_amd64.deb) ... Selecting previously deselected package lvm2. Unpacking lvm2 (from .../lvm2_2.02.54-1ubuntu4_amd64.deb) ... Processing triggers for ureadahead ... Processing triggers for man-db ... Setting up cryptsetup (2:1.1.0~rc2-1ubuntu13) ... update-initramfs: deferring update (trigger activated) Setting up libdevmapper-event1.02.1 (2:1.02.39-1ubuntu4) ... Setting up watershed (5) ... update-initramfs: deferring update (trigger activated) Setting up lvm2 (2.02.54-1ubuntu4) ... update-initramfs: deferring update (trigger activated) Processing triggers for initramfs-tools ... update-initramfs: Generating /boot/initrd.img-2.6.32-21-generic Processing triggers for libc-bin ... ldconfig deferred processing now taking place
Om zeker te weten dat het systeem straks goed op kan starten:
# update-initramfs -c -k all update-initramfs: Generating /boot/initrd.img-2.6.32-21-generic
# update-grub2 Generating grub.cfg ... Found linux image: /boot/vmlinuz-2.6.32-21-generic Found initrd image: /boot/initrd.img-2.6.32-21-generic Found memtest86+ image: /memtest86+.bin done
Je kunt de Terminal nu sluiten en tot slot alsnog op Restart Now klikken:
Bij het opstarten van je systeem zal nu om de PIN-code van je OpenPGP-kaart worden gevraagd en heb je natuurlijk ook je OpenPGP-kaart zelf nodig. Echte two-factor beveiliging!
De oplettende lezer zal zich misschien afvragen of het wel veilig is om je secring.gpg in je /boot te verstoppen. Dit is natuurlijk geen probleem, aangezien hier alleen verwijzingen naar de OpenPGP-kaart in te vinden zijn.
Ter referentie: http://lfde.org/wiki/index.php/Ubuntu_Lucid_Lynx_10.04_Full_Disk_Encryption_with_USB_Key_Authentication
Onlangs heb ik een nieuwe OpenPGP smartcard aangeschaft, eentje met ondersteuning voor 2048 bits sleutels, wat veiliger dus. Gelieve mijn oude sleutel dan ook niet meer te gebruiken!
$ gpg --fingerprint D839CC0A
pub 2048R/D839CC0A 2009-10-30 [expires: 2011-10-30]
Key fingerprint = B6F2 D09A BFC9 522B 40F5 5E87 32A9 BB60 D839 CC0A
uid Kornelis (Kees) Hendricus Franciscus Meijs <kees@kumina.nl>
uid Kornelis (Kees) Hendricus Franciscus Meijs <post@keesmeijs.nl>
uid Kornelis (Kees) Hendricus Franciscus Meijs <kees@bommelnetworks.nl>
sub 2048R/FCFB107F 2009-10-30 [expires: 2011-10-30]
sub 2048R/B6F4749F 2009-10-30 [expires: 2011-10-30]
Om trust paths intact te houden, heb ik de nieuwe sleutel ondertekend met mijn oude sleutel.
Wellicht is het wat eleganter om alleen use-ssh-agent uit /etc/X11/Xsession.options te verwijderen. Helaas blijft het nog steeds noodzakelijk om /etc/X11/Xsession.d/90gpg-agent aan te passen, dus heb ik wat commentaar toegevoegd bij een reeds bestaande Debian bug.
Mocht je onder Ubuntu (en vermoedelijk ook onder Debian) willen proberen om je (Free/Open)PGP/GnuPG sleutel te gebruiken voor SSH authenticatie, dan kom je waarschijnlijk bedrogen uit. De GNOME keyring services library (eigenlijk Seahorse) werkt blijkbaar niet goed in combinatie met gpg-agent(1) én ssh-agent(1).
De oplossing is doodeenvoudig, maar niet voor de hand liggend: zorg ervoor dat /etc/X11/Xsession.d/90×11-common_ssh-agent leeg is (zodat ssh-agent niet gestart wordt) of pas het script dusdanig aan dat gecontroleerd wordt of bijv. gpg-agent niet al draait. Verder is aanpassen van /etc/X11/Xsession.d/90gpg-agent noodzakelijk, dusdanig dat er gebruik gemaakt wordt van de optie –enable-ssh-support.