Αποκρυπτογράφηση ενός κοντέινερ LUKS κατά την εκκίνηση του συστήματος

Καλή μέρα και νύχτα σε όλους! Αυτή η ανάρτηση θα είναι χρήσιμη για όσους χρησιμοποιούν κρυπτογράφηση δεδομένων LUKS και θέλουν να αποκρυπτογραφήσουν δίσκους στο Linux (Debian, Ubuntu) στο στάδια αποκρυπτογράφησης του ριζικού διαμερίσματος. Και δεν μπορούσα να βρω τέτοιες πληροφορίες στο Διαδίκτυο.

Πιο πρόσφατα, με την αύξηση του αριθμού των δίσκων στα ράφια, αντιμετώπισα το πρόβλημα της αποκρυπτογράφησης δίσκων χρησιμοποιώντας την παραπάνω από γνωστή μέθοδο μέσω του /etc/crypttab. Προσωπικά, επισημαίνω μερικά προβλήματα με τη χρήση αυτής της μεθόδου, δηλαδή ότι το αρχείο διαβάζεται μόνο μετά τη φόρτωση (προσάρτηση) του ριζικού διαμερίσματος, το οποίο επηρεάζει αρνητικά τις εισαγωγές ZFS, ιδίως εάν δημιουργήθηκαν από κατατμήσεις σε συσκευή *_crypt ή επιδρομές mdadm που δημιουργήθηκαν επίσης από κατατμήσεις. Όλοι γνωρίζουμε ότι μπορείτε να χρησιμοποιήσετε χωριστή σε δοχεία LUKS, σωστά; Και επίσης το πρόβλημα της πρόωρης έναρξης άλλων υπηρεσιών, όταν δεν υπάρχουν ακόμα συστοιχίες, αλλά χρήση Χρειάζομαι ήδη κάτι (δουλεύω με συγκεντρωμένα Proxmox VE 5.x και ZFS μέσω iSCSI).

Λίγα λόγια για το ZFSoverISCSIΤο iSCSI λειτουργεί για μένα μέσω του LIO, και μάλιστα, όταν ο στόχος iscsi ξεκινά και δεν βλέπει συσκευές ZVOL, απλώς τις αφαιρεί από τη διαμόρφωση, κάτι που εμποδίζει την εκκίνηση των φιλοξενούμενων συστημάτων. Ως εκ τούτου, είτε η επαναφορά ενός αντιγράφου ασφαλείας του αρχείου json είτε η μη αυτόματη προσθήκη συσκευών με αναγνωριστικά για κάθε VM, κάτι που είναι απλά τρομερό όταν υπάρχουν δεκάδες τέτοια μηχανήματα και κάθε διαμόρφωση έχει περισσότερους από 1 δίσκο.

Και η δεύτερη ερώτηση που θα εξετάσω είναι πώς γίνεται η αποκρυπτογράφηση (αυτό είναι το βασικό σημείο του άρθρου). Και θα μιλήσουμε για αυτό παρακάτω, πηγαίνετε κάτω από το κόψιμο!

Τις περισσότερες φορές, στο Διαδίκτυο, χρησιμοποιείται ένα αρχείο κλειδιού (αυτό προστίθεται στην υποδοχή πριν από αυτό με την εντολή - cryptsetup luksAddKey), ή σε σπάνιες εξαιρέσεις (στο ρωσικό Διαδίκτυο υπάρχουν πολύ λίγες πληροφορίες) - το σενάριο decrypt_derived βρίσκεται στο /lib/cryptsetup/script/ (φυσικά, υπάρχουν και άλλοι τρόποι, αλλά χρησιμοποίησα αυτούς τους δύο, που αποτέλεσαν τη βάση του άρθρου). Προσπάθησα επίσης για την πλήρη αυτόνομη συμπερίληψη μετά τις επανεκκινήσεις, χωρίς πρόσθετες εντολές στην κονσόλα, έτσι ώστε όλα να «πετάξουν» για μένα αμέσως. Επομένως, γιατί να περιμένετε; —

Ας ξεκινήσουμε!

Ας υποθέσουμε ότι ένα σύστημα, όπως το Debian, είναι εγκατεστημένο σε ένα διαμέρισμα κρυπτογράφησης sda3_crypt και σε δώδεκα δίσκους έτοιμους να κρυπτογραφηθούν και να δημιουργηθούν με βάση το περιεχόμενο της καρδιάς σας. Έχουμε μια φράση πρόσβασης (φράση πρόσβασης) για να ξεκλειδώσετε το sda3_crypt, και από αυτό το διαμέρισμα θα αφαιρέσουμε το "hash" από τον κωδικό πρόσβασης στο τρέχον (αποκρυπτογραφημένο) σύστημα και θα το προσθέσουμε στους υπόλοιπους δίσκους. Όλα είναι στοιχειώδη, στην κονσόλα που εκτελούμε:

/lib/cryptsetup/scripts/decrypt_derived sda3_crypt | cryptsetup luksFormat /dev/sdX

όπου Χ είναι οι δίσκοι μας, οι κατατμήσεις κ.λπ.

Αφού κρυπτογραφήσετε τους δίσκους με ένα "hash" από τη φράση πρόσβασής μας, πρέπει να μάθετε το UUID ή το ID - ανάλογα με το ποιος είναι συνηθισμένος σε τι και τι. Λαμβάνουμε δεδομένα από /dev/disk/by-uuid και by-id αντίστοιχα.

Το επόμενο βήμα είναι η προετοιμασία αρχείων και mini-scripts για τις λειτουργίες που χρειαζόμαστε, ας προχωρήσουμε:

cp -p /usr/share/initramfs-tools/hooks/cryptroot /etc/initramfs-tools/hooks/
cp -p /usr/share/initramfs-tools/scripts/local-top/cryptroot /etc/initramfs-tools/scripts/local-top/

περαιτέρω

touch /etc/initramfs-tools/hooks/decrypt && chmod +x /etc/initramfs-tools/hooks/decrypt

Περιεχόμενα ../αποκρυπτογράφηση

#!/bin/sh

cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived"

περαιτέρω

touch /etc/initramfs-tools/hooks/partcopy && chmod +x /etc/initramfs-tools/hooks/partcopy

Τα περιεχόμενα του ../partcopy

#!/bin/sh

cp -p /sbin/partprobe "$DESTDIR/bin/partprobe"
cp -p /lib/x86_64-linux-gnu/libparted.so.2 "$DESTDIR/lib/x86_64-linux-gnu/libparted.so.2"
cp -p /lib/x86_64-linux-gnu/libreadline.so.7 "$DESTDIR/lib/x86_64-linux-gnu/libreadline.so.7"

λίγο ακόμα

touch /etc/initramfs-tools/scripts/local-bottom/partprobe && chmod +x /etc/initramfs-tools/scripts/local-bottom/partprobe

Περιεχόμενο ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

και τελευταίο, πριν από το update-initramfs, πρέπει να επεξεργαστείτε το αρχείο /etc/initramfs-tools/scripts/local-top/cryptroot, ξεκινώντας από τη γραμμή ~360, απόσπασμα κώδικα παρακάτω

Πρωτότυπο


                # decrease $count by 1, apparently last try was successful.
                count=$(( $count - 1 ))
                
                message "cryptsetup ($crypttarget): set up successfully"
                break

και φέρτε το σε αυτή τη μορφή

Επεξεργάστηκε


                # decrease $count by 1, apparently last try was successful.
                count=$(( $count - 1 ))
                

                /bin/decrypt_derived $crypttarget | cryptsetup luksOpen /dev/disk/by-uuid/ *CRYPT_MAP*
                /bin/decrypt_derived $crypttarget | cryptsetup luksOpen /dev/disk/by-id/ *CRYPT_MAP*

                message "cryptsetup ($crypttarget): set up successfully"
                break

Σημειώστε ότι εδώ μπορούν να χρησιμοποιηθούν είτε UUID είτε ID. Το κύριο πράγμα είναι ότι τα απαραίτητα προγράμματα οδήγησης για συσκευές HDD / SSD προστίθενται στο /etc/initramfs-tools/modules. Μπορείτε να μάθετε ποιο πρόγραμμα οδήγησης χρησιμοποιείται με την εντολή udevadm info -a -n /dev/sdX | egrep "κοιτάζω|ΟΔΗΓΟΣ".

Τώρα που τελειώσαμε και όλα τα αρχεία είναι στη θέση τους, εκτελέστε ενημέρωση-initramfs -u -k όλα -v, στην καταγραφή δεν πρέπει να είναι σφάλματα εκτέλεσης των σεναρίων μας. Κάνουμε επανεκκίνηση, εισάγουμε τη φράση πρόσβασης και περιμένουμε λίγο, ανάλογα με τον αριθμό των δίσκων. Στη συνέχεια, το σύστημα θα ξεκινήσει και στο τελικό στάδιο της εκκίνησης, δηλαδή μετά την «προσάρτηση» του ριζικού διαμερίσματος, θα εκτελεστεί η εντολή partprobe - θα βρει και θα παραλάβει όλα τα δημιουργημένα διαμερίσματα σε συσκευές LUKS και τυχόν συστοιχίες, είτε πρόκειται για ZFS είτε mdadm, θα συναρμολογηθεί χωρίς προβλήματα! Και όλα αυτά πριν τη φόρτωση βασικές υπηρεσίες και υπηρεσίες που χρειάζονται αυτούς τους δίσκους/συστοιχίες.

ενημέρωση1: Πως Παρατήρησα AEP, αυτή η μέθοδος λειτουργεί μόνο για το LUKS1.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο