Menggunakan satu frasa sandi untuk membuka kunci beberapa disk terenkripsi saat boot

23

Mesin saya memiliki SSD, tempat saya menginstal sistem dan HDD, yang saya gunakan sebagai penyimpanan untuk file besar dan / atau jarang digunakan. Keduanya dienkripsi, tetapi saya memilih untuk menggunakan kata sandi yang sama untuk mereka. SSD terpasang di /dan HDD di /usr/hdd(masing-masing pengguna memiliki direktori di atasnya dan dapat terhubung sesuai keinginan dari direktori rumah).

Ketika sistem di-boot, ia segera meminta frasa sandi untuk SSD, dan hanya beberapa detik kemudian untuk yang untuk HDD (ini dipasang secara otomatis). Mengingat kedua frasa sandi itu sama, apakah ada cara untuk mengkonfigurasi sistem untuk bertanya sekali saja?

doublep
sumber
Anda dapat menulis expectskrip atau sejenisnya yang dipanggil untuk memasang disk alih-alih meminta sistem melakukannya. Sebagai gantinya, sistem akan memanggil skrip yang akan meminta kata sandi, menyimpannya, dan menyediakannya untuk setiap operasi pemasangan.
h3rrmiller
Jika saya memahami ide Anda dengan benar, itu tidak dapat diterapkan ke SSD, karena dari situlah sistem melakukan booting. Tetapi kemudian menjadi sia-sia, karena saya masih perlu mengetikkan frasa sandi untuk HDD secara terpisah. Atau tidak?
doublep
Anda dapat menggunakan /etc/crypttab untuk membuka kunci drive kedua .
jasonwryan
1
@jasonwryan jika itu dapat diperluas ke jawaban, maka ... jawaban harus diposting sebagai jawaban, bukan komentar.
derobert
1
@derobert kadang-kadang orang tidak punya waktu, atau kecenderungan, untuk menulis jawaban yang bagus.
jasonwryan

Jawaban:

24

Distribusi berbasis Debian:

Debian dan Ubuntu mengirimkan skrip caching kata sandi decrypt_keyctl dengan paket cryptsetup .

skrip decrypt_keyctl memberikan kata sandi yang sama ke beberapa target LUKS terenkripsi, menyelamatkan Anda dari mengetiknya beberapa kali. Itu dapat diaktifkan di crypttab dengan keyscript=decrypt_keyctlopsi. Kata sandi yang sama digunakan untuk target yang memiliki pengidentifikasi yang sama di bidang keyfile . Kata sandi saat boot untuk setiap pengenal diminta satu kali.

Contoh crypttab :

<target>      <source>         <keyfile>      <options>
part1_crypt   /dev/disk/...    crypt_disks    luks,keyscript=decrypt_keyctl
part2_crypt   /dev/disk/...    crypt_disks    luks,keyscript=decrypt_keyctl

Setelah Anda memperbarui cryptab Anda, Anda juga harus memperbarui initramfs untuk menerapkan perubahan. Gunakan update-initramfs -u.

Readme lengkap untuk decrypt_keyctl terletak di /usr/share/doc/cryptsetup/README.keyctl

Sayangnya, ini saat ini tidak berfungsi pada sistem Debian menggunakan systemd init karena bug (sistem init lain seharusnya tidak terpengaruh). Halaman manual Debian crypttab menyarankan sebagai solusi untuk menggunakan initramfsopsi untuk memaksa pemrosesan pada tahap boot initramfs.


Distribusi yang tidak menyediakan skrip decrypt_keyctl :

Jika decrypt_keyctrl tidak disediakan oleh distribusi Anda, perangkat dapat dibuka dengan menggunakan keyfile di sistem file root terenkripsi. Ini ketika sistem file root dapat dibuka dan dipasang sebelum perangkat terenkripsi lainnya.

LUKS mendukung banyak slot kunci. Ini memungkinkan Anda untuk membuka kunci perangkat secara alternatif menggunakan kata sandi jika file kunci tidak tersedia / hilang.

  1. Hasilkan kunci dengan data acak dan atur izinnya agar hanya dapat dibaca oleh pemilik agar tidak bocor. Perhatikan bahwa file kunci harus di partisi root yang tidak dikunci terlebih dahulu.

    dd if=/dev/urandom of=<path to key file> bs=1024 count=1
    chmod u=rw,g=,o= <path to key file>
    
  2. Tambahkan kunci ke perangkat LUKS Anda

    cryptsetup luksAddKey <path to encrypted device> <path to key file>
    
  3. Konfigurasikan crypttab untuk menggunakan file kunci. Baris pertama harus menjadi perangkat root, karena perangkat tidak dikunci dalam urutan yang sama seperti yang tercantum dalam crypttab . Gunakan jalur absolut untuk file kunci.

    <target>      <source>         <keyfile>                  <options>
    root_crypt    /dev/disk/...    none                       luks
    part1_crypt   /dev/disk/...    <path to key file>         luks
    
