Cifrado de disco completo de Ubuntu con cifrado / arranque

15

Estoy tratando de configurar un disco cifrado completo con una /bootpartición separada y tengo algunos problemas.

Escribiré el procedimiento que he seguido en una sesión de Ubuntu 15.04 Live DVD.

  • Llenar el disco con 'datos aleatorios'

    sudo dd if=/dev/urandom of=/dev/sda1 bs=4096   #ok
    
  • Crear las particiones (usando gparted)

    1. Crear tabla de particiones - gpt 2.
      • / dev / sda1 ext2 1.5GB #boot
      • / dev / sda2 linux-swap 4GB #swap
      • / dev / sda3 ext4 15 GB # raíz
      • / dev / sda4 ext4 FREESPACE #home
  • Cifrar volúmenes

    cryptsetup luksFormat --cipher twofish-xts-plain64 --key-size 512
                          --hash sha512 --iter-time 3000 /dev/sda1
    cryptsetup luksFormat --cipher twofish-xts-plain64 --key-size 512
                          --hash sha512 --iter-time 3000 /dev/sda2
    cryptsetup luksFormat --cipher twofish-xts-plain64 --key-size 512
                          --hash sha512 --iter-time 3000 /dev/sda3
    cryptsetup luksFormat --cipher twofish-xts-plain64 --key-size 512
                          --hash sha512 --iter-time 5000 /dev/sda4
    
  • Abrir criptovolumen

    cryptsetup luksOpen /dev/sda1 boot
    cryptsetup luksOpen /dev/sda2 swap
    cryptsetup luksOpen /dev/sda3 root
    cryptsetup luksOpen /dev/sda4 home
    
  • Formato

    mkfs.ext2 /dev/mapper/boot
    mkswap /dev/mapper/swap
    mkfs.ext4 /dev/mapper/root
    mkfs.ext2 /dev/mapper/home
    
  • Instalar (usando Ubiquity)

    • cargador de arranque en / dev / sda
    • / dev / sda1 - usar como ext2 - punto de montaje / arranque
    • / dev / sda2 - usar como ext2 - punto de montaje / arranque
    • / dev / sda3 - usar como ext2 - punto de montaje / arranque
    • / dev / sda4 - usar como ext2 - punto de montaje / arranque

    Al final, el instalador advierte que la instalación de grub falló (porque el volumen de arranque está encriptado), así que elija 'continuar sin cargador de arranque'.

  • Volumen de arranque limpio

    mkfs.ext2 /dev/mapper/boot
    
  • Volumen de montaje

    mkdir /mnt/root
    mount /dev/mapper/root /mnt/root
    mount /dev/mapper/boot /mnt/root/boot
    
  • Actualizar fstab y crypttab

    sudo blkid
    
    [/dev/sr0: UUID="2015-10-21-16-17-40-00" LABEL="Ubuntu 15.10 amd64"
               TYPE="iso9660" PTUUID="429817b4" PTTYPE="dos"
    /dev/sda1: UUID="...#1" TYPE="crypto_LUKS" PARTUUID="..."
    /dev/sda2: UUID="...#2" TYPE="crypto_LUKS" PARTUUID="..."
    /dev/sda3: UUID="...#3" TYPE="crypto_LUKS" PARTUUID="..."
    /dev/sda4: UUID="...#4" TYPE="crypto_LUKS" PARTUUID="..."
    /dev/mapper/boot: UUID="..." TYPE="ext2"
    /dev/mapper/swap: UUID="..." TYPE="swap"
    /dev/mapper/root: UUID="..." TYPE="ext4"
    /dev/mapper/home: UUID="..." TYPE="ext4"]
    
  • fstab

    #<file system>   <mount point>   <type>   <options>           <dump>   <pass>
    UUID=#1          /boot           ext2     defaults            0        2
    UUID=#2          none            swap     sw                  0        0
    UUID=#3          /               ext4     errors=remount-ro   0        1
    UUID=#4          /home           ext4     defaults            0        2
    
  • criptab

    boot   UUID=#1   luks,cipher=twofish-xts-plain64,size=512,
                     hash=whirlpool, time=3000
    swap   UUID=#2   luks,swap,cipher=twofish-xts-plain64,size=512,
                     hash=whirlpool,time=3000
    root   UUID=#3   luks,cipher=twofish-xts-plain64,size=512,
                     hash=whirlpool,time=3000
    home   UUID=#4    luks,cipher=twofish-xts-plain64,size=512,
                      hash=whirlpool,time=5000
    
  • Actualizar imagen initramfs

    cd /mnt
    sudo chroot root
    mount -t proc proc /proc
    mount -t sysfs sys /sys
    mount -t devpts devpts /dev/pts
    update-initramfs -u                      #ok
    
  • Configurar bootloader ( /etc/default/grub)

    GRUB_ENABLE_CRYPTODISK=y
    GRUB_PRELOAD_MODULES="luks cryptodisk"
    GRUB_CMDLINE_LINUX="cryptdevice=UUID#3:root root=/dev/mapper/root resume=/dev/mapper/swap 
                        crypto=whirlpool:twofish-xts-plain64:512:0:"
    
  • crear archivo de configuración

    $ grub-mkconfig -o /boot/grub/grub.cfg
    [/usr/sbin/grub-probe: error: failed to get canonical path of `/dev/mapper/root'.]
    
  • intenta afuera

    $ exit
    $ grub-mkconfig -o /boot/grub/grub.cfg
    [/usr/sbin/grub-probe: error: failed to get canonical path of `/cow'.]
    

¿Cometí algún error antes de esto? ¿Cómo puedo continuar configurando e instalando grub correctamente?

Nicholas Roveda
fuente
Me siento mal porque después de hacer que muevas tu Q al sitio "correcto", nadie ha ayudado. No he hecho este nivel de trabajo en Ubuntu. Pero busqué en google grubtu + título. Supongo que encontró su procedimiento para encriptar en pavelkogan.com/2014/05/23/luks-full-disk-encryption (que es la primera búsqueda de Google sobre este tema). si no, tal vez eso ayude. ¡Buena pregunta! ¡y buena suerte!
shellter
Un par de cosas: 1. Menciona /bootcomo el punto de montaje para todo. Espero que sea un error tipográfico. 2. No /devmontaste durante el chrooting, pero montaste devpts. Oo
muru
Otro error es que parece estar usando los mismos UUID en crypttab y fstab. fstab debería usar los UUID de / dev / mapper / drives.
Aleksandr Dubinsky
1
consulte esta guía por un miembro de la comunidad de Ubuntu. Lo he usado y me funciona muy bien.
kapad

Respuestas:

13

Cometiste algunos errores, pero el problema principal está en la ubicuidad y la suciedad. Básicamente, cuando configuras /una partición cifrada y no creas una partición separada /boot, grub muestra un mensaje de error como:

Sé que /bootestá encriptado. Es necesario establecer GRUB_ENABLE_CRYPTODISK=yen /etc/default/grub. No lo haré por ti, así que voy a fallar y tu instalación se detendrá.

Una visión general del proceso.

  • Usamos el modo EFI.
  • Instalamos en una /bootpartición no encriptada y un btrfs encriptado /usando el instalador estándar.
  • Una vez que finaliza el instalador, realizamos chrootalgunos cambios de configuración importantes y reinstalamos grub en la partición del sistema EFI y volvemos a crear initrd.

Los pasos detallados

  • Arranque desde el disco de instalación de Ubuntu 16.04 (probado con Xubuntu).
  • Conéctese a Internet y ejecute sudo apt update && sudo apt upgradepara actualizar los componentes del instalador
  • Use fdisk, gpartedu otra herramienta para crear 3 particiones:
    • Una tabla de particiones GPT
    • Una partición de 200 MB que usaremos para la partición del sistema EFI
    • Una partición de varios gigabytes que eventualmente utilizaremos como nuestra partición de intercambio encriptada, pero que funcionará como nuestra encriptación temporal /boot
    • Una partición encriptada que usa el resto del espacio
  • Prepare la partición encriptada

    sudo cryptsetup luksFormat /dev/sda3
    sudo cryptsetup luksOpen --allow-discards /dev/sda3 sda3_crypt
    sudo mkfs.btrfs /dev/mapper/sda3_crypt
    
  • Instalar Ubuntu

    • Elija "Algo más" cuando se le pregunte sobre el tipo de instalación.
    • Configurar /dev/sda1comoEFI System Partition
    • Configure /dev/sda2como ext2, formateado, con punto de montaje de/boot
    • Configurar /dev/mapper/sda3_cryptcomo btrfs con punto de montaje de/
    • Continuar con la instalación.
    • Después de que termine, elija permanecer en el sistema en vivo (sin reiniciar).
  • Copie el contenido de /booty haga unchroot

    sudo mount -o subvol=@ /dev/mapper/sda3_crypt /target
    sudo mount /dev/sda2 /mnt
    # (Watch those trailing slashes! rsync is very sensitive to them.)
    sudo rsync -aXAH /mnt/ /target/boot/
    sudo mount /dev/sda1 /target/boot/efi
    sudo mount --bind /dev /target/dev
    sudo mount --bind /proc /target/proc
    sudo mount --bind /sys /target/sys
    sudo chroot /target
    
  • (Todo está sucediendo ahora chrootdentro de su nuevo sistema).

  • Agregar línea a /etc/default/grub

    GRUB_ENABLE_CRYPTODISK=y
    
  • Añadir línea a /etc/crypttab. Primero deberá ejecutar sudo blkidpara encontrar el UUID de /dev/sda3(NOT /dev/mapper/sda3_crypt).

    sda3_crypt UUID=<UUID of /dev/sda3> none luks,discard
    
  • Edite /etc/fstaby elimine la línea para /boot. Las otras entradas son correctas.

  • Instale grub en la partición del sistema EFI, genere un nuevo grub.cfg y prepare initrd.

    sudo grub-install --target=x86_64-efi --efi-directory /boot/efi --bootloader=ubuntu --boot-directory=/boot/efi/EFI/ubuntu --recheck
    sudo grub-mkconfig -o /boot/efi/EFI/ubuntu/grub/grub.cfg
    sudo update-initramfs -c -k all
    
  • Verificación doble opcional: Verificación doble que /boot/efi/EFI/ubuntu/grub/grub.cfgcontiene líneas que incluyen insmod luks, cryptomount -u <UUID>las entradas de arranque correctas, etc. Y verifique que su initrd contenga el cryptsetupbinario. Si faltan estas cosas, es porque grub-mkconfig y / o update-initrd no pudieron entender cómo los volúmenes que ha montado o especificado en fstab se relacionan con el volumen cifrado en crypttab. (Hay una gran cantidad de configuraciones automáticas mágicas que hacen). Esto puede suceder si diverges de esta guía, por ejemplo, usando ZFS o intentando particionar sda3_crypt.

  • (Si usa ZFS en lugar de btrfs) grub-mkconfig y update-initrd no reconocerán ZFS. La solución alternativa implica (durante chroot, antes de grub-mkconfig / update-initrd) editar /usr/sbin/grub-mkconfigpara agregar || truea la línea 139 (que comienza con GRUB_DEVICE=), agregar GRUB_DEVICE="/dev/mapper/sda3_crypt"a /etc/default/grub, crear un archivo /usr/share/initramfs-tools/conf-hooks.d/forcecryptsetupcon contenido export CRYPTSETUP=yy un archivo /etc/initramfs-tools/conf.d/cryptrootcon contenido target=sda3_crypt,source=UUID=<UUID of sda3>,key=none,discard. Todo esto se suma a los pasos que seguiría si no estuviera encriptando la partición ZFS (como instalar zfs userspace utils tanto en el sistema en vivo como durante chroot y eliminar la línea que se monta /en fstab).

  • Salga de chroot y reinicie en su nuevo sistema

    exit
    sudo umount /target/boot/efi
    sudo umount /target/dev
    sudo umount /target/proc
    sudo umount /target/sys
    sudo umount /target
    sudo reboot
    
  • Deberías ver a grub pidiendo tu contraseña. Entonces obtendrás el menú de arranque. Después de elegir Ubuntu, se le pedirá su contraseña nuevamente. Entonces estarás en tu sistema. Lea más sobre cómo Ubuntu usa BTRFS .

  • TODO : Crear intercambio cifrado (pista: implica editar crypttab, fstab y volver a ejecutar update-initrd).

  • TODO : guarda tu contraseña para que solo necesites ingresarla una vez en grub. Esto se detalla aquí .

Actualizaciones

  • Cada vez que instale un nuevo núcleo, debe ejecutar el grub-mkconfigcomando personalizado .
  • Cada vez que actualice grub, debe ejecutar el grub-installcomando personalizado .

Otras notas

  • Es tentador crear un solo volumen cifrado y particionarlo para crear la partición de intercambio (y posiblemente otros), pero esto no funciona. Tanto grub-mkconfig como update-initrd se comportarán mal. Sin embargo, no he probado LVM.
  • Puede ser tentador usar un archivo de intercambio encima de btrfs , pero probablemente sea una mala idea debido al rendimiento.
Aleksandr Dubinsky
fuente
Solo aclarando lo que creo que ya sabes (según tu comentario): fstaby en crypttabrealidad no son correctos en la pregunta. crypttabdebe apuntar a la uuidde los /dev/sdxYdispositivos en bruto ; fstabdebe apuntar a los dispositivos de cripta abiertos en /dev/mapper/label.
Hendy
Gracias por hacer esta respuesta, me ayudó a configurar esto.
x13
En realidad, no considero ninguno de estos FDE verdaderos, ya que hay información de partición filtrada. El verdadero FDE hace que todos los sectores sean datos cifrados (con la excepción del encabezado LUKS al principio, aunque técnicamente no es necesario mediante el uso de un encabezado separado). Hago FDE usando LVM dentro de LUKS, por lo que definitivamente funciona y puede ser mejor si necesita cambiar el tamaño de la partición / volumen más adelante. Aquí hay una antigua publicación de blog sobre cómo hacer esto en 12.04, pero debería funcionar en versiones posteriores.
grosero
Además, usar un archivo de intercambio en BTRFS es definitivamente una mala idea ...
crass
En su grub-installinstrucción, tiene un --bootloader=ubuntuparámetro. Parece que no puedo encontrar ese argumento en los manuales de Ubuntu o GNU . ¿Podría aclarar qué hace o dónde está documentado?
Samuel Harmer el