Τρόπος χρήσης SUID, SGID και Sticky Bits στο Linux

Τα SUID, SGID και Sticky Bits είναι ισχυρά ειδικά δικαιώματα που μπορείτε να ορίσετε για εκτελέσιμα και καταλόγους στο Linux. Θα μοιραστούμε τα οφέλη—και τις πιθανές παγίδες—από τη χρήση τους.

Είναι ήδη σε χρήση

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

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

Αύξηση της κατάστασής σας

Συνήθως, οι εντολές και τα προγράμματα Linux εκτελούνται με το ίδιο σύνολο δικαιωμάτων με το άτομο που εκκινεί το πρόγραμμα. Όταν το root εκτελεί την εντολή passwd για να αλλάξετε έναν κωδικό πρόσβασης, εκτελείται με δικαιώματα root. Αυτό σημαίνει ότι η εντολή passwd μπορεί ελεύθερα να έχει πρόσβαση στους αποθηκευμένους κωδικούς πρόσβασης στο αρχείο /etc/shadow.

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

Το παραπάνω σενάριο είναι ακριβώς αυτό που κάνει το Set User ID bit (SUID). Το εκτελεί προγράμματα και εντολές με τα δικαιώματα του κατόχου του αρχείου και όχι τα δικαιώματα του ατόμου που εκκινεί το πρόγραμμα.

Ανεβάζετε την κατάσταση του προγράμματος

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

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

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

Το μεγαλύτερο πλεονέκτημα του λογισμικού ανοιχτού κώδικα είναι μπορείτε να δείτε μόνοι σας τον πηγαίο κώδικα ή ανατρέξτε σε αξιόπιστες αξιολογήσεις από ομοτίμους. Στον πηγαίο κώδικα για το πρόγραμμα passwd, υπάρχουν έλεγχοι, ώστε να μπορείτε να δείτε εάν το άτομο που εκτελεί το πρόγραμμα είναι root. Επιτρέπονται διαφορετικές δυνατότητες εάν κάποιος είναι root (ή κάποιος που χρησιμοποιεί sudo).

  Πώς να αποσυμπιέσετε τα αρχεία TarGZ στο Linux

Αυτό είναι ο κώδικας που ανιχνεύει εάν κάποιος είναι root.

Ένα απόσπασμα πηγαίου κώδικα από

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

Ένα απόσπασμα πηγαίου κώδικα από

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

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

Εντολές Linux που χρησιμοποιούν SUID

Ακολουθούν μερικές από τις εντολές Linux που χρησιμοποιούν το bit SUID για να δώσουν στην εντολή αυξημένα δικαιώματα όταν εκτελούνται από έναν κανονικό χρήστη:

ls -l /bin/su
ls -l /bin/ping
ls -l /bin/mount
ls -l /bin/umount
ls -l /usr/bin/passwd

Σημειώστε ότι τα ονόματα αρχείων επισημαίνονται με κόκκινο χρώμα, γεγονός που υποδηλώνει ότι το bit SUID έχει οριστεί.

Τα δικαιώματα σε ένα αρχείο ή κατάλογο συνήθως αντιπροσωπεύονται από τρεις ομάδες τριών χαρακτήρων: rwx. Αυτά αντιπροσωπεύουν ανάγνωση, εγγραφή και εκτέλεση. Εάν υπάρχουν οι επιστολές, αυτή η άδεια έχει χορηγηθεί. Ωστόσο, εάν υπάρχει παύλα (-) αντί για γράμμα, αυτή η άδεια δεν έχει δοθεί.

Υπάρχουν τρεις ομάδες αυτών των δικαιωμάτων (από αριστερά προς τα δεξιά): αυτές για τον κάτοχο του αρχείου, για μέλη της ομάδας του αρχείου και για άλλα. Όταν το bit SUID έχει οριστεί σε ένα αρχείο, ένα “s” αντιπροσωπεύει την άδεια εκτέλεσης του κατόχου.

Εάν το bit SUID έχει οριστεί σε ένα αρχείο που δεν έχει εκτελέσιμες δυνατότητες, ένα κεφαλαίο “S” το υποδηλώνει.

Θα ρίξουμε μια ματιά σε ένα παράδειγμα. Ο κανονικός χρήστης dave πληκτρολογεί την εντολή passwd:

passwd

ο

Οι εντολές passwd ζητά από τον dave τον νέο κωδικό πρόσβασής του. Μπορούμε να χρησιμοποιήσουμε την εντολή ps για να δείτε τις λεπτομέρειες των διεργασιών που εκτελούνται.

Θα χρησιμοποιήσουμε ps με grep σε διαφορετικό παράθυρο τερματικού και αναζητήστε τη διαδικασία passwd. Θα χρησιμοποιήσουμε επίσης τις επιλογές -e (κάθε διαδικασία) και -f (πλήρης μορφή) με ps.

Πληκτρολογούμε την παρακάτω εντολή:

ps -e -f | grep passwd

ο

