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

Διαφορές μεταξύ λειτουργικών συστημάτων
---------------------------------------

Οι άδειες στο Unix
------------------

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

Τα δικαιώματα διαχειρίζονται σε τρεις κλάσεις. Αυτές είναι γνωστές ως **χρήστης**, **ομάδα**, 
και **άλλοι**. Πρακτικά οι άδειες στο unix είναι μια απλοποιημένη μορφή από λίστες ελέγχου πρόσβασης.

Όταν δημιουργείται ένα αρχείο σε ένα σύστημα unix, οι άδειες του καθορίζονται από την umask της διεργασίας που το δημιουργεί.

### Κλάσεις

Στα συστήματα αρχείων λειτουργικών συστημάτων unix κάθε αρχείο και κατάλογος **ανήκει** σε κάποιον συγκεκριμένο χρήστη.
Ο ιδιοκτήτης ενός αντικειμένου αποτελεί την **κλάση των χρηστών**. Άδειες που ανατίθενται στην κλάση των χρηστών εφαρμόζονται μόνο σε αυτόν τον χρήστη.

Επίσης σε κάθε αρχείο ή κατάλογο ανατίθεται μια **ομάδα** που αποτελεί την **κλάση της ομάδας**. Δικαιώματα που ανατίθενται στην κλάση της ομάδας ισχύουν μόνο για τα μέλη της (εκτός από τον ιδιοκτήτη). Ενώ ένα συγκεκριμένο αρχείο 
μπορεί να ανατεθεί μόνο σε μια ομάδα , ένας χρήστης μπορεί να είναι μέλος σε πολλές ομάδες και μια ομάδα μπορεί να περιλαμβάνει οποιονδήποτε αριθμό χρηστών. Η εντολή "groups" εμφανίζει όλες τις ομάδες στις οποίες ανήκει ένας χρήστης και η εντολή "members" τους χρήστες που ανήκουν σε κάποια ομάδα. Ο διαχειριστής του συστήματος με την εντολή "addgroup" μπορεί να προσθέσει έναν χρήστη σε μια ομάδα.

Οι χρήστες που δεν ανήκουν (σχετικά με ένα αρχείο) είτε στην κλάση των χρηστών (δηλαδή δεν είναι ιδιοκτήτες) ούτε στην κλάση της ομάδας ανήκουν στην **κλάση άλλοι**.

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

### Βασικές άδειες

Υπάρχουν τρεις άδειες-δικαιώματα σε λειτουργικά συστήματα τύπου unix που εφαρμόζονται σε κάθε κλάση:

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

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

### Επιπρόσθετες άδειες

Υπάρχουν τρία ακόμα μπιτ τα οποία καθορίζουν δικαιώματα πρόσβασης και δεν είναι ευρέως γνωστά. 

#### setuid

Το setuid καθορίζει αν το εκτελέσιμο αρχείο θα τρέχει με τις άδειες του ιδιοκτήτη ή τις άδειες αυτού που το κάλεσε. Όταν προσπαθείτε να εκτελέσετε ένα αρχείο και εφόσον έχετε τα δικαιώματα να το εκτελέσετε τότε κανονικά αυτό εκτελείται με τα δικαιώματα τα δικά σας. Είναι χρήσιμο όμως να μπορεί να εκτελεστεί το αρχείο με τα δικαιώματα του ιδιοκτήτη του αρχείου και όχι με τα δικαιώματα αυτού που το εκτελεί. Κλασικό παράδειγμα είναι τα παιχνίδια στα οποία θέλουμε να κρατάμε το σκορ για όλους τους χρήστες του υπολογιστή. Σε αυτές τις περιπτώσεις συνήθως δημιουργείται ένας χρήστης που κρατάει το σκορ (χωρίς άλλα δικαιώματα και χωρίς καν δικαίωμα εισόδου στο σύστημα).

