Δικαιώματα αρχείων στο Linux

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

Δικαιώματα αρχείων στο Linux

Τα δικαιώματα αρχείων προσφέρουν μια ασφαλή εναλλακτική λύση στα εκτελέσιμα SUID, αλλά μπορεί να φαίνονται λίγο μπερδεμένα στην αρχή.


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

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

Τα δικαιώματα είναι εξαιρετικά για υπηρεσίες που συνήθως εκτελούνται πάντα ως root, αλλά τι γίνεται με τα βοηθητικά προγράμματα γραμμής εντολών; Ευτυχώς, αυτό υποστηρίζεται επίσης με την προϋπόθεση ότι έχετε εγκαταστήσει τα σωστά βοηθητικά προγράμματα. Εάν χρησιμοποιείτε Ubuntu, θα χρειαστείτε για παράδειγμα το πακέτο libcap2-bin. Θα χρειαστεί επίσης να εκτελέσετε έναν μη αρχαϊκό πυρήνα (από την έκδοση 2.6.24).

Αυτές οι λειτουργίες επιτρέπουν τη συσχέτιση δικαιωμάτων με εκτελέσιμα αρχεία, παρόμοια με τη ρύθμιση του bit SUID, αλλά μόνο για ένα συγκεκριμένο σύνολο δικαιωμάτων. Χρησιμότητα setcap χρησιμοποιείται για την προσθήκη και αφαίρεση δικαιωμάτων από ένα αρχείο.

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

Υποθέτοντας ότι βρίσκεστε στον κατάλογο όπου βρίσκεται το δυαδικό αρχείο tracewalk, μπορείτε να προσθέσετε αυτήν την άδεια ως εξής:

sudo setcap cap_net_raw=eip tracewalk

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

setcap -v cap_new_raw=eip tracewalk

Ή μπορείτε να παραθέσετε όλα τα δικαιώματα που έχουν οριστεί για ένα δεδομένο εκτελέσιμο αρχείο:

getcap tracewalk

Για αναφορά, μπορείτε επίσης να αφαιρέσετε όλα τα δικαιώματα από το εκτελέσιμο αρχείο με:

setcap -r tracewalk

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

Τι σημαίνει λοιπόν αυτό το περίεργο επίθημα; =eip? Αυτό απαιτεί κάποια κατανόηση της φύσης των αδειών. Κάθε διεργασία έχει τρία σύνολα δικαιωμάτων − αποτελεσματική, κληρονομική και επιτρεπόμενη:

  • Αποτελεσματικός Τα δικαιώματα είναι εκείνα που ορίζουν τι μπορεί πραγματικά να κάνει μια διαδικασία. Για παράδειγμα, δεν μπορεί να αντιμετωπίσει ακατέργαστες πρίζες εάν CAP_NET_RAW δεν είναι στο ενεργό σύνολο.
  • Διαθέσιμος Τα δικαιώματα είναι εκείνα που επιτρέπεται να έχει μια διεργασία εάν τα ζητήσει χρησιμοποιώντας την κατάλληλη κλήση. Αποτρέπουν μια διεργασία από το να κάνει πραγματικά οτιδήποτε, εκτός εάν έχει γραφτεί ειδικά για να ζητήσει την εν λόγω άδεια. Αυτό επιτρέπει τη σύνταξη διεργασιών για την προσθήκη κρίσιμων δικαιωμάτων στο ενεργό σύνολο μόνο για την περίοδο που απαιτούνται πραγματικά.
  • Κληρονόμητος Τα δικαιώματα είναι εκείνα που μπορούν να κληρονομηθούν στο προσβάσιμο σύνολο της διαδικασίας αναπαραγωγής θυγατρικού. Κατά τη διάρκεια της επέμβασης fork() ή clone() Η θυγατρική διαδικασία λαμβάνει πάντα ένα αντίγραφο των δικαιωμάτων της γονικής διεργασίας, καθώς εξακολουθεί να εκτελείται το ίδιο εκτελέσιμο αρχείο σε εκείνο το σημείο. Ένα κληρονομικό σύνολο χρησιμοποιείται όταν exec() (ή ισοδύναμο) καλείται να αντικαταστήσει το εκτελέσιμο αρχείο με άλλο. Σε αυτό το σημείο, το διαθέσιμο σύνολο της διεργασίας καλύπτεται από το κληρονομούμενο σύνολο για να ληφθεί το προσβάσιμο σύνολο που θα χρησιμοποιηθεί για τη νέα διαδικασία.

