Clevis เป็นเฟรมเวิร์กที่เสียบได้สำหรับการถอดรหัสอัตโนมัติ สามารถใช้ในการถอดรหัสข้อมูลอัตโนมัติ หรือแม้แต่การปลดล็อควอลุ่ม LUKS โดยอัตโนมัติ
สิ่งนี้มีลักษณะอย่างไร? ขั้นตอนแรกคือการเข้ารหัสข้อมูลบางอย่าง เราทำสิ่งนี้ด้วยคำสั่งง่ายๆ:
$ clevis encrypt PIN CONFIG < PLAINTEXT > CIPHERTEXT.jwe
คำสั่งนี้ใช้ข้อความธรรมดากับอินพุตมาตรฐานและสร้างอ็อบเจ็กต์ JWE ที่เข้ารหัสบนเอาต์พุตมาตรฐาน นอกจากข้อความธรรมดาแล้ว เราจำเป็นต้องระบุพารามิเตอร์อินพุตเพิ่มเติมอีกสองตัว
อย่างแรกคือพิน ในคำศัพท์เฉพาะของเคลวิส พินคือปลั๊กอินที่ใช้การถอดรหัสอัตโนมัติ เราเพียงแค่ส่งชื่อของพินที่นี่
ประการที่สองคือการกำหนดค่า การกำหนดค่าเป็นออบเจ็กต์ JSON ซึ่งจะถูกส่งโดยตรงไปยังพิน ประกอบด้วยการกำหนดค่าที่จำเป็นทั้งหมดเพื่อทำการเข้ารหัสและตั้งค่าการถอดรหัสอัตโนมัติ
ในการถอดรหัส JWE ของเรา เราเพียงดำเนินการดังต่อไปนี้:
$ clevis decrypt < CIPHERTEXT.jwe > PLAINTEXT
โปรดสังเกตว่าไม่จำเป็นต้องป้อนข้อมูลหรือการโต้ตอบเพิ่มเติมสำหรับคำสั่งถอดรหัส ลองดูตัวอย่างที่เป็นรูปธรรมเพิ่มเติม
Tang คือการใช้งานเซิร์ฟเวอร์ที่ให้บริการการเชื่อมโยงการเข้ารหัสโดยไม่จำเป็นต้องมีคนดูแลผลประโยชน์ Clevis สนับสนุน Tang อย่างเต็มที่ นี่คือตัวอย่างวิธีใช้ Clevis กับ 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
ในตัวอย่างนี้ เราเข้ารหัสข้อความ "สวัสดี" โดยใช้ Tang pin พารามิเตอร์เดียวที่จำเป็นในกรณีนี้คือ URL ของเซิร์ฟเวอร์ Tang ในระหว่างขั้นตอนการเข้ารหัส Tang Pin จะขอโฆษณาคีย์จากเซิร์ฟเวอร์และขอให้คุณเชื่อถือคีย์ดังกล่าว สิ่งนี้ทำงานคล้ายกับ SSH
หรือคุณสามารถโหลดโฆษณาด้วยตนเองโดยใช้พารามิเตอร์ adv
พารามิเตอร์นี้รับสตริงที่อ้างอิงถึงไฟล์ที่เก็บโฆษณา หรือเนื้อหา JSON ของโฆษณาเอง เมื่อมีการระบุโฆษณาด้วยตนเองเช่นนี้ Clevis จะถือว่าโฆษณานั้นเชื่อถือได้
Clevis ให้การสนับสนุนการเข้ารหัสคีย์ในชิป Trusted Platform Module 2.0 (TPM2) คีย์สุ่มที่แข็งแกร่งในการเข้ารหัสซึ่งใช้สำหรับการเข้ารหัสจะถูกเข้ารหัสโดยใช้ชิป TPM2 และถูกถอดรหัสโดยใช้ TPM2 ในขณะที่ทำการถอดรหัสเพื่อให้เคลวิสสามารถถอดรหัสความลับที่เก็บไว้ใน JWE
ตัวอย่างเช่น:
$ echo hi | clevis encrypt tpm2 ' {} ' > hi.jwe
Clevis จัดเก็บคีย์สาธารณะและคีย์ส่วนตัวของคีย์ที่เข้ารหัสไว้ในออบเจ็กต์ JWE เพื่อให้สามารถดึงข้อมูลเหล่านั้นได้ในการถอดรหัสเพื่อเปิดผนึกคีย์ที่เข้ารหัสโดยใช้ TPM2
Clevis สามารถทำหน้าที่เป็นแอปพลิเคชัน PKCS#11 ได้ ตามที่อธิบายไว้ใน RFC 7512: The PKCS#11 URI Scheme
โปรโตคอล PKCS#11 กำหนดว่าต้องกำหนดค่า PIN (หมายเลขประจำตัวส่วนบุคคล) ลงในอุปกรณ์ฮาร์ดแวร์เพื่อให้กระบวนการปลดล็อคสำเร็จ Clevis จะอนุญาตให้ผู้ใช้ปลดล็อคดิสก์ที่เข้ารหัสโดยเฉพาะ และจะจัดเตรียมวิธีรับ PIN จะมีความเป็นไปได้สองประการ:
1 - ระบุ PIN ในเวลาบูต: ในกรณีแรกนี้ Clevis จะตรวจพบอุปกรณ์ PKCS#11 และจะถามหา PIN ในกรณีที่ PIN ไม่ถูกต้อง Clevis จะแจ้งให้ป้อน PIN อีกครั้ง เป็นความรับผิดชอบของผู้ใช้ที่จะต้องระวังการล็อค / บริคของอุปกรณ์ที่อาจเกิดขึ้นในกรณีที่ไม่ทราบ PIN
2 - ระบุ PIN ในเวลากำหนดค่า Clevis: ในกรณีที่สองนี้ Clevis จะได้รับการกำหนดค่าด้วยค่า PIN
ในขั้นต้น RFC7512 กำหนดกลไกเพื่อระบุ URI ชนิดพิเศษ ( pkcs11
URI) ที่ช่วยให้สามารถระบุทั้งอุปกรณ์และข้อมูลที่จำเป็นสำหรับการปลดล็อค ความสนใจเป็นพิเศษสมควรได้รับพารามิเตอร์ pin-value
ซึ่งอนุญาตให้ระบุค่าของ PIN หรือตำแหน่งของ PIN ตามลำดับ Clevis จะเข้าใจพารามิเตอร์ 'pin-value' ในตอนแรก คุณสามารถดูและตัวอย่างของ PKCS#11 URI ที่ใช้พารามิเตอร์ก่อนหน้าได้ที่ด้านล่างนี้:
pin-value
: pkcs11:token=Software%20PKCS%2311%20softtoken;manufacturer=Snake%20Oil,%20Inc.?pin-value=the-pin
ในส่วนถัดไป จะมีตัวอย่างการกำหนดค่า Clevis มาให้ เพื่อให้มีความกระจ่างว่าตัวเลือกต่างๆ สำหรับอุปกรณ์ PKCS#11 ที่จะเชื่อมโยงกับดิสก์ที่เข้ารหัสคืออะไร
Clevis จะจัดเตรียมกลไกให้ผู้ใช้สามารถผูกอุปกรณ์ PKCS#11 กับอุปกรณ์ที่เข้ารหัสได้ ชื่อของพินใหม่สำหรับ Clevis จะเป็น pkcs11
และวิธีการกำหนดค่าจะเหมือนกับที่ใช้อยู่ในปัจจุบัน:
$ 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
ตามตัวอย่างแรก ผู้ใช้สามารถให้ข้อมูลของอุปกรณ์โดยการระบุ URI ให้กับ 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"}'
ตัวเลือกเพิ่มเติมคือจัดเตรียมการกำหนดค่า Clevis เพื่อให้อุปกรณ์ PKCS#11 แรกที่ Clevis พบถูกผูกไว้ โดยสามารถระบุ URI ว่างๆ ได้ตามที่แสดงด้านล่าง:
$ clevis luks bind -d /dev/sda1 pkcs11 '{"uri": "pkcs11:"}'
คำสั่งการกำหนดค่าที่สั้นยิ่งขึ้นซึ่งเทียบเท่ากับคำสั่งก่อนหน้านี้แสดงอยู่ด้านล่าง:
$ clevis luks bind -d /dev/sda1 pkcs11 '{}'
ในกรณีนี้ Clevis จะรับผิดชอบในการตรวจจับอุปกรณ์ และหากไม่พบอุปกรณ์ จะต้องรับผิดชอบในการทิ้งข้อผิดพลาดที่เกี่ยวข้อง
จะต้องมีการชี้แจงว่าการระบุ URI ที่ว่างเปล่าจะทำให้ Clevis พร้อมท์ให้เลือกหนึ่งในคีย์ที่พร้อมใช้งานซึ่งตรงกับโทเค็น เพื่อหลีกเลี่ยงการเข้ารหัสด้วยคีย์ที่ไม่ต้องการโดยไม่ตั้งใจ
สามารถระบุเส้นทางโมดูลให้กับ Clevis เพื่อให้ใช้โมดูลนั้นในการเข้าถึงอุปกรณ์ สิ่งนี้จำเป็นเฉพาะในกรณีที่การ์ดไม่รองรับซอฟต์แวร์ Clevis (OpenSC) พื้นฐาน ด้วยเหตุนี้ ฟิลด์พาธของโมดูลจึงเป็นทางเลือกโดยสมบูรณ์ เพื่อระบุตำแหน่งโมดูล ผู้ใช้สามารถจัดเตรียม "เส้นทางโมดูล" ให้กับการกำหนดค่า 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"}'
เมื่อมันเกิดขึ้นกับอุปกรณ์ที่เหลือ คุณสามารถตรวจสอบดิสก์ที่เข้ารหัสซึ่งผูกไว้กับอุปกรณ์ PKCS#11 ได้โดยใช้คำสั่ง 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"}'
ในช่วงแรกของการพัฒนา Clevis จะถูกใช้ที่ด้านบนของ OpenSC เพื่อมอบฟังก์ชันการทำงานของ PKCS#11 OpenSC และโดยเฉพาะอย่างยิ่ง pkcs11-tool
มีตัวเลือกในการระบุกลไกที่จะใช้สำหรับการถอดรหัส เพื่อวัตถุประสงค์ในการทดสอบ ไลบรารีบางแห่ง เช่น SoftHSM) ไม่สามารถใช้งานกับกลไก pkcs11-tool
เริ่มต้นได้ ดังนั้นจึงจำเป็นต้องจัดเตรียมกลไกเฉพาะเพื่อใช้ ด้วยเหตุนี้ Clevis จึงสามารถจัดเตรียมกลไกการใช้งานไว้ได้ ในกรณีที่ค่าเริ่มต้น RSA-PKCS-OAEP
ไม่ถูกต้อง:
$ clevis luks bind -d /dev/sda1 pkcs11 '{"uri": "pkcs11:", "mechanism":"RSA-PKCS"}'
เพื่อตรวจสอบกลไกที่มีอยู่สำหรับโทเค็นเฉพาะ คุณสามารถใช้คำสั่ง pkcs11-tool -M
:
$ 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
ในขณะนี้ เฉพาะกลไก RSA เท่านั้นที่ได้รับการสนับสนุนโดย Clevis เนื่องจากข้อจำกัดของอัลกอริธึมที่เหลือ จึงไม่มีอัลกอริธึมการเข้ารหัสแบบอสมมาตรอื่นใดที่สามารถเข้ารหัสได้อย่างง่ายดาย ECC รองรับเฉพาะลายเซ็นและการสืบทอดคีย์เท่านั้น แต่ไม่รองรับการเข้ารหัส การดำเนินการเข้ารหัสสามารถสร้างขึ้นได้จากการสืบทอดคีย์ แต่ไม่ใช่การดำเนินการที่ตรงไปตรงมา
ต้องเน้นย้ำว่ากลไก RSA-PKCS (การขยาย PKCS#1.5 สำหรับการเข้ารหัส) ถือว่าไม่ปลอดภัย และส่วนใหญ่มีไว้เพื่อความเข้ากันได้ แต่ไม่แนะนำให้ใช้ในการใช้งานจริง
Clevis จะอนุญาตให้ระบุสล็อตที่อุปกรณ์ PKCS#11 ตั้งอยู่ผ่านพารามิเตอร์ที่ให้ไว้กับ URI:
$ clevis luks bind -d /dev/sda1 pkcs11 '{"uri": "pkcs11:slot-id=0"}'
ต้องชี้แจงว่าการระบุเฉพาะข้อมูลสล็อตจะทำให้ Clevis คาดเดาคีย์ใดคีย์หนึ่งที่พร้อมใช้งานซึ่งตรงกับโทเค็นในช่องที่เลือก ซึ่งอาจทำให้เกิดการเข้ารหัสคีย์ที่ไม่ต้องการโดยไม่ตั้งใจ ไม่แนะนำให้ใช้ slot เป็นตัวเลือกอุปกรณ์ เนื่องจาก slot id เป็นตัวเลขที่ไม่รับประกันว่าจะเสถียรในการเริ่มต้นโมดูล PKCS#11 อย่างไรก็ตาม มีไลบรารีและโมดูลบางตัวที่ให้ตัวระบุสล็อตที่เสถียร ดังนั้นจึงสามารถใช้ในกรณีเฉพาะเหล่านี้ได้
มีสองตัวเลือกที่ดีกว่าในการแยกความแตกต่างระหว่างอุปกรณ์ PKCS#11 ที่แตกต่างกัน:
1 - การกำหนดค่าหลายอุปกรณ์ด้วยวัตถุคีย์สาธารณะ ( แนะนำ ):
ด้วย OpenSC
เวอร์ชันล่าสุด (จาก OpenSC 0.26.0 release) เป็นต้นไป pkcs11-tool
ซึ่ง Clevis ใช้เพื่อจัดการคำสั่ง PKCS#11 ส่วนใหญ่ PKCS#11 URI จะถูกทิ้งสำหรับทั้งโทเค็นและอ็อบเจ็กต์ของ โทเค็นเฉพาะ:
$ 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
ในกรณีนี้ เมื่อมีอุปกรณ์ PKCS#11 หลายเครื่อง ให้เลือกคีย์สาธารณะของอุปกรณ์นั้นๆ และผูกเข้ากับ 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"}'
ในกรณีที่คุณใช้ module-path คุณจะต้องใช้อันที่ส่งคืนเมื่อระบุตัวเลือก --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 - การกำหนดค่าหลายอุปกรณ์พร้อมข้อกำหนดซีเรียล + โทเค็น:
สำหรับเวอร์ชันที่ pkcs11-tool
ไม่ดัมพ์ URI สำหรับโทเค็น/อ็อบเจ็กต์ Clevis จะ "ลอง" การระบุตัวตนเฉพาะโดยใช้คู่ serial
ของอุปกรณ์ + token label
ในสถานการณ์ประเภทนี้ การระบุตัวตนสามารถทำได้ด้วยพารามิเตอร์ทั้งสองนี้ แม้ว่าควรจัดเตรียม model
ไว้ด้วยเพื่อให้ Clevis แจ้งเกี่ยวกับอุปกรณ์ได้ง่ายขึ้นเมื่อขอ 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"}'
โปรดจำไว้ว่าต้องกำหนดอักขระพิเศษในโหมดเปอร์เซ็นต์ ตามที่กำหนดไว้ใน RFC 7512: The PKCS#11 URI Scheme
สำหรับการติดตั้งและการกำหนดค่าคุณลักษณะ clevis PKCS#11 ต้องปฏิบัติตามขั้นตอนถัดไป:
1 - ติดตั้งการขึ้นต่อกันที่จำเป็นของ Clevis รวมถึงการขึ้นต่อกันของ PKCS#11:
$ sudo dnf install -y opensc pcsc-lite openssl socat
2 - อุปกรณ์ PKCS11 ต้องสามารถเข้าถึงได้โดย "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 - กำหนดค่าอุปกรณ์ให้เชื่อมโยงกับเคลวิส:
$ sudo clevis luks bind -d /dev/sda5 pkcs11 '{"uri":"pkcs11:"}'
ในกรณีที่จำเป็นต้องจัดเตรียมโมดูลเพื่อใช้ สามารถทำได้ผ่านพารามิเตอร์ URI module-path
:
$ sudo clevis luks bind -d /dev/sda5 pkcs11 '{"uri":"pkcs11:module-path=/usr/lib64/libykcs11.so.2"}'
4 - เปิดใช้งานหน่วย clevis-luks-pkcs11-askpass.socket:
$ sudo systemctl enable --now clevis-luks-pkcs11-askpass.socket
5 - /etc/crypttab การกำหนดค่า:
เพื่อให้ฟีเจอร์ PKCS#11 ทำงานอย่างเหมาะสม จะต้องกำหนดค่าไฟล์ /etc/crypttab
เพื่อให้ systemd ใช้ซ็อกเก็ต AF_UNIX เพื่อรอคีย์วลีที่จะปลดล็อคดิสก์ และไม่แสดงข้อความผ่านคอนโซล
ไฟล์หน่วย Clevis PKCS#11 จะกำหนดค่าซ็อกเก็ตในพาธ /run/systemd/clevis-pkcs11.sock
เพื่อส่งและรับข้อมูลเกี่ยวกับการปลดล็อคดิสก์ สำหรับดิสก์ที่จะปลดล็อคผ่าน PKCS#11 Clevis pin ไฟล์ซ็อกเก็ตนั้นจะต้องได้รับการกำหนดค่าเป็นไฟล์คีย์ ดังนั้น การเปลี่ยนแปลงครั้งต่อไปจะต้องถูกนำมาใช้ใน /etc/crypttab
เพื่อให้การปลดล็อคเกิดขึ้น:
$ 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
ขอแนะนำอย่างยิ่งให้ตั้งค่าตัวเลือก keyfile-timeout
เพื่อกำหนดค่ากลไกการล่มสลายในกรณีที่เกิดข้อผิดพลาดในการปลดล็อคและจำเป็นต้องป้อนข้อความรหัสผ่านด้วยตนเองผ่านคอนโซล
6 - รีบูตและทดสอบ:
ระบบควรบู๊ตและถาม PIN ของอุปกรณ์ PKCS#11 และถอดรหัสดิสก์ที่เข้ารหัสที่กำหนดค่าไว้ที่เกี่ยวข้องในกรณีที่ PIN ถูกต้องเท่านั้น
7 - ในกรณีที่ไม่จำเป็นต้องทดสอบกระบวนการบูต ให้เข้ารหัสและถอดรหัสด้วยคำสั่งถัดไป (โปรดทราบว่าจำเป็นต้องระบุค่า PIN เพื่อให้ทำงานอย่างเหมาะสม) และตรวจสอบการเข้ารหัส/ถอดรหัสของสตริงที่สามารถทำได้ด้วยซับเดียวนี้ และไม่มีข้อผิดพลาดเกิดขึ้น:
$ echo "top secret" | clevis encrypt pkcs11 '{"uri":"pkcs11:module-path=/usr/lib64/libykcs11.so.2?pin-value=123456"}' | clevis decrypt
ควรส่งคืนสตริง top secret
Clevis มีวิธีผสมหมุดเข้าด้วยกันเพื่อให้มีนโยบายการปลดล็อคที่ซับซ้อน ซึ่งทำได้โดยใช้อัลกอริทึมที่เรียกว่า Shamir Secret Sharing (SSS)
SSS เป็นโครงการกำหนดเกณฑ์ขั้นต่ำ มันสร้างคีย์และแบ่งออกเป็นหลายส่วน แต่ละชิ้นถูกเข้ารหัสโดยใช้พินอื่น (อาจเป็น SSS ซ้ำก็ได้) นอกจากนี้ คุณยังกำหนดเกณฑ์ t
หากสามารถถอดรหัสได้อย่างน้อย t
ชิ้น คีย์การเข้ารหัสก็สามารถกู้คืนได้และการถอดรหัสก็สามารถสำเร็จได้
นี่คือตัวอย่างที่เราใช้พิน SSS กับทั้งพิน Tang และ TPM2:
$ echo hi | clevis encrypt sss
' {"t": 2, "pins": {"tpm2": {"pcr_ids": "0"}, "tang": {"url": "http://tang.local"}}} '
> hi.jwe
ในตัวอย่างข้างต้น เรากำหนดพินลูกสองพินและมีเกณฑ์เป็น 2 ซึ่งหมายความว่าในระหว่างการถอดรหัส พินลูก ทั้งสอง จะต้องสำเร็จเพื่อให้ SSS ดำเนินการได้สำเร็จ
นี่เป็นอีกตัวอย่างหนึ่งที่เราใช้เพียง Tang pin:
$ echo hi | clevis encrypt sss
' {"t": 1, "pins": {"tang": [{"url": "http://server1.local/key"}, {"url": "http://server2.local/key"}]}} '
> hi.jwe
ในตัวอย่างนี้ เรากำหนดอินสแตนซ์ย่อยของ Tang pin สองอินสแตนซ์ - แต่ละอินสแตนซ์มีการกำหนดค่าของตัวเอง เนื่องจากเรามีเกณฑ์อยู่ที่ 1 หากอินสแตนซ์ Tang pin ตัวใดตัวหนึ่ง ประสบความสำเร็จในระหว่างการถอดรหัส SSS ก็จะสำเร็จ
สามารถใช้ Clevis เพื่อผูกโวลุ่ม LUKS โดยใช้พินเพื่อให้สามารถปลดล็อคได้โดยอัตโนมัติ
วิธีการทำงานค่อนข้างง่าย เราสร้างคีย์ใหม่ที่มีการเข้ารหัสที่แข็งแกร่ง คีย์นี้ถูกเพิ่มใน LUKS เป็นข้อความรหัสผ่านเพิ่มเติม จากนั้นเราเข้ารหัสคีย์นี้โดยใช้ Clevis และจัดเก็บเอาต์พุต JWE ไว้ในส่วนหัว LUKS โดยใช้ LUKSMeta
นี่คือตัวอย่างที่เราผูก /dev/sda1
โดยใช้ Tang pin:
$ 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:
เมื่อกระบวนการเชื่อมโยงนี้เสร็จสมบูรณ์ ดิสก์สามารถปลดล็อคได้โดยใช้หนึ่งในตัวปลดล็อคที่ให้มา
หากคุณต้องการใช้การปลดล็อคผ่านเครือข่าย คุณจะต้องระบุ rd.neednet=1
เป็นอาร์กิวเมนต์เคอร์เนล หรือใช้ --hostonly-cmdline
เมื่อสร้างด้วย dracut
หากคุณใช้ Tang กับ TLS (ตัวอย่าง: '{"url": "https://tang.remote"}'
) โฟลเดอร์ /etc/ssl
ควรรวมอยู่ในอิมเมจ initramfs --include /etc/ssl /etc/ssl --force
เมื่อสร้างด้วย dracut
ตัวปลดล็อค Dracut จะพยายามปลดล็อคโวลุ่มโดยอัตโนมัติระหว่างการบู๊ตครั้งแรก ซึ่งอนุญาตให้มีการเข้ารหัสโวลุ่มรูทอัตโนมัติ การเปิดใช้งานตัวปลดล็อค Dracut นั้นง่ายมาก เพียงสร้าง initramfs ของคุณใหม่หลังจากติดตั้ง Clevis:
$ sudo dracut -f
เมื่อรีบูต คุณจะได้รับแจ้งให้ปลดล็อคโวลุ่มโดยใช้รหัสผ่าน ในเบื้องหลัง Clevis จะพยายามปลดล็อคระดับเสียงโดยอัตโนมัติ หากสำเร็จ ข้อความแจ้งรหัสผ่านจะถูกยกเลิก และการบูตจะดำเนินต่อไป
เมื่อใช้ Clevis กับ initramfs-tools ในการสร้าง initramfs ใหม่ คุณจะต้องเรียกใช้:
sudo update-initramfs -u -k ' all '
เมื่อรีบูตเครื่องจะทำงานเหมือนกับการใช้ Dracut
ตัวปลดล็อค UDisks2 ของเราทำงานในเซสชันเดสก์ท็อปของคุณ คุณไม่จำเป็นต้องเปิดใช้งานด้วยตนเอง เพียงติดตั้งตัวปลดล็อค Clevis UDisks2 และรีสตาร์ทเซสชันเดสก์ท็อปของคุณ ตัวปลดล็อคควรเริ่มทำงานโดยอัตโนมัติ
ตัวปลดล็อคนี้ทำงานเกือบจะเหมือนกับตัวปลดล็อค Dracut หากคุณใส่อุปกรณ์เก็บข้อมูลแบบถอดได้ที่ผูกกับ Clevis เราจะพยายามปลดล็อคโดยอัตโนมัติพร้อมกับการแจ้งรหัสผ่านบนเดสก์ท็อป หากการปลดล็อคอัตโนมัติสำเร็จ ข้อความแจ้งรหัสผ่านจะถูกปิดโดยที่ผู้ใช้ไม่ต้องดำเนินการใดๆ
อุปกรณ์ LUKS ที่เชื่อมโยงกับนโยบาย Clevis ยังสามารถปลดล็อคได้โดยใช้คำสั่งปลดล็อค clevis luks
$ sudo clevis luks unlock -d /dev/sda1
สามารถยกเลิกการผูกวอลุ่ม LUKS ได้โดยใช้คำสั่ง clevis luks unbind ตัวอย่างเช่น:
$ sudo clevis luks unbind -d /dev/sda1 -s 1
พินที่ผูกไว้กับโวลุ่ม LUKS ที่กำหนดสามารถแสดงรายการได้โดยใช้คำสั่ง clevis luks list ตัวอย่างเช่น:
$ sudo clevis luks list -d /dev/sda1
กรุณาอย่าติดตั้ง Clevis โดยตรง ให้ใช้แพ็คเกจการกระจายที่คุณต้องการแทน
คำสั่งนี้จะติดตั้งคำสั่งหลักของ Clevis, ตัวปลดล็อค Dracut และตัวปลดล็อค UDisks2 ตามลำดับ
$ sudo dnf install clevis clevis-dracut clevis-udisks2
ตามที่กล่าวไว้ในส่วนที่แล้ว แนะนำว่าอย่าติดตั้ง Clevis โดยตรง อย่างไรก็ตาม ในกรณีที่ไม่มีแพ็คเกจ Clevis สำหรับการแจกจ่าย Linux ของคุณ ขั้นตอนในการคอมไพล์และติดตั้ง Clevis ด้วยตนเองจะเป็นขั้นตอนถัดไป:
$ 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
เพื่อตั้งค่าการคอมไพล์: $ meson setup ..
ninja
: $ ninja
ninja install
(คุณจะต้องมีสิทธิ์รูท): $ sudo ninja install