Δώστε στο OpenVPN το CAP_NET_ADMIN χωρίς root
Μια μονάδα που ξεκινά ως μη προνομιούχος χρήστης χρειάζεται ακόμη το σωστό σύνολο δυνατοτήτων. Ελέγξτε τη μονάδα, τη ζωντανή διεργασία και το όριο exec, με αυτή τη σειρά.
Η υπηρεσία ξεκινά, το αρχείο καταγραφής παραπονιέται ότι δεν μπορεί να ανοίξει τη συσκευή tun, και οι διαδρομές δεν εμφανίζονται ποτέ. Εκτελέστε το capsh --print στο κέλυφός σας και το cap_net_admin είναι ακριβώς εκεί, κάτι που κάνει την αποτυχία να φαίνεται αδύνατη. Αυτό που διαφέρει ανάμεσα στο κέλυφός σας και τη μονάδα είναι η μετάβαση προνομίων, όχι η προθυμία του πυρήνα να παραχωρήσει τη δυνατότητα. Περάστε τους τέσσερις ελέγχους παρακάτω με σειρά και σταματήστε στον πρώτο που εξηγεί το κενό.
Διαχωρίστε μια απούσα δυνατότητα από μια κρυμμένη συσκευή
Δύο αποτυχίες φαίνονται ίδιες από τη γραμμή καταγραφής. Μια διεργασία χωρίς CAP_NET_ADMIN δεν μπορεί να δημιουργήσει ή να ρυθμίσει τη διεπαφή της σήραγγας, και μια διεργασία της οποίας το sandbox κρύβει το /dev/net/tun δεν μπορεί να το ανοίξει εξαρχής. Η προσθήκη δυνατοτήτων δεν θα διορθώσει τη δεύτερη περίπτωση.
Ελέγξτε αν η συσκευή υπάρχει μέσα στον χώρο ονομάτων της υπηρεσίας πριν επεξεργαστείτε οτιδήποτε. Το PrivateDevices=yes είναι μια συνηθισμένη γραμμή σκλήρυνσης που αφαιρεί εντελώς τον κόμβο tun, και ένα περιοριστικό ProtectSystem μπορεί να κάνει τη διαδρομή ρυθμίσεων μόνο για ανάγνωση με τρόπο που διαβάζεται σαν σφάλμα δικαιωμάτων. Και τα δύο παράγουν γραμμές καταγραφής που αναφέρουν τη σήραγγα, γι' αυτό κατηγορούνται οι δυνατότητες. Επιβεβαιώστε πρώτα ότι ο κόμβος υπάρχει και ανοίγει, και μετά προχωρήστε.
Μάθετε ποιο σύνολο δυνατοτήτων κοιτάτε
Το Linux κρατά σύνολα επιτρεπόμενων, ενεργών, κληρονομήσιμων, περιοριστικών και περιβάλλοντος, και το σύνολο περιβάλλοντος είναι εκείνο που επιβιώνει από ένα exec μη root χρήστη. Οι δυνατότητες αρχείου στο εκτελέσιμο μπορούν να μεταβιβάσουν επιτρεπόμενα και ενεργά δικαιώματα στο exec, αλλά μόνο όσο τίποτε στην αλυσίδα δεν μπλοκάρει αυτή τη μεταβίβαση.
Εδώ το sudo παραπλανά τους ανθρώπους. Μια εντολή που εκτελείται μέσω sudo -u ξεκινά νέα μετάβαση προνομίων και το σύνολο περιβάλλοντος χάνεται, οπότε ο ίδιος έλεγχος που πετυχαίνει ως root αποτυγχάνει εκεί. Ο διαχειριστής υπηρεσιών είναι άλλη μια μετάβαση και δεν παραχωρεί τίποτε περιβάλλοντος αν η μονάδα δεν το δηλώνει.
Δώστε τη δυνατότητα στη μονάδα, όχι σε περιτύλιγμα
Ένα ελάχιστο τμήμα υπηρεσίας για μια σήραγγα που πρέπει να δημιουργήσει συσκευή και να εγκαταστήσει διαδρομές έχει ως εξής.
[Unit]
Description=OpenVPN client, office profile
After=network-online.target
[Service]
Type=notify
User=openvpn
Group=openvpn
NoNewPrivileges=yes
AmbientCapabilities=CAP_NET_ADMIN
CapabilityBoundingSet=CAP_NET_ADMIN
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/office.confAmbientCapabilities βάζει το δικαίωμα στο σύνολο περιβάλλοντος πριν ξεκινήσει η διεργασία, και το CapabilityBoundingSet εμποδίζει τη διεργασία να κρατά οτιδήποτε έξω από αυτή τη λίστα. Το NoNewPrivileges=yes μπλοκάρει την απόκτηση προνομίων μέσω setuid ή δυνατοτήτων αρχείου, ενώ η δυνατότητα που παραχωρεί ρητά η μονάδα εξακολουθεί να ισχύει. Προσθέστε το CAP_NET_BIND_SERVICE μόνο όταν η υπηρεσία πρέπει να δεσμεύσει χαμηλή θύρα, και μην προσθέτετε ποτέ το CAP_SYS_ADMIN επειδή το έκανε κάποιο νήμα φόρουμ.
Αν η μονάδα τυλίγει το εκτελέσιμο σε sudo, αφαιρέστε το περιτύλιγμα. Το systemd εφαρμόζει ήδη το User=, και αυτό το επιπλέον επίπεδο είναι ο πιθανότερος λόγος που το σύνολο περιβάλλοντος είναι κενό.
Επαληθεύστε με τη ζωντανή διεργασία, όχι με το αρχείο της μονάδας
Διαβάστε τι εφάρμοσε πραγματικά ο διαχειριστής και μετά διαβάστε τη διεργασία που γέννησε.
unit=openvpn-client@office
systemctl show -p User -p AmbientCapabilities "$unit"
systemctl show -p MainPID --value "$unit" | xargs -r getpcaps
grep -E '^Cap(Eff|Amb)' /proc/$(systemctl show -p MainPID --value "$unit")/statusΑν η μονάδα αναφέρει τη δυνατότητα και το CapEff εξακολουθεί να τη στερείται, κάποιο drop-in υπερισχύει της ρύθμισης ή κάποιο βήμα ExecStartPre αλλάζει το περιβάλλον. Αναζητήστε το όνομα της μονάδας στους καταλόγους drop-in πριν υποθέσετε ότι το κύριο αρχείο είναι το έγκυρο, γιατί ένα μεταγενέστερο αρχείο κερδίζει σιωπηλά. Αν τόσο η μονάδα όσο και η διεργασία δείχνουν τη δυνατότητα και η σήραγγα εξακολουθεί να αποτυγχάνει, επιστρέψτε στους ελέγχους συσκευής και διαδρομής αντί να διευρύνετε το περιοριστικό σύνολο. Η διεύρυνση κρύβει την πραγματική αιτία και αφήνει την υπηρεσία πιο προνομιούχα απ' ό,τι ήταν.
Προτιμήστε να εγκαταλείψετε προνόμια μετά την εκκίνηση
OpenVPN μπορεί να ξεκινήσει με προνόμια και μετά να περάσει σε μη προνομιούχο λογαριασμό μέσα από τις δικές του επιλογές user και group, με τα persist-key και persist-tun να κρατούν τη σήραγγα χρησιμοποιήσιμη μετά. Αυτή η διάταξη στενεύει το παράθυρο στο οποίο η διεργασία κρατά δικαιώματα, και συχνά ταιριάζει καλύτερα από το να ξεκινά ολόκληρος ο δαίμονας χωρίς προνόμια με μόνιμες δυνατότητες.
Όποιο μοντέλο κι αν επιλέξετε, επανεκκινήστε τη μονάδα και επαναλάβετε τους ελέγχους μετά από επανεκκίνηση, γιατί μια υπηρεσία που λειτουργεί από διαδραστικό κέλυφος root και αποτυγχάνει στην εκκίνηση είναι συνήθως διαφορά σε δυνατότητα, συσκευή ή δικαιώματα αρχείου. Καταγράψτε τις ρυθμίσεις της μονάδας δίπλα στην έξοδο δυνατοτήτων της διεργασίας, ώστε ο επόμενος ελεγκτής να δει αν μια ενημέρωση πακέτου ή ένα drop-in μετακίνησε το όριο.