Άρα η χρησιμότητα setcap μας επιτρέπει να προσθέσουμε ανεξάρτητα τα δικαιώματα αυτών των τριών συνόλων για ένα δεδομένο εκτελέσιμο αρχείο. Σημειώστε ότι η έννοια των ομάδων ερμηνεύεται ελαφρώς διαφορετικά για τα δικαιώματα αρχείων:

  • Διαθέσιμος Τα δικαιώματα αρχείου είναι αυτά που είναι πάντα διαθέσιμα σε ένα εκτελέσιμο αρχείο, ακόμα κι αν η γονική διεργασία που το κάλεσε δεν τα είχε. Παλαιότερα ονομάζονταν «αναγκαστικές» άδειες.
  • Κληρονόμησε Τα δικαιώματα αρχείου ορίζουν μια πρόσθετη μάσκα που μπορεί επίσης να χρησιμοποιηθεί για την κατάργηση δικαιωμάτων από το σύνολο της διαδικασίας κλήσης. Ισχύουν επιπλέον του κληρονομούμενου συνόλου της διαδικασίας κλήσης, επομένως η άδεια κληρονομείται μόνο εάν υπάρχει και στα δύο σύνολα.
  • Αποτελεσματικός Τα δικαιώματα αρχείου είναι στην πραγματικότητα μόνο ένα bit, όχι ένα σύνολο, και εάν οριστούν, σημαίνει ότι ολόκληρο το διαθέσιμο σύνολο αντιγράφεται επίσης στο ενεργό σύνολο της νέας διαδικασίας. Αυτό μπορεί να χρησιμοποιηθεί για την προσθήκη δικαιωμάτων σε διεργασίες που δεν έχουν γραφτεί ειδικά για να ζητηθούν. Εφόσον είναι ένα bit, εάν το ορίσετε για οποιαδήποτε άδεια, πρέπει να οριστεί για όλα τα δικαιώματα. Μπορείτε να το σκεφτείτε ως ένα κομμάτι παλαιού τύπου, επειδή χρησιμοποιείται για να επιτρέπει τη χρήση αδειών από εφαρμογές που δεν τα υποστηρίζουν.

Κατά τον καθορισμό αδειών μέσω setcap τρία γράμματα e, i и p σχετίζονται με αποτελεσματικό, κληρονομικό και προσβάσιμο σετ αντίστοιχα. Έτσι, η προηγούμενη προδιαγραφή:

sudo setcap cap_net_raw=eip tracewalk

...υποδεικνύει ότι το ψήφισμα CAP_NET_RAW πρέπει να προστεθεί στα διαθέσιμα και κληρονομήσιμα σύνολα και ότι το ενεργό bit πρέπει επίσης να οριστεί. Αυτό θα παρακάμψει τυχόν δικαιώματα που έχουν οριστεί προηγουμένως στο αρχείο. Για να ορίσετε πολλά δικαιώματα ταυτόχρονα, χρησιμοποιήστε μια λίστα διαχωρισμένη με κόμματα:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

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

Πρώτον, οι δυνατότητες αρχείων δεν λειτουργούν με συμβολικούς συνδέσμους - πρέπει να τις εφαρμόσετε στο ίδιο το δυαδικό αρχείο (δηλαδή στον στόχο του συμβολικού συνδέσμου).

Δεύτερον, δεν λειτουργούν με ερμηνευμένα σενάρια. Για παράδειγμα, εάν έχετε ένα σενάριο Python στο οποίο θέλετε να εκχωρήσετε άδεια, πρέπει να το εκχωρήσετε στον ίδιο τον διερμηνέα Python. Προφανώς αυτό είναι ένα πιθανό ζήτημα ασφάλειας, επειδή τότε όλα τα σενάρια που εκτελούνται με αυτόν τον διερμηνέα θα έχουν την καθορισμένη άδεια, αν και αυτό είναι ακόμα πολύ καλύτερο από το να γίνει SUID. Η πιο συνηθισμένη λύση φαίνεται να είναι να γράψετε ένα ξεχωριστό εκτελέσιμο αρχείο σε C ή ισοδύναμο που μπορεί να εκτελέσει τις απαραίτητες λειτουργίες και να το καλέσει από ένα σενάριο. Αυτή είναι παρόμοια με την προσέγγιση που χρησιμοποιείται από το Wireshark που χρησιμοποιεί ένα δυαδικό /usr/bin/dumpcap για την εκτέλεση προνομιακών λειτουργιών:

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

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

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

Αυτό είναι όλο. Περισσότερες λεπτομέρειες για το πρόγραμμα μαθημάτων μπορείτε να βρείτε στο διαδικτυακό σεμινάριο, το οποίο θα πραγματοποιηθεί στις 24 Ιανουαρίου.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο