Instale o Archlinux com criptografia completa do sistema e LVM no LUKS

Neste post, você lerá um pouco sobre minha estranha pesquisa durante a licença médica forçada. Serão várias coisas ao mesmo tempo, que não são “melhores práticas”, mas também são possíveis! Então, aqui está um tutorial sobre como instalar o Archlinux (minha distr favorita) para que:

  • sem um / boot separado (apenas em / root)
  • / no lvm
  • lvm dentro do contêiner luks
  • com UEFI
  • em uma máquina virtual.
  • com inicialização segura (é improvável que "difícil" na máquina virtual seja bem-sucedido)

Vale ressaltar que tudo será criptografado, exceto a partição do sistema EFI com um único arquivo grubx64.efi - um aplicativo EFI para executar o grub.

Se você estiver interessado, bem-vindo ao gato!

Primeiro, configurei tudo no meu laptop Lenovo X240 e, para escrever um artigo, usei uma máquina virtual com OVMF no Proxmox.

Configuração do Testbed:


Tudo é criado de maneira bastante padronizada. A imagem usa meu arco favorito, que sempre pode ser baixado do Yandex .

Em seguida, alguns pontos no virtual no Proxmox em relação à UEFI. Para testar a operação do suporte com UEFI (caso contrário, não será tão interessante), é necessário configurar o OVMF em vez do SeaBIOS nas propriedades da máquina virtual:



Em seguida, adicione o disco UEFI de acordo, para obter algo parecido com isto:



Agora podemos iniciar a máquina virtual e iniciar o processo de instalação. No console da máquina virtual, inicie imediatamente o serviço sshd, defina a senha raiz e descubra o endereço dhcp da máquina virtual:



Em seguida, podemos continuar trabalhando no ssh para torná-lo mais conveniente.

Layout do disco


Portanto, já tendo se conectado via ssh, primeiro definimos o horário para que mais tarde não aconteça que os sistemas de arquivos sejam criados no futuro:

timedatectl set-ntp true && timedatectl set-timezone Europe/Moscow 

Verifique se tudo está correto:

 root@archiso ~ # timedatectl Local time: Tue 2018-08-14 13:42:03 MSK Universal time: Tue 2018-08-14 10:42:03 UTC RTC time: Tue 2018-08-14 10:42:04 Time zone: Europe/Moscow (MSK, +0300) System clock synchronized: yes NTP service: active RTC in local TZ: no 

Agora podemos começar a particionar o disco. Nesta fase, tenho uma unidade / dev / vda, como Controlador Virtio e este é apenas um disco vazio sem uma tabela de partição:

 root@archiso ~ # fdisk -l /dev/vda Disk /dev/vda: 15 GiB, 16106127360 bytes, 31457280 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes 

Vamos dividi-lo em 2 partições:

  • disco fat32 para aplicativos UEFI (EFI_system_partition)
  • Contêiner LUKS com todo o resto

Use o gdisk para criar a GPT:

 root@archiso ~ # gdisk /dev/vda GPT fdisk (gdisk) version 1.0.4 Command (? for help): o This option deletes all partitions and creates a new protective MBR. Proceed? (Y/N): y 

Em seguida, crie a primeira partição para EFI com o tipo EF00 (Partição de sistema EFI):

 Command (? for help): n Partition number (1-128, default 1): First sector (34-31457246, default = 2048) or {+-}size{KMGTP}: Last sector (2048-31457246, default = 31457246) or {+-}size{KMGTP}: +512M Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): <b>EF00</b> Changed type of partition to 'EFI System' 

Agora, crie uma partição para o LUKS, na qual nem vamos nos preocupar com o tipo e deixe como está:

 Command (? for help): n Partition number (2-128, default 2): First sector (34-31457246, default = 1050624) or {+-}size{KMGTP}: Last sector (1050624-31457246, default = 31457246) or {+-}size{KMGTP}: <b>Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): Changed type of partition to 'Linux filesystem'</b> 

Vamos anotar as alterações e terminar com a marcação da partição:

 Command (? for help): w Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!! Do you want to proceed? (Y/N): y OK; writing new GUID partition table (GPT) to /dev/vda. The operation has completed successfully. 

Criando um Contêiner LUKS e Sistemas de Arquivos


Com a primeira seção (vda1), tudo é bem simples. Só precisamos formatá-lo e, por enquanto, é isso:

 root@archiso ~ # mkfs.vfat /dev/vda1 mkfs.fat 4.1 (2017-01-24) 

A segunda partição é o contêiner que você deve preparar primeiro. Formaizamos a partição através do cryptsetup e definimos a senha:

 root@archiso ~ # cryptsetup -v luksFormat /dev/vda2 WARNING! ======== This will overwrite data on /dev/vda2 irrevocably. Are you sure? (Type uppercase yes): YES Enter passphrase for /dev/vda2: Verify passphrase: Command successful. 

*** Eu não me incomodei com a escolha de cifras, com a randomização substituída por urandom e outras, mas apenas criei um contêiner padrão.

Em seguida, abra o contêiner especificando a mesma senha:

 root@archiso ~ # cryptsetup luksOpen /dev/vda2 container Enter passphrase for /dev/vda2: 

Agora temos um contêiner aberto acessível através do mapeador de dispositivos:

 root@archiso ~ # ls -l /dev/mapper | grep container lrwxrwxrwx 1 root root 7 Aug 14 14:01 container -> ../dm-0 

Agora podemos continuar com o lvm (vou escrever rapidamente, pois esse não é um assunto):

 root@archiso ~ # pvcreate /dev/mapper/container Physical volume "/dev/mapper/container" successfully created. root@archiso ~ # vgcreate rootvg /dev/mapper/container Volume group "rootvg" successfully created root@archiso ~ # lvcreate -L1G -n swap rootvg Logical volume "swap" created. root@archiso ~ # lvcreate -L5G -n root rootvg Logical volume "root" created. root@archiso ~ # lvcreate -L2G -n home rootvg Logical volume "home" created. root@archiso ~ # lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert home rootvg -wi-a----- 2.00g root rootvg -wi-a----- 5.00g swap rootvg -wi-a----- 1.00g 

Em seguida, crie os sistemas de arquivos em nosso lv:

 root@archiso ~ # mkfs.ext4 -L root /dev/mapper/rootvg-root mke2fs 1.44.3 (10-July-2018) ... Writing superblocks and filesystem accounting information: done [root@archiso ~]# mkfs.ext4 -L home /dev/mapper/rootvg-home mke2fs 1.44.3 (10-July-2018) Creating filesystem with 524288 4k blocks and 131072 inodes ... Writing superblocks and filesystem accounting information: done [root@archiso ~]# mkswap -L swap /dev/mapper/rootvg-swap ... LABEL=swap, UUID=98b0bc31-1c62-4fec-bb97-e1913d1e8cb4 

Agora tudo isso pode ser montado para instalar o sistema básico. O ponto de instalação será / mnt, onde a raiz do nosso sistema futuro começará:

 [root@archiso ~]# mount /dev/mapper/rootvg-root /mnt/ [root@archiso ~]# mkdir -p /mnt/{home,boot/efi} 

*** / boot / efi que crio para que o / boot em si permaneça em / dev / mapper / rootvg-root e a pasta efi já esteja montada em / dev / vda1 (partição fat32 efi):

 [root@archiso ~]# mount /dev/vda1 /mnt/boot/efi/ [root@archiso ~]# mount /dev/mapper/rootvg-home /mnt/home/ [root@archiso ~]# swapon /dev/mapper/rootvg-swap 

Verifique os pontos de montagem atuais (sempre úteis):

 [root@archiso ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 462.5M 1 loop /run/archiso/sfs/airootfs sr0 11:0 1 573M 0 rom /run/archiso/bootmnt vda 254:0 0 15G 0 disk ├─vda1 254:1 0 512M 0 part /mnt/boot/efi └─vda2 254:2 0 14.5G 0 part └─container 253:0 0 14.5G 0 crypt ├─rootvg-swap 253:1 0 1G 0 lvm [SWAP] ├─rootvg-root 253:2 0 5G 0 lvm /mnt └─rootvg-home 253:3 0 2G 0 lvm /mnt/home 

Como vemos, tudo é honesto e agora é hora de colocar o arco em si.

Instalação do sistema base


Instale os pacotes base a partir dos conjuntos base e base-devel usando o pacote pacstrap (você pode colocar tudo o que quiser e além disso):

 pacstrap /mnt base base-devel 

Tudo inicializado perfeitamente, o sistema básico está pronto. Naturalmente, retirei a conclusão. Agora podemos configurar esse sistema para inicializar e funcionar.

Das coisas básicas, geramos imediatamente o fstab:

 genfstab -pU /mnt >> /mnt/etc/fstab 

Em seguida, faça o arch-chroot nesse novo sistema:

 [root@archiso ~]# arch-chroot /mnt 

O arch-chroot é um utilitário muito útil, porque faz tudo sozinho. Embora você sempre possa usar o chroot padrão, antes de fazer isso, siga as instruções no manual do gentoo wiki.gentoo.org/wiki/Handbook : Seção AMD64 / Installation / Base “Montando os sistemas de arquivos necessários”

Configure imediatamente a hora e o nome do host do sistema:

 ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime && \ hwclock --systohc && \ echo luks-test > /etc/hostname 

Defina a senha root:

 [root@archiso /]# passwd root New password: Retype new password: passwd: password updated successfully 

Remova o comentário dos locais necessários em /etc/locale.gen:

 [root@archiso /]# vi /etc/locale.gen [root@archiso /]# grep -v '^#' /etc/locale.gen en_US ISO-8859-1 en_US.UTF-8 UTF-8 ru_RU.UTF-8 UTF-8 ru_RU ISO-8859-5 

Vamos gerá-los:

 [root@archiso /]# locale-gen Generating locales... en_US.ISO-8859-1... done en_US.UTF-8... done ru_RU.UTF-8... done ru_RU.ISO-8859-5... done Generation complete 

Configure-os imediatamente para o sistema e o console:

 [root@archiso /]# echo LANG=en_US.UTF-8 > /etc/locale.conf [root@archiso /]# echo KEYMAP=ru > /etc/vconsole.conf [root@archiso /]# echo FONT=cyr-sun16 >> /etc/vconsole.conf 

Agora configure o arquivo /etc/mkinitcpio.conf, responsável por opções, ganchos etc. ao gerar o initramfs:

 vi /etc/mkinitcpio.conf 

O mais importante são os ganchos e sua ordem:

 HOOKS=(base udev autodetect modconf block keymap encrypt lvm2 resume filesystems keyboard fsck) 

*** retome o gancho para inicializar o sistema após a hibernação da troca. Em uma máquina virtual, isso não é necessário. Eu copiei da faia.

Agora podemos gerar initramfs:

 [root@archiso /]# mkinitcpio -p linux ==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'default' -> -k /boot/vmlinuz-linux -c /etc/mkinitcpio.conf -g /boot/initramfs-linux.img ==> Starting build: 4.17.14-arch1-1-ARCH -> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [autodetect] -> Running build hook: [modconf] -> Running build hook: [block] -> Running build hook: [keymap] -> Running build hook: [encrypt] -> Running build hook: [lvm2] -> Running build hook: [resume] -> Running build hook: [filesystems] -> Running build hook: [keyboard] -> Running build hook: [fsck] ==> Generating module dependencies ==> Creating gzip-compressed initcpio image: /boot/initramfs-linux.img ==> Image generation successful 

Agora que temos o sistema, precisamos instalar o próprio carregador de inicialização. Minha escolha foi no grub (2), porque é de alguma forma mais familiar e facilmente capaz de carregar o kernel de uma partição criptografada (bem, ou eu realmente não procurei por outras pessoas).

Instale o pacote grub:

 [root@archiso /]# pacman -S grub dosfstools efibootmgr mtools 

Antes de gerar a configuração, edite as opções padrão do grub:

 vim /etc/default/grub 

aqui você precisa descomentar uma linha importante (sem comentários, é claro):

 # Uncomment to enable booting from LUKS encrypted devices GRUB_ENABLE_CRYPTODISK=y 

e adicione (vazio por padrão) ao GRUB_CMDLINE_LINUX:

 GRUB_CMDLINE_LINUX="cryptdevice=UUID=5ad7c9ad-fb17-4839-925e-479432516c07:container" 

UUID que tirei do blkid:

 [root@archiso /]# blkid | grep vda2 /dev/vda2: UUID="5ad7c9ad-fb17-4839-925e-479432516c07" TYPE="crypto_LUKS" PARTLABEL="Linux filesystem" PARTUUID="667a1243-17ff-4f03-952c-5afd5e3415cc" 

Geramos uma configuração para o grub:

 [root@archiso /]# grub-mkconfig -o /boot/grub/grub.cfg Generating grub configuration file ... WARNING: Failed to connect to lvmetad. Falling back to device scanning. Found linux image: /boot/vmlinuz-linux Found initrd image: /boot/initramfs-linux.img Found fallback initrd image(s) in /boot: initramfs-linux-fallback.img WARNING: Failed to connect to lvmetad. Falling back to device scanning. done 

Em seguida, instale o próprio grub no disco:

 [root@archiso /]# grub-install /dev/vda Installing for x86_64-efi platform. ... Installation finished. No error reported. 

*** você pode adicionar --recheck --debug, especificar a arquitetura ... mas ... realmente funciona por si só)

