Εκτελείτε το script up ως root, ολοκληρώνεται, και το ίδιο script αποτυγχάνει όταν το καλεί η υπηρεσία. Τίποτα στις άδειες του αρχείου δεν άλλαξε, οπότε το φυσικό επόμενο βήμα είναι να τις χαλαρώσετε ξανά, κάτι που δεν διορθώνει τίποτα. Σε έναν διακομιστή με SELinux ο καθοριστικός παράγοντας συχνά δεν είναι ποιος είναι η διεργασία αλλά σε ποιον τομέα εκτελείται, και το root μέσα σε περιορισμένο τομέα παραμένει περιορισμένο.

Η ίδια εντολή, δύο διαφορετικοί τομείς ασφαλείας

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

Γι’ αυτό η σύγκριση των δύο εκτελέσεων είναι χρήσιμη μόνο αν συγκρίνετε τα συμφραζόμενά τους. Εκτελέστε την ίδια εντολή από το κέλυφος και από το hook, και η έκδοση από το κέλυφος αποδεικνύει ότι το δυαδικό υπάρχει και ότι τα ορίσματα είναι σωστά· δεν αποδεικνύει τίποτα για το αν η υπηρεσία επιτρέπεται να το εκτελέσει. Εκτελέστε την και με τους δύο τρόπους και συγκρίνετε τους τομείς, όχι μόνο τους κωδικούς εξόδου. Αυτή η σύγκριση είναι που μετατρέπει μια αόριστη διαμαρτυρία για άδειες σε συγκεκριμένο ερώτημα για έναν τομέα και μία ετικέτα.

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

Διαβάστε την εγγραφή AVC δίπλα στο σφάλμα του hook

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

ausearch -m AVC,USER_AVC -ts recent
ls -Z /usr/local/sbin/vpn-up.sh
ps -eZ | grep openvpn

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

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

Ετικέτα, ρύθμιση ή πολιτική: τρεις διορθώσεις

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

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

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

Γιατί ένα παλιό module allow δεν είναι η απάντηση

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

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

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

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