Παύση ενός πελάτη OpenVPN: γιατί η ανάκληση είναι ο λάθος μοχλός
Το να σκοτώσεις τη συνεδρία είναι αναστρέψιμο· το να ανακαλέσεις το πιστοποιητικό δεν είναι. Αποφασίστε ποιος μοχλός ταιριάζει στην περίπτωση και ξαναχτίστε τη CRL μόνο όταν ταιριάζει.
Το να θέσεις σε παύση την πρόσβαση ενός πελάτη και το να τον αφαιρέσεις οριστικά μοιάζουν με την ίδια εργασία μέχρι να προσπαθήσεις να αναιρέσεις το ένα από τα δύο. Η ανάκληση πιστοποιητικού γράφει μια εγγραφή που ο διακομιστής θεωρεί τελική, και η αναίρεσή της σημαίνει χειροκίνητη επεξεργασία της βάσης δεδομένων του εκδότη. Η απόρριψη της ζωντανής σήραγγας είναι μια εντολή διαχείρισης που δεν αλλάζει τίποτα στην εμπιστοσύνη. Διάλεξε τον μοχλό ρωτώντας αν το κλειδί είναι ακόμη αξιόπιστο, όχι ρωτώντας πόσο επείγον φαίνεται το αίτημα.
Η πεποίθηση: ανακλημένο και ανεσταλμένο είναι το ίδιο
Ένας εργολάβος μπαίνει σε παύση για μια εβδομάδα και το αντανακλαστικό είναι η ανάκληση, γιατί η ανάκληση ακούγεται σαν σβήσιμο κάποιου πράγματος. Φαίνεται τακτοποιημένο, παίρνει δέκα δευτερόλεπτα, και αφήνει μια επεξεργασία βάσης δεδομένων ως τη μόνη οδό επιστροφής. Το αντανακλαστικό είναι κατανοητό και είναι πιο κοντά στο κάψιμο ενός διαβατηρίου παρά στο κλείσιμο μιας πόρτας. Μια συσκευή σε παύση και ένα κλειδί που έχει εκτεθεί θέλουν διαφορετική μεταχείριση, και μόνο το ένα από τα δύο είναι φθηνό να αναιρεθεί.
Η διάκριση αφορά το διαπιστευτήριο και όχι το πρόσωπο. Ένα κλειδί που είναι ακόμη στα σωστά χέρια μπορεί να μπει σε παύση και να συνεχιστεί χωρίς καμία απώλεια εμπιστοσύνης. Ένα κλειδί που μπορεί να έχει αντιγραφεί δεν πρέπει ποτέ να αποκατασταθεί, γιατί η αποκατάσταση ισχυρίζεται ότι το αντίγραφο δεν υπάρχει.
Γράψε την απάντηση πριν αγγίξεις οποιοδήποτε από τα δύο συστήματα. Αν δεν μπορείς να πεις αν το κλειδί έχει εκτεθεί, η συντηρητική απάντηση είναι η αντικατάσταση.
Απόρριψε τη ζωντανή συνεδρία με τη διεπαφή διαχείρισης
OpenVPN παρέχει μια διεπαφή διαχείρισης που μπορεί να απαριθμήσει συνεδρίες και να σκοτώσει μία από αυτές με το κοινό όνομα. Ενεργοποίησέ την στο localhost, κράτησέ την μακριά από τη δημόσια διεπαφή, και στείλε την εντολή σκοτώματος όταν μια συνεδρία πρέπει να εξαφανιστεί τώρα. Η εντολή κλείνει μόνο εκείνη τη σήραγγα, και κάθε άλλος πελάτης συνεχίζει να δουλεύει.
Αυτή είναι απάντηση σε ενεργό πρόβλημα, όχι πολιτική αναστολής. Το ίδιο προφίλ μπορεί να συνδεθεί ξανά σε ένα λεπτό, γιατί τίποτα στο διαπιστευτήριό του δεν άλλαξε. Χρησιμοποίησέ την όταν η συνεδρία πρέπει να φύγει και η διαρκής απόφαση λαμβάνεται ακόμη.
Επιβεβαίωσε ότι η συνεδρία ήταν συνδεδεμένη πριν τη σκοτώσεις, ώστε να μην κυνηγάς πελάτη που δεν συνδέθηκε ποτέ. Η εντολή κατάστασης παρακάτω εκτυπώνει τι είναι συνδεδεμένο αυτή τη στιγμή.
printf 'status 2\nquit\n' | nc 127.0.0.1 7506
printf 'kill kiosk-14\nquit\n' | nc 127.0.0.1 7506Αν το σκότωμα αναφέρει ότι δεν υπάρχει τέτοιος πελάτης, το κοινό όνομα στο πιστοποιητικό δεν είναι η συμβολοσειρά που πληκτρολόγησες. Διάβασε την έξοδο κατάστασης αντί για το όνομα του αρχείου προφίλ.
Τι ελέγχει στην πραγματικότητα η CRL
Ο διακομιστής δεν συμβουλεύεται κάποια σημαία ανάκλησης αποθηκευμένη στο πιστοποιητικό. Διαβάζει τη λίστα ανάκλησης πιστοποιητικών που ορίζεται στο crl-verify, σε κάθε νέα σύνδεση, και απορρίπτει πιστοποιητικό του οποίου ο σειριακός αριθμός εμφανίζεται σε εκείνη τη λίστα. Δύο συνέπειες προκύπτουν, και οι δύο μετρούν λειτουργικά. Το αρχείο πρέπει να είναι αναγνώσιμο από τον λογαριασμό στον οποίο ο διακομιστής ρίχνει τα προνόμιά του, και ένας ήδη συνδεδεμένος πελάτης συνεχίζει να τρέχει μέχρι να ξανασυνδεθεί.
Η δεύτερη συνέπεια εκπλήσσει τον κόσμο κατά τη διάρκεια περιστατικών. Η ανάκληση πιστοποιητικού δεν κλείνει τη σήραγγα που το χρησιμοποιεί αυτή τη στιγμή. Συνδύασε την ανάκληση με ένα σκότωμα διαχείρισης αν η συνεδρία πρέπει να τελειώσει αμέσως, και αντιμετώπισε τις δύο ενέργειες ως ξεχωριστά βήματα στο εγχειρίδιο.
Εξέτασε τη λίστα για να δεις τι θα επιβάλει πραγματικά ο διακομιστής, αντί να εμπιστεύεσαι τη χρονοσφραγίδα του τελευταίου αρχείου που αντέγραψες. Το πλήθος των σειριακών αριθμών είναι το κομμάτι που μετράει.
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | sed -n '1,14p'
ls -l /etc/openvpn/server/crl.pemΜια λίστα χωρίς εγγραφές και μια λίστα με τις σωστές εγγραφές φαίνονται ίδιες σε μια καταχώριση καταλόγου, γι αυτό αξίζει να εκτυπώνεται το πλήθος των σειριακών αριθμών. Η γραμμή δικαιωμάτων μετράει εξίσου, γιατί ένα αρχείο που ο δαίμονας δεν μπορεί να διαβάσει παράγει αποτυχία που μοιάζει με απορριφθέντα πελάτη.
Αποκατάσταση μιας εγγραφής, προσεκτικά
Η αποκατάσταση πιστοποιητικού σημαίνει αναστροφή μιας εγγραφής στη βάση έκδοσης και δημοσίευση νέας λίστας. Το easy-rsa 3 κρατά αυτή τη βάση ως index.txt κάτω από τον κατάλογο PKI, ενώ παλαιότερες διατάξεις χρησιμοποιούσαν άλλη οργάνωση. Μια γραμμή ξεκινά με ένα γράμμα κατάστασης και μια ημερομηνία λήξης. Μια ανακλημένη γραμμή εισάγει μια χρονοσφραγίδα για την ανάκληση πριν συνεχίσει με τον σειριακό αριθμό, το όνομα του αρχείου πιστοποιητικού και το διακριτικό όνομα. Το να επαναφέρεις μια γραμμή σημαίνει να διαγράψεις εκείνη τη χρονοσφραγίδα και να αντιστρέψεις το γράμμα, αφήνοντας όλα τα άλλα ήσυχα.
Πάρε πρώτα αντίγραφο ασφαλείας του αρχείου, και γράψε την αλλαγή ως σενάριο αντί να πληκτρολογείς σε επεξεργαστή κειμένου. Ένα τυπογραφικό λάθος που αλλάζει πόσα πεδία κουβαλά μια γραμμή σπάει την έκδοση για κάθε πιστοποιητικό που προστίθεται μετά. Γι αυτό αξίζει να αυτοματοποιήσεις την αλλαγή και να αντιγράψεις το αρχείο πριν το αγγίξεις.
Μια δεύτερη ανάκληση του ίδιου ονόματος συχνά αποτυγχάνει επίσης, γιατί η πρώτη εκτέλεση μετακίνησε εκείνο το πιστοποιητικό και το κλειδί του έξω από τους καταλόγους όπου το εργαλείο περιμένει να τα βρει. Το εργαλείο τότε δεν μπορεί να βρει αυτό που του ζητήθηκε να ανακαλέσει, και το μήνυμα σφάλματος δεν εξηγεί πάντα καθαρά το γιατί.
cp /etc/easy-rsa/pki/index.txt /root/index.txt.$(date +%F-%H%M)
grep -c '^R' /etc/easy-rsa/pki/index.txt
easyrsa gen-crlΔημοσίευσε τη νέα λίστα, διόρθωσε την ιδιοκτησία της, και κάνε τον διακομιστή να τη διαβάσει. Μια επαναφόρτωση αρκεί στις περισσότερες εγκαταστάσεις, αλλά η επιβεβαίωση πρέπει να έρθει από νέα σύνδεση, αφού η υπάρχουσα συνεδρία δεν ξαναέλεγξε τίποτα.
Έλεγξε ποιον μοχλό αξίζει η περίπτωση
Κάνε την ερώτηση που αποφασίζει όλο το εγχειρίδιο: είναι το ιδιωτικό κλειδί ακόμη μόνο εκεί όπου πρέπει να είναι. Αν είναι, το σκότωμα της συνεδρίας μαζί με μια τεκμηριωμένη παύση καλύπτει την περίπτωση και δεν αφήνει μόνιμη εγγραφή. Αν δεν είναι, η μόνη ασφαλής απάντηση είναι νέο κλειδί με το παλιό πιστοποιητικό ανακλημένο.
Έπειτα επιβεβαίωσε το αποτέλεσμα με μια απόπειρα σύνδεσης και όχι με μια διαφορά διαμόρφωσης. Η διαφορά σου λέει τι σκόπευες, και η σύνδεση σου λέει τι επιβάλλει ο διακομιστής.
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | grep -c 'Serial Number'
printf 'status 2\nquit\n' | nc 127.0.0.1 7506Όταν ένας αποκατεστημένος πελάτης συνδεθεί και εμφανιστεί στην έξοδο κατάστασης, η επεξεργασία της εγγραφής δούλεψε. Όταν ένας ανακλημένος πελάτης απορριφθεί και το αρχείο καταγραφής ονομάσει τη CRL, η ανάκληση δούλεψε. Κάθε τι ενδιάμεσο είναι πρόβλημα δικαιωμάτων ή επαναφόρτωσης, και αξίζει να διορθωθεί πριν φτάσει το επόμενο αίτημα.