PrivateTmp: το hook έγραψε το αρχείο, πού πήγε όμως;
Ένας ιδιωτικός προσωρινός χώρος ονομάτων κρύβει το αρχείο αντί να το διαγράφει. Έλεγξε τη ρίζα της διεργασίας πριν αλλάξεις τη μονάδα και μετά δώσε στα κοινόχρηστα δεδομένα πραγματική διαδρομή.
Τα hooks αναφέρουν επιτυχία, και η ίδια διαδρομή εξακολουθεί να φαίνεται κενή από ένα shell. Και οι δύο δηλώσεις μπορούν να ισχύουν ταυτόχρονα, επειδή μια υπηρεσία systemd μπορεί να ζει στον δικό της χώρο ονομάτων προσάρτησης με έναν ιδιωτικό προσωρινό κατάλογο. Μόλις γίνει κατανοητό αυτό, το ενδιαφέρον ερώτημα γίνεται αν η εγγραφή πέτυχε καθόλου.
Δύο προσωρινοί κατάλογοι, μία διαδρομή
Η ρύθμιση απομόνωσης δίνει στη μονάδα ιδιωτική όψη των προσωρινών καταλόγων αντί να τους κάνει μόνο για ανάγνωση. Οι διεργασίες έξω από τη μονάδα δεν βλέπουν τι γράφει εκεί, και ό,τι αφήνει πίσω της απορρίπτεται όταν η μονάδα σταματά. Επομένως μια διαδρομή που εκτυπώνει το hook και μια διαδρομή που ελέγχεται από ένα shell μπορεί να αναφέρονται σε διαφορετικά αντικείμενα με το ίδιο όνομα.
Αυτό είναι πρόβλημα ορατότητας, και μοιάζει με πρόβλημα απώλειας δεδομένων. Τίποτα δεν διαγράφηκε, επειδή το αρχείο βρίσκεται απλώς σε έναν χώρο ονομάτων του οποίου το shell δεν είναι μέλος. Η ίδια εντολή συμπεριφέρεται διαφορετικά όταν εκτελείται μέσα στη μονάδα, και αυτή είναι η παρατήρηση που συνήθως λύνει τη διαφωνία. Διάβασε τις ρυθμίσεις της μονάδας πριν συμπεράνεις οτιδήποτε για την εγγραφή.
Ξεχώρισε το αόρατο από το μη εγγράψιμο
Μια επιτυχημένη εγγραφή και ένα αποτυχημένο άνοιγμα παράγουν διαφορετικά στοιχεία, και η διάκριση καθορίζει την επισκευή. Αν το hook λέει ότι το αρχείο δημιουργήθηκε αλλά ένας εξωτερικός αναγνώστης δεν το βρίσκει, έχεις ζήτημα χώρου ονομάτων. Αν το hook αναφέρει σφάλμα δικαιωμάτων ή αποτυχημένο άνοιγμα, το αρχείο δεν γράφτηκε ποτέ και καμία αλλαγή του χώρου ονομάτων δεν θα βοηθήσει.
systemctl show [email protected] -p PrivateTmp -p User -p Group -p RuntimeDirectory
systemctl show [email protected] -p MainPID --value
sudo ls -l /proc/PID/root/tmp/client-stateΗ διαδρομή της ρίζας της διεργασίας εκθέτει την όψη του συστήματος αρχείων της ίδιας της υπηρεσίας, υπό τους ελέγχους δικαιωμάτων σε αυτή τη διεργασία όσο ακόμη εκτελείται. Διάβασε το ημερολόγιο της μονάδας στην ίδια συνεδρία, γιατί ένα σφάλμα εγγραφής και ένα αρχείο που λείπει συγχέονται εύκολα όταν κάποιος έχει ήδη αποφασίσει την αιτία.
Δώσε στα κοινόχρηστα δεδομένα ρητή θέση
Τα δεδομένα που χρειάζεται μόνο η υπηρεσία ανήκουν στον ιδιωτικό προσωρινό κατάλογό της. Τα δεδομένα που πρέπει να διαβάζει μια άλλη διεργασία χρειάζονται διαδρομή ορισμένη και για τους δύο, με δηλωμένο ιδιοκτήτη, λειτουργία και λήξη. Αποφάσισε ποια από τις δύο περιπτώσεις έχεις πριν επεξεργαστείς τη μονάδα. Τα περισσότερα από αυτά τα περιστατικά προέρχονται από το να αντιμετωπίζεται ένα ιδιωτικό αρχείο ως κοινόχρηστο.
[Service]
RuntimeDirectory=openvpn-hook-office
RuntimeDirectoryMode=0750Ένας κατάλογος χρόνου εκτέλεσης τοποθετεί τον φάκελο κάτω από την περιοχή χρόνου εκτέλεσης του συστήματος, τον δημιουργεί για τον ρυθμισμένο χρήστη και την ομάδα της μονάδας και τον αφαιρεί όταν η μονάδα σταματά. Πρόσθεσέ τον μέσω ενός drop-in ώστε η μονάδα του πακέτου να μείνει ανέπαφη, μετά επαναφόρτωσε τον διαχειριστή και επανεκκίνησε αυτό το στιγμιότυπο, δεχόμενος ότι οι πελάτες του θα επανασυνδεθούν.
Διατήρησε κάθε κατάλογο χρόνου εκτέλεσης που απαιτεί ήδη η εγκατεστημένη μονάδα. Η αντικατάσταση της λίστας αντί της προσθήκης σε αυτήν είναι συνηθισμένος τρόπος να σπάσει μια άσχετη λειτουργία που κανείς δεν συνδέει με την αλλαγή.
Δύο επίπεδα προνομίων μπορεί να διαφωνούν
Ο διαχειριστής υπηρεσιών δημιουργεί τον κατάλογο για τον ρυθμισμένο χρήστη της μονάδας, ενώ ο δαίμονας VPN μπορεί ξεχωριστά να κατέβει στον δικό του λογαριασμό πριν εκτελέσει ένα hook σύνδεσης. Αυτά είναι διαφορετικά επίπεδα, και μπορούν να ονομάζουν διαφορετικές ταυτότητες.
Ένας κατάλογος που ανήκει στο root με περιοριστική λειτουργία είναι απόλυτα ορατός σε έναν δαίμονα που έχει ήδη εγκαταλείψει προνόμια, και όμως μη εγγράψιμος από αυτόν. Το σφάλμα τότε διαβάζεται ως πρόβλημα δικαιωμάτων, αν και η διαδρομή υπάρχει ακριβώς εκεί που περίμενες. Σύγκρινε τον ιδιοκτήτη του καταλόγου με την ταυτότητα που αναφέρει το hook. Όταν διαφέρουν, η λειτουργία δεν ήταν ποτέ το ζήτημα.
Έλεγξε την ταυτότητα με την οποία εκτελείται πραγματικά το hook πριν αλλάξεις ιδιοκτησία. Η αλλαγή του χρήστη εκτέλεσης της υπηρεσίας για να διορθωθεί ένας κατάλογος μπορεί να αλλάξει την πρόσβαση σε συσκευές και τα δικαιώματα δικτύου αλλού, κάτι που είναι μεγάλο τίμημα για ένα μικρό πρόβλημα.
Επαλήθευσε ολόκληρη τη μεταβίβαση
Επιβεβαίωσε τέσσερα πράγματα ταυτόχρονα: το hook γράφει με την πραγματική του ταυτότητα, ο προβλεπόμενος αναγνώστης μπορεί να καταναλώσει το αρχείο, άσχετοι χρήστες δεν μπορούν, και η διακοπή της μονάδας καθαρίζει όπως έχει σχεδιαστεί. Το να εμφανιστεί ένα αρχείο στον κοινόχρηστο προσωρινό κατάλογο του κεντρικού υπολογιστή δεν είναι απαίτηση, και συνήθως είναι σημάδι ότι η ανταλλαγή δεν απέκτησε ποτέ δική της διαδρομή. Δοκίμασε τον αναγνώστη μετά από επανεκκίνηση, όχι μόνο κατά την πρώτη εκτέλεση. Η συμπεριφορά καθαρισμού είναι μέρος του σχεδιασμού, οπότε παρατήρησέ την αντί να την υποθέσεις.
Η μόνιμη κατάσταση ανήκει κάπου με αντίστοιχη διάρκεια ζωής, αφού ένας κατάλογος χρόνου εκτέλεσης προορίζεται να εξαφανιστεί. Διάλεξε τη θέση με βάση τη διάρκεια ζωής και όχι την ευκολία. Αυτή η συνήθεια αποτρέπει την επόμενη εκδοχή της ίδιας έρευνας.