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

Η προσθήκη και η δημιουργία είναι διαφορετικοί έλεγχοι

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

OperationWhat must permit itTypical failure message
Append to an existing logFile write access, path traversalPermission denied on the file
Create a missing logDirectory write and search accessPermission denied on the path
Rename a replacement into placeBoth directories, plus sticky restrictionsPermission denied or operation not permitted

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

Τα προεπιλεγμένα ACL κληρονομούνται, δεν παραχωρούν

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

namei -l /var/log/openvpn/server.log
getfacl -p /var/log/openvpn
getfacl -p /var/log/openvpn/server.log

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

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

Προσδιορίστε ποιος γράφει εκείνη τη στιγμή

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

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

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

Περιστρέψτε χωρίς να επαναφέρετε το σφάλμα

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

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

Όταν η περικοπή αποτυγχάνει ούτως ή άλλως, σταματήστε να προσθέτετε δικαιώματα

Μια αποτυχία να περικόψετε ένα αρχείο στο οποίο μπορείτε να γράψετε δεν εξηγείται από δικαιώματα καταλόγου, και περισσότερα από αυτά δεν θα βοηθήσουν. Κοιτάξτε αντί γι' αυτό τα χαρακτηριστικά και τον περιορισμό: ένα χαρακτηριστικό append-only επιτρέπει εγγραφές μόνο σε λειτουργία προσθήκης, και μια προσάρτηση μόνο για ανάγνωση ή ένα sandbox υπηρεσίας μπορεί να αρνηθεί μια πράξη που το ACL επιτρέπει.

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

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