Instalar Parabola GNU/Linux-libre

Índice

Guía de instalación de Parabola GNU/Linux-libre, por Felix Freeman. Más contenido en hacktivista.com.

Es importante considerar que Parabola es menos estable que Arch debido a que tiene menos usuarios. Si eres un usuario novel no te recomiendo instalarlo, si eres un usuario más avanzado por favor hazlo e involúcrate con su desarrollo y progreso!

Inicialización

  • Conectar cable de red
  • Encender
  • Presionar o (other boot options)
  • Presionar Ctrl+b
  • Ingresar dhcp
  • Ingresar chain https://boot.netboot.xyz
  • Cuando aparezca el menú, ir a Linux Network Installs (64-bit) -> Arch Linux -> la última revisión.

Esperar a que bootee, y opcionalmente ingresar:

ls /usr/share/kbd/keymaps/**/*.map.gz # listado de distribuciones de teclado
loadkeys us-acentos # seleccionar distribución de teclado

ls /usr/share/kbd/consolefonts/ # listado de fuentes
setfont latarcyrheb-sun32 && reset # seleccionar fuente

timedatectl set-ntp true # actualizar hora

Preparación en caso de encriptación

Si se desea encriptación completa del dispositivo de almacenamiento interno, opcionalmente, pero muy recomendado es borrar la información previamente contenida en el dispositivo llenándola con datos aleatorios. Tomará un tiempo, esperar hasta recibir el error "no space left on device".

cryptsetup open --type plain -d /dev/urandom /dev/sdX to_wipe
dd if=/dev/zero of=/dev/mapper/to_wipe status=progress # opcionalmente bs=1M
cryptsetup close to_wipe # luego de "no space left on device"

Particionado

Hackware-boot por defecto solo intenta desencriptar la primera partición de cada dispositivo de almacenamiento interno, de modo que la partición de booteo (con GRUB) debe ser la primera en la tabla de particiones. Podemos usar una tabla de particiones MBR o GPT, en el caso de GPT querrás crear una partición bios_grub (parted /dev/sdX set Y bios_grub on) de 1M para almacenar datos de arranque de GRUB.

Si se desea una encriptación completa del almacenamiento interno, debido a que GRUB no tiene soporte apropiado para LUKS2, lo mejor es crear una partición /boot separada para encriptarla con LUKS1.

500MB es un tamaño muy seguro para /boot en caso de la instalación de uno o dos sistemas operativos, pero si se desea bootear más SO se recomienda aumentar ese tamaño.

Si no se encriptará el almacenamiento, y se desea instalar OpenBSD (u otro sistema unix-like que use swap) además de GNU/Linux, se recomienda crear una partición swap separada. En caso de encriptación es mejor que cada cual tenga su swap por seguridad.

Para particionar el almacenamiento puedes usar fdisk /dev/sdX, donde sdX es el medio de almacenamiento a particionar, podemos reconocerlo ejecutando lsblk.

A continuación asumiremos encriptación, pero si no se desea encriptación simplemente debemos omitir los comandos cryptsetup y usar las particiones directamente en los otros comandos.

/boot

Creamos una unidad con encriptación LUKS1 para /boot.

cryptsetup -v --type luks1 luksFormat /dev/sdX1
cryptsetup open /dev/sdX1 cryptboot
mkfs.ext2 /dev/mapper/cryptboot

/

Creamos una unidad con encriptación LUKS2 para /.

Por seguridad es altamente recomendable escoger una contraseña distinta. Según la instalación sugerida en este tutorial solo deberemos ingresar la de /boot, pero no debes perder la de /, pues podría servirte para recuperar el acceso a tus archivos en caso de fallas o compromiso a tu sistema.

cryptsetup -v --type luks2 luksFormat /dev/sdXY
cryptsetup open /dev/sdXY cryptroot

En caso de desear la instalación de múltiples distros ahora o posiblemente en el futuro (y/o facilitar la restauración del sistema con snapshots), recomiendo BTRFS. LVM también es una buena opción dependiendo de la necesidad.

De otra manera, lo más sencillo es usar una partición ext4.

ext4

