Ενότητα 7 · 7.4
Ενίσχυση ασφάλειας του ιστοτόπου: δικαιώματα, κεφαλίδες και πρόσθετα ασφαλείας @@ΟΜΣΧΡΙΨΗ@@
Ενότητα 7: Ασφάλεια · Χρόνος ανάγνωσης: 10 λεπτά
Μαθησιακός στόχος: Μετά από αυτό το μάθημα θα μπορείτε να ενισχύσετε την ασφάλεια ενός ιστοτόπου WordPress με δικαιώματα, ρυθμίσεις και κεφαλίδες ασφαλείας, και να αξιολογείτε σωστά την αξία των πρόσθετων ασφαλείας.
Βασικές έννοιες: ενίσχυση ασφάλειας (hardening), δικαιώματα αρχείων (644, 755), DISALLOW_FILE_EDIT, καμία εκτέλεση PHP στα uploads, λίστα φακέλων, απόκρυψη έκδοσης, X-Powered-By, κεφαλίδες ασφαλείας, αρχεία αντιγράφων ασφαλείας και .git στον φάκελο ιστού, WAF στον server, WAF σε πρόσθετο, σαρωτής κακόβουλου λογισμικού
Τι σημαίνει ενίσχυση ασφάλειας
Η ενίσχυση ασφάλειας σημαίνει: να ρυθμίσετε τον ιστότοπο έτσι ώστε ένα σφάλμα ή μια παραβίαση να προκαλεί λιγότερη ζημιά. Δεν αντικαθιστά τις ενημερώσεις και τους ισχυρούς κωδικούς πρόσβασης (μάθημα 7.2 και 7.3), αλλά μειώνει τις συνέπειες. Σκεφτείτε ένα σπίτι: οι ενημερώσεις είναι οι κλειδαριές, η ενίσχυση ασφάλειας είναι να φροντίσετε ώστε ένας διαρρήκτης που μπήκε παρόλα αυτά μέσα, να μην μπορεί να φτάσει στο χρηματοκιβώτιο.
Δικαιώματα αρχείων
Κάθε αρχείο και κάθε φάκελος στον server έχει δικαιώματα: ποιος μπορεί να διαβάσει, να γράψει και να εκτελέσει. Γράφονται ως τρία ψηφία, για τον ιδιοκτήτη, την ομάδα και τον υπόλοιπο κόσμο. Η κατευθυντήρια γραμμή από την τεκμηρίωση του WordPress:
| Τι | Δικαιώματα | Σημασία |
|---|---|---|
| Φάκελοι | 755 | Ο ιδιοκτήτης μπορεί τα πάντα, οι άλλοι μπορούν να διαβάσουν και να ανοίξουν |
| Αρχεία | 644 | Ο ιδιοκτήτης μπορεί να διαβάσει και να γράψει, οι άλλοι μόνο να διαβάσουν |
| wp-config.php | αυστηρότερα, για παράδειγμα 600 ή 640 | Μόνο ο ιδιοκτήτης (και ενδεχομένως η ομάδα του web server) μπορεί να διαβάσει |
Ποια τιμή λειτουργεί για το wp-config.php εξαρτάται από το πώς εκτελεί ο πάροχός σας το PHP: στην πλειονότητα της κοινόχρηστης φιλοξενίας (hosting) το PHP εκτελείται ως ο δικός σας χρήστης, οπότε το 600 είναι αρκετό. Δοκιμάστε το και ελέγξτε αν ο ιστότοπος εξακολουθεί να λειτουργεί.
Ποτέ 777. Αυτό σημαίνει: όλοι στον server μπορούν να γράψουν. Ένας οδηγός που λέει «ορίστε τον φάκελο σε 777 αν το ανέβασμα δεν λειτουργεί», λύνει το πρόβλημα με λάθος τρόπο. Σε καλή φιλοξενία αυτό δεν χρειάζεται ποτέ.
Ρυθμίσεις στο wp-config.php
Μερικές γραμμές που κάνουν μεγάλη διαφορά (πάνω από το «σταματήστε την επεξεργασία»):
// Καμία επεξεργασία αρχείων από τον Πίνακα Ελέγχου (Εμφάνιση > Επεξεργαστής θέματος και Πρόσθετα > Επεξεργαστής πρόσθετων).
define( 'DISALLOW_FILE_EDIT', true );
// Μηνύματα σφάλματος ποτέ στην οθόνη των επισκεπτών (μάθημα 5.4).
define( 'WP_DEBUG', false );Με το DISALLOW_FILE_EDIT εξαφανίζεται ο επεξεργαστής με τον οποίο μπορείτε να τροποποιήσετε στον Πίνακα Ελέγχου αρχεία PHP θεμάτων εμφάνισης και πρόσθετων. Ένας διαρρήκτης που καταλαμβάνει έναν λογαριασμό διαχειριστή, δεν μπορεί τότε με δύο κλικ να βάλει κακόβουλο κώδικα στο θέμα εμφάνισής σας. Μπορείτε ακόμα να εγκαθιστάτε πρόσθετα· αν θέλετε να απαγορεύσετε και αυτό (για παράδειγμα σε έναν ιστότοπο που διαχειρίζεστε για έναν πελάτη), υπάρχει το DISALLOW_FILE_MODS, αλλά τότε δεν λειτουργούν πλέον ούτε οι ενημερώσεις μέσω του Πίνακα Ελέγχου.
Καμία εκτέλεση PHP στα uploads, καμία λίστα φακέλων
Στον φάκελο wp-content/uploads ανήκουν εικόνες και έγγραφα, ποτέ αρχεία PHP. Διαρρήκτες που μέσω μιας παραβίασης μπορούν να ανεβάσουν ένα αρχείο, προσπαθούν ακριβώς να τοποθετήσουν εκεί ένα αρχείο PHP και να το ζητήσουν. Μπλοκάρετε αυτό με ένα .htaccess στον φάκελο uploads (σε LiteSpeed και Apache):
<Files *.php>
Require all denied
</Files>Απενεργοποιήστε επίσης την εμφάνιση λίστας φακέλων. Χωρίς index.php ή index.html σε έναν φάκελο, ορισμένοι web servers εμφανίζουν μια λίστα όλων των αρχείων («Index of /wp-content/uploads/2026/11»). Αυτό είναι μια βιτρίνα για όποιον ψάχνει αντίγραφα ασφαλείας ή ευαίσθητα έγγραφα. Στο .htaccess του φακέλου ιστού σας:
Options -IndexesΠολλοί πάροχοι έχουν ήδη απενεργοποιήσει αυτό από προεπιλογή. Η άσκηση αυτού του μαθήματος το ελέγχει.
Χωρίς υπολείμματα στον φάκελο ιστού
Όλα όσα βρίσκονται στον φάκελο ιστού μπορούν να ζητηθούν μέσω του διαδικτύου, εκτός από ό,τι ο server εκτελεί ως PHP ή μπλοκάρει. Επικίνδυνα είναι:
- αντίγραφα του wp-config.php (
wp-config.php.bak,wp-config.old,wp-config.php~από έναν επεξεργαστή κειμένου): αυτά περιέχουν τον κωδικό πρόσβασης της βάσης δεδομένων σας και αποστέλλονται ως απλό κείμενο (μάθημα 1.3)· - αντίγραφα ασφαλείας όπως
backup.zip,site.tar.gzήdatabase.sqlστον φάκελο ιστού· - ένας φάκελος
.gitαπό έναν προγραμματιστή, με τον οποίο κάποιος μπορεί να κατεβάσει όλον τον κώδικά σας (και μερικές φορές κωδικούς πρόσβασης)· - το debug.log μέσα στο wp-content (μάθημα 5.4)·
- παλιά αρχεία εγκατάστασης ή δοκιμών όπως το
info.phpμε τοphpinfo().
Φυλάσσετε τα αντίγραφα ασφαλείας εκτός του φακέλου ιστού ή εκτός του server, και καθαρίζετε τα υπολείμματα.
Απόκρυψη έκδοσης: μικρό κέρδος
Το WordPress προσθέτει από προεπιλογή στο HTML:
<meta name="generator" content="WordPress 7.1.4" />και το ίδιο στο RSS feed. Επίσης το PHP μερικές φορές εμφανίζεται σε μια κεφαλίδα: X-Powered-By: PHP/8.3.14. Η απόκρυψη αυτού είναι λογική, αλλά μην περιμένετε πολλά: τα προγράμματα των διαρρηκτών δοκιμάζουν απλώς μια παραβίαση, ανεξάρτητα από την έκδοση που εμφανίζετε, και οι εκδόσεις μπορούν συχνά να εξαχθούν και από το ?ver= μετά από scripts. Η απόκρυψη είναι τακτοποίηση, όχι ασφάλεια. Ένας ιστότοπος που κρύβει την έκδοσή του αλλά δεν ενημερώνεται, είναι εξίσου ευάλωτος.
Έτσι το κάνετε, σε ένα δικό σας μικρό πρόσθετο ή στο functions.php του child theme σας:
remove_action( 'wp_head', 'wp_generator' );
add_filter( 'the_generator', '__return_empty_string' );Και την κεφαλίδα PHP με expose_php = Off στις ρυθμίσεις PHP του παρόχου σας (στο DirectAdmin στο Select PHP version, Options), ή με Header unset X-Powered-By στο .htaccess.
Κεφαλίδες ασφαλείας
Με μερικές κεφαλίδες ενημερώνετε τον browser πώς πρέπει να συμπεριφέρεται με τον ιστότοπό σας. Οι σημαντικότερες:
| Κεφαλίδα | Τι κάνει |
|---|---|
Strict-Transport-Security | Μόνο μέσω https πλέον (μάθημα 3.1) |
X-Content-Type-Options: nosniff | Ο browser δεν θα μαντέψει τι είδους αρχείο είναι κάτι· αποτρέπει να εκτελεστεί ως script μια ανεβασμένη «εικόνα» |
X-Frame-Options: SAMEORIGIN ή Content-Security-Policy: frame-ancestors 'self' | Άλλοι ιστότοποι δεν επιτρέπεται να εμφανίζουν τον ιστότοπό σας σε frame· αποτρέπει το clickjacking (ένα αόρατο κουμπί του ιστοτόπου σας κάτω από εκείνο κάποιου άλλου) |
Referrer-Policy: strict-origin-when-cross-origin | Σε ένα κλικ προς άλλον ιστότοπο μεταφέρεται μόνο το domain σας, όχι η πλήρης διεύθυνση |
Permissions-Policy | Απενεργοποιεί λειτουργίες του browser που ο ιστότοπός σας δεν χρησιμοποιεί (κάμερα, μικρόφωνο, τοποθεσία) |
Content-Security-Policy | Καθορίζει ακριβώς από ποιες πηγές επιτρέπεται να προέρχονται scripts και στυλ. Ισχυρό, αλλά δύσκολο να ρυθμιστεί σωστά με WordPress και πρόσθετα· ξεκινήστε με τη λειτουργία Report-Only |
Στο .htaccess (σε LiteSpeed και Apache):
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
</IfModule>Ελέγξτε στη συνέχεια αν όλα λειτουργούν: ενσωματωμένο περιεχόμενο, κουμπιά πληρωμής, ένα widget συνομιλίας. Εξωτερικά εργαλεία όπως το securityheaders.com και το internet.nl δείχνουν τι στέλνει ο ιστότοπός σας.
Πρόσθετα ασφαλείας, με ειλικρίνεια
Υπάρχουν πολλά πρόσθετα ασφαλείας (για παράδειγμα Wordfence, Solid Security, All-In-One Security, Sucuri). Συχνά συνδυάζουν: ένα firewall, έναν σαρωτή κακόβουλου λογισμικού, προστασία σύνδεσης, έλεγχο ταυτότητας δύο παραγόντων, ειδοποιήσεις και μια λίστα ενίσχυσης ασφάλειας. Χρήσιμα, αλλά με όρια:
- Ένα firewall σε πρόσθετο (WAF) ξεκινά μόνο όταν εκτελείται το PHP. Ένα κακόβουλο αίτημα πρέπει πρώτα να περάσει μέσα από τον web server και το PHP προτού το δει το πρόσθετο. Μια παραβίαση σε ένα αρχείο PHP που καλείται απευθείας, ή μια επίθεση που επιβαρύνει έντονα το ίδιο το PHP, δεν το σταματά πάντα. Ένα firewall στον server (για παράδειγμα ModSecurity, Imunify360 ή ένα firewall του παρόχου σας) βρίσκεται νωρίτερα στην αλυσίδα και σταματά περισσότερα, χωρίς το δικό σας πρόσθετο να κάνει τον υπολογισμό. Ρωτήστε τον πάροχό σας τι εκτελείται στον server.
- Ένας σαρωτής βρίσκει εκ των υστέρων. Ένας σαρωτής κακόβουλου λογισμικού σας ενημερώνει ότι κάτι είναι λάθος. Αυτό είναι πολύτιμο, αλλά δεν αποτρέπει τίποτα. Και ένας σαρωτής στον ίδιο server με έναν παραβιασμένο ιστότοπο μπορεί και ο ίδιος να έχει τροποποιηθεί από τον διαρρήκτη.
- Δεν αντικαθιστούν τις ενημερώσεις. Ένα πρόσθετο με γνωστή παραβίαση παραμένει ευάλωτο, ακόμα και με ένα πρόσθετο ασφαλείας δίπλα του. Ορισμένες υπηρεσίες ασφαλείας προσφέρουν «εικονικά patches» που σταματούν γνωστές επιθέσεις μέχρι να κάνετε την ενημέρωση· χρήσιμο ως γέφυρα, όχι ως αντικατάσταση.
- Είναι και τα ίδια ένα πρόσθετο. Περισσότερος κώδικας, περισσότερα για ενημέρωση, μερικές φορές και τα ίδια με παραβίαση. Και δύο πρόσθετα ασφαλείας ταυτόχρονα συχνά συγκρούονται.
- Κοστίζουν σε υπολογιστική ισχύ, ιδίως οι σαρωτές που εκτελούνται στον δικό σας server.
Μια λογική επιλογή: δείτε πρώτα τι κάνει ήδη ο πάροχός σας (firewall, σάρωση κακόβουλου λογισμικού, μπλοκάρισμα προσπαθειών σύνδεσης). Συμπληρώστε ό,τι λείπει, συνήθως έλεγχος ταυτότητας δύο παραγόντων και περιορισμός προσπαθειών σύνδεσης. Ένα εκτεταμένο πρόσθετο ασφαλείας είναι ιδιαίτερα χρήσιμο σε φιλοξενία που από μόνη της κάνει λίγα.
Σύνοψη
- Η ενίσχυση ασφάλειας περιορίζει τη ζημιά από ένα σφάλμα ή μια παραβίαση· δεν αντικαθιστά τις ενημερώσεις και τους κωδικούς πρόσβασης.
- Φάκελοι 755, αρχεία 644, wp-config.php αυστηρότερα· ποτέ 777.
- Ενεργοποιήστε το DISALLOW_FILE_EDIT, μπλοκάρετε την εκτέλεση PHP στα uploads, απενεργοποιήστε τις λίστες φακέλων και καθαρίστε αντίγραφα ασφαλείας, .git και debug.log από τον φάκελο ιστού.
- Η απόκρυψη έκδοσης είναι τακτοποίηση, όχι ασφάλεια· οι κεφαλίδες ασφαλείας βοηθούν τον browser να προστατεύσει τους επισκέπτες σας.
- Ένα firewall στον server σταματά περισσότερα από ένα πρόσθετο· τα πρόσθετα ασφαλείας είναι συμπλήρωμα, όχι αντικατάσταση.
Κουίζ
Άσκηση
Άσκηση A7.4: Τι δείχνει ο ιστότοπός σας σε όλους; Συμπληρώστε τη διεύθυνση του ιστοτόπου σας. Το πρόγραμμα διαβάζει την αρχική σελίδα και το RSS feed (/feed/) και ελέγχει: δεν υπάρχει έκδοση WordPress στην ετικέτα generator του HTML και του feed, η κεφαλίδα X-Powered-By δεν δείχνει έκδοση PHP, και ο ιστότοπός σας στέλνει X-Content-Type-Options: nosniff, μια προστασία κατά των frames (X-Frame-Options ή frame-ancestors) και μια Referrer-Policy; Η απουσία HSTS (μάθημα 3.1) και Permissions-Policy επιτρέπεται (πορτοκαλί).
Άσκηση A7.4b: Χωρίς υπολείμματα στον φάκελο ιστού. Αποδείξτε ότι είναι δικός σας ο ιστότοπος (εγγραφή TXT ή αρχείο με τον κωδικό της άσκησης). Το πρόγραμμα ζητά στη συνέχεια μια σύντομη σταθερή λίστα: τον φάκελο /wp-content/uploads/ (καμία λίστα φακέλων), το /.git/HEAD, το /wp-content/debug.log και μερικά συνηθισμένα ονόματα αντιγράφων του wp-config.php. Καλό αποτέλεσμα είναι όταν κανένα από αυτά δεν επιστρέφει περιεχόμενο (404 ή 403). Το πρόγραμμα δεν δοκιμάζει τίποτα άλλο και δεν τροποποιεί τίποτα.
Περαιτέρω ανάγνωση
Αυτά τα άρθρα περιγράφουν τα βήματα στους πίνακες ελέγχου του WebOké· σε άλλους πίνακες ελέγχου λειτουργούν παρόμοια.
- Εγχειρίδιο DirectAdmin 11.5: Δικαιώματα αρχείων και φακέλων (chmod)
- Εγχειρίδιο DirectAdmin 11.4: Εμφάνιση και επεξεργασία κρυφών αρχείων όπως το .htaccess
- Εγχειρίδιο DirectAdmin 15.10: Web Application Firewall
- Εγχειρίδιο DirectAdmin 15.11: Imunify360: σαρώστε την ιστοσελίδα σας για κακόβουλο λογισμικό
- Αποκλεισμός αρχείων μέσω .htaccess, π.χ. plugin-googlemap2-proxy.php
- Ασφάλεια PHP
- Ενίσχυση ασφάλειας WordPress (developer.wordpress.org, Αγγλικά): https://developer.wordpress.org/advanced-administration/security/hardening/
- Κεφαλίδες ασφαλείας (MDN, Αγγλικά): https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#security
- Επιπλέον ασφάλεια για το WordPress: δικαιώματα, wp-config και .htaccess
