ProtectHome έναντι σπόρου TOTP: γιατί αποτυγχάνει η σύνδεση VPN
Ένας σωστός κωδικός δεν βοηθά μια μονάδα PAM που δεν μπορεί να ανοίξει τον σπόρο. Διαλέξτε ανάμεσα σε drop-in και σε εγγράψιμη διαδρομή κατάστασης και μετά ελέγξτε τη μονάδα.
Ο αυθεντικοποιητής δείχνει έναν νέο εξαψήφιο κωδικό, το VPN τον απορρίπτει, και ο ίδιος κωδικός επαληθεύεται κανονικά όταν τον δοκιμάζετε από το δικό σας κέλυφος. Αυτό το χάσμα είναι όλη η ιστορία. Μια μονάδα PAM που δεν μπορεί να ανοίξει το μυστικό εγγραφής επιστρέφει αποτυχία που μοιάζει ίδια με λάθος κωδικό, και το περιβάλλον της υπηρεσίας που κρύβει τους προσωπικούς καταλόγους είναι συνηθισμένη αιτία. Πριν χαλαρώσετε οποιαδήποτε άδεια, αποφασίστε σε ποια από τις τρεις καταστάσεις βρίσκεστε.
Ποια από τις τρεις αποτυχίες είναι;
Η πρώτη είναι ένα μυστικό που η μονάδα δεν μπορεί καθόλου να διαβάσει. Η δεύτερη είναι ένα μυστικό που μπορεί να διαβάσει αλλά όχι να ενημερώσει. Η τρίτη είναι ένας κωδικός που είναι πραγματικά λάθος, συνήθως λόγω μετατόπισης ρολογιού ή επαναχρησιμοποιημένης τιμής.
Ξεχωρίστε τις διαβάζοντας το ημερολόγιο της υπηρεσίας και το αρχείο αυθεντικοποίησης του συστήματος για μία αποτυχημένη προσπάθεια, και μετά επιβεβαιώστε ποια υπηρεσία PAM φορτώνει το πρόσθετο και ποια γραμμή μονάδας χρησιμοποιεί αυτή η υπηρεσία. Ένα γενικό μήνυμα αποτυχίας αυθεντικοποίησης δεν τις ξεχωρίζει, ούτε μια επιτυχημένη χειροκίνητη δοκιμή, γιατί το κέλυφός σας δεν είναι το περιβάλλον της υπηρεσίας.
Η όψη του συστήματος αρχείων στη μονάδα είναι ο συνήθης ένοχος όταν αποτυγχάνει μόνο η υπηρεσία.
systemctl show -p ProtectHome -p ProtectSystem -p ReadWritePaths [email protected]
ls -l /var/lib/vpn-otp/*/.google_authenticator 2>/dev/null | head -n 20Επιλογή A: μετακινήστε το μυστικό έξω από τον προσωπικό κατάλογο
Όταν η υπηρεσία κρύβει το /home και προτιμάτε να κρατήσετε αυτή την προστασία, αποθηκεύστε το μυστικό κάπου που μπορεί να το δει. Η μονάδα δέχεται διαδρομή secret= και λογαριασμό user= που εκτελεί τις εργασίες αρχείων, κάτι που επιτρέπει σε ένα κεντρικό αποθετήριο να εξυπηρετεί πολλές ταυτότητες.
Αυτή είναι η τακτοποιημένη επιλογή και χρειάζεται την περισσότερη προσοχή, γιατί ένα κοινόχρηστο αποθετήριο κάνει έναν κατάλογο το όριο ασφαλείας για κάθε λογαριασμό.
auth required pam_google_authenticator.so secret=/var/lib/vpn-otp/${USER}/.google_authenticator user=vpn-otpΕλέγξτε τρία πράγματα πριν το εμπιστευτείτε: ο λογαριασμός υπάρχει, η διεργασία της μονάδας μπορεί να μεταβεί σε αυτόν, και τα αρχεία ανήκουν σε αυτόν με περιοριστικές λειτουργίες. Μη χρησιμοποιείτε ~ ή διαδρομή με μεταβλητή προσωπικού καταλόγου μαζί με user=, και μην απενεργοποιείτε τους ελέγχους ιδιοκτησίας της μονάδας για να δουλέψει μια διαδρομή. Κρατήστε το στάδιο κωδικού πρόσβασης και την υπόλοιπη στοίβα άθικτα.
Επιλογή B: αφήστε το αρχείο και ανοίξτε μια διαδρομή
Αν το μυστικό πρέπει να μείνει στον προσωπικό κατάλογο του χρήστη, η μονάδα χρειάζεται όψη που περιλαμβάνει αυτόν τον έναν κατάλογο χωρίς να εκθέτει κάθε προσωπικό κατάλογο στον κεντρικό υπολογιστή. Ένα drop-in μπορεί να προσθέσει ένα στενά περιορισμένο bind mount κάτω από έναν απομονωμένο προσωπικό κατάλογο.
Αυτό κρατά την ιδιοκτησία ανά χρήστη ως μοντέλο, με κόστος μια αλλαγή στη μονάδα που πρέπει να ελέγχεται κάθε φορά που αλλάζει το sandbox.
Δύο όρια περνούν εύκολα απαρατήρητα. Μια διαδρομή μόνο για ανάγνωση που προστίθεται κάτω από κατάλογο που κρύβει το sandbox δεν τον εκθέτει, γιατί ο γονέας απλώς δεν υπάρχει. Και το mount πρέπει να είναι εγγράψιμο αν η μονάδα πρέπει να ενημερώνει κατάσταση, κάτι που φέρνει την επόμενη επιλογή στο παιχνίδι. Γράψτε το drop-in ως ξεχωριστό αρχείο αντί να επεξεργάζεστε τη συσκευασμένη μονάδα κάτω από το /usr/lib, ώστε μια αναβάθμιση πακέτου να μην το αναιρέσει σιωπηλά.
Επιλογή C: κρατήστε το sandbox και διορθώστε τις εγγραφές κατάστασης
Η ανάγνωση του μυστικού είναι μόνο το μισό της αυθεντικοποίησης. Η μονάδα μπορεί να ξαναγράψει πληροφορίες χρονικής απόκλισης, προστασία επανάληψης ή έναν μετρητή, και ένα αρχείο που περνά τον έλεγχο ανάγνωσης μπορεί ακόμη να αποτύχει στην εγγραφή.
Αυτή η αποτυχία μοιάζει με κακό κωδικό στην επόμενη προσπάθεια και όχι σε αυτήν, γι' αυτό συγχέεται με μετατόπιση ρολογιού.
Δώστε της δικό της εγγράψιμο κατάλογο και κατευθύνετε εκεί τη διαδρομή του μυστικού, αντί να κάνετε εγγράψιμο όλο τον προσωπικό κατάλογο. Επιβεβαιώστε τον ιδιοκτήτη του καταλόγου, τον ελεύθερο χώρο του συστήματος αρχείων και αν η μονάδα περιορίζει εγγραφές αλλού. Μετά δοκιμάστε δύο διαδοχικές συνδέσεις, γιατί η δεύτερη αποδεικνύει τη διαδρομή εγγραφής και η πρώτη μόνο την ανάγνωση.
Επαληθεύστε ως η υπηρεσία, όχι ως ο εαυτός σας
Κάθε έλεγχος που μετράει πρέπει να εκτελείται μέσα στο sandbox της μονάδας με την ταυτότητα της μονάδας.
Μια εντολή που πετυχαίνει ως root σας λέει ότι το αρχείο υπάρχει και τίποτα άλλο. Μια σύνδεση μέσω της πραγματικής υπηρεσίας σας λέει αν η μονάδα μπορεί να διαβάσει το μυστικό, να το χρησιμοποιήσει και να ξαναγράψει ό,τι χρειάζεται.
Τέλος, κρατήστε την απαίτηση άθικτη. Η προσθήκη επιλογής κωδικού μηδενικού μήκους, η αποδοχή αποτυχιών μόνο ανάγνωσης ή η αφαίρεση του sandbox θα έκαναν το σύμπτωμα να εξαφανιστεί αλλάζοντας την πολιτική. Ένας χρήστης που υποχρεούται να παρουσιάσει κωδικό πρέπει ακόμη να απορρίπτεται όταν το μυστικό είναι απρόσιτο.