Το setuid είχε "εφευρεθεί" από τον Dennis MacAlistair Ritchie. Είχε πατενταριστεί από την AT&T αλλά το κόστος παρακολούθησης των δικαιωμάτων υπερέβαινε τα έσοδα οπότε η εταιρεία το παραχώρησε σαν κοινό κτήμα (public domain). Η παραχώρηση αυτή θεωρείται εξαιρετικά σημαντική για την κοινότητα του Linux αφού χωρίς αυτή τη λειτουργία θα ήταν τελείως διαφορετικό σήμερα.

#### setgid

Αντίστοιχο με το setuid, αλλά επιβάλλει το να τρέχει το εκτελέσιμο με τις άδειες της ομάδας. Κανονικά σε ένα αρχείο που δημιουργείται ανήκει αυτόματα στην ομάδα που ανήκει και ο χρήστης που το δημιούργησε. Αν έχει "τεθεί" το setgid σε φάκελο, τότε τα αρχεία που δημιουργούνται μέσα σε αυτόν ανήκουν αυτόματα στην ομάδα που ανήκει ο φάκελος. Εννοείται, βέβαια, ότι ο ιδιοκτήτης του αρχείου μπορεί να αλλάξει την ομάδα αν θέλει.

#### sticky bit

Στην αρχή χρησίμευε για να διατηρεί στη μνήμη ένα εκτελέσιμο αρχείο, όταν τελείωνε τη λειτουργία του, ώστε να μην χρειάζεται να ξαναδιαβαστεί από το αποθηκευτικό μέσο. Έτσι, αν κάποιος το χρησιμοποιούσε πολλές φορές, δεν θα χρειαζόταν να ξαναδιαβαστεί ο δίσκος ή η μαγνητοταινία. Με τα σημερινά γρήγορα αποθηκευτικά μέσα, σπάνια χρειάζεται γι αυτήν τη διαδικασία και είχε περάσει στην αφάνεια. Τώρα χρησιμοποιείται για να προσδιορίσει ποιος μπορεί να διαγράψει τα αρχεία ενός φακέλου. Πολύ χρήσιμο για υποφακέλους μέσα σε κοινόχρηστους φακέλους. Για παράδειγμα στον φάκελο /tmp μπορεί να δημιουργήσει κάποιος έναν φάκελο και να θέσει το sticky bit. Τα αρχεία που θα δημιουργεί θα μπορεί μόνο αυτός να τα διαγράφει.

Συμβολισμός των αδειών στο unix
-------------------------------

### Συμβολισμός

* - σημαίνει κανονικό αρχείο
* d σημαίνει κατάλογος directory
* b σημαίνει ειδικό αρχείο μπλοκ
* c σημαίνει ειδικό αρχείο χαρακτήρων
* l σημαίνει συμβολικός σύνδεσμος
* p σημαίνει διασωλήνωση με όνομα
* s σημαίνει d υποδοχέας ονόματος περιοχής (domain socket)

Κάθε κλάση δικαιωμάτων αναπαρίσταται από τρεις χαρακτήρες. Η πρώτη ομάδα χαρακτήρων αναπαριστά την κλάση χρήστη, η δεύτερη την κλάση ομάδας και η τρίτη και τελική τις άλλες κλάσεις.

Καθένας από τους τρεις χαρακτήρες αναπαριστά τις άδειες ανάγνωση **r**ead , εγγραφή **w**rite, και εκτέλεση e**x**ecute αντίστοιχα:

* **r** αν τεθεί το μπιτ ανάγνωσης, **-** αν δεν τεθεί.
* **w** αν τεθεί το μπιτ εγγραφής, **-** αν δεν τεθεί.
* **x** αν τεθεί το μπιτ εκτέλεσης, **-** αν δεν τεθεί.
* Τα **r** και **w** θα είναι **s** αν το μπιτ setuid ή setgid έχει επίσης τεθεί, και το **x** θα είναι **t** αν το sticky μπιτ έχει τεθεί. Αν τα setuid, setgid και sticky bit έχουν τεθεί αλλά τα αντίστοιχα μπιτ εκτέλεσης δεν έχουν τεθεί τότε θα είναι στα κεφαλαία.

Ακολουθούν παραδείγματα στην συμβολική γραφή:

