Εν συντομία: Στα δικαιώματα αρχείων του διακομιστή ιστού ισχύει μία βασική αρχή: ο χρήστης υπό τον οποίο εκτελείται η PHP επιτρέπεται να διαβάζει τον δικό του κώδικα, αλλά όχι να τον αλλάζει. Δικαιώματα εγγραφής παίρνουν μόνο οι φάκελοι upload, cache και tmp, και εκεί δεν εκτελείται PHP. Δικαιώματα όπως το 777 δεν έχουν θέση σε διακομιστή παραγωγής.
Γιατί τα δικαιώματα αρχείων κάνουν τη διαφορά μετά από μια εισβολή
Όταν επιτιθέμενοι εκτελούν κώδικα σε έναν διακομιστή μέσω μιας ευπάθειας, ο κώδικας αυτός εκτελείται με τα δικαιώματα της διεργασίας PHP. Ό,τι επιτρέπεται σε αυτόν τον χρήστη, επιτρέπεται και στον επιτιθέμενο. Ακριβώς εδώ κρίνεται αν μια εισβολή θα γίνει μόνιμη κερκόπορτα.
Με το PHP2Shell αυτό το σενάριο έγινε τον Οκτώβριο του 2026 πολύ συγκεκριμένο. Οι ευπάθειες CVE-2026-109618 και CVE-2026-109619 επιτρέπουν την εκτέλεση κακόβουλου κώδικα χωρίς σύνδεση. Έχουν διορθωθεί από τις 21.10.2026 στις PHP 8.5.12, 8.4.27, 8.3.36 και 8.2.35. Τα σωστά δικαιώματα αρχείων δεν αποτρέπουν μια επίθεση, αποτρέπουν όμως τον κώδικα που εισάγεται κρυφά από το να ξαναγράψει μόνιμα την εφαρμογή σας.
Σε πολλές εγκαταστάσεις ολόκληρος ο κώδικας ανήκει στον χρήστη του διακομιστή ιστού, ώστε οι ενημερώσεις να λειτουργούν με το πάτημα ενός κουμπιού. Είναι βολικό, αλλά ακριβώς η κατάσταση που αναζητούν οι επιτιθέμενοι.
Η βασική αρχή: διαχωρίστε τον ιδιοκτήτη και τον χρήστη εκτέλεσης
Λογικός είναι ένας διαχωρισμός σε δύο ρόλους. Ένας ιδιοκτήτης, π.χ. ένας χρήστης deploy, κατέχει τα αρχεία και εφαρμόζει τις ενημερώσεις. Η διεργασία PHP εκτελείται υπό διαφορετικό χρήστη και έχει δικαίωμα μόνο ανάγνωσης μέσω της ομάδας.
| Τομέας | Ιδιοκτήτης : Ομάδα | Δικαιώματα αρχείων | Δικαιώματα φακέλων |
|---|---|---|---|
| Κώδικας προγράμματος | deploy : seite1 | 640 | 750 |
| Διαμόρφωση με κωδικούς | deploy : seite1 | 640 | – |
| Uploads, cache, tmp | seite1 : seite1 | 640 | 750 |
| Logs | root ή seite1 | 640 | 750 |
Ο ίδιος ο διακομιστής ιστού, π.χ. το Nginx, χρειάζεται με το PHP-FPM μόνο πρόσβαση ανάγνωσης σε στατικά αρχεία όπως εικόνες και CSS. Την αποκτά μέσω της ομάδας ή ενός στοχευμένου κανόνα πρόσβασης. Όποιος διατηρεί περισσότερους ιστοτόπους, δίνει σε καθέναν δικό του χρήστη εκτέλεσης· πώς συνδυάζεται αυτό με τα pools, αναφέρεται στον οδηγό open_basedir και απομόνωση ανά ιστότοπο.
Έλεγχος των δικαιωμάτων αρχείων στον διακομιστή ιστού
Προτού αλλάξετε οτιδήποτε, αποκτήστε μια συνολική εικόνα. Οι παρακάτω εντολές δεν αλλάζουν τίποτα.
# Υπό ποιον χρήστη εκτελούνται οι διεργασίες PHP;
ps -eo user,cmd | grep -E "[p]hp-fpm|[a]pache2|[h]ttpd" | sort | uniq -c
# Αρχεία και φάκελοι εγγράψιμοι από όλους
find /var/www -perm -o+w -ls
# Αρχεία που ανήκουν στον χρήστη του διακομιστή ιστού (παράδειγμα www-data)
find /var/www -user www-data -type f -name "*.php" | head -50
# Δικαιώματα των αρχείων διαμόρφωσης
ls -la /var/www/*/wp-config.php /var/www/*/.env 2>/dev/null
Εγγραφές εγγράψιμες από όλους είναι σχεδόν πάντα λάθος. Αρχεία PHP που ανήκουν στον χρήστη εκτέλεσης δείχνουν ότι αυτός μπορεί να αλλάξει τον κώδικά του. Ύποπτα είναι επιπλέον μεμονωμένα αρχεία των οποίων ο ιδιοκτήτης ή τα δικαιώματα διαφέρουν από τα γειτονικά αρχεία. Αυτό μπορεί να είναι ένδειξη αρχείων που έχουν εισαχθεί κρυφά, όπως περιγράφεται στον οδηγό Εντοπισμός και αφαίρεση webshell.
Διόρθωση των δικαιωμάτων: βήμα προς βήμα
Αλλάξτε δικαιώματα μόνο μετά από αντίγραφο ασφαλείας και, αν είναι δυνατό, πρώτα σε περιβάλλον δοκιμών. Αν υπάρχει υποψία εισβολής, διασώστε προηγουμένως τα ίχνη, επειδή ο ιδιοκτήτης και οι χρονοσφραγίδες αποτελούν τότε αποδεικτικά στοιχεία.
SITE=/var/www/seite1
# Ιδιοκτήτης: χρήστης deploy, ομάδα: χρήστης εκτέλεσης
sudo chown -R deploy:seite1 "$SITE"
# Φάκελοι 750, αρχεία 640
sudo find "$SITE" -type d -exec chmod 750 {} +
sudo find "$SITE" -type f -exec chmod 640 {} +
# Μόνο αυτούς τους φακέλους επιτρέπεται να γράφει η PHP (προσαρμόστε τις διαδρομές στην εφαρμογή)
sudo chown -R seite1:seite1 "$SITE/public/uploads" "$SITE/var/cache"
Ελέγξτε στη συνέχεια πλήρως τον ιστότοπο: αρχική σελίδα, σύνδεση, φόρμες, upload εικόνας, caches. Ποιους φακέλους πρέπει να γράφει μια εφαρμογή, αναφέρεται στις απαιτήσεις συστήματος του κατασκευαστή στην επίσημη σελίδα του.
Ένα chmod -R 777 για να λυθεί γρήγορα ένα πρόβλημα ανοίγει τον διακομιστή σε κάθε τοπικό χρήστη και σε κάθε διεργασία που έχει εισαχθεί κρυφά. Διορθώστε αντί γι' αυτό τον ιδιοκτήτη και την ομάδα.
Αποτροπή εκτέλεσης PHP σε εγγράψιμους φακέλους
Τα δικαιώματα εγγραφής είναι μόνο κατά το ήμισυ τόσο επικίνδυνα όταν εκεί δεν μπορεί να εκτελεστεί κώδικας. Αποκλείστε την εκτέλεση PHP σε φακέλους upload και cache σε επίπεδο διακομιστή ιστού. Για τον Apache στη διαμόρφωση του VirtualHost:
<Directory "/var/www/seite1/public/uploads">
<FilesMatch "\.(php|phtml|phar)$">
Require all denied
</FilesMatch>
</Directory>
Για το Nginx αρκεί ένα μπλοκ location που απορρίπτει αιτήματα προς αρχεία PHP σε αυτούς τους φακέλους. Ο κανόνας ανήκει στη διαμόρφωση του διακομιστή και όχι σε ένα .htaccess μέσα στον φάκελο upload, το οποίο ένας επιτιθέμενος με δικαιώματα εγγραφής θα μπορούσε να αλλάξει ξανά.
Συμπληρωματικά αξίζει μια ματιά στο umask του χρήστη deploy, ώστε τα νέα αρχεία να μη δημιουργούνται αυτόματα με υπερβολικά ανοιχτά δικαιώματα. Μια τιμή 027 οδηγεί σε 640 για αρχεία και 750 για φακέλους. Σε δικούς σας διακομιστές αυτή η ευθύνη βαρύνει πλήρως εσάς· τι άλλο περιλαμβάνεται εκεί, περιγράφει η σελίδα Ασφάλεια root servers και vServers από εσάς τους ίδιους.
Ειδικές περιπτώσεις: πάνελ φιλοξενίας, shared hosting και deployments
Δεν μπορεί κάθε διακομιστής να στηθεί κατά το εγχειρίδιο. Πάνελ φιλοξενίας όπως το Plesk ή το cPanel δημιουργούν δικούς τους χρήστες και δικαιώματα και τα επαναφέρουν σε ορισμένες ενέργειες. Αλλάζετε εκεί τα δικαιώματα κατά το δυνατόν μέσω των λειτουργιών του πάνελ ή ελέγχετε μετά από ενημερώσεις του πάνελ αν οι ρυθμίσεις σας ισχύουν ακόμη.
Στο shared hosting έχετε συνήθως μόνο έναν χρήστη για τα πάντα. Ένας διαχωρισμός ιδιοκτήτη και χρήστη εκτέλεσης δεν είναι τότε εφικτός. Τόσο σημαντικότερα είναι τα στενά δικαιώματα στα αρχεία διαμόρφωσης, η απουσία δικαιωμάτων 777 και η απενεργοποίηση της εκτέλεσης PHP στους φακέλους upload, στο μέτρο που το επιτρέπει ο πάροχος.
Όποιος εργάζεται με αυτόματα deployments, πρέπει να ορίζει τα δικαιώματα μέσα στο ίδιο το script του deployment. Διαφορετικά κάθε νέα έκδοση επαναφέρει την παλιά, υπερβολικά ανοιχτή κατάσταση. Ένας σύντομος έλεγχος στο τέλος του deployment, π.χ. με την παραπάνω εντολή για εγγράψιμα αρχεία, αναχαιτίζει αξιόπιστα τέτοιες οπισθοδρομήσεις και ενσωματώνεται χωρίς μεγάλο κόπο σε κάθε pipeline.
Πώς βοηθά συγκεκριμένα η PHP SOS;
- Καταγράφουμε ιδιοκτήτες, δικαιώματα και χρήστες εκτέλεσης όλων των ιστοτόπων στον διακομιστή.
- Ορίζουμε μια έννοια δικαιωμάτων που ταιριάζει με την εφαρμογή σας και τον τρόπο ενημέρωσής της.
- Εφαρμόζουμε δικαιώματα και αποκλεισμούς εκτέλεσης και δοκιμάζουμε στη συνέχεια πλήρως τον ιστότοπο.
- Τεκμηριώνουμε την έννοια, ώστε τα deployments και οι ενημερώσεις να μην την χαλαρώνουν ξανά.
Πώς εντάσσεται αυτό σε μια μόνιμη θωράκιση, περιγράφει η υπηρεσία Θωράκιση διακομιστών PHP.
Συχνές ερωτήσεις
Είναι ποτέ σωστά τα δικαιώματα 777;
Σε διακομιστή παραγωγής πρακτικά ποτέ. Με το 777 κάθε χρήστης του συστήματος μπορεί να δημιουργεί και να αλλάζει αρχεία. Αν μια εφαρμογή δεν λειτουργεί χωρίς 777, συνήθως έχει οριστεί λάθος ο ιδιοκτήτης και όχι πολύ στενά τα δικαιώματα.
Γιατί δεν πρέπει να επιτρέπεται στον διακομιστή ιστού να αλλάζει τα δικά του αρχεία;
Επειδή ο κώδικας που έχει εισαχθεί κρυφά εκτελείται με τα δικαιώματα του διακομιστή ιστού. Αν ο διακομιστής ιστού επιτρέπεται να γράφει αρχεία PHP, ένας επιτιθέμενος μπορεί να παραποιήσει υπάρχοντα scripts ή να δημιουργήσει νέες κερκόπορτες. Αν διαχωριστούν ο ιδιοκτήτης και ο χρήστης εκτέλεσης, ο κώδικας παραμένει προστατευμένος από εγγραφή.
Πώς ενημερώνω ένα CMS όταν ο διακομιστής ιστού δεν επιτρέπεται να γράφει;
Οι ενημερώσεις γίνονται τότε μέσω του ιδιοκτήτη, π.χ. με WP-CLI, Composer ή deployment, και όχι μέσω του κουμπιού ενημέρωσης στο backend. Είναι κάπως πιο επίπονο, αλλά ο κώδικας που εισάγεται κρυφά δεν μπορεί να αλλάξει αρχεία του προγράμματος.
Ποια δικαιώματα χρειάζεται το αρχείο διαμόρφωσης με τον κωδικό της βάσης δεδομένων;
Όσο το δυνατόν λιγότερα: αναγνώσιμο για τον χρήστη PHP, για κανέναν άλλον. Συνηθισμένα είναι τα 640 με κατάλληλη ομάδα ή τα 400, όταν ο ίδιος ο χρήστης PHP είναι ο ιδιοκτήτης.