Ενότητα 3 · 3.1
Χρήστες, ομάδες και δικαιώματα αρχείων
Ενότητα 3: Χρήστες, δικαιώματα και sudo · Χρόνος ανάγνωσης: 12 λεπτά
Στόχος μαθήματος: Μετά από αυτό το μάθημα μπορείτε να δημιουργείτε και να εξετάζετε χρήστες και ομάδες, να διαβάζετε τα δικαιώματα ενός αρχείου ή φακέλου στο ls -l και να τα ρυθμίζετε σωστά με τα chmod και chown, χωρίς να ανοίγετε τα πάντα σε όλους.
Βασικές έννοιες: root (UID 0), απλός χρήστης, χρήστης συστήματος, /etc/passwd, /etc/shadow, ομάδα, adduser, id, rwx, κάτοχος, ομάδα, λοιποί, οκταδικό (644, 755, 600), chmod, chown, umask, setuid, 777
Ο καθένας είναι ένας αριθμός
Το Linux σχεδιάστηκε εξαρχής για πολλούς χρήστες σε ένα μηχάνημα. Κάθε διεργασία που εκτελείται, εκτελείται εκ μέρους κάποιου χρήστη, και κάθε αρχείο έχει κάτοχο. Για το σύστημα, ένας χρήστης είναι κυρίως ένας αριθμός, το UID:
- Ο root έχει UID 0. Ο root μπορεί να κάνει τα πάντα: να διαβάσει και να αλλάξει κάθε αρχείο, να σταματήσει κάθε υπηρεσία, να δημιουργήσει κάθε χρήστη. Δεν υπάρχει ερώτηση "είστε σίγουροι;".
- Οι απλοί χρήστες, όπως ο
anna, παίρνουν στο Debian και στο Ubuntu UID από 1000 και πάνω. Μπορούν να γράφουν στον δικό τους αρχικό φάκελο (home) και ελάχιστα άλλα. - Οι χρήστες συστήματος έχουν χαμηλό αριθμό και συνήθως ούτε κωδικό πρόσβασης ούτε shell. Οι υπηρεσίες εκτελούνται υπό τέτοιον χρήστη: το nginx υπό τον
www-data, η PostgreSQL υπό τονpostgres. Αν παραβιαστεί μια τέτοια υπηρεσία, ο εισβολέας έχει μόνο τα δικαιώματα αυτού του χρήστη, όχι του root.
Ποιος είστε, το βλέπετε με την εντολή id:
anna@web1:~$ id
uid=1000(anna) gid=1000(anna) groups=1000(anna),27(sudo),100(users)Η Anna έχει UID 1000, μια δική της ομάδα anna, και ανήκει επίσης στις ομάδες sudo και users.
Πού βρίσκονται οι χρήστες
Η λίστα των χρηστών βρίσκεται στο /etc/passwd, μία γραμμή ανά χρήστη:
anna@web1:~$ grep -E '^(root|www-data|anna):' /etc/passwd
root:x:0:0:root:/root:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
anna:x:1000:1000:Anna,,,:/home/anna:/bin/bashΤα πεδία, χωρισμένα με άνω και κάτω τελεία: όνομα, x (ο κωδικός πρόσβασης βρίσκεται αλλού), UID, κύρια ομάδα, περιγραφή, αρχικός φάκελος, shell. Στον www-data το shell είναι /usr/sbin/nologin: η σύνδεση δεν είναι δυνατή.
Οι ίδιοι οι κωδικοί πρόσβασης βρίσκονται, κρυπτογραφημένοι (σε μορφή hash), στο /etc/shadow. Αυτό το αρχείο μπορεί να το διαβάσει μόνο ο root. Ένα ! ή * στην αρχή του πεδίου κωδικού σημαίνει: η σύνδεση με κωδικό πρόσβασης δεν είναι δυνατή. Έτσι ο root είναι κλειδωμένος από προεπιλογή στο Ubuntu, και στο Debian αν δεν ορίσατε κωδικό root κατά την εγκατάσταση.
Δημιουργία χρηστών και ομάδων
Στο Debian και στο Ubuntu χρησιμοποιείτε το φιλικό adduser:
root@web1:~# adduser anna
info: Adding user `anna' ...
info: Adding new group `anna' (1000) ...
info: Adding new user `anna' (1000) with group `anna (1000)' ...
info: Creating home directory `/home/anna' ...
info: Copying files from `/etc/skel' ...
New password:
Retype new password:
...Το adduser δημιουργεί τον χρήστη, μια δική του ομάδα με το ίδιο όνομα, έναν αρχικό φάκελο και ζητά κωδικό πρόσβασης. Υπάρχει επίσης το χαμηλότερου επιπέδου useradd (που στο AlmaLinux και στο Rocky Linux είναι η συνηθισμένη εντολή), αλλά χωρίς επιλογές κάνει λιγότερα: δεν ορίζει κωδικό πρόσβασης και σε ορισμένα συστήματα δεν δημιουργεί αρχικό φάκελο.
Μια ομάδα είναι ένας τρόπος να δίνετε δικαιώματα σε πολλούς χρήστες ταυτόχρονα. Προσθήκη χρήστη σε ομάδα:
root@web1:~# adduser anna www-data
root@web1:~# usermod -aG www-data anna # το ίδιο, λειτουργεί παντούΠροσέξτε το -a στο usermod: χωρίς το -a αντικαθιστάτε όλες τις επιπλέον ομάδες του χρήστη με μόνο αυτήν τη μία. Μια νέα ομάδα ισχύει μόνο μετά από νέα σύνδεση.
Κλείδωμα ενός λογαριασμού χωρίς διαγραφή (για παράδειγμα ενός πρώην συνεργάτη):
root@web1:~# usermod -L -e 1 janΤο -L κλειδώνει τον κωδικό πρόσβασης, το -e 1 κάνει τον λογαριασμό να λήξει. Προσοχή: ένας κλειδωμένος κωδικός δεν σταματά πάντα ένα κλειδί SSH. Αφαιρέστε λοιπόν και τα κλειδιά από το /home/jan/.ssh/authorized_keys (μάθημα 2.3)· τον λογαριασμό που έχει λήξει (-e 1) το sshd τον απορρίπτει.
Ανάγνωση δικαιωμάτων
anna@web1:~$ ls -l /var/www/example.com
total 12
-rw-r--r-- 1 anna www-data 1520 Nov 9 10:12 index.html
-rw-r----- 1 anna www-data 412 Nov 9 10:14 config.php
drwxr-xr-x 2 anna www-data 4096 Nov 9 10:15 images
drwxrwxr-x 2 www-data www-data 4096 Nov 9 10:20 uploadsΤο πρώτο μπλοκ των δέκα χαρακτήρων είναι το κλειδί για όλα:
- Χαρακτήρας 1: το είδος. Το
-είναι απλό αρχείο, τοdφάκελος (directory), τοlσυντόμευση (symlink). - Χαρακτήρες 2 έως 4: τι επιτρέπεται στον κάτοχο.
- Χαρακτήρες 5 έως 7: τι επιτρέπεται στην ομάδα.
- Χαρακτήρες 8 έως 10: τι επιτρέπεται στους λοιπούς (όλους τους άλλους).
Ακολουθούν ο αριθμός συνδέσμων, ο κάτοχος, η ομάδα, το μέγεθος και η ημερομηνία.
Τα γράμματα σημαίνουν σε ένα αρχείο:
| Γράμμα | Σημασία σε αρχείο |
|---|---|
r | ανάγνωση |
w | τροποποίηση |
x | εκτέλεση ως πρόγραμμα ή script |
Και σε έναν φάκελο κάτι λίγο διαφορετικό:
| Γράμμα | Σημασία σε φάκελο |
|---|---|
r | προβολή των ονομάτων των αρχείων του φακέλου |
w | δημιουργία, μετονομασία και διαγραφή αρχείων στον φάκελο |
x | είσοδος στον φάκελο και άνοιγμα αρχείων μέσα σε αυτόν |
Το τελευταίο εκπλήσσει πολλούς. Χωρίς x σε έναν φάκελο δεν φτάνετε στα αρχεία του, ακόμη κι αν αυτά είναι αναγνώσιμα. Και όποιος έχει w σε έναν φάκελο, μπορεί να διαγράψει αρχεία μέσα σε αυτόν, ακόμη κι αν ανήκουν σε άλλον.
Στο παράδειγμα: το index.html μπορούν να το διαβάσουν όλοι· το config.php (με τον κωδικό της βάσης δεδομένων) η Anna μπορεί να το διαβάσει και να το τροποποιήσει, η ομάδα www-data (δηλαδή ο web server) μόνο να το διαβάσει, και οι υπόλοιποι τίποτα. Στο uploads ο web server μπορεί να γράψει, επειδή εκεί αποθηκεύονται τα uploads των επισκεπτών.
Δικαιώματα ως αριθμός
Τα δικαιώματα γράφονται συχνά ως τρία ψηφία, ο οκταδικός αριθμός. Κάθε γράμμα έχει μια τιμή: r = 4, w = 2, x = 1. Προσθέστε ανά ομάδα:
| Δικαιώματα | Αριθμός | Χρήση |
|---|---|---|
rw-r--r-- | 644 | απλό αρχείο που μπορούν να διαβάσουν όλοι |
rw-r----- | 640 | αρχείο για κάτοχο και ομάδα, όπως μια ρύθμιση με κωδικό πρόσβασης |
rw------- | 600 | μυστικό αρχείο, όπως το authorized_keys ή ένα ιδιωτικό κλειδί |
rwxr-xr-x | 755 | φάκελος ή πρόγραμμα που μπορούν να χρησιμοποιούν όλοι |
rwx------ | 700 | ιδιωτικός φάκελος, όπως το ~/.ssh |
Αλλαγή δικαιωμάτων: chmod και chown
anna@web1:~$ chmod 640 /var/www/example.com/config.php
anna@web1:~$ chmod g+w /var/www/example.com/uploads
root@web1:~# chown anna:www-data /var/www/example.com/config.phpΤο chmod αλλάζει τα δικαιώματα, με αριθμό ή με γράμματα (u, g, o για κάτοχο, ομάδα, λοιπούς· + ή - και το γράμμα). Το chown eigenaar:groep αλλάζει κάτοχο και ομάδα· αυτό επιτρέπεται μόνο στον root. Με το -R και τα δύο λειτουργούν σε έναν ολόκληρο φάκελο, και εκεί συχνά γίνονται λάθη: το chmod -R 644 σε έναν φάκελο κάνει όλους τους υποφακέλους άχρηστους, επειδή οι φάκελοι χρειάζονται x. Για ένα ολόκληρο δέντρο χρησιμοποιήστε καλύτερα το find:
root@web1:~# find /var/www/example.com -type d -exec chmod 755 {} +
root@web1:~# find /var/www/example.com -type f -exec chmod 644 {} +Ποτέ 777
"Δεν δούλευε, οπότε έβαλα 777." Το 777 σημαίνει: όλοι στον server μπορούν να το διαβάσουν, να το τροποποιήσουν και να το εκτελέσουν. Αν κάποτε παραβιαστεί μία υπηρεσία ή ένας ιστότοπος στον server σας, ο εισβολέας μπορεί να γράψει οπουδήποτε υπάρχει 777, συμπεριλαμβανομένων των αρχείων PHP σας. Το πραγματικό πρόβλημα είναι σχεδόν πάντα ο κάτοχος ή η ομάδα: δώστε στον web server μέσω της ομάδας ακριβώς το δικαίωμα που χρειάζεται, και μόνο στον φάκελο όπου το χρειάζεται.
Προεπιλεγμένα δικαιώματα και ειδικά bits
Τα νέα αρχεία παίρνουν τα δικαιώματά τους μέσω του umask. Με το συνηθισμένο umask 022 τα νέα αρχεία γίνονται 644 και οι νέοι φάκελοι 755. Το umask σας το βλέπετε με την εντολή umask.
Μερικές φορές βλέπετε ένα s αντί για x, όπως στο /usr/bin/passwd (-rwsr-xr-x). Αυτό είναι το bit setuid: το πρόγραμμα εκτελείται με τα δικαιώματα του κατόχου (root), ακόμη κι αν το ξεκινά ένας απλός χρήστης. Αυτό χρειάζεται για μερικά προγράμματα συστήματος, αλλά μην το βάζετε ποτέ μόνοι σας σε ένα script. Ένα απροσδόκητο αρχείο setuid είναι γνωστή ένδειξη εισβολής· με το find / -perm -4000 -type f 2>/dev/null τα βλέπετε όλα.
Στο AlmaLinux και στο Rocky Linux
Εκεί το adduser είναι άλλο όνομα για το useradd· χρησιμοποιήστε useradd -m anna και στη συνέχεια passwd anna. Η προσθήκη ομάδων γίνεται με το usermod -aG. Το SELinux προσθέτει ένα επιπλέον επίπεδο δίπλα στα δικαιώματα αυτού του μαθήματος: ένα αρχείο με τα σωστά δικαιώματα μπορεί παρ' όλα αυτά να απορριφθεί αν έχει λάθος ετικέτα SELinux (το ls -Z την εμφανίζει).
Σύνοψη
- Κάθε χρήστης έχει ένα UID· ο root (0) μπορεί να κάνει τα πάντα, οι υπηρεσίες εκτελούνται υπό δικούς τους χρήστες συστήματος χωρίς shell.
- Οι χρήστες βρίσκονται στο
/etc/passwd, τα hash των κωδικών στο/etc/shadow. Δημιουργήστε χρήστες με τοadduserκαι προσθέστε ομάδες με τοusermod -aG. - Το
ls -lδείχνει το είδος, τα δικαιώματα κατόχου, ομάδας και λοιπών, και μετά τον κάτοχο και την ομάδα. Σε φάκελο, τοxσημαίνει είσοδο και τοwδημιουργία και διαγραφή αρχείων. - Συνηθισμένοι αριθμοί: 644 και 755 για δημόσια, 640 για ρυθμίσεις με μυστικά, 600 και 700 για ιδιωτικά. Ποτέ 777.
- Χρησιμοποιήστε το
findγια να ορίσετε δικαιώματα σε ολόκληρο δέντρο· προσέχετε τα αρχεία setuid.
Κουίζ
Άσκηση
Άσκηση Z3.1: Ανάγνωση δικαιωμάτων. Ανοίξτε το αρχείο παραδείγματος rechten-1.txt: την έξοδο του id για τρεις χρήστες και του ls -l σε έναν φάκελο ιστότοπου. Απαντήστε σε κάθε ερώτηση ποιος μπορεί να κάνει τι (για παράδειγμα: "μπορεί ο web server να τροποποιήσει το config.php;", "ποιο αρχείο έχει υπερβολικά χαλαρά δικαιώματα;", "ποιος αριθμός αντιστοιχεί στο .env;"). Το πρόγραμμα συγκρίνει τις απαντήσεις σας με το σταθερό κλειδί και εξηγεί για κάθε ερώτηση το γιατί.
Για περαιτέρω μελέτη
Τα βήματα σε αυτά τα άρθρα ισχύουν για τα πακέτα hosting και τα VPS της WebOké· σε άλλους παρόχους η διαδικασία είναι παρόμοια.
- Απαγορευμένη πρόσβαση (403): Δεν έχετε δικαίωμα πρόσβασης στο / σε αυτόν τον διακομιστή
- Σύνδεση στο VPS σας με SSH (και δημιουργία κλειδιού SSH)
- Στο μάθημα WordPress: μάθημα 7.4 "Θωράκιση του ιστότοπου: δικαιώματα, headers και plugins ασφαλείας"
- Εγχειρίδιο Debian για το adduser: https://manpages.debian.org/trixie/adduser/adduser.8.en.html
- Εγχειρίδιο Debian για το chmod: https://manpages.debian.org/trixie/coreutils/chmod.1.en.html
