Ποιες δυνατότητες Linux χρειάζεται η διαδικασία VPN σας;
Η ρύθμιση της διεπαφής, οι διαδρομές, η πρόσβαση σε συσκευές και οι συνηθισμένοι υποδοχείς είναι ξεχωριστά προνόμια. Ονομάστε τη λειτουργία που απέτυχε πριν παραχωρήσετε CAP_NET_ADMIN.
Ένας δαίμονας VPN χρειάζεται προνομιακές δικτυακές λειτουργίες, παρόλο που οι συνηθισμένες εφαρμογές ανοίγουν υποδοχείς εξόδου χωρίς κανένα προνόμιο. Σε αυτό το κενό ξεκινούν τα περισσότερα λάθη δυνατοτήτων: κάποιος βλέπει ένα σφάλμα άδειας, παραχωρεί όλο το σύνολο και η υπηρεσία λειτουργεί για λόγους που κανείς δεν μπορεί να εξηγήσει αργότερα. Η περιήγηση παρακάτω ξεκινά από τη λειτουργία που απέτυχε, τη χαρτογραφεί σε μία αρμοδιότητα και έπειτα ελέγχει το περιβάλλον στο οποίο εκτελείται πραγματικά η διαδικασία. Η εκτέλεση ως root χωρίς περιορισμούς είναι έγκυρη απάντηση για ορισμένες αναπτύξεις, αλλά θα πρέπει να είναι απόφαση και όχι προεπιλογή.
Ξεκινήστε από τη λειτουργία που απέτυχε
Διαβάστε το σφάλμα πριν διαβάσετε οδηγό. Το «η λειτουργία δεν επιτρέπεται» σε αλλαγή διεπαφής, η άρνηση ανοίγματος κόμβου συσκευής και η αποτυχία σύνδεσης σε χαμηλή θύρα είναι τρία διαφορετικά προβλήματα με τρεις διαφορετικές παραχωρήσεις. Αν η διαδικασία ξεκινά και αποτυγχάνει μόνο στην πρώτη αλλαγή διαδρομής, αυτό δείχνει επίσης ότι η δημιουργία της διεπαφής πέτυχε ήδη, κάτι που περιορίζει σημαντικά την απάντηση.
Αναπαράγετε την αποτυχία με την υπηρεσία σταματημένη και μετά ξεκινήστε την στο προσκήνιο με τον ίδιο χρήστη, αν η υλοποίηση το επιτρέπει. Ένα σφάλμα που βλέπετε είναι καλύτερο από μια γραμμή αρχείου καταγραφής που πρέπει να μαντέψετε, και κάνει φανερή τη διαφορά ανάμεσα σε πρόβλημα δυνατοτήτων και σε άρνηση του SELinux ή του AppArmor.
Αντιστοιχίστε κάθε λειτουργία σε μία αρμοδιότητα
Ο πίνακας είναι ένας αρχικός χάρτης, όχι υποκατάστατο της τεκμηρίωσης της υλοποίησης:
| Operation | Usual authority | Watch for |
|---|---|---|
| Create or configure tun/tap | CAP_NET_ADMIN in the relevant namespace | Creating the device and opening it are separate steps |
| Add routes, rules, firewall entries | CAP_NET_ADMIN | Same capability, different namespace than you think |
| Open /dev/net/tun | Device permissions, not a capability | Group membership or a udev rule may be enough |
| Raw sockets | CAP_NET_RAW | Needed by some user-space tunnel implementations |
| Bind a port below 1024 | CAP_NET_BIND_SERVICE | Irrelevant for most modern tunnel ports |
Οι δύο γραμμές σε αυτόν τον πίνακα είναι εκείνες που οι άνθρωποι συγχέουν. Το άνοιγμα του /dev/net/tun είναι ζήτημα άδειας αρχείου· το αίτημα προς τον πυρήνα να διαμορφώσει αυτό που ανοίξατε είναι ζήτημα δυνατοτήτων. Η παραχώρηση CAP_NET_ADMIN δεν διορθώνει έναν κόμβο συσκευής που ο χρήστης της υπηρεσίας σας δεν μπορεί να διαβάσει, και η διόρθωση του κόμβου δεν σας δίνει αρμοδιότητα διαδρομών. Ελέγξτε και τα δύο πριν αλλάξετε οποιοδήποτε από αυτά.
Το WireGuard του πυρήνα και τα προγράμματα σήραγγας χώρου χρήστη δεν έχουν ούτε αυτά ίδιες απαιτήσεις. Η διαδρομή του αρθρώματος πυρήνα διαμορφώνει υπάρχουσα διεπαφή μέσω netlink, ενώ μια υλοποίηση χώρου χρήστη μπορεί να χρειάζεται και τη συσκευή και, για ορισμένα μέσα μεταφοράς, ακατέργαστους υποδοχείς.
Διαβάστε το περιβάλλον: υπηρεσία, κοντέινερ ή κέλυφος
Μια δυνατότητα στον χώρο ονομάτων δικτύου του κεντρικού υπολογιστή μπορεί να επηρεάσει πολύ περισσότερα από την ίδια λειτουργία μέσα σε μια σκόπιμα απομονωμένη στοίβα. Ένα περιβάλλον εκτέλεσης κοντέινερ ξεκινά συνήθως με μειωμένο σύνολο ορίων· η προσθήκη NET_ADMIN σε ένα κοντέινερ που μοιράζεται το δίκτυο του κεντρικού υπολογιστή είναι πολύ μεγαλύτερη παραχώρηση από την προσθήκη του σε ένα με δικό του χώρο ονομάτων δικτύου και χωρίς προσαρτήσεις του κεντρικού υπολογιστή.
Για μονάδες systemd διαβάστε τι εφαρμόζεται πραγματικά και όχι τι φαίνεται να λέει το αρχείο μονάδας: το systemctl show -p CapabilityBoundingSet -p AmbientCapabilities αναφέρει τις ενεργές τιμές, που μπορεί να έχουν οριστεί από ένα drop-in που ξεχάσατε. Ζητήστε την ενεργή τιμή, ποτέ την προτιθέμενη. Οι δυνατότητες ambient έχουν σημασία γιατί μια υπηρεσία χωρίς root χάνει δυνατότητες κατά το exec χωρίς αυτές.
Χρησιμοποιήστε ως βάση την υποστηριζόμενη ρύθμιση του πακέτου ή της εικόνας. Μην προσθέτετε άδειες ακατέργαστων υποδοχέων ή προνομιακή λειτουργία επειδή ένας άλλος οδηγός τις απαρίθμησε για άλλο εργαλείο· αυτός ο συλλογισμός δεν μεταφέρει τίποτα και σας κοστίζει την απομόνωση που πληρώσατε. Σε αμφιβολία, μη παραχωρείτε τίποτα και διαβάστε τις σημειώσεις της υλοποίησης για την ακριβή λειτουργία που χρειάζεστε.
Παρατηρήστε τι συμβαίνει όταν πέσουν τα προνόμια
Πολλοί δαίμονες ξεκινούν με προνόμια, διαμορφώνουν τη διεπαφή και μετά περνούν σε χρήστη χωρίς προνόμια και κρατούν τη σήραγγα. Από εκείνο το σημείο η διαδικασία δεν μπορεί πλέον να προσθέσει διαδρομή, να ξαναγράψει κανόνα τείχους προστασίας ή να ανοίξει νέα προνομιακή συσκευή, κάτι που είναι εντάξει μέχρι η επανασύνδεση να χρειαστεί ακριβώς αυτό. Μεταγενέστερες αναγνώσεις αρχείων και εκτέλεση αγκίστρων μπορεί να αποτύχουν για τον ίδιο λόγο.
Δοκιμάστε ολόκληρο τον κύκλο ζωής και όχι το πρώτο δευτερόλεπτο: εκκίνηση, ανανέωση ή επανασύνδεση και καθαρισμός στο σταμάτημα. Η πρώτη επιτυχημένη δημιουργία διεπαφής δεν αποδεικνύει ότι κάθε μεταγενέστερη προνομιακή λειτουργία θα λειτουργεί ακόμη, και η αποτυχία εμφανίζεται συνήθως ώρες αργότερα στην παραγωγή.
Οι υλοποιήσεις που κρατούν τη σήραγγα ανοιχτή κατά την εναλλαγή χρήστη το συνδυάζουν συνήθως με επιλογές διατήρησης της σήραγγας και των κλειδιών. Στην πλευρά του systemd, το ισοδύναμο ερώτημα είναι αν το σύνολο δυνατοτήτων της μονάδας επιβιώνει της εναλλαγής χρήστη που διαμορφώσατε.
Καταγράψτε την παραχώρηση και τον λόγο της
Γράψτε την ακριβή παραχώρηση, τη λειτουργία που επιτρέπει και το σφάλμα που διόρθωσε. Μία γραμμή στις σημειώσεις ανάπτυξης — «CAP_NET_ADMIN στον χώρο ονομάτων δικτύου της μονάδας, απαραίτητο για αλλαγές διαδρομών μετά από επανασύνδεση» — αρκεί για να εμποδίσει τον επόμενο να διευρύνει ξανά την παραχώρηση.
Έπειτα ξαναδιαβάστε το ενεργό σύνολο μετά από κάθε αναβάθμιση. Οι προμηθευτές προσθέτουν λειτουργίες, οι εικόνες αλλάζουν προεπιλογές, και μια δυνατότητα που ήταν περιττή πέρυσι μπορεί να γίνει φέρουσα χωρίς να το προσέξει κανείς.