* `-rwxr-xr-x` για ένα κανονικό αρχείο που η κλάση του των χρηστών έχει πλήρη δικαιώματα και του οποίου η ομάδα και οι άλλες κλάσεις έχουν μόνο δικαίωμα ανάγνωσης και εκτέλεσης.
* `crw-rw-r--` για ένα ειδικό αρχείο χαρακτήρα του οποίου οι κλάσεις χρήστη και ομάδας έχουν δικαιώματα ανάγνωσης και εγγραφής και οι άλλες κλάσεις μόνο δικαίωμα ανάγνωσης.
* `dr-x------` για έναν κατάλογο του οποίου η κλάση χρηστών έχει δικαιώματα ανάγνωσης και *εκτέλεσης* (με την ειδική σημασία που δώσαμε στην εκτέλεση για τους καταλόγους) και κανένα η κλάση ομάδας και άλλων.
* `--S--S--T` αρχείο στο οποίο ενώ έχουν τεθεί τα ειδικά μπιτ, δεν έχει τεθεί κανένα άλλο. Το παράδειγμα δείχνει απλά τη δυνατότητα που υπάρχει, αλλά δεν έχει καμία χρησιμότητα αφού το αρχείο δεν μπορεί κανένας να το διαβάσει να το γράψει ή να το εκτελέσει.

### Συμβολισμός στο οκταδικό

Μια ακόμα κοινή μέθοδος για την αναπαράσταση των αδειών των αρχείων του unix είναι στο οκταδικό σύστημα αρίθμησης. Ο συμβολισμός αυτός αποτελείται από τρία ή τέσσερα ψηφία με τιμή που έχει βάση το 8.

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

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

* Το μπιτ ανάγνωσης προσθέτει 4 στο σύνολο (100 στο δυαδικό),
* Το μπιτ εγγραφής προσθέτει 2 στο σύνολο (010 στο δυαδικό), και
* Το μπιτ εκτέλεσης προσθέτει 1 στο σύνολο (001 στο δυαδικό).

Αυτές οι τιμές παρέχουν μονοσήμαντους συνδυασμούς, κάθε άθροισμα αναπαριστά ένα συγκεκριμένο συνδυασμό αδειών.

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

* `-rwxr-xr-x` θα αναπαρασταθεί ως 755 στα τρία οκταδικά ψηφία.
* `-rw-rw-r--` θα αναπαρασταθεί ως 664 στα τρία οκταδικά ψηφία.
* `-r-x------` θα αναπαρασταθεί ως 500 στα τρία οκταδικά ψηφία.

  

Ακολουθεί μια σύνοψη της σημασίας της κάθε τιμής στο οκταδικό:

```
0 --- no permission
1 --x εκτέλεση
2 -w- εγγραφή 
3 -wx εγγραφή και εκτέλεση
4 r-- ανάγνωση
5 r-x ανάγνωση και εκτέλεση
6 rw- ανάγνωση και εγγραφή
7 rwx ανάγνωση, εγγραφή και εκτέλεση.
```

Οκταδικές τιμές ψηφίων μπορούν να προστεθούν δίνοντάς μας την συμβολική γραφή: 

(4=r)+(1=x) == (5=r-x)  
 
(4=r)+(2=w) == (6=rw-)  
 
(4=r)+(2=w)+(1=x) == (7=rwx)

Ακολουθεί και μια σύνοψη που δείχνει ποια οκταδικά ψηφία επηρεάζουν άδειες για χρήστη, ομάδα και άλλους:

* ΧΟΑ = Χρήστης, Ομάδα, Άλλοι
* 777 = `-rwxrwxrwx` = rwx για όλους
* 754 = `-rwxr-xr--` = rwx για ιδιοκτήτη, r-x για ομάδα, r-- για άλλους
* 124 = `---x-w-r--` = --x για ιδιοκτήτη ,-w- για ομάδα, r-- για άλλους

Παραπομπές
----------

1. ↑  Brown, Chris (2010). «Μια ιστορία σε τρία bits». *Ελληνικό LINUX FORMAT* (COMPUPRESS). σελ. 73

Δείτε επίσης
------------

* Access control list
* Σύστημα αρχείων
* POSIX