mkfs.ext4 /dev/mapper/cryptroot

Monta tu sistema de archivos para Parabola en /mnt.

mount /dev/mapper/cryptroot /mnt
mount --mkdir /dev/mapper/cryptboot /mnt/boot

BTRFS

mkfs.btrfs /dev/mapper/cryptroot

Para permitir la instalación de varios sistemas ahora o posibilemente a futuro lo mejor es crear un subvolumen base por cada sistema operativo y luego las particiones de cada cual.

Primero que nada creamos un subvolumen para swap que compartiremos entre todas las distros que instalemos. Necesita no estar sujeto a Copy-on-write (COW) para funcionar apropiadamente. Es un buen lugar para guardar otras cosas que deben estar seguras y disponibles para todos los sistemas, a posterioridad lo montaremos en /var/safe.

btrfs subvolume create /mnt/safe
chattr +C /mnt/safe

Ya que BTRFS es bastante flexible y no limita el tamaño de los volumenes (ya que no son block devices, sino árboles de archivo POSIX) recomiendo crear por lo menos 2 volumenes para cada sistema operativo:

  • @ para la raíz /
  • @home para /home
mount /dev/mapper/cryptroot /mnt
mkdir /mnt/parabola
for subvolume in @ @home; do
        btrfs subvolume create /mnt/parabola/$subvolume
done

Existen distintas formas de estructurar un esquema BTRFS, acá usamos una estructrura "flat" para @ y @home, y "nested" para @var en caso de snapshots.

Si se desea realizar snapshots para facilitar la restauración del sistema, Snapper con snap-pac y snap-pac-grub son grandes herramientas.

En tal caso es buena idea crear además de un subvolumen para snapshots en /var/snapshots, subvolúmenes para espacios a los que no se desea sacar snapshots, como el caché de pacman en /var/cache/pacman, /var/tmp, /var/log y /var/spool.

btrfs subvolume create /mnt/parabola/@var
mkdir /mnt/parabola/@var/cache
for subvolume in snapshots cache/pacman tmp spool log; do
        btrfs subvolume create /mnt/parabola/@var/$subvolume
done

Ahora desmontamos con umount /mnt.

Monta tu sistema de archivos para Parabola en /mnt. Conforme al esquema presentado antes sería asi:

for subvolume in @ @home @var; do
        mount /dev/mapper/cryptroot --mkdir -o subvol=parabola/$subvolume /mnt/${subvolume#@}
done
mount /dev/mapper/cryptroot --mkdir -o subvol=safe /mnt/var/safe
mount --mkdir /dev/mapper/cryptboot /mnt/boot

LVM

Pendiente.

Migrando instalador a Parabola

Basado en https://wiki.parabola.nu/Migration_from_Arch

En /etc/pacman.conf setear RemoteFileSigLevel = Never.

Instalar keyring y mirrorlist de Parabola:

pacman -U https://www.parabola.nu/packages/core/i686/archlinux32-keyring-transition/download
pacman -U https://www.parabola.nu/packages/libre/x86_64/parabola-keyring/download
pacman -U https://www.parabola.nu/packages/libre/x86_64/pacman-mirrorlist/download

En /etc/pacman.conf, devolver RemoteFileSigLevel a su estado original (comentado o seteado RemoteFileSigLevel = Required DatabaseOptional).

Añadir el repo [libre] en /etc/pacman.conf. El orden es importante: [libre] debe estar sobre todos los repos de Arch (core|extra|community).

...
[libre]
Include = /etc/pacman.d/mirrorlist
...
#[testing]
#Include = /etc/pacman.d/mirrorlist
...

Renombrar mirrorlist.pacnew como mirrorlist:

cp -vr /etc/pacman.d/mirrorlist.pacnew /etc/pacman.d/mirrorlist

Actualiza la base de datos:

pacman -Syy

Actualiza el keyring. Paciencia, esto tomará un tiempo (aprox 1:30 hrs, sigue leyendo para ver una alternativa).

pacman-key --refresh-keys

Alternativamente puedes importar las llaves con pacman-key --import directory-with-pubring.gpg. Previamente necesitas haber creado un backup con mkdir backup-dir && pacman-key --export backup-dir/pubring.gpg (o alguien de confianza te lo tiene que haber pasado).

Instala el pacman de Parabola y your-freedom. Acepta todos los reemplazos.

pacman -S pacman your-freedom

Swap

Por flexibilidad usaremos un archivo swap en lugar de una partición. Usaremos una Swap de 4GB (1MB*4000), dependiendo de su uso y las características de tu equipo podrías necesitar más o menos.

mkdir -p /mnt/var/safe
dd if=/dev/zero of=/mnt/var/safe/swapfile bs=1MB count=4000 status=progress
chmod 600 /mnt/var/safe/swapfile
mkswap -U clear /mnt/var/safe/swapfile
swapon /mnt/var/safe/swapfile

Instalación

Paquetes básicos

Deberás instalar los paquetes básicos para el funcionamiento del sitema: base, linux, grub y dhclient.

  • Si encriptaste tu almacenamiento interno además necesitarás cryptsetup.
  • Si usas BTRFS también necesarás instalar btrfs-progs.
  • Si usas LVM también necesarás instalar lvm2.
  • Adicionalmente podrías desear instalar base-devel para compilar cosas, iwd para manejar tu wi-fi, man-db man-pages texinfo para obtener ayuda en tu consola, bash-completion para autocompletación en consola, posix-user-portability para herramientas básicas POSIX y vim y/o emacs como editores.
pacstrap /mnt base linux grub dhclient (..otros..)

Fstab

Genera un fstab:

genfstab -U /mnt > /mnt/etc/fstab

Chroot

Posiciónate sobre tu sistema recién instalado en una jaula chroot para comenzar a trabajar desde el:

arch-chroot /mnt

Zona horaria

Selecciona tu zona horaria:

ln -sf /usr/share/zoneinfo/America/Santiago /etc/localtime
hwclock --systohc

Localización

Para seleccionar tu localización:

  1. Descomenta tu(s) locale(s) en /etc/locale.gen, por ejemplo en_US.UTF-8 UTF-8 y es_CL.UTF-8 UTF-8.
  2. Ingresa la variable LANG acorde a tu locale en /etc/locale.conf, por ejemplo LANG=es_CL.UTF-8.
  3. Corre locale-gen.

Setea tu tu keyboard layout en /etc/vconsole.conf:

KEYMAP=us-acentos

Hostname

Ingresa tu hostname:

echo 'parabola' > /etc/hostname

Repos adicionales

Opcionalmente habilita los repos adicionales del proyecto Parabola en /etc/pacman.conf.

Recomiendo solo habilitar [nonprism] y [pcr] para un sistema relativamente estable. Usar [nonsystemd] requiere más paciencia y capacidades técnicas que la versión que usa systemd, y requiere pasos adicionales o distintos que no están cubiertos en este tutorial.

Si habilitas [nonprism] instala your-privacy:

pacman -Sy your-privacy

Montaje automático de /boot

Para montar automáticamente /boot al incio:

dd bs=1 count=512 if=/dev/random of=/var/safe/cryptboot.keyfile iflag=fullblock
chmod 600 /var/safe/cryptboot.keyfile
cryptsetup -v luksAddKey /dev/sdX1 /var/safe/cryptboot.keyfile

Y añade una línea con cryptboot UUID=<cryptboot-uuid> /var/safe/cryptboot.keyfile a /etc/crypttab, donde <cryptboot-uuid> es el UUID de /dev/sdX1, puedes averiguarlo con blkid /dev/sdX1.

Mkinitcpio

Dependiendo de nuestra instalación, es probable que necesitemos incluir algunos hooks en /etc/mkinitcpio.conf.

  • Si usas encriptación o LVM verifica que esté (o agrega) udev después de base.
  • Si usas encriptación necesitarás agregar los hook encrypt después de block y keymap después de autodetect (verifica o agrega también keyboard).
  • Si usas LVM necesitarás agregar el hook lvm2, después de block.
  • Agrega resume antes de fsck para soportar la hibernación del sistema.

Ingresar solo una contraseña

En caso de encriptación completa del almacenamiento interno, debido a que tenemos 2 particiones encriptadas, usualmente tendríamos que ingresar 2 contraseñas para poder bootear nuestro sistema. Podemos conseguir que solo nos solicite la contraseña de /boot si dejamos una llave para el acceso a "cryptroot" en initramfs.

Crea el archivo llave y añádela como llave a tu partición encriptada como "cryptroot":

dd bs=1 count=512 if=/dev/random of=/var/safe/cryptroot.keyfile iflag=fullblock
chmod 600 /var/safe/cryptroot.keyfile
cryptsetup -v luksAddKey /dev/sdXY /var/safe/cryptroot.keyfile

Añade el archivo de llave a la imagen initramfs editando /etc/mkinitcpio.conf:

FILES=(/var/safe/cryptroot.keyfile)

Protección anti-tamper

La encriptación del almacenamiento interno de un equipo protege ante ataques fuera de línea, como el acceso a la información por medio de la sutracción de un equipo o sus medios de almacenamiento. Sin embargo existe el riesgo de un tipo de ataque más sofisticado conocido como evil-maid.

Para protegerse ante este tipo de ataques se recomiendan estas medidas:

  • Hacer el sistema tamper-evident, por medio de la verificación de nuestro bootloader al cargar initramfs, que es lo que haremos ahora (otra opción es verificar el kernel desde la instalación de GRUB en coreboot).
  • Usar una contraseña diferente para /boot y /.
  • Proteger el acceso a la configuración de la BIOS y el booteo de medios no apropiadamente identificados con una contraseña.

Este tutorial cubre las primeras dos. La tercera requiere de un flasheo interno de la BIOS en sistemas hackware-boot con la configuración por defecto, para modificar su grub.cfg.

Advertencia: Para sistemas que bootean múltiples SO desde la misma partición esto podría arrojar "falsos positivos".

Necesitaremos los paquetes fakeroot y binutils para crear un paquete desde AUR, si ya instalaste base-devel ya están instalados, en caso contrario puedes instalarlos con pacman -Sy fakeroot binutils.

curl -LO https://aur.archlinux.org/cgit/aur.git/snapshot/mkinitcpio-chkcryptoboot.tar.gz
tar xzvf mkinitcpio-chkcryptoboot.tar.gz
cd mkinitcpio-chkcryptoboot
chmod --recursive g+rw .
chgrp --recursive nobody .
su nobody -s /bin/sh -c "makepkg -sc"
pacman -U mkinitcpio-chkcryptoboot-*.pkg.tar.zst
cd -
rm -r mkinitcpio-chkcryptoboot*

Ahora puedes eliminar los paquetes fakeroot y binutils si es que no habías instalado base-devel con anterioridad con pacman -Rs fakeroot binutils.

Agrega el hook chkcryptoboot antes de encrypt en /etc/mkinitcpio.conf.

Edita el archivo /etc/default/chkcryptoboot.conf con los siguientes valores:

  • BOOTMODE=mbr
  • BOOTDISK=/dev/sdX
  • BOOT_PARTITION=/dev/disk/by-partuuid/<PARTUUID>, en caso de una tabla de particiones GPT, donde <PARTUUID> corresponde a la partición bios_grub, puedes averiguarlo con blkid /dev/sdXY.
  • Setear CMDLINE_NAME y CMDLINE_VALUE con dos valores únicos. Recomiendo generarlos aleatoriamente con un largo de al menos 32 caractres cada uno (por ejemplo con pwgen -c 32 1).

Crear initramfs

Una vez editado /etc/mkinitcpio.conf creamos la imagen initramfs con:

mkinitcpio -P

GRUB

Dependiendo de nuestra instalación es probable que necesitemos incluir algunos módulos en GRUB, lo hacemos a través del archivo /etc/default/grub.

  • Si usas encriptación:
    1. Descomenta GRUB_ENABLE_CRYPTODISK.
    2. Identifica el UUID de tu partición encriptada "cryptroot" con blkid /dev/sdXY.
    3. Añade cryptdevice=UUID=<UUID>:cryptroot cryptkey=rootfs:/var/safe/cryptroot.keyfile a GRUB_CMDLINE_LINUX (reemplazando <UUID>).
    4. Añade los mismos valores de <CMDLINE_NAME> y <CMDLINE_VALUE> que asignaste en chkcryptoboot.conf a GRUB_CMDLINE_LINUX en el formato <CMDLINE_NAME>=<CMDLINE_VALUE>.
  • Si usas LVM agrega lvm a GRUB_PRELOAD_MODULES.

Hibernación

Para hibernar usando un archivo swap es necesario:

  • Agregar resume=<swap_device> a GRUB_CMDLINE_LINUX, donde <swap_device> es el volumen donde se encuentra la swap. En caso de encriptación /dev/mapper/cryptroot, en caso de no haber encriptado /dev/sdXY.
  • Agregar resume_offset=<swap_file_offset>, donde <swap_file_offset> se puede obtener de distintas formas dependiendo del tipo de formato de la partición que usemos:
ext4
filefrag -v /var/safe/swapfile | awk 'NR == 4 { gsub(/\./, "", $4); print $4 }'
BTRFS

Es un poco más complicado de determinar. Tendremos que instalar gcc al menos temporalmente y luego correr estos comandos:

curl -LO https://raw.githubusercontent.com/osandov/osandov-linux/master/scripts/btrfs_map_physical.c
gcc -O2 -o btrfs_map_physical btrfs_map_physical.c
./btrfs_map_physical /var/safe/swapfile | awk 'BEGIN{ "getconf PAGESIZE" | getline psize } NR == 2 { print $9/psize }'

Luego de obtener el número e ingresarlo en la configuración de GRUB podemos "limpiar" nuestra instalación borrando los archivos creados con rm y eliminando las gcc, si ya no lo usaremos con pacman -Rs.

Instalar

Una vez editado /etc/default/grub, instala GRUB con:

grub-install --target=i386-pc --recheck /dev/sdX
grub-mkconfig -o /boot/grub/grub.cfg

Contraseña de root

Cambia la contraseña del usuario root con el comando passwd.

Finalización

Si lo deseas puedes olvidar todos los comandos ingresados para la instalación con history -c && rm /root/.bash_history.

Ya puedes reiniciar tu sistema ingresando primero exit y luego reboot.

Hackware-boot tool

Tu instalación ya está completamente encriptada, sin embargo aún no es razonablemente segura ante ataques evil-maid, para protegerla es necesario que uses hwbtool.

  • Instala el paquete flashrom.
  • Copia el binario compilado de la utilidad de coreboot, cbfstool (desde coreboot/util/cbfstool) a /usr/local/sbin/.
  • Copia hwbtool a /usr/local/sbin/.

Reinicia agregando el parámetro del kernel iomem=relaxed a la línea de arranque de GRUB en tu sistema Parabola GNU/Linux-libre:

  1. Prende o reinicia tu equipo.
  2. Selecciona [u] Unlock encrypted boot o espera 2 segundos luego de que aparece el menú de GRUB.
  3. Ingresa tu contraseña de /boot.
  4. Espera unos segundos.
  5. Verás el menú de booteo de Parabola. Presiona e.
  6. En la línea que comienza con linux, dirígete al final de ella e ingresa iomem=relaxed.
  7. Presiona <F10> para bootear Parabola.
  8. Espera que cargue, luego verás la pantalla de inicio de sesión.
  9. Presiona <Ctrl>+<Alt>+<F2> para acceder a una terminal.
  10. Inicia sesión con el usuario root.

Ahora podrás ejecutar hwbtool y seguir las instrucciones.

Para una configuración razonablemente segura de tu sistema luego de haber seguido cada instrucción de este tutorial ejecuta hwbtool --grub.

Optimizaciones

  • thermald y tlp Mejoran el consumo energético y la vida útil de la batería. TLP es incompatible con power-profiles-daemon, que viene activado por defecto en GNOME y tal vez algunos otros sistemas, por lo que probablemente debas deshabilitarlo.

Thinkpad

cat << EOF > /etc/tlp.d/10-battery.conf START_CHARGE_THRESH_BAT0=67 STOP_CHARGE_THRESH_BAT0=100 EOF

Fuente