Instal Archlinux dengan enkripsi sistem lengkap dan LVM di LUKS

Dalam posting ini Anda akan membaca sedikit tentang penelitian aneh saya selama cuti sakit paksa. Ini akan mengenai beberapa hal sekaligus, yang bukan "praktik terbaik", tetapi juga mungkin! Jadi di sini adalah tutorial tentang cara menginstal Archlinux (distr favorit saya) sehingga:

  • tanpa / boot terpisah (hanya di / root)
  • / pada lvm
  • lvm di dalam wadah luks
  • dengan UEFI
  • di mesin virtual.
  • dengan boot aman ("sulit" di mesin virtual tidak mungkin berhasil)

Patut dicatat bahwa semuanya akan dienkripsi kecuali untuk partisi sistem EFI dengan satu file grubx64.efi - aplikasi EFI untuk menjalankan grub.

Jika Anda tertarik, selamat datang ke kucing!

Pertama, saya mengatur semuanya pada laptop Lenovo X240 saya, kemudian untuk menulis artikel saya menggunakan mesin virtual dengan OVMF di Proxmox.

Pengaturan testbed:


Semuanya dibuat cukup standar. Gambar menggunakan lengkungan favorit saya, yang selalu dapat diunduh dari Yandex .

Selanjutnya, beberapa poin pada virtual di Proxmox tentang UEFI. Untuk menguji operasi dudukan dengan UEFI (jika tidak maka tidak akan begitu menarik), Anda perlu mengatur OVMF alih-alih SeaBIOS di properti mesin virtual:



Selanjutnya, tambahkan disk UEFI sesuai, untuk mendapatkan sesuatu seperti ini:



Sekarang kita dapat memulai mesin virtual dan memulai proses instalasi. Di konsol mesin virtual, segera mulai layanan sshd, atur kata sandi root dan temukan alamat dhcp mesin virtual:



Selanjutnya, kita dapat terus bekerja pada ssh untuk membuatnya lebih nyaman.

Tata letak disk


Jadi, setelah terhubung melalui ssh, pertama-tama kita mengatur waktu sehingga nantinya tidak akan menghasilkan sistem file di masa depan:

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

Periksa apakah semuanya benar:

 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 

Sekarang kita dapat mulai mempartisi disk. Pada tahap ini, saya memiliki drive / dev / vda, sebagai Pengontrol Virtio dan ini hanyalah disk kosong tanpa tabel partisi:

 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 

Kami akan memecahnya menjadi 2 partisi:

  • disk fat32 untuk aplikasi UEFI (EFI_system_partition)
  • Wadah LUK dengan yang lainnya

Gunakan gdisk untuk membuat 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 

Selanjutnya, buat partisi pertama untuk EFI dengan tipe EF00 (Partisi Sistem 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' 

Sekarang buat partisi untuk LUKS, tempat kami bahkan tidak akan repot dengan tipenya dan membiarkannya apa adanya:

 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> 

Kami akan menuliskan perubahan dan menyelesaikannya dengan markup partisi:

 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. 

Membuat wadah LUKS dan sistem file


Dengan bagian pertama (vda1), semuanya cukup sederhana. Kami hanya perlu memformatnya dan untuk saat ini:

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

Partisi kedua adalah wadah yang harus Anda persiapkan terlebih dahulu. Kami memformat partisi melalui cryptsetup dan mengatur frasa sandi:

 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. 

*** Saya tidak peduli dengan pilihan cipher, dengan pengacakan ditimpa dengan urandom dan lainnya, tetapi hanya membuat wadah default.

Selanjutnya, buka wadah dengan menentukan frasa sandi yang sama:

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

Sekarang kami memiliki wadah terbuka yang dapat diakses melalui device mapper:

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

Sekarang kita dapat melanjutkan dengan lvm (saya akan menulis dengan cepat, karena ini bukan subjek):

 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 

Selanjutnya, buat sistem file di lv kami:

 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 

Sekarang semua ini dapat dipasang untuk menginstal sistem dasar. Titik instalasi adalah / mnt, di mana root dari sistem masa depan kita akan dimulai:

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

*** / boot / efi yang saya buat sehingga / boot itu sendiri tetap di / dev / mapper / rootvg-root, dan folder efi sudah di-mount di / dev / vda1 (partisi 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 

Periksa titik pemasangan saat ini (selalu berguna):

 [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 

Seperti yang kita lihat, semuanya jujur ​​dan sekarang saatnya menempatkan lengkungan itu sendiri.

Instalasi sistem dasar


Instal paket base dari set base dan devel-devel menggunakan paket pacstrap (Anda dapat meletakkan semua yang Anda inginkan dan selain itu):

 pacstrap /mnt base base-devel 

Semuanya boot dengan sempurna, sistem dasar sudah siap. Secara alami, saya menghapus kesimpulan. Sekarang kita dapat mengkonfigurasi sistem ini untuk boot dan bekerja.

Dari hal-hal dasar, kami segera menghasilkan fstab:

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

Selanjutnya, buat arch-chroot ke dalam sistem baru ini:

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

*** arch-chroot adalah utilitas yang sangat berguna, karena ia melakukan semuanya dengan sendirinya. Meskipun Anda selalu dapat menggunakan chroot standar, sebelum melakukan ini, ikuti instruksi di gentoo-handbook wiki.gentoo.org/wiki/Handbook : AMD64 / Instalasi / Bagian Basis Memasang sistem file yang diperlukan”

Segera konfigurasikan waktu sistem dan nama host:

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

Tetapkan kata sandi root:

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

Batalkan komentar lokal yang diperlukan di /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 

Kami akan menghasilkan mereka:

 [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 

Segera konfigurasikan untuk sistem dan konsol:

 [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 

Sekarang konfigurasikan file /etc/mkinitcpio.conf, yang bertanggung jawab untuk opsi, kait, dll. Saat membuat initramfs:

 vi /etc/mkinitcpio.conf 

Yang paling penting adalah pengait dan urutannya:

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

*** melanjutkan pengait untuk mem-boot sistem setelah hibernasi dari swap. Pada mesin virtual itu tidak diperlukan. Saya menyalinnya dari beech.

Sekarang kita dapat menghasilkan 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 

Sekarang setelah kita memiliki sistem, kita perlu menginstal bootloader itu sendiri. Pilihan saya jatuh pada grub (2), karena entah bagaimana lebih akrab dan cukup mudah memuat kernel dari partisi terenkripsi (baik, atau saya tidak benar-benar mencari yang lain).

Instal paket grub:

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

Sebelum membuat konfigurasi, edit opsi grub default:

 vim /etc/default/grub 

di sini Anda perlu menghapus komentar pada satu baris penting (tidak ada komentar, tentu saja):

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

dan tambahkan (ada yang kosong secara default) ke GRUB_CMDLINE_LINUX:

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

UUID yang saya ambil dari 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" 

Kami membuat konfigurasi untuk 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 

Selanjutnya, instal grub sendiri pada disk:

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

*** Anda dapat menambahkan --recheck --debug, tentukan arsitekturnya ... tapi ... itu benar-benar berfungsi dengan sendirinya)

Sekarang kita akan mengedit / etc / crypttab sehingga sistem itu sendiri tahu bahwa ketika memuat perlu mendekripsi bagian LUKS. Tambahkan baris:

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

Yang berarti bahwa Anda perlu meminta kata sandi (tidak ada) untuk partisi / dev / vda2 dan menyajikannya sebagai wadah melalui perangkat mapper.

Sekarang kita siap untuk keluar dari chroot dan reboot sistem:

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

Sekarang mari kita beralih ke konsol mesin virtual untuk melihat hasilnya:



Pada tahap ini, kami memulai aplikasi EFI /boot/efi/EFI/arch/grubx64.efi dengan / dev / vda1, yang meminta kami kata sandi untuk mendekripsi wadah kami.

Selanjutnya, setelah memasukkan kata sandi:



Ini adalah jendela grub yang familier dengan opsi boot kami dari /boot/grub/grub.cfg.
Pada tahap ini, grub mendekripsi kontainer kami dan mendapatkan akses ke file ini sendiri (/boot/grub/grub.cfg), kernel, dan initramfs. Setelah memilih opsi, kernel akan boot secara default, initramfs:



Secara aktif, kernel muncul dengan kait terenkripsi, yang lagi-lagi meminta kami untuk kata sandi untuk mendekripsi wadah (secara umum, Anda perlu memasukkan kata sandi 2 kali, tetapi mungkin Anda membuat 2 wadah untuk boot dan root dari kelebihan paranoia :)

Dan kemudian setelah sistem terisi penuh:



PS: untuk meningkatkan level skizofrenia, hanya boot aman saja tidak cukup untuk menandatangani bootloader grubx64.efi kami.

Saya merasa tidak menarik untuk hanya meletakkan kernel dan initramfs di / dev / vda1, karena saya sudah melakukannya 100 kali. Boot loader lain seperti SHIM, bootctl, dll. Tidak tahu bagaimana melakukan ini (yah, jika saya tidak tahu, beri tahu kami di komentar)

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


All Articles