Το δύσκολο έργο της αφαίρεσης ενός USB στο Linux

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

Τι μας παρέχει ο πυρήνας;

Όχι πολλά, ο πυρήνας παρέχει τους μηχανισμούς , αλλά όχι τις πολιτικές. Υπάρχει μια κλήση συστήματος που κάνει πρόσάρτηση και αποπροσάρτηση μιας κατάτμησης και οι γνωστές εντολές mount/umount. Και η κλήση συστήματος απαιτεί αυξημένα δικαιώματα. Άρα θα πρέπει να τρέξουμε την εντολή με sudo. Αλλά τότε πως θα κάνει προσάρτηση ένας απλός χρήστης; Αλλά υπάρχει μια λύση. Να κάνουμε την εντολή suid ή να γίνομε λιγάκι ποιο εκλεπτυσμένοι.

Εντάξει λύσαμε το πρόβλημα, αλλά προσθέσαμε άλλους πονοκεφάλους. Ο κάθε χρήστης θα μπορεί να προσαρτήσει ή αποπροσαρτήσει οποιαδήποτε κατάτμηση! Ουσιαστικά αυτό που κάναμε είναι να μεταφέρουμε το έργο σε μια προνομιούχα υπηρεσία. Τρέχοντας ένα εκτελέσιμο με “ειδικές δυνατότητες” περάσαμε ένα σύνορο.

Η mount μπορεί να κάνει κάποιους ελέγχους: Υπάρχει μια καταχώρηση στο /etc/fstab; Μπορεί να την πειράξει ο χρήστης; Αλλά δεν μπορούμε να έχουμε καταχωρήσεις εκεί για κάθε πιθανό στικάκι. Ποιος θα τις προσθέσει; Ιδιότητες όπως “είναι αφαιρούμενο μέσο” ή “είναι ο χρήστης δίπλα στον υπολογιστή ή έχει απομακρυσμένη πρόσβαση” είναι έξω από την γνώση της mount. Κάναμε μια τρύπα στο νερό, πρέπει να υπάρχει κάποιος άλλος τρόπος.

Ζήτα από κάποιον άλλο να το κάνει

Μια άλλη λύση είναι να ζητήσουμε μέσα από κάποιο κανάλι επικοινωνίας (IPC) κάποια υπηρεσία με αυξημένα δικαιώματα να το κάνει. Και η ποιο συνηθισμένη λύση είναι με την βοήθεια του D-BUS

To udisks2 είναι μια τέτοια υπηρεσία. Παρέχει ένα κανάλι ανταλλαγής μηνυμάτων και δεν είναι απαιτεί να ανοίγουμε δεκάδες κανάλια για να μιλάει μια εφαρμογή με μια άλλη αποκλειστικά. Με κάποιο βοηθητικό πρόγραμμα θα στείλουμε την αίτηση για προσάρτηση στο udisks2 . Και αυτό θα πρέπει να αναρωτηθεί

  • Τι μου ζήτησε ο τύπος να κάνω ;
  • Θα πρέπει να το κάνω;

και ο κάθε τύπος έχει να απαντήσει σε μια ερώτηση, κάτι που έχει συμβεί στον καθένα μας όταν κάνει μια αίτηση σε μια δημόσια υπηρεσία ή ακόμα χειρότερα σε κάποιον internet service provider

  • Έλαβε το αίτημα μου ή απλά το αγνόησε;

Και κάποια αιτήματα είναι παράλογα και δεν πρέπει καν να φτάσουν στην υπηρεσία. Αλλά ποιος θα το καθορίσει αυτό; Σίγουρα όχι ο πυρήνας. Το D-Bus έχει μηχανισμούς για να αποτρέψει μια επικοινωνία, άλλα δεν μπορεί να ξεκαθαρίσει αν μια αίτηση είναι έγκυρη ή όχι. Το χρήστης μπορεί να θέλει να αποπροσαρτήσει ένα δικό του στικάκι, αλλά μπορεί να θέλει να αφαιρέσει αυτό του γείτονα ή κάποια κατάτμηση του ίδιου του λειτουργικού.

Μια λύση είναι να έχει το udisk2 μια ειδική γνώση για το τι μπορεί να κάνει ή να μην κάνει κάποιος χρήστης και πού. Και με βάση αυτή την γνώση να πάρει μια απόφαση για το αν θα δεχτεί το αίτημα. Αλλά οι σχετικοί κανόνες είναι πολύπλοκοι και κανένα σύστημα δεν είναι το ίδιο. Στον δικό μου υπολογιστή ισχύουν άλλοι κανόνες φιλαράκο… Στον δικό μου υπολογιστή θέλω να δώσεις κωδικό χρήστη σε ένα παράθυρο και να έχεις δίπλα ένα RFID κλειδί, γιατί όχι δηλαδή; έχεις πρόβλημα;

Θα μπορούσαμε να προσθέταμε αυτούς τους κανόνες στο udisks2 με κάποιο τρόπο. Και στην συνέχει να κάνουμε το ίδιο για τον Network Manager, στο systemd καθώς και σε κάθε υπηρεσία του systemd. Και κάθε μια να έχει τον δικό της τρόπο για την ρύθμιση. Υπέροχα. Πάω να πάρω το κατάνα μου …

Η λύση του polkit

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

Στην περίπτωση μας ευτυχώς θα ελέγξει μόνο αν η κατάτμηση είναι σε αφαιρούμενο δίσκο, αν τα υπόλοιπα στοιχεία της αίτησης είναι λογικά, αν ο χρήστης είναι τοπικά συνδεμένος (υπηρεσία που παρέχει η logind) , καθώς και αν θα πρέπει ο χρήστης να παρέχει κάποιον κωδικό. Και στην συνέχεια θα δεχτεί ή θα απορρίψει το αίτημα.

Οι πολιτικές που θα συμβουλευτεί είναι στους φακέλους /usr/share/polkit-1/actions, /usr/share/polkit-1/rules.d και /etc/polkit-1/rules.d.

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

Η βασική ιδέα του κειμένου είναι από ένα παλιό κείμενο εδώ:

http://smcv.pseudorandom.co.uk/2015/why_polkit/

Διαβάστε:

4 «Μου αρέσει»