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

Διαχωρίστε ό,τι φορτώθηκε νωρίς από ό,τι ανοίγει αργότερα

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

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

Ένα μεταγενέστερο άνοιγμα είναι άλλη συναλλαγή. Εκτελείται με τα τρέχοντα διαπιστευτήρια, το τρέχον πλαίσιο ασφάλειας και την τρέχουσα όψη προσάρτησης, οπότε μια διαδρομή αναγνώσιμη στην εκκίνηση μπορεί να απορριφθεί στην επόμενη σύνδεση. Η εναλλαγή προσθέτει παγίδα: η εγγραφή νέου αρχείου πάνω στο ίδιο όνομα διαδρομής αφήνει έναν υπάρχοντα περιγραφέα δεμένο στο παλιό αντικείμενο, οπότε μια επαναφόρτωση μπορεί να φαίνεται επιτυχής ενώ ο δαίμονας χρησιμοποιεί ακόμη το προηγούμενο περιεχόμενο. Συγκρίνετε το inode που κρατά η διεργασία με αυτό στον δίσκο πριν πιστέψετε ότι η εναλλαγή ίσχυσε.

Ονομάστε τις τρεις αναγνώσεις χρόνου εκτέλεσης και πότε ενεργοποιείται καθεμία

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

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

Path reopened laterWhat triggers the openFirst sign when it fails
Client configuration fileA connection for that client identityOne client rejected while others connect
Revocation dataPeer authentication, including after replacementRevoked and valid peers both refused
Script or plugin temporary directoryA helper needs to create a fileThe helper exits with a path error

persist-key απαντά σε στενότερο ερώτημα απ ό,τι υποθέτουν οι περισσότεροι. Κρατά το αρχείο κλειδιού ανοιχτό στις τεκμηριωμένες επαναφορές SIGUSR1 και ping-restart, και δεν κάνει τίποτα για αρχεία CCD, δεδομένα ανάκλησης, βοηθητικά εκτελέσιμα ή πλήρη επανεκκίνηση διεργασίας. Αυτά ακολουθούν τις δικές τους διαδρομές ανοίγματος, υπό όποιον λογαριασμό τρέχει εκείνη τη στιγμή.

Επιβεβαιώστε τον λογαριασμό και την όψη που πραγματικά έχει

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

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

ps -o user:12,pid,args -C openvpn
systemctl show -p User -p Group -p ProtectHome -p RootDirectory [email protected]
sudo -u openvpn namei -l /etc/openvpn/ccd/alice

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

Δώστε στην εγγραφή χρόνου εκτέλεσης δικό της κατάλογο

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

Κρατήστε τα δικαιώματα του ιδιωτικού κλειδιού χωριστά από τα αρχεία πολιτικής. Ένα κλειδί που πρέπει να ξαναδιαβαστεί μετά από επαναφορά έχει διαφορετική απαίτηση από ένα αρχείο πελάτη που διαβάζεται σε κάθε σύνδεση, και μία επιεικής λειτουργίας για τα δύο δίνει περισσότερη πρόσβαση απ ό,τι ζητά το πρόβλημα. Ένας ειδικός λογαριασμός δαίμονα με στενή κυριότητα ελέγχεται ευκολότερα από μια ευρεία ομάδα. Όταν το κλειδί πρέπει να επιβιώσει από επαναφορές, persist-key αφαιρεί την επανάγνωση αντί να διευρύνει τον κατάλογο.

Αποφασίστε από το γεγονός που μπορείτε να αναπαράγετε

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

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

systemctl kill -s SIGUSR1 [email protected]
journalctl -u [email protected] -n 40 --no-pager

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

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