Agora vamos editar o arquivo / etc / crypttab para que o próprio sistema saiba que, ao carregar, é necessário descriptografar a seção LUKS. Adicione a linha:

 echo "container /dev/vda2 none" >> /etc/crypttab 

O que significa que você precisa solicitar uma senha (nenhuma) para a partição / dev / vda2 e apresentá-la já como contêiner via mapeador de dispositivo.

Agora estamos prontos para sair do chroot e reiniciar o sistema:

 [root@archiso /]# exit exit [root@archiso ~]# reboot Welcome back! 

Agora vamos ao console da máquina virtual para ver o resultado:



Nesse estágio, iniciamos o aplicativo EFI /boot/efi/EFI/arch/grubx64.efi com / dev / vda1, que solicita uma senha para descriptografar nosso contêiner.

Em seguida, após digitar a senha:



Aqui está a familiar janela do grub com nossas opções de inicialização em /boot/grub/grub.cfg.
Nesse ponto, o grub descriptografou nosso contêiner e obteve acesso ao próprio arquivo (/boot/grub/grub.cfg), ao kernel e ao initramfs. Após selecionar a opção, o kernel será inicializado por padrão, initramfs:



Ativamente, o kernel veio com o gancho de criptografia, que novamente solicita a senha para descriptografar o contêiner (em geral, você precisa digitar a senha duas vezes, mas pode ser que você crie 2 contêineres para inicializar e root com excesso de paranóia :)

E depois que o sistema estiver totalmente carregado:



PS: para aumentar o nível de esquizofrenia, apenas a inicialização segura não é suficiente para assinar nosso carregador de inicialização grubx64.efi.

Achei desinteressante colocar o kernel e o initramfs em / dev / vda1, como já fiz isso 100 vezes. Outros carregadores de inicialização, como SHIM, bootctl, etc. não sabem como fazer isso (bem, se eu não souber, conte-nos nos comentários)

Source: https://habr.com/ru/post/pt420081/


All Articles