Αναφέρονται δύο γραμμές, η δεύτερη από τις οποίες είναι η διαδικασία grep που αναζητά εντολές με τη συμβολοσειρά “passwd” σε αυτές. Είναι η πρώτη γραμμή που μας ενδιαφέρει, ωστόσο, γιατί είναι αυτή για τη διαδικασία passwd που ξεκίνησε ο dave.

Μπορούμε να δούμε τη διαδικασία passwd να εκτελείται με τον ίδιο τρόπο που θα εκτελούσε αν την είχε εκκινήσει το root.

  Πώς να χρησιμοποιήσετε την εντολή lsof του Linux

Ρύθμιση του SUID Bit

Είναι εύκολο να αλλάξετε το bit SUID με το chmod. Η συμβολική λειτουργία u+s ορίζει το bit SUID και η συμβολική λειτουργία us διαγράφει το bit SUID.

Για να επεξηγήσουμε μερικές από τις έννοιες του bit SUID, δημιουργήσαμε ένα μικρό πρόγραμμα που ονομάζεται htg. Βρίσκεται στον ριζικό κατάλογο του χρήστη dave και δεν έχει οριστεί το bit SUID. Όταν εκτελείται, εμφανίζει τα πραγματικά και αποτελεσματικά αναγνωριστικά χρήστη (UID).

Το αληθινό UID ανήκει στο άτομο που ξεκίνησε το πρόγραμμα. Το αποτελεσματικό αναγνωριστικό είναι ο λογαριασμός από τον οποίο το πρόγραμμα συμπεριφέρεται σαν να είχε ξεκινήσει.

Πληκτρολογούμε τα εξής:

ls -lh htg
./htg

ο

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

Ας το αντιγράψουμε στον κατάλογο /usr/local/bin για να το χρησιμοποιήσουν άλλοι.

Πληκτρολογούμε τα εξής, χρησιμοποιώντας chmod για να ορίσουμε το bit SUID και, στη συνέχεια, ελέγχουμε ότι έχει οριστεί:

sudo cp htg /usr/local/bin
sudo chmod u+s /usr/local/bin/htg
ls -hl /usr/local/bin/htg

ο

Έτσι, το πρόγραμμα αντιγράφεται και το bit SUID έχει οριστεί. Θα το εκτελέσουμε ξανά, αλλά αυτή τη φορά θα εκτελέσουμε το αντίγραφο στον φάκελο /usr/local/bin:

htg

ο

Παρόλο που ο dave ξεκίνησε το πρόγραμμα, το ενεργό αναγνωριστικό ορίζεται στον χρήστη root. Έτσι, εάν η Mary εκκινήσει το πρόγραμμα, συμβαίνει το ίδιο, όπως φαίνεται παρακάτω:

htg

ο

Το πραγματικό ID είναι το mary και το αποτελεσματικό ID είναι το root. Το πρόγραμμα εκτελείται με τα δικαιώματα του χρήστη root.

Το SGID Bit

Το bit Set Group ID (SGID) είναι πολύ παρόμοιο με το bit SUID. Όταν το bit SGID έχει οριστεί σε ένα εκτελέσιμο αρχείο, η αποτελεσματική ομάδα ορίζεται στην ομάδα του αρχείου. Η διαδικασία εκτελείται με τα δικαιώματα των μελών της ομάδας του αρχείου και όχι με τα δικαιώματα του ατόμου που την εκκίνησε.

Τροποποιήσαμε το πρόγραμμά μας htg, ώστε να δείχνει και την αποτελεσματική ομάδα. Θα αλλάξουμε την ομάδα του προγράμματος htg ώστε να είναι η προεπιλεγμένη ομάδα του χρήστη mary, mary. Θα χρησιμοποιήσουμε επίσης τις συμβολικές λειτουργίες us και g+s με chown για να αφαιρέσουμε το bit SUID και να ορίσουμε το SGID.

Για να το κάνουμε αυτό, πληκτρολογούμε τα εξής:

sudo chown root:mary /usr/local/bin/htg
sudo chmod u-s,g+s /usr/local/bin/htg
ls -lh /usr/local/bin/htg

ο

Μπορείτε να δείτε το bit SGID που υποδηλώνεται με το “s” στα δικαιώματα της ομάδας. Επίσης, σημειώστε ότι η ομάδα έχει οριστεί σε mary και το όνομα του αρχείου επισημαίνεται τώρα με κίτρινο.

Πριν εκτελέσουμε το πρόγραμμα, ας καθορίσουμε σε ποιες ομάδες ανήκουν οι dave και mary. Θα χρησιμοποιήσουμε την εντολή id με την επιλογή -G (ομάδες), για να εκτυπώσετε όλα τα αναγνωριστικά ομάδας. Στη συνέχεια, θα εκτελέσουμε το πρόγραμμα htg ως dave.

Πληκτρολογούμε τις παρακάτω εντολές:

id -G dave
id -G mary
htg

ο

Το αναγνωριστικό της προεπιλεγμένης ομάδας για το mary είναι 1001 και η αποτελεσματική ομάδα του προγράμματος htg είναι 1001. Έτσι, παρόλο που ξεκίνησε από τον dave, εκτελείται με τα δικαιώματα των μελών στην ομάδα mary. Είναι το ίδιο σαν ο Ντέιβ να είχε μπει στην ομάδα των Mary.

  Πώς να παίξετε το Galactic Civilizations III στο Linux

Ας εφαρμόσουμε το bit SGID σε έναν κατάλογο. Πρώτα, θα δημιουργήσουμε έναν κατάλογο που ονομάζεται “work” και, στη συνέχεια, θα αλλάξουμε την ομάδα του σε “geek”. Στη συνέχεια, θα ορίσουμε το bit SGID στον κατάλογο.

Όταν χρησιμοποιούμε το ls για να ελέγξουμε τις ρυθμίσεις του καταλόγου, θα χρησιμοποιήσουμε επίσης την επιλογή -d (κατάλογος) ώστε να βλέπουμε τις λεπτομέρειες του καταλόγου και όχι τα περιεχόμενά του.

Πληκτρολογούμε τις παρακάτω εντολές:

sudo mkdir work
sudo chown dave:geek work
sudo chmod g+s work
ls -lh -d work

ο

Το SGID bit και η ομάδα “geek” έχουν οριστεί. Αυτά θα επηρεάσουν τυχόν στοιχεία που δημιουργούνται στον κατάλογο εργασίας.

Πληκτρολογούμε τα εξής για να εισέλθουμε στον κατάλογο εργασίας, να δημιουργήσουμε έναν κατάλογο που ονομάζεται “demo” και να ελέγξουμε τις ιδιότητές του:

cd work
mkdir demo
ls -lh -d demo

ο

Το SGID bit και η ομάδα “geek” εφαρμόζονται αυτόματα στον κατάλογο “demo”.

Ας πληκτρολογήσουμε τα παρακάτω για να δημιουργήσουμε ένα αρχείο με το αφή εντολή και ελέγξτε τις ιδιότητές του:

touch useful.sh
ls -lh useful.sh

ο

Η ομάδα του νέου αρχείου ορίζεται αυτόματα σε “geek”.

Το κολλώδες κομμάτι

Το κολλώδες κομμάτι πήρε το όνομά του από τον ιστορικό του σκοπό. Όταν ορίζεται σε ένα εκτελέσιμο αρχείο, επισήμανε στο λειτουργικό σύστημα ότι τα τμήματα κειμένου του εκτελέσιμου αρχείου πρέπει να διατηρούνται σε εναλλαγή, καθιστώντας την επαναχρησιμοποίησή τους ταχύτερη. Στο Linux, το κολλώδες bit επηρεάζει μόνο έναν κατάλογο — η ρύθμιση του σε ένα αρχείο δεν θα είχε νόημα.

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

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

Ας δημιουργήσουμε έναν κατάλογο που ονομάζεται “κοινόχρηστο”. Θα χρησιμοποιήσουμε τη συμβολική λειτουργία o+t με το chmod για να ορίσουμε το sticky bit σε αυτόν τον κατάλογο. Στη συνέχεια, θα εξετάσουμε τα δικαιώματα σε αυτόν τον κατάλογο, καθώς και τους καταλόγους /tmp και /var/tmp.

Πληκτρολογούμε τις παρακάτω εντολές:

mkdir shared
sudo chmod o+t shared
ls -lh -d shared
ls -lh -d /tmp
ls -lh -d /var/tmp

ο

Εάν έχει οριστεί το sticky bit, το εκτελέσιμο bit του συνόλου των δικαιωμάτων αρχείου “άλλο” ορίζεται σε “t”. Το όνομα του αρχείου επισημαίνεται επίσης με μπλε χρώμα.

Οι φάκελοι /tmp και /var/tmp είναι δύο παραδείγματα καταλόγων που έχουν όλα τα δικαιώματα αρχείων που έχουν οριστεί για τον κάτοχο, την ομάδα και άλλα (γι’ αυτό επισημαίνονται με πράσινο χρώμα). Χρησιμοποιούνται ως κοινόχρηστες τοποθεσίες για προσωρινά αρχεία.

Με αυτές τις άδειες, οποιοσδήποτε θα πρέπει, θεωρητικά, να μπορεί να κάνει οτιδήποτε. Ωστόσο, το sticky bit τα παρακάμπτει και κανείς δεν μπορεί να διαγράψει ένα αρχείο που δεν του ανήκει.

Υπενθυμίσεις

Ακολουθεί μια γρήγορη λίστα ελέγχου των όσων καλύψαμε παραπάνω για μελλοντική αναφορά:

Το SUID λειτουργεί μόνο σε αρχεία.
Μπορείτε να εφαρμόσετε το SGID σε καταλόγους και αρχεία.
Μπορείτε να εφαρμόσετε το sticky bit μόνο σε καταλόγους.
Εάν οι ενδείξεις “s”, “g” ή “t” εμφανίζονται με κεφαλαία, το εκτελέσιμο bit (x) δεν έχει οριστεί.