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

Δύο μοντέλα, ένας ιδιοκτήτης της αλλαγής

Το πρώτο μοντέλο ανήκει στον δαίμονα. Η κοινοτική έκδοση του OpenVPN έχει τις επιλογές user και group, που αλλάζουν ταυτότητα αφού στηθούν το τούνελ και τα κλειδιά, και τα persist-key μαζί με persist-tun κρατούν αυτούς τους πόρους χρησιμοποιήσιμους μετά.

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

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

Αποφασίστε πού αλλάζει η ταυτότητα

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

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

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

Οι δυνατότητες είναι όρια, όχι παραχωρήσεις

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

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

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

Χαρτογραφήστε την εξουσία σε όλο τον κύκλο ζωής

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

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

Χρησιμοποιήστε αποκλειστικό λογαριασμό και όχι κοινόχρηστο. Οι προγραμματιστές του OpenVPN προειδοποιούν κατά της συνήθειας να χρησιμοποιείται το nobody ως γενικό παράδειγμα, γιατί άλλες υπηρεσίες στον κεντρικό υπολογιστή μπορεί να τρέχουν ήδη με αυτόν τον λογαριασμό και η απομόνωση που νομίζετε ότι έχετε δεν υπάρχει.

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

Γράψτε το σχέδιο και κρατήστε πρόσβαση αποκατάστασης

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

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

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

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