HSTS και κεφαλίδες ασφαλείας για τον ιστότοπό σας
Με κάθε σελίδα, ο web server σας στέλνει και headers: σύντομες γραμμές με οδηγίες για τον browser. Αυτές καθορίζουν εν μέρει πόσο ασφαλή χειρίζεται ο browser την ιστοσελίδα σας. Εδώ θα διαβάσετε τι είναι το HSTS, ποιες άλλες κεφαλίδες ασφαλείας υπάρχουν και πώς τις ρυθμίζετε και τις ελέγχετε.
Πρώτα η ιστοσελίδα σας πρέπει να διαθέτει ένα πιστοποιητικό που λειτουργεί και να ανακατευθύνει τους επισκέπτες σε https. Αυτό το διαβάζετε στα άρθρα Ενεργοποίηση και ανανέωση πιστοποιητικού SSL και επίλυση προβλημάτων και Υποχρεωτική ανακατεύθυνση επισκεπτών σε https.
Τι κάνει το HSTS;
Η ανακατεύθυνση σε https έχει ένα αδύναμο σημείο: το πρώτο αίτημα μέσω http αποστέλλεται ακόμη χωρίς κρυπτογράφηση. Κάποιος στο ίδιο δίκτυο, για παράδειγμα σε δημόσιο wifi, μπορεί να υποκλέψει αυτό το αίτημα. Το HSTS (HTTP Strict Transport Security) λύνει αυτό το πρόβλημα. Η ιστοσελίδα σας στέλνει μέσω https την εξής κεφαλίδα:
Strict-Transport-Security: max-age=31536000
Ο browser θυμάται τότε ότι επιτρέπεται να ανοίγει την ιστοσελίδα σας μόνο μέσω https. Αν αργότερα ένας επισκέπτης πληκτρολογήσει http://, ο browser το μετατρέπει ο ίδιος σε https, πριν ακόμη σταλεί οτιδήποτε στο δίκτυο. Μια κεφαλίδα HSTS που φτάνει μέσω απλού http αγνοείται από τον browser.
| Στοιχείο | Σημασία |
|---|---|
max-age | Για πόσο χρόνο το θυμάται ο browser, σε δευτερόλεπτα. Ο έλεγχος του internet.nl θεωρεί επαρκές τουλάχιστον ένα έτος (31536000). |
includeSubDomains | Ισχύει επίσης για όλα τα subdomains, όπως shop.yourdomain.nl και mail.yourdomain.nl. |
preload | Ζητάτε την καταχώριση στη λίστα που είναι ενσωματωμένη στους browsers (hstspreload.org). Τότε προστατεύεται ακόμη και η πρώτη επίσκεψη. Για αυτό απαιτούνται, μεταξύ άλλων, ένα έτος, includeSubDomains και https σε όλα τα subdomains. Η αφαίρεση από τη λίστα διαρκεί πολύ. |
max-age=0 | Διαγράφει την αποθηκευμένη οδηγία, κατά την επόμενη επίσκεψη μέσω https. |
includeSubDomains αυτό ισχύει και για κάθε subdomain, όπως μια παλιά σελίδα κάμερας ή εκτυπωτή χωρίς πιστοποιητικό. Γι' αυτό προχωρήστε σταδιακά: ξεκινήστε με σύντομο max-age, για παράδειγμα μία ημέρα (86400), ελέγξτε ότι όλα λειτουργούν και αυξήστε το βήμα βήμα έως ένα έτος.Το HSTS στη WebOké
Στους περισσότερους servers μας, ο web server στέλνει από προεπιλογή HSTS για κάθε ιστοσελίδα που ανοίγει μέσω https: Strict-Transport-Security: max-age=31536000. Αυτό αντιστοιχεί σε ένα έτος, χωρίς includeSubDomains και χωρίς preload. Δεν χρειάζεται να κάνετε τίποτα γι' αυτό. Σε λίγους servers δεν είναι ενεργοποιημένο από προεπιλογή· εκεί το ενεργοποιείτε μόνοι σας. Αν η ιστοσελίδα σας στέλνει ήδη HSTS και με ποιο max-age, μπορείτε να το δείτε στα εργαλεία προγραμματιστή του browser σας ή στον έλεγχο του internet.nl (δείτε παρακάτω).
Ο διακόπτης HSTS στο DirectAdmin
Στο DirectAdmin μεταβείτε στο Domains και κάντε κλικ στο όνομα του domain σας. Αν είναι ενεργοποιημένο το Secure SSL, θα δείτε στο HSTS τον διακόπτη Enable HTTP Strict Transport Security. Στη συνέχεια κάντε κλικ στο Save για αποθήκευση. Πώς γίνεται αυτό βήμα βήμα, διαβάστε στο άρθρο Ανακατεύθυνση επισκεπτών πάντα σε https.
Αν η ιστοσελίδα σας στέλνει ήδη HSTS, δεν χρειάζεστε τον διακόπτη. Ενεργοποιήστε τον μόνο αν η ιστοσελίδα σας δεν στέλνει ακόμη HSTS. Ρυθμίστε το HSTS σε ένα μόνο σημείο: στο DirectAdmin ή στο .htaccess, όχι και στα δύο. Αν ο browser λάβει δύο κεφαλίδες HSTS, χρησιμοποιεί μόνο την πρώτη.
Οι υπόλοιπες κεφαλίδες ασφαλείας
| Κεφαλίδα | Προστασία από | Τιμή για αρχή |
|---|---|---|
X-Content-Type-Options | Ο browser μαντεύει μόνος του τι είδους αρχείο είναι κάτι, με αποτέλεσμα μια ανεβασμένη «εικόνα» να μπορεί να εκτελεστεί ως script. | nosniff (η μόνη έγκυρη τιμή) |
Content-Security-Policy: frame-ancestors ή X-Frame-Options | Clickjacking: μια άλλη ιστοσελίδα φορτώνει αόρατα τη σελίδα σας σε ένα frame, ώστε οι επισκέπτες να κάνουν κλικ στα κουμπιά σας χωρίς να το αντιληφθούν. | frame-ancestors 'self', ή η παλαιότερη κεφαλίδα X-Frame-Options: SAMEORIGIN |
Referrer-Policy | Όταν γίνεται κλικ προς άλλη ιστοσελίδα, ο browser στέλνει τη διεύθυνση της προηγούμενης σελίδας, μερικές φορές με όρο αναζήτησης ή αριθμό παραγγελίας. | strict-origin-when-cross-origin, ή αυστηρότερα same-origin ή no-referrer. Το internet.nl θεωρεί σωστές μόνο τις αυστηρές τιμές. |
Permissions-Policy | Καθορίζει ποιες λειτουργίες του browser μπορούν να χρησιμοποιούν η σελίδα σας και τα ενσωματωμένα frames, όπως κάμερα, μικρόφωνο και τοποθεσία. | Το camera=(), microphone=(), geolocation=() απενεργοποιεί αυτές τις τρεις. Αν η ιστοσελίδα σας χρησιμοποιεί κάποια από αυτές τις λειτουργίες, παραλείψτε την. |
Content-Security-Policy (πλήρης) | Περιορίζει από ποιες πηγές επιτρέπεται να φορτώνονται scripts, styles και εικόνες. Έτσι γίνεται πολύ δυσκολότερη η εισαγωγή κακόβουλων scripts (XSS). | Εξατομικευμένη για κάθε ιστοσελίδα. Αποφύγετε τα unsafe-inline, unsafe-eval και τα wildcards. |
Ρύθμιση στο .htaccess
Τοποθετήστε αυτές τις γραμμές στην αρχή του αρχείου .htaccess στον φάκελο public_html του domain σας. Δημιουργήστε πρώτα ένα αντίγραφο του αρχείου.
<IfModule mod_headers.c> Header always set X-Content-Type-Options "nosniff" Header always set Content-Security-Policy "frame-ancestors 'self'" Header always set Referrer-Policy "strict-origin-when-cross-origin" Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()" # Μόνο αν η ιστοσελίδα σας δεν στέλνει ακόμη HSTS (δείτε παραπάνω): # Header always set Strict-Transport-Security "max-age=31536000" </IfModule>
Προσθέστε το includeSubDomains μόνο όταν είστε βέβαιοι ότι κάθε subdomain διαθέτει https. Αν χρησιμοποιείτε WordPress, μπορείτε να ρυθμίσετε τις κεφαλίδες και με ένα plugin. Επιλέξτε ένα γνωστό plugin που ενημερώνεται ακόμη και ρυθμίστε κάθε κεφαλίδα σε ένα μόνο σημείο: στο plugin ή στο .htaccess.
Content-Security-Policy-Report-Only. Αυτή δεν μπλοκάρει τίποτα, αλλά δείχνει στην κονσόλα του browser τι θα μπλοκαριζόταν. Σε περίπτωση αμφιβολίας, αφήστε το στον κατασκευαστή της ιστοσελίδας σας ή ξεκινήστε μόνο με το frame-ancestors.Σε VPS με nginx ή Caddy
Σε ένα VPS δεν χρησιμοποιείτε DirectAdmin και συχνά ούτε .htaccess. Σε αυτή την περίπτωση ορίζετε τις κεφαλίδες στις ρυθμίσεις του web server σας. Κανένας από τους δύο δεν στέλνει αυτόματα HSTS ή αυτές τις κεφαλίδες.
nginx: στο μπλοκ server για τη θύρα 443:
add_header Strict-Transport-Security "max-age=31536000" always; add_header X-Content-Type-Options "nosniff" always; add_header Content-Security-Policy "frame-ancestors 'self'" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always;
Με το always οι κεφαλίδες αποστέλλονται και στις σελίδες σφάλματος. Προσοχή: αν ένα μπλοκ location περιέχει δικό του add_header, οι κανόνες του μπλοκ server δεν ισχύουν πλέον για αυτό το location. Επαναλάβετέ τους εκεί ή τοποθετήστε τους σε ξεχωριστό αρχείο που εισάγετε παντού με include. Ελέγξτε τις ρυθμίσεις με nginx -t και φορτώστε τις με systemctl reload nginx.
Caddy: στο μπλοκ της ιστοσελίδας σας στο Caddyfile:
header {
Strict-Transport-Security "max-age=31536000"
X-Content-Type-Options "nosniff"
Content-Security-Policy "frame-ancestors 'self'"
Referrer-Policy "strict-origin-when-cross-origin"
}
Φορτώστε την αλλαγή με systemctl reload caddy. Για τη δημιουργία μιας ιστοσελίδας με nginx ή Caddy, δείτε τα άρθρα nginx με πιστοποιητικό από το Let's Encrypt και Caddy: ιστοσελίδα με αυτόματο https στον οδηγό VPS.
Έλεγχος
- Internet.nl: εισαγάγετε το domain σας στον έλεγχο ιστοσελίδας στο internet.nl.
- Ο browser σας: ανοίξτε την ιστοσελίδα σας, πατήστε F12 (ή επιλέξτε Επιθεώρηση), μεταβείτε στην καρτέλα Δίκτυο, φορτώστε ξανά τη σελίδα και κάντε κλικ στο πρώτο αίτημα. Στην ενότητα Κεφαλίδες απόκρισης (Response Headers) βλέπετε όλα όσα στέλνει ο server σας.
- Η γραμμή εντολών: η εντολή
curl -sI https://yourdomain.nl/εμφανίζει τις κεφαλίδες.
Μετά από κάθε αλλαγή, ελέγξτε ότι η ιστοσελίδα, οι φόρμες και η σελίδα πληρωμής σας εξακολουθούν να λειτουργούν. Επιπλέον, διατηρείτε ενημερωμένα το CMS, τα plugins και τα themes σας. Δείτε το άρθρο Προστασία του wp-login.php του WordPress.
Περισσότερες πληροφορίες
- MDN: Strict-Transport-Security (στα Αγγλικά)
- MDN: Content-Security-Policy (στα Αγγλικά)
- MDN: Permissions-Policy (στα Αγγλικά)
- Λίστα HSTS preload (στα Αγγλικά)
Θέλετε να μάθετε περισσότερα; Παρακολουθήστε το δωρεάν μάθημα Ασφάλεια στο διαδίκτυο για επιχειρηματίες, ενότητα 4.2 Η ιστοσελίδα σας: https, HSTS και κεφαλίδες ασφαλείας, ή το δωρεάν μάθημα WordPress, ενότητα 7.4 Θωράκιση της ιστοσελίδας: δικαιώματα, κεφαλίδες και plugins ασφαλείας.