sebasth
sumber
Dari baris pertama readme itu terlihat sangat menjanjikan, terima kasih. Saya akan periksa besok (tidak mau reboot sekarang).
doublep
Sayangnya, itu tidak berfungsi (karena tidak ada perubahan). Lihat sayacrypttab (saya tidak sentuh UUID=diciptakan oleh sistem installer, saya kira itu seharusnya tidak masalah) dan entri mengakibatkan/var/log/syslog . Kesalahan semacam itu bisa dimengerti, tapi saya tidak tahu apa yang harus dilakukan tentang mereka. File /lib/cryptsetup/scripts/decrypt_keyctlada, jadi saya tidak tahu mengapa ia mengeluh tentang opsi yang tidak diketahui. Saya juga tidak tahu apa yang harus ditentukan sebagai keyfile, saya tidak melihat penjelasan di mana pun ...
doublep
Apakah Anda memverifikasi decrypt_keyctl akan disertakan dalam initramfs? Periksa menggunakan opsi verbose ketika memperbarui gambar:, update-initramfs -u -k $(uname -r) -vitu harus keluar Adding binary /lib/cryptsetup/scripts/decrypt_keyctl.
sebasth
1
Untuk melihat isi initramfs:lsinitramfs /boot/initrd.img-$(uname -r)
sebasth
3
Eh, maaf, sekarang aku lebih memerhatikan apa yang update-initramfskatakan, saya melihat ini: E: /usr/share/initramfs-tools/hooks/cryptkeyctl failed with return 1.. Setelah sedikit googling, saya menemukan bahwa saya mungkin perlu keyutilspaket (benar-benar tidak diinstal). Sekarang update-initramfsberhasil dan lsinitramfstidak disebutkan decrypt_keytls. Akan diperbarui setelah boot berikutnya (kemungkinan besok).
doublep
3

Ini adalah solusi untuk debian, mengingat bug yang dirujuk di atas oleh @sebasth.

Setup saya sedikit berbeda. Saya memiliki partisi root terenkripsi dan banyak raid disk. Bagi saya, saya harus menambahkan opsi initramfs ke crypttab:

<target>      <source>         <keyfile>      <options>
part1_crypt   /dev/disk/...    crypt_disks    plain,cipher=aes-xts-plain64,keyscript=decrypt_keyctl,initramfs
part2_crypt   /dev/disk/...    crypt_disks    plain,cipher=aes-xts-plain64,keyscript=decrypt_keyctl,initramfs

Ini memberitahu pembaruan-initramfs bahwa saya ingin agar entri crypttab ini dipasang di initramfs. Saya memeriksa crypttab saya dengan menjalankan

cryptdisks_start part1_crypt
cryptdisks_start part2_crypt

Perhatikan bahwa disk raid saya adalah dm-crypt. Ini berarti bahwa saya tidak dapat menggunakan metode keyfile luks yang bekerja di sekitar bug keycript systemd. Untuk plain dm-crypt, saya harus menyimpan kata sandi dalam plaintext.

Disk terenkripsi harus dipasang sebelum update-initramfsdijalankan; jika tidak maka akan terjadi kesalahan. Saya harus mencari baris berikut ketika initramf saya dibuat:

update-initramfs -k -u -v | grep 'keyctl'

yang menunjukkan dua file berikut:

/bin/keyctl
cryptkeyctl

ditambahkan ke initramfs.

Akhirnya, saya harus menonaktifkan systemd menangani crypttab saya, untuk menangani bug yang dirujuk di atas: systemd tidak mendukung opsi keyscript di crypttab. Untuk ini, saya menambahkan opsi kernel

GRUB_CMDLINE_LINUX_DEFAULT="quiet luks.crypttab=no"     

ke / etc / default / grub dan berlari update-grub. systemd sekarang mengabaikan crypttab, dan semua partisi terenkripsi dimuat di initramfs.

Karena saya memiliki partisi root terenkripsi, cryptroot tampaknya tidak men-cache kunci saya. Ini berarti saya harus memasukkan kata sandi saya dua kali; satu untuk partisi root dan sekali untuk array raid saya.

pengguna128063
sumber
1

Opsi lain adalah menggunakan /lib/cryptsetup/scripts/decrypt_derivedskrip, yang juga merupakan bagian dari cryptsetup di Debian / Ubuntu.

Alih-alih menyimpan kunci, Anda menggunakan kunci volume satu disk sebagai kata sandi tambahan untuk disk kedua. Ini membutuhkan penambahan kata sandi kedua ke disk terenkripsi kedua (dan ketiga, dll), tetapi LUKS mendukungnya. Oleh karena itu solusi ini juga berfungsi jika beberapa disk terenkripsi Anda tidak menggunakan kata sandi yang sama.

Contoh untuk menambahkan kunci dari sda6crypt ke sda5:

Tambahkan kunci volume sda6crypt sebagai kata sandi tambahan untuk sda5:

mkfifo fifo
/lib/cryptsetup/scripts/decrypt_derived sda6crypt > fifo &
cryptsetup luksAddKey /dev/sda5 fifo
rm fifo

Konfigurasikan sda5crypt untuk dibuka secara otomatis di /etc/crypttab

ls -la /dev/disk/by-uuid/ | grep sda5
echo "sda5crypt UUID=<uuid> sda6crypt luks,initramfs,keyscript=/lib/cryptsetup/scripts/decrypt_derived" >> /etc/crypttab

Ini menggunakan pipa bernama ( fifo) untuk meneruskan kunci untuk menghindari keharusan menyimpan kunci volume dalam file sementara pada disk.

The keyscriptpilihan hanya bekerja jika crypttabdiproses oleh alat cryptsetup asli Debian, yang implementasi ulang systemd saat ini tidak mendukung hal itu. Jika sistem Anda menggunakan systemd (yang merupakan sebagian besar sistem), Anda memerlukan initramfsopsi untuk memaksa pemrosesan terjadi di initrd oleh alat cryptsetup, sebelum systemd memulai.

Berdasarkan /unix//a/32551/50793

JanKanis
sumber
Harus mengatakan ini solusi yang indah Bekerja langsung dari kelelawar tidak ada cegukan pada debian 10 buster!
Janus