बूट पर कई एन्क्रिप्टेड डिस्क को अनलॉक करने के लिए एक एकल पासफ़्रेज़ का उपयोग करना


23

मेरी मशीन में एक एसएसडी है, जहां मैंने सिस्टम और एक एचडीडी स्थापित किया है, जिसका उपयोग मैं बड़े और / या अक्सर उपयोग की जाने वाली फ़ाइलों के लिए भंडारण के रूप में करता हूं। दोनों एन्क्रिप्टेड हैं, लेकिन मैंने उनके लिए समान पासफ़्रेज़ का उपयोग करने का विकल्प चुना। SSD पर /और HDD पर /usr/hdd(अलग-अलग उपयोगकर्ताओं को इस पर एक निर्देशिका है और वे घर की निर्देशिका से जैसे चाहें सहानुभूति कर सकते हैं) पर मुहिम शुरू की है ।

जब सिस्टम बूट हो जाता है, तो यह तुरंत SSD के लिए पासफ़्रेज़ मांगता है, और HDD के लिए बस कुछ सेकंड बाद (यह ऑटो-माउंटेड होता है)। यह देखते हुए कि दोनों पासफ़्रेज़ समान हैं, क्या सिस्टम को केवल एक बार पूछने के लिए कॉन्फ़िगर करने का एक तरीका है?


आप संभवतः एक expectस्क्रिप्ट या समान लिख सकते हैं जिसे सिस्टम को करने के बजाय डिस्क को माउंट करने के लिए कहा जाता है। इसके बजाय, सिस्टम उस स्क्रिप्ट को कॉल करेगा जो पासवर्ड के लिए पूछेगा, इसे स्टोर करेगा, और इसे प्रत्येक माउंट ऑपरेशन में प्रदान करेगा।
hrrrmiller

अगर मैं आपके विचार को सही ढंग से समझता हूं, तो यह एसएसडी पर लागू नहीं हो सकता है, क्योंकि यह सिस्टम बूट से है। लेकिन फिर यह व्यर्थ हो जाता है, क्योंकि मुझे अभी भी एचडीडी के लिए अलग से पासफ़्रेज़ टाइप करना होगा। याँ नहीं?
doublep


1
@ajonwryan अगर उस उत्तर को विस्तारित किया जा सकता है तो ... उत्तर को उत्तर के रूप में पोस्ट किया जाना चाहिए, टिप्पणियों पर नहीं।
derobert

1
@derobert कभी-कभी लोगों के पास अच्छा जवाब लिखने के लिए समय, या झुकाव नहीं होता है।
jasonwryan

जवाबों:


24

डेबियन आधारित वितरण:

डेबियन और उबंटू एक पासवर्ड कैशिंग स्क्रिप्ट decrypt_keyctl को cryptsetup पैकेज के साथ शिप करते हैं ।

decrypt_keyctl स्क्रिप्ट कई एन्क्रिप्टेड LUKS लक्ष्यों को एक ही पासवर्ड प्रदान करती है, जो आपको कई बार इसे टाइप करने से बचाती है । इसे क्रिप्टैब में keyscript=decrypt_keyctlविकल्प के साथ सक्षम किया जा सकता है। उसी पासवर्ड का उपयोग उन लक्ष्यों के लिए किया जाता है जिनकी कीफ़ाइल फ़ील्ड में समान पहचानकर्ता होती है । प्रत्येक पहचानकर्ता के लिए बूट पासवर्ड पर एक बार पूछा जाता है।

एक उदाहरण 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

अपने क्रिप्टबेड को अपडेट करने के बाद , आपको परिवर्तनों को लागू करने के लिए initramfs को भी अपडेट करना होगा। का उपयोग करें update-initramfs -u

Decrypt_keyctl के लिए पूर्ण रीडमी में स्थित है /usr/share/doc/cryptsetup/README.keyctl

दुर्भाग्य से, यह वर्तमान में एक बग के कारण सिस्टमड इनिट का उपयोग करते हुए डेबियन सिस्टम पर काम नहीं करता है (अन्य init सिस्टम अप्रभावित होना चाहिए)। डेबियन क्रिप्टैब मैन पेजinitramfs बूट के initramfs चरण को संसाधित करने के लिए विकल्प का उपयोग करने के लिए वैकल्पिक हल के रूप में सुझाता है ।


वितरण जो डिक्रिप्ट_कीक्टल स्क्रिप्ट प्रदान नहीं करते हैं :

यदि आपके वितरण द्वारा decrypt_keyctrl प्रदान नहीं किया गया है, तो डिवाइस एन्क्रिप्टेड रूट फ़ाइल सिस्टम में कीफाइल का उपयोग करके अनलॉक किया जा सकता है। यह तब होता है जब रूट फाइल सिस्टम को किसी अन्य एन्क्रिप्टेड डिवाइस से पहले अनलॉक और माउंट किया जा सकता है।

LUKS कई प्रमुख स्लॉट का समर्थन करता है। यह आपको कुंजी फ़ाइल अनुपलब्ध / खो जाने पर पासवर्ड का उपयोग करके वैकल्पिक रूप से डिवाइस को अनलॉक करने की अनुमति देता है।

  1. यादृच्छिक डेटा के साथ कुंजी उत्पन्न करें और इसे लीक से बचने के लिए केवल स्वामी के लिए इसकी अनुमतियाँ सेट करें। ध्यान दें कि मुख्य फ़ाइल को रूट विभाजन पर होना चाहिए जिसे पहले अनलॉक किया गया है।

    dd if=/dev/urandom of=<path to key file> bs=1024 count=1
    chmod u=rw,g=,o= <path to key file>
    
  2. अपने LUKS डिवाइस में कुंजी जोड़ें

    cryptsetup luksAddKey <path to encrypted device> <path to key file>
    
  3. कुंजी फ़ाइल का उपयोग करने के लिए crypttab कॉन्फ़िगर करें। पहली पंक्ति रूट डिवाइस होनी चाहिए, क्योंकि डिवाइस उसी क्रम में अनलॉक किए जाते हैं जैसा कि क्रिप्टैब में सूचीबद्ध है । कुंजी फ़ाइलों के लिए पूर्ण पथ का उपयोग करें।

    <target>      <source>         <keyfile>                  <options>
    root_crypt    /dev/disk/...    none                       luks
    part1_crypt   /dev/disk/...    <path to key file>         luks
    

रीडमी की पहली पंक्तियों से यह बहुत आशाजनक लग रहा है, धन्यवाद। मैं कल इसकी जाँच करूँगा (अब रिबूट नहीं करना चाहता)।
डबल

दुर्भाग्य से, यह काम नहीं करता है (जैसा कि कोई परिवर्तन नहीं)। मेराcrypttab देखें (मैंने UUID=सिस्टम इंस्टॉलर द्वारा बनाया गया स्पर्श नहीं किया, मुझे लगता है कि इससे कोई फर्क नहीं पड़ता) और परिणामस्वरूप प्रविष्टियां हुईं/var/log/syslog । त्रुटियां समझने योग्य हैं, लेकिन मुझे नहीं पता कि उनके बारे में क्या करना है। फ़ाइल /lib/cryptsetup/scripts/decrypt_keyctlमौजूद है, इसलिए मुझे नहीं पता कि यह अज्ञात विकल्प के बारे में क्यों शिकायत करता है। मुझे यह भी पता नहीं है कि
कीफाइल के

क्या आपने यह सत्यापित किया है कि डिक्रिप्ट_कीक्टल को इनट्रैमफैस में शामिल किया गया है? छवि को अपडेट करते समय क्रिया विकल्प का उपयोग करके इसे जांचें: update-initramfs -u -k $(uname -r) -vयह आउटपुट होना चाहिए Adding binary /lib/cryptsetup/scripts/decrypt_keyctl
sebasth

1
lsinitramfs /boot/initrd.img-$(uname -r)
Initramfs

3
उह, क्षमा करें, अब जब मैंने update-initramfsकहा कि मैंने और अधिक ध्यान दिया , तो मैंने इस पर ध्यान दिया E: /usr/share/initramfs-tools/hooks/cryptkeyctl failed with return 1.:। थोड़ा गुगली करने के बाद, मुझे पता चला कि मुझे शायद keyutilsपैकेज की जरूरत है (वास्तव में स्थापित नहीं था)। अब update-initramfsसफल होता है और lsinitramfsउल्लेख करता है decrypt_keytls। अगले बूट (कल होने की संभावना) के बाद अपडेट करेंगे।
डबल

3

यहाँ डेबियन पर मेरा वर्कअराउंड दिया गया है, जिसे ऊपर @sebasth द्वारा संदर्भित बग दिया गया है।

मेरा सेटअप थोड़ा अलग है। मेरे पास एक एन्क्रिप्टेड रूट विभाजन और छापे डिस्क का एक गुच्छा है। मेरे लिए, मुझे क्रिप्टैब में एक इनट्राम्राम्स विकल्प जोड़ना था:

<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

यह अपडेट-इनट्रैमफैट बताता है कि मैं इन क्रिप्टैब एंट्री को इनट्रैमफैट में माउंट करना चाहता हूं। मैंने दौड़कर अपना क्रिप्टैब चेक किया

cryptdisks_start part1_crypt
cryptdisks_start part2_crypt

ध्यान दें कि मेरे छापे डिस्क सादे डीएम-क्रिप्ट हैं। इसका मतलब था कि मैं सिस्टम कुंजीस्क्रिप्ट बग के आसपास काम करने वाली लुक्स कीफाइल विधि का उपयोग नहीं कर सकता था। सादे डीएम-क्रिप्ट के लिए, मुझे पासफ़्रेज़ को प्लेनटेक्स्ट में स्टोर करना होगा।

एन्क्रिप्टेड डिस्क को update-initramfsचलाने से पहले माउंट किया जाना है; अन्यथा यह त्रुटियों को फेंक देगा। जब मेरे initramfs का निर्माण किया गया था, तो मुझे निम्नलिखित पंक्तियों को देखना था:

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

जिसमें निम्नलिखित दो फाइलें दिखाई गई हैं:

/bin/keyctl
cryptkeyctl

initramfs में जोड़ा जा रहा है।

अंत में, मुझे ऊपर उल्लिखित बग से निपटने के लिए अपने क्रिप्टैब को संभालने वाले सिस्टमड को निष्क्रिय करना पड़ा: सिस्टमट क्रिप्टैब में कीस्क्रिप्ट के विकल्प का समर्थन नहीं करता है। इसके लिए, मैंने कर्नेल विकल्प जोड़ा

GRUB_CMDLINE_LINUX_DEFAULT="quiet luks.crypttab=no"     

to / etc / default / grub और भागा update-grub। systemd अब crypttab को अनदेखा करता है, और सभी एन्क्रिप्ट किए गए विभाजन initramfs में लोड किए जाते हैं।

क्योंकि मेरे पास एक एन्क्रिप्टेड रूट पार्टीशन है, क्रिप्टोकरंसी मेरी कुंजी को कैश नहीं करती है। इसका मतलब है कि मुझे अपना पासवर्ड दो बार दर्ज करना होगा; एक रूट विभाजन के लिए और एक बार मेरे रेड सरणी के लिए।


1

एक अन्य विकल्प /lib/cryptsetup/scripts/decrypt_derivedस्क्रिप्ट का उपयोग करना है , जो डेबियन / उबंटू में क्रायसिपेटअप का भी हिस्सा है।

कुंजी को कैशिंग करने के बजाय, आप एक डिस्क की वॉल्यूम कुंजी का उपयोग दूसरी डिस्क के लिए अतिरिक्त पासवर्ड के रूप में करते हैं। इसके लिए दूसरी (और तीसरी, आदि) एन्क्रिप्टेड डिस्क में दूसरा पासवर्ड जोड़ने की आवश्यकता होती है, लेकिन LUKS इसका समर्थन करता है। यह समाधान इसलिए भी काम करता है यदि आपके कई एन्क्रिप्टेड डिस्क एक ही पासवर्ड का उपयोग नहीं करते हैं।

Sda6crypt से sda5 में कुंजी जोड़ने के लिए उदाहरण:

Sda5 के लिए अतिरिक्त पासवर्ड के रूप में sda6crypt की मात्रा कुंजी जोड़ें:

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

Sda5crypt को स्वचालित रूप से अनलॉक करने के लिए कॉन्फ़िगर करें /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

यह fifoडिस्क पर एक अस्थायी फ़ाइल में वॉल्यूम कुंजी को संग्रहीत करने से बचने के लिए कुंजी को पारित करने के लिए एक नामित पाइप ( ) का उपयोग करता है ।

keyscriptविकल्प केवल तभी काम करता है crypttabडेबियन के मूल cryptsetup उपकरण द्वारा संसाधित किया जाता है, systemd reimplementation वर्तमान में इसका समर्थन नहीं करता। यदि आपका सिस्टम systemd (जो कि ज्यादातर सिस्टम है) का उपयोग करता है, तो आपको सिस्टम initramfsशुरू होने से पहले क्रिप्टसैप्टअप टूल्स के द्वारा प्रोसेसिंग को initrd में होने के लिए बाध्य करने के विकल्प की आवश्यकता होती है।

Https://unix.stackexchange.com/a/32551/50793 पर आधारित


कहते हैं कि यह एक सुंदर समाधान है बल्ले से काम किया हिरण 10 बस्टर पर कोई हिचकी नहीं!
Janus
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.