Clevis adalah kerangka kerja pluggable untuk dekripsi otomatis. Ini dapat digunakan untuk menyediakan dekripsi data otomatis atau bahkan membuka kunci volume LUKS secara otomatis.
Seperti apa bentuknya? Nah, langkah pertama adalah mengenkripsi beberapa data. Kami melakukan ini dengan perintah sederhana:
$ clevis encrypt PIN CONFIG < PLAINTEXT > CIPHERTEXT.jwe
Perintah ini mengambil teks biasa pada masukan standar dan menghasilkan objek JWE terenkripsi pada keluaran standar. Selain teks biasa, kita perlu menentukan dua parameter masukan tambahan.
Yang pertama adalah pinnya. Dalam terminologi clevis, pin adalah plugin yang mengimplementasikan dekripsi otomatis. Kami cukup memberikan nama pin di sini.
Yang kedua adalah konfigurasinya. Konfigurasinya adalah objek JSON yang akan diteruskan langsung ke pin. Ini berisi semua konfigurasi yang diperlukan untuk melakukan enkripsi dan mengatur dekripsi otomatis.
Untuk mendekripsi JWE kami, kami cukup melakukan hal berikut:
$ clevis decrypt < CIPHERTEXT.jwe > PLAINTEXT
Perhatikan bahwa tidak diperlukan input atau interaksi tambahan untuk perintah dekripsi. Mari kita lihat beberapa contoh yang lebih konkrit.
Tang adalah implementasi server yang menyediakan layanan pengikatan kriptografi tanpa memerlukan escrow. Clevis memberikan dukungan penuh kepada Tang. Berikut ini contoh cara menggunakan Clevis dengan Tang:
$ echo hi | clevis encrypt tang ' {"url": "http://tang.local"} ' > hi.jwe
The advertisement is signed with the following keys:
kWwirxc5PhkFIH0yE28nc-EvjDY
Do you wish to trust the advertisement ? [yN] y
Dalam contoh ini, kami mengenkripsi pesan "hai" menggunakan pin Tang. Satu-satunya parameter yang diperlukan dalam hal ini adalah URL server Tang. Selama proses enkripsi, pin Tang meminta iklan kunci dari server dan meminta Anda mempercayai kunci tersebut. Ini bekerja mirip dengan SSH.
Alternatifnya, Anda dapat memuat iklan secara manual menggunakan parameter adv
. Parameter ini mengambil string yang mereferensikan file tempat iklan disimpan, atau konten JSON dari iklan itu sendiri. Ketika iklan ditentukan secara manual seperti ini, Clevis berasumsi bahwa iklan tersebut dapat dipercaya.
Clevis memberikan dukungan untuk mengenkripsi kunci dalam chip Trusted Platform Module 2.0 (TPM2). Kunci acak yang kuat secara kriptografis yang digunakan untuk enkripsi dienkripsi menggunakan chip TPM2, dan didekripsi menggunakan TPM2 pada saat dekripsi untuk memungkinkan clevis mendekripsi rahasia yang disimpan di JWE.
Misalnya:
$ echo hi | clevis encrypt tpm2 ' {} ' > hi.jwe
Clevis menyimpan kunci publik dan pribadi dari kunci terenkripsi di objek JWE, sehingga kunci tersebut dapat diambil saat dekripsi untuk membuka segel kunci yang dienkripsi menggunakan TPM2.
Clevis dapat menjalankan peran aplikasi PKCS#11, seperti yang dijelaskan dalam RFC 7512: Skema URI PKCS#11.
Protokol PKCS#11 menentukan bahwa PIN (Personal Identity Number) harus dikonfigurasikan ke dalam perangkat keras agar proses pembukaan kunci berhasil. Clevis akan memungkinkan pengguna untuk membuka kunci disk terenkripsi tertentu, dan akan memberikan cara untuk mendapatkan PIN. Akan ada dua kemungkinan:
1 - Berikan PIN saat boot: Dalam kasus pertama ini, Clevis akan mendeteksi perangkat PKCS#11 dan akan meminta PIN-nya. Jika PIN salah, Clevis akan meminta PIN lagi. Merupakan tanggung jawab pengguna untuk mewaspadai kemungkinan kunci/bata perangkat jika PIN tidak diketahui.
2 - Berikan PIN pada waktu konfigurasi Clevis: Dalam kasus kedua ini, Clevis akan dikonfigurasi dengan nilai PIN.
Awalnya, RFC7512 mendefinisikan mekanisme untuk menentukan jenis URI khusus (URI pkcs11
), yang memungkinkan mengidentifikasi perangkat dan juga informasi yang diperlukan untuk membuka kuncinya. Perhatian khusus patut diberikan pada parameter pin-value
, yang memungkinkan penentuan nilai PIN atau lokasi PIN masing-masing. Clevis akan memahami, pada awalnya, parameter 'nilai pin'. Di bawah ini Anda dapat menemukan dan contoh URI PKCS#11 menggunakan parameter sebelumnya:
pin-value
yang ditentukan: pkcs11:token=Software%20PKCS%2311%20softtoken;manufacturer=Snake%20Oil,%20Inc.?pin-value=the-pin
Di bagian berikutnya, contoh konfigurasi Clevis disediakan, sehingga memperjelas opsi apa saja yang berbeda untuk perangkat PKCS#11 untuk diikat ke disk terenkripsi.
Clevis akan menyediakan mekanisme bagi pengguna untuk mengikat perangkat PKCS#11 tertentu ke perangkat terenkripsi. Nama pin baru untuk Clevis adalah pkcs11
, dan cara konfigurasinya akan sama dengan yang digunakan saat ini:
$ clevis luks bind -h
Usage: clevis luks bind [-y] [-f] [-s SLT] [-k KEY] [-t TOKEN_ID] [-e EXISTING_TOKEN_ID] -d DEV PIN CFG
Sebagai contoh pertama, pengguna dapat memberikan informasi perangkat dengan menentukan URI-nya ke Clevis:
$ clevis luks bind -d /dev/sda1 pkcs11 '{"uri": "pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;
serial=0a35ba26b062b9c5;token=clevis;id=%02;object=Encryption%20Key"}'
Opsi tambahan adalah memberikan Clevis konfigurasi sehingga perangkat PKCS#11 pertama yang ditemukan oleh Clevis terikat. Untuk melakukannya, URI kosong dapat diberikan seperti yang ditunjukkan di bawah ini:
$ clevis luks bind -d /dev/sda1 pkcs11 '{"uri": "pkcs11:"}'
Perintah konfigurasi yang lebih pendek, setara dengan yang sebelumnya, ditunjukkan di bawah ini:
$ clevis luks bind -d /dev/sda1 pkcs11 '{}'
Dalam hal ini, Clevis akan bertanggung jawab untuk mendeteksi perangkat dan, jika tidak ada perangkat yang ditemukan, bertanggung jawab untuk membuang kesalahan terkait.
Harus diklarifikasi bahwa memberikan URI kosong akan membuat Clevis juga meminta untuk memilih salah satu kunci yang tersedia yang cocok dengan token untuk menghindari enkripsi yang tidak disengaja dengan kunci yang tidak diinginkan.
Jalur modul dapat diberikan ke Clevis, sehingga Clevis menggunakan modul tersebut untuk mengakses perangkat. Ini hanya diperlukan jika kartu tidak didukung oleh perangkat lunak dasar Clevis (OpenSC). Karena alasan ini, bidang jalur modul sepenuhnya opsional. Untuk menyediakan lokasi modul, pengguna dapat menyediakan "jalur modul" ke konfigurasi Clevis "uri":
$ clevis-luks-bind -d /dev/sda1 pkcs11 '{"uri": "pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;
serial=0a35ba26b062b9c5;token=clevis;id=%02;object=Encryption%20Key?
module-path=/usr/local/lib64/libmypkcs11.so"}'
Seperti yang terjadi pada perangkat lainnya, disk terenkripsi yang telah diikat ke perangkat PKCS#11 dapat diperiksa dengan perintah clevis luks list
:
$ clevis luks list -d /dev/sda1
1: pkcs11 '{"uri": "pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;
serial=0a35ba26b062b9c5;token=clevis;id=%02;object=Encryption%20Key?
module-path=/usr/local/lib64/libmypkcs11.so"}'
Pada tahap pertama pengembangan, Clevis akan digunakan di atas OpenSC untuk menyediakan fungsionalitas PKCS#11. OpenSC, dan, khususnya, pkcs11-tool
, memberikan opsi untuk menunjukkan mekanisme yang akan digunakan untuk dekripsi. Untuk tujuan pengujian, beberapa perpustakaan, seperti SoftHSM), tidak bekerja dengan mekanisme pkcs11-tool
default, sehingga diperlukan mekanisme tertentu untuk digunakan. Oleh karena itu, Clevis dapat diberikan mekanisme untuk digunakan, jika mekanisme default, RSA-PKCS-OAEP
, tidak valid:
$ clevis luks bind -d /dev/sda1 pkcs11 '{"uri": "pkcs11:", "mechanism":"RSA-PKCS"}'
Untuk memeriksa mekanisme yang tersedia untuk token tertentu, perintah pkcs11-tool -M
dapat digunakan:
$ pkcs11-tool -M
Using slot 0 with a present token (0x0)
Supported mechanisms:
SHA-1, digest
...
SHA512, digest
MD5, digest
...
RSA-PKCS-KEY-PAIR-GEN, keySize={2048,4096}, generate_key_pair
Saat ini, hanya mekanisme RSA yang didukung oleh Clevis. Karena keterbatasan algoritma lainnya, tidak ada algoritma kriptografi asimetris lain yang dapat melakukan enkripsi dengan mudah. ECC hanya mendukung tanda tangan dan derivasi kunci, tetapi tidak mendukung enkripsi. Operasi enkripsi dapat dibangun dari derivasi kunci, tetapi ini bukanlah operasi yang mudah.
Harus digarisbawahi bahwa mekanisme RSA-PKCS (padding PKCS#1.5 untuk enkripsi) dianggap tidak aman dan sebagian besar disediakan untuk kompatibilitas, namun tidak disarankan untuk menggunakannya dalam produksi.
Clevis akan mengizinkan penentuan slot di mana perangkat PKCS#11 berada melalui parameter yang diberikan ke URI:
$ clevis luks bind -d /dev/sda1 pkcs11 '{"uri": "pkcs11:slot-id=0"}'
Harus diklarifikasi bahwa memberikan informasi slot saja akan membuat Clevis menebak salah satu kunci yang tersedia yang cocok dengan token di slot yang dipilih, yang dapat menyebabkan enkripsi secara tidak sengaja dengan kunci yang tidak diinginkan. Tidak disarankan untuk menggunakan slot sebagai pemilih perangkat, karena id slot adalah angka yang tidak dijamin stabil di seluruh inisialisasi modul PKCS#11 . Namun, ada perpustakaan dan modul tertentu yang menyediakan pengidentifikasi slot yang stabil, sehingga dapat digunakan untuk kasus-kasus tertentu.
Ada dua opsi yang lebih baik untuk membedakan perangkat PKCS#11 yang berbeda:
1 - Konfigurasi multi-perangkat dengan objek kunci publik ( disarankan ):
Dengan versi terbaru OpenSC
(mulai rilis OpenSC 0.26.0) dan seterusnya, pkcs11-tool
, yang digunakan oleh Clevis untuk menangani sebagian besar perintah PKCS#11, URI PKCS#11 dibuang untuk token dan objek dari a tanda tertentu:
$ pkcs11-tool -L | grep uri
uri : pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=42facd1f749ece7f;token=clevis
uri : pkcs11:model=PKCS%2315%20emulated;manufacturer=OpenPGP%20project;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29
$ pkcs11-tool -O --slot-index 1 --type pubkey | grep uri
ising slot 0 with a present token (0x0)
uri: pkcs11:model=PKCS%2315%20emulated;manufacturer=OpenPGP%20project;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29;id=%03;object=Authentication%20key;type=public
Dalam kasus khusus ini, ketika ada beberapa perangkat PKCS#11, pilih kunci publik perangkat tertentu dan ikat ke Clevis:
$ clevis luks bind -d /dev/sda pkcs11 '{"uri":"pkcs11:model=PKCS%2315%20emulated;manufacturer=OpenPGP%20project;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29;id=%03;object=Authentication%20key;type=public"}'
Jika Anda menggunakan jalur modul, Anda harus menggunakan jalur yang dikembalikan saat memberikan opsi --module:
$ pkcs11-tool --module /usr/lib64/libykcs11.so -O --type pubkey | grep uri
/usr/local/bin/pkcs11-tool.manual --module /usr/lib64/libykcs11.so -O --type pubkey | grep uri
Using slot 0 with a present token (0x0)
uri: pkcs11:model=YubiKey%20YK5;manufacturer=Yubico%20%28www.yubico.com%29;serial=28083311;token=YubiKey%20PIV%20%2328083311;id=%03;object=Public%20key%20for%20Key%20Management;type=public
uri: pkcs11:model=YubiKey%20YK5;manufacturer=Yubico%20%28www.yubico.com%29;serial=28083311;token=YubiKey%20PIV%20%2328083311;id=%19;object=Public%20key%20for%20PIV%20Attestation;type=public
$ clevis luks bind -d /dev/sda pkcs11 '{"uri":"pkcs11:model=YubiKey%20YK5;manufacturer=Yubico%20%28www.yubico.com%29;serial=28083311;token=YubiKey%20PIV%20%2328083311;id=%03;object=Public%20key%20for%20Key%20Management;type=public;module-path=/usr/lib64/libykcs11.so"}'
2 - Konfigurasi multi-perangkat dengan spesifikasi serial + token:
Untuk versi di mana pkcs11-tool
tidak membuang URI untuk tokens/objects , identifikasi spesifik akan "dicoba" oleh Clevis dengan menggunakan pasangan serial
perangkat + token label
. Dalam skenario seperti ini, identifikasi dapat dilakukan dengan dua parameter berikut, meskipun model
juga harus disediakan untuk memudahkan Clevis menginformasikan tentang perangkat saat meminta PIN:
# pkcs11-tool -L | grep "token label|serial"
token label : OpenPGP card (User PIN)
serial num : 42facd1f749ece7f
$ clevis luks bind -d /dev/sda pkcs11 '{"uri":"pkcs11:model=PKCS%2315%20emulated;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29"}'
Ingatlah bahwa karakter khusus harus ditentukan dalam mode persen, seperti yang ditentukan dalam RFC 7512: Skema URI PKCS#11.
Untuk instalasi dan konfigurasi fitur clevis PKCS#11, langkah selanjutnya harus diikuti:
1 - Instal dependensi yang diperlukan Clevis, termasuk dependensi PKCS#11:
$ sudo dnf install -y opensc pcsc-lite openssl socat
2 - Perangkat PKCS11 harus dapat diakses melalui “pkcs11-tool”:
$ pkcs11-tool -L
pkcs11-tool -L
Available slots:
Slot 0 (0x0): Yubico YubiKey OTP+CCID 00 00
token label : clevis
...
uri : pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=42facd1f749ece7f;token=clevis
3 - Konfigurasikan perangkat untuk diikat dengan clevis:
$ sudo clevis luks bind -d /dev/sda5 pkcs11 '{"uri":"pkcs11:"}'
Jika diperlukan untuk menyediakan modul yang akan digunakan, hal ini dapat dilakukan melalui parameter URI module-path
:
$ sudo clevis luks bind -d /dev/sda5 pkcs11 '{"uri":"pkcs11:module-path=/usr/lib64/libykcs11.so.2"}'
4 - Aktifkan unit clevis-luks-pkcs11-askpass.socket:
$ sudo systemctl enable --now clevis-luks-pkcs11-askpass.socket
5 - konfigurasi /etc/crypttab:
Agar fitur PKCS#11 berfungsi dengan baik, file /etc/crypttab
harus dikonfigurasi sehingga systemd menggunakan soket AF_UNIX untuk menunggu frasa kunci yang akan membuka kunci disk dan tidak memintanya melalui konsol.
File unit Clevis PKCS#11 akan mengonfigurasi soket di jalur /run/systemd/clevis-pkcs11.sock
untuk mengirim dan menerima informasi tentang pembukaan kunci disk. Untuk disk yang akan dibuka kuncinya melalui pin Clevis PKCS#11, file soket tersebut harus dikonfigurasi sebagai file kunci. Jadi, perubahan selanjutnya harus dilakukan di /etc/crypttab
agar pembukaan kunci dapat dilakukan:
$ sudo diff -Nuar /etc/crypttab.ori /etc/crypttab
--- /etc/crypttab.ori 2024-07-04 10:46:16.295073739 +0200
+++ /etc/crypttab 2024-07-03 17:14:27.764743860 +0200
@@ -1 +1,2 @@
-luks-6e38d5e1-7f83-43cc-819a-7416bcbf9f84 UUID=6e38d5e1-7f83-43cc-819a-7416bcbf9f84 - -
+luks-6e38d5e1-7f83-43cc-819a-7416bcbf9f84 UUID=6e38d5e1-7f83-43cc-819a-7416bcbf9f84 /run/systemd/clevis-pkcs11.sock keyfile-timeout=30s
Sangat disarankan untuk mengatur opsi keyfile-timeout
untuk mengonfigurasi mekanisme fall-through jika terjadi kesalahan pembukaan kunci dan frasa sandi perlu dimasukkan secara manual melalui konsol.
6 - Nyalakan ulang dan uji:
Sistem harus melakukan booting dan meminta PIN perangkat PKCS#11, dan mendekripsi disk terenkripsi yang dikonfigurasi sesuai hanya jika PIN benar.
7 - Jika tidak ada proses boot yang perlu diuji, enkripsi dan dekripsi dengan perintah berikutnya (perhatikan bahwa nilai PIN perlu diberikan agar dapat berfungsi dengan benar) dan pemeriksaan enkripsi/dekripsi string dapat dilakukan dengan satu baris ini , dan tidak ada kesalahan yang terjadi:
$ echo "top secret" | clevis encrypt pkcs11 '{"uri":"pkcs11:module-path=/usr/lib64/libykcs11.so.2?pin-value=123456"}' | clevis decrypt
String top secret
harus dikembalikan
Clevis menyediakan cara untuk menggabungkan pin untuk memberikan kebijakan pembukaan kunci yang canggih. Hal ini dicapai dengan menggunakan algoritma yang disebut Shamir Secret Sharing (SSS).
SSS adalah skema ambang batas. Ini menciptakan kunci dan membaginya menjadi beberapa bagian. Setiap bagian dienkripsi menggunakan pin lain (bahkan mungkin SSS secara rekursif). Selain itu, Anda menentukan ambang batas t
. Jika paling sedikit t
bagian dapat didekripsi, maka kunci enkripsi dapat diperoleh kembali dan dekripsi dapat berhasil.
Berikut ini contoh penggunaan pin SSS dengan pin Tang dan TPM2:
$ echo hi | clevis encrypt sss
' {"t": 2, "pins": {"tpm2": {"pcr_ids": "0"}, "tang": {"url": "http://tang.local"}}} '
> hi.jwe
Pada contoh di atas, kita mendefinisikan dua pin anak dan memiliki ambang batas 2. Artinya, selama dekripsi, kedua pin anak harus berhasil agar SSS itu sendiri berhasil.
Berikut adalah contoh lain di mana kami hanya menggunakan pin Tang:
$ echo hi | clevis encrypt sss
' {"t": 1, "pins": {"tang": [{"url": "http://server1.local/key"}, {"url": "http://server2.local/key"}]}} '
> hi.jwe
Dalam contoh ini, kami mendefinisikan dua instance anak dari pin Tang - masing-masing dengan konfigurasinya sendiri. Karena kita memiliki ambang batas 1, jika salah satu contoh pin Tang berhasil selama dekripsi, SSS akan berhasil.
Clevis dapat digunakan untuk mengikat volume LUKS menggunakan pin sehingga dapat dibuka kuncinya secara otomatis.
Cara kerjanya cukup sederhana. Kami menghasilkan kunci baru yang kuat secara kriptografis. Kunci ini ditambahkan ke LUKS sebagai frasa sandi tambahan. Kami kemudian mengenkripsi kunci ini menggunakan Clevis, dan menyimpan keluaran JWE di dalam header LUKS menggunakan LUKSMeta.
Berikut adalah contoh di mana kita mengikat /dev/sda1
menggunakan pin Tang:
$ sudo clevis luks bind -d /dev/sda1 tang ' {"url": "http://tang.local"} '
The advertisement is signed with the following keys:
kWwirxc5PhkFIH0yE28nc-EvjDY
Do you wish to trust the advertisement ? [yN] y
Enter existing LUKS password:
Setelah berhasil menyelesaikan proses pengikatan ini, disk dapat dibuka kuncinya menggunakan salah satu pembuka kunci yang disediakan.
Jika Anda ingin menggunakan pembukaan kunci berbasis jaringan, Anda perlu menentukan rd.neednet=1
sebagai argumen kernel atau menggunakan --hostonly-cmdline
saat membuat dengan dracut.
Jika Anda menggunakan Tang dengan TLS (Contoh: '{"url": "https://tang.remote"}'
), folder /etc/ssl
harus disertakan dalam gambar initramfs, --include /etc/ssl /etc/ssl --force
saat membuat dengan dracut.
Pembuka Dracut mencoba membuka kunci volume secara otomatis selama boot awal. Ini memungkinkan enkripsi volume root otomatis. Mengaktifkan pembuka kunci Dracut itu mudah. Bangun kembali initramfs Anda setelah menginstal Clevis:
$ sudo dracut -f
Setelah reboot, Anda akan diminta untuk membuka kunci volume menggunakan kata sandi. Di latar belakang, Clevis akan mencoba membuka kunci volume secara otomatis. Jika berhasil, permintaan kata sandi akan dibatalkan dan booting akan dilanjutkan.
Saat menggunakan Clevis dengan initramfs-tools, untuk membangun kembali initramfs, Anda perlu menjalankan:
sudo update-initramfs -u -k ' all '
Setelah reboot, ia akan berperilaku persis seperti menggunakan Dracut.
Pembuka UDisks2 kami berjalan di sesi desktop Anda. Anda tidak perlu mengaktifkannya secara manual; cukup instal pembuka kunci Clevis UDisks2 dan mulai ulang sesi desktop Anda. Pembuka kunci harus dimulai secara otomatis.
Pembuka kunci ini bekerja hampir persis sama dengan pembuka kunci Dracut. Jika Anda memasukkan perangkat penyimpanan yang dapat dilepas yang telah terikat dengan Clevis, kami akan mencoba membuka kuncinya secara otomatis bersamaan dengan permintaan kata sandi desktop. Jika pembukaan kunci otomatis berhasil, permintaan kata sandi akan ditutup tanpa campur tangan pengguna.
Perangkat LUKS yang terikat pada kebijakan Clevis juga dapat dibuka kuncinya dengan menggunakan perintah buka kunci clevis luks.
$ sudo clevis luks unlock -d /dev/sda1
Volume LUKS dapat dilepas ikatannya menggunakan perintah clevis luks unbind. Misalnya:
$ sudo clevis luks unbind -d /dev/sda1 -s 1
Pin yang terikat pada volume LUKS tertentu dapat didaftar menggunakan perintah clevis luks list. Misalnya:
$ sudo clevis luks list -d /dev/sda1
Tolong jangan menginstal Clevis secara langsung. Sebagai gantinya, gunakan paket distribusi pilihan Anda.
Perintah ini menginstal perintah inti Clevis, masing-masing pembuka kunci Dracut dan pembuka kunci UDisks2.
$ sudo dnf install clevis clevis-dracut clevis-udisks2
Seperti disebutkan di bagian sebelumnya, disarankan untuk tidak menginstal Clevis secara langsung . Namun, jika tidak ada paket Clevis untuk distribusi Linux Anda, langkah-langkah untuk mengkompilasi dan menginstal Clevis secara manual adalah sebagai berikut:
$ wget https://github.com/latchset/clevis/releases/download/v21/clevis-21.tar.xz
$ tar Jxvf clevis-21.tar.xz
$ cd clevis-21
$ mkdir build
$ cd build
meson
untuk mengatur kompilasi: $ meson setup ..
ninja
: $ ninja
ninja install
(Anda memerlukan izin root untuk itu): $ sudo ninja install