Μια παλιά λύση παράκαμψης μετακίνησε το εκτελέσιμο του OpenVPN αλλού και άφησε ένα περιτύλιγμα shell στην αρχική διαδρομή. Μήνες αργότερα φτάνει μια αναβάθμιση, και η αναίρεση της λύσης γίνεται παιχνίδι εικασιών για το ποιο αρχείο είναι πραγματικά ο πελάτης. Το όνομα της εντολής, το εκτελέσιμο που έχει ρυθμιστεί στην υπηρεσία και η δική του λίστα αρχείων του πακέτου μπορούν όλα να δείχνουν σε διαφορετικά αντικείμενα, και η επισκευή ενός από αυτά χωρίς τα υπόλοιπα παράγει έναν κεντρικό υπολογιστή που φαίνεται διορθωμένος και συμπεριφέρεται χειρότερα.

Ξεκινήστε από τη διαδρομή που εκκινεί η υπηρεσία

Ένα τερματικό και μια μονάδα systemd δεν επιλύουν τα εκτελέσιμα με τον ίδιο τρόπο. Το κέλυφος αναζητά σε ένα PATH· η μονάδα ονομάζει μια διαδρομή, και οι παρακάμψεις drop-in μπορούν να την αντικαταστήσουν χωρίς να αγγίξουν το αρχείο που διαβάζετε. Αυτή η διαφορά εξηγεί το μεγαλύτερο μέρος της σύγχυσης σε αυτή την εργασία. Καθορίζει επίσης σε ποιο αρχείο πρέπει να στοχεύσει η επισκευή σας.

Ρωτήστε τη μονάδα τι εκτελεί, μαζί με τα drop-in που την τροποποιούν, και διαβάστε τη γραμμή ExecStart που προκύπτει αντί για το απόσπασμα που θεωρείτε έγκυρο. Στη συνέχεια ακολουθήστε αυτή τη διαδρομή μέσα από οποιονδήποτε συμβολικό σύνδεσμο μέχρι το τελικό αρχείο. Ένα περιτύλιγμα που τελειώνει με exec σε έναν κρυφό κατάλογο είναι συνηθισμένη διάταξη από αυτές τις παλιές διορθώσεις.

Γράψτε την επιλυμένη διαδρομή πριν αλλάξετε οτιδήποτε.

systemctl cat [email protected] | grep -n 'ExecStart'
readlink -f "$(command -v openvpn)"

Συγκρίνετε το όνομα της εντολής με τη διαδρομή της υπηρεσίας

Οι δύο απαντήσεις συχνά διαφέρουν, και αυτή η διαφορά δεν είναι αυτόματα σφάλμα. Ένα πρόσθετο του NetworkManager μπορεί να εκκινεί τη δική του διαδρομή, και ένα κοντέινερ μπορεί να προσαρτήσει άλλη.

Αυτό που έχει σημασία είναι να ξέρετε ποιος ιδιοκτήτης εκκινεί τη διεργασία που εξυπηρετεί την κίνηση. Αν η μονάδα εκτελεί /usr/local/sbin/openvpn-wrapper ενώ το κέλυφός σας επιλύει /usr/sbin/openvpn, η επισκευή του δεύτερου αρχείου δεν αλλάζει τίποτα στην υπηρεσία.

Ρωτήστε ποιο πακέτο κατέχει κάθε υποψήφιο και μετά αποφασίστε αν το αρχείο διαχειρίζεται από πακέτο ή έχει τοποθετηθεί τοπικά. Ένα αρχείο χωρίς πακέτο που το κατέχει είναι ένα αρχείο που κάποιος έβαλε εκεί σκόπιμα, και αξίζει όνομα, ιδιοκτήτη και αιτία πριν διαγραφεί. Το αντίστροφο λάθος είναι επίσης συνηθισμένο: η αντικατάσταση ενός αρχείου πακέτου με ένα παλιό αποθηκευμένο δυαδικό, επειδή μια δημοσίευση σε φόρουμ χρησιμοποίησε τον ίδιο κατάλογο.

Αφήστε τη βάση δεδομένων πακέτων να μιλήσει για τα αρχεία του πακέτου

Όταν το λογισμικό προήλθε από πακέτο Debian, η βάση δεδομένων πακέτων μπορεί να σας πει αν τα αρχεία του εξακολουθούν να ταιριάζουν με ό,τι εγκαταστάθηκε. Είναι ένα στενό ζήτημα ακεραιότητας, όχι ετυμηγορία ασφαλείας, και η διαφορά μετράει όταν αποφασίζετε τι να επισκευάσετε. Μια αναντιστοιχία σημαίνει ότι το αρχείο άλλαξε μετά την εγκατάσταση, κάτι που μπορεί να είναι η παλιά σας λύση ή μια νόμιμη τοπική τροποποίηση. Η έξοδος δεν καθορίζει ποιο από τα δύο, οπότε διαβάστε την ως ένδειξη και όχι ως συμπέρασμα.

Εκτελέστε την επαλήθευση και διαβάστε την έξοδο αντί να θεωρείτε ένα κενό αποτέλεσμα απόδειξη οτιδήποτε.

dpkg -S /usr/sbin/openvpn
dpkg --verify openvpn

Το εγχειρίδιο του dpkg τεκμηριώνει ότι η επαλήθευση συγκρίνει τα εγκατεστημένα αρχεία με τοπικά καταγεγραμμένα μεταδεδομένα, χρησιμοποιώντας αποθηκευμένα αθροίσματα ελέγχου όπου υπάρχουν. Εντοπίζει ένα αλλαγμένο αρχείο πακέτου και δεν μπορεί να σας πει αν εκτελείται αντ' αυτού κάποιο άλλο δυαδικό.

Καταγράψτε την κατάσταση πριν την επισκευή

Συλλέξτε την επιλυμένη διαδρομή εκκίνησης, τη σχέση του αρχείου με το πακέτο, τη θέση του περιτυλίγματος και την εγγραφή αλλαγής που το εισήγαγε. Αντιγράψτε το περιτύλιγμα σε προστατευμένη θέση αν περιέχει εργασία ενσωμάτωσης που θα χρειαστεί αργότερα.

Μην επικολλάτε το περιεχόμενο του περιτυλίγματος σε ένα νήμα υποστήριξης πριν το διαβάσετε, καθώς αυτά τα σενάρια μερικές φορές μεταφέρουν διαπιστευτήρια ή στοιχεία πύλης.

Καταγράψτε ποια προφίλ χρησιμοποιεί η υπηρεσία και ποιος είναι συνδεδεμένος όσο εργάζεστε, γιατί η επανεκκίνηση της σήραγγας μπορεί να διακόψει τη συνεδρία με την οποία διαχειρίζεστε τον κεντρικό υπολογιστή.

Επαληθεύστε την εκκίνηση και μετά αφαιρέστε το περιτύλιγμα

Μετά την επισκευή, εκκινήστε την υπηρεσία και επιβεβαιώστε ότι η διεργασία εκτελεί τη διαδρομή που σκοπεύατε. Ένα ερώτημα έκδοσης που εκτελείται με το χέρι αποδεικνύει ότι το αρχείο λειτουργεί· δεν αποδεικνύει ότι η μονάδα το χρησιμοποιεί.

Στη συνέχεια επανασυνδέστε έναν πελάτη και ελέγξτε ότι το προφίλ εξακολουθεί να πιστοποιείται, γιατί μια ανταλλαγή δυαδικού που αγνοεί τις αρχικές επιλογές θα αποτύχει με τρόπο που μοιάζει με πρόβλημα πιστοποιητικού.

Αφαιρέστε το μετατοπισμένο περιτύλιγμα μέσω της ίδιας εγγραφής αλλαγής που το εισήγαγε. Η ολοκληρωμένη επισκευή δηλώνει ποιο εκτελέσιμο εκτελείται, γιατί, και ποιο αρχείο αφαιρέθηκε· το να επαναφέρετε ένα όνομα αρχείου και να ελπίζετε δεν είναι το ίδιο πράγμα.

Σχετικά άρθρα