Joomla Tutorials

Οδηγίες & κόλπα

HTTP Headers Plugin: Πλήρης Οδηγός

Το Joomla περιλαμβάνει ένα πρόσθετο πυρήνα, το System - HTTP Headers, που σας επιτρέπει να ορίζετε κεφαλίδες ασφαλείας του προγράμματος περιήγησης. Με σωστές ρυθμίσεις αποτρέπει το clickjacking, επιβάλλει το HTTPS και, μαζί με μια Πολιτική Ασφαλείας Περιεχομένου (Content Security Policy), εμποδίζει την εκτέλεση των περισσότερων «κακόβουλα εισαγόμενων» scripts. Φυσικά χρειάζεται σωστές ρυθμίσεις διότι αν κάνετε κάτι λάθος, σπάει ενσωματώσεις (embeds), τυχόν φόρμες πληρωμής και γενικότερη λειτουργικότητα του ιστότοπου.

Γιατί έχουν σημασία οι κεφαλίδες ασφαλείας

Οι κεφαλίδες ασφαλείας είναι οδηγίες που στέλνει ο διακομιστής σας με κάθε σελίδα και λένε στο πρόγραμμα περιήγησης τι επιτρέπεται κάνει. Δεν διορθώνουν ευπάθειες στον κώδικά σας, αλλά περιορίζουν τη ζημιά όταν κάτι ξεφύγει. Ένα σφάλμα cross-site scripting σε μια επέκταση είναι πολύ λιγότερο επικίνδυνο αν το πρόγραμμα περιήγησης αρνείται να εκτελέσει scripts που δεν έχετε εγκρίνει.

Το πρόσθετο υπάρχει στον πυρήνα από το Joomla 4.0. 

Οι κεφαλίδες που διαχειρίζεται

Το πρόσθετο καλύπτει απευθείας πέντε κεφαλίδες ασφαλείας και σας επιτρέπει να προσθέσετε οποιαδήποτε άλλη κεφαλίδα μέσω της λίστας Force HTTP Headers. Για αρχή όμως θα ξεκινήσουμε με κάποιες ασφαλείς τιμές παρακάτω· και θα αυστηροποιούμε σταδιακά μόνο μετά από δοκιμές.

Κεφαλίδα Προστατεύει από Ασφαλής αρχική τιμή Πού βρίσκεται στο πρόσθετο
X-Frame-Options Clickjacking: φόρτωση των σελίδων σας σε κρυφό πλαίσιο (frame) άλλου ιστοτόπου SAMEORIGIN Switch box (On/Off) στην κύρια καρτέλα
Referrer-Policy Διαρροή πλήρων URL (με query strings) σε άλλους ιστοτόπους strict-origin-when-cross-origin (η προεπιλογή του προσθέτου) Αναπτυσσόμενο μενού στην κύρια καρτέλα
Cross-Origin-Opener-Policy Επιθέσεις μεταξύ παραθύρων μέσω window.opener same-origin, ή same-origin-allow-popups αν χρησιμοποιείτε αναδυόμενα παράθυρα OAuth ή πληρωμών Αναπτυσσόμενο μενού στην κύρια καρτέλα
Strict-Transport-Security (HSTS) Υποβάθμιση σε HTTP και κλοπή cookies σε μη ασφαλή δίκτυα max-age=31536000, υποτομείς μόνο αν όλοι οι υποτομείς έχουν HTTPS Καρτέλα HSTS
Content-Security-Policy Εισαγόμενα scripts, styles και διαρροή δεδομένων (XSS) Ξεκινήστε σε λειτουργία μόνο αναφοράς (report-only)· δείτε την ενότητα CSP Καρτέλα CSP
Permissions-Policy Σελίδες ή ενσωματώσεις που χρησιμοποιούν αθόρυβα κάμερα, μικρόφωνο ή τοποθεσία camera=(), microphone=(), geolocation=() Force HTTP Headers
 

Βήμα προς βήμα: διαμόρφωση του προσθέτου

Πλοηγούμαστε στα πρόσθετα

Από Σύστημα → Διαχείριση → Πρόσθετα (System → Manage → Plugins), αναζητήστε «HTTP Headers» και επιλέξτε το. 

Αναζήτηση Plugin

Θα ανοίξει η σελίδα ρυθμίσεων του πρόσθετου και θα παρουσιαστούν 3 καρτέλες. (Πρόσθετο, Strict-Transport-Security (HSTS) και Content-Security-Policy (CSP)).

Καρτέλα Plugin

Καρτέλα Πρόσθετο

Ορίστε τις βασικές κεφαλίδες. Στην κύρια καρτέλα, ενεργοποιήστε το X-Frame-Options, ορίστε το Referrer-Policy σε strict-origin-when-cross-origin και το Cross-Origin-Opener-Policy σε same-origin. 

Καρτέλα Strict-Transport-Security (HSTS)

Εδώ η καρτέλα καλό είναι αν δεν είστε σίγουροι για το πακέτο φιλοξενίας σας και το SSL σας, να παραμείνει ανενεργή. Για μεγαλύτερη ασφάλεια μπορείτε να επικοινωνήσετε με τον πάροχο φιλοξενίας σας και να σας δώσει συγκεκριμένες οδηγίες σχετικά.

Καρτέλα HSTS

Ενεργοποιήστε το HSTS μόνο όταν το HTTPS είναι σταθερό. Στην καρτέλα HSTS, επιβεβαιώστε ότι κάθε σελίδα, συμπεριλαμβανομένου του backend, φορτώνει μέσω HTTPS χωρίς προειδοποιήσεις. Έπειτα ενεργοποιήστε το HSTS με μικρό max-age, π.χ. 300 δευτερόλεπτα, για μια μέρα δοκιμών. Αυξήστε το σε 31536000 (ένα έτος) μόλις είστε σίγουροι οτι δεν είδατε κάποιο πρόβλημα στον ιστότοπο.

Ρυθμίσεις HSTS

Προσοχή με τους υποτομείς και το preload του HSTS. Συμπεριλάβετε υποτομείς μόνο αν κάθε υποτομέας, ακόμη και παλιοί όπως mail. ή dev., εξυπηρετεί έγκυρο HTTPS. Το preload υποβάλλει τον τομέα σας σε λίστα ενσωματωμένη στα προγράμματα περιήγησης· η αφαίρεσή του αργότερα μπορεί να διαρκέσει μήνες. Αφήστε το preload απενεργοποιημένο, εκτός αν είστε βέβαιοι.

Καρτέλα Content-Security-Policy

Content Security Policy χωρίς να "σπάσει" ο ιστότοπος

Ενεργοποιώντας το CSP, πρέπει να επιλέξουμε το "Αναφορά-Μόνο" για αρχή.

Καρτέλα CSP

Αυτό είναι απόλυτα ασφαλές αφού όποιες ρυθμίσεις και να ορίσουμε έπειτα εδώ, ο ιστότοπος θα συνεχίσει απροβλημάτιστα, καθώς στα Developer Tools (Inspect) του browser σας, στην κονσόλα, θα εμφανίσει αν υπάρχουν τυχόν προβλήματα, ποια είναι αυτά, καθώς και τη λύση τους.

Εφαρμόζοντας λοιπον το CSP πρώτα σε λειτουργία "Αναφορά-Μόνο" στη διεπαφή χρήστη (Frontend), συγκεντρώνουμε και καταγράφουμε τις παραβιάσεις που αναφέρονται σελίδα προς σελίδα για να τα διορθώσουμε. Ένα CSP λέει στο πρόγραμμα περιήγησης ακριβώς ποιες πηγές μπορούν να παρέχουν scripts, stylesφο, εικόνες, πλαίσια και συνδέσεις, οτιδήποτε άλλο μπλοκάρεται. Είναι ισχυρή προστασία, αλλά και ο ευκολότερος τρόπος να σπάσει ένας ιστότοπος.

Πώς λειτουργεί η καρτέλα CSP

  • Ενεργός – ενεργοποιεί την πολιτική ασφάλειας περιεχομένου.
  • Επιλογές πελάτη – επιλέγετε Ιστότοπος, Διαχειριστής ή και τα δύο. Ξεκινήστε μόνο με τον ιστότοπο. 
  • Αναφορά Μόνο – στέλνει Content-Security-Policy-Report-Only αντί της κανονικής κεφαλίδας. Το πρόγραμμα περιήγησης καταγράφει παραβιάσεις αλλά δεν μπλοκάρει τίποτα.
  • Nonce – προσθέτει ένα τυχαίο διακριτικό μίας χρήσης στα scripts και styles που εξάγει το Joomla μέσω του asset API του, ώστε τα inline μπλοκ αυτά να επιτρέπονται ενώ τα εισαγόμενα όχι.
  • Script hashes - Προστίθεται ενα hash (SHA-256) για κάθε inline script που δηλώνεται μέσω του Web Asset Manager και το προσθέτει στο script-src. 
  • Style hashes - Αφορά τα inline styles (addInlineStyle()). Όπως και με τα script hashes ετσι κι εδώ προστίθεται ενα hash (SHA-256), οπότε επιτρέπονται μόνο τα μπλοκ <style> που αποδόθηκαν μέσω Jooma Web Asset Manager.
  • Strict dynamic – προσθέτει το 'strict-dynamic', που επιτρέπει σε scripts εγκεκριμένα με nonce ή hash να φορτώνουν επιπλέον scripts. Ισχύει μόνο αφού έχετε ορίσει οδηγία script-src
  • Προσθήκη Οδηγίας – λίστα γραμμών, καθεμία με οδηγία (directive, π.χ. script-src), τιμή και client. 

Σχέδιο εφαρμογής οδηγιών

Σε κάθε νεα γραμμή, επιλέγουμε την αντίστοιχη οδηγία και στην τιμή ορίζουμε τις επιλογές μας.

Ξεκινήστε με μια αρχική πολιτική:

Οδηγία Τιμή
default-src 'self'
script-src 'self' (με ενεργοποιημένο nonce)
style-src 'self' 'unsafe-inline'
img-src 'self' data: https:
font-src 'self' data:
frame-ancestors 'self'
base-uri 'self'
form-action 'self'
object-src 'none'

Παράδειγμα CSP

Επεξήγηση του πίνακα

Κάθε γραμμή της πολιτικής έχει μια οδηγία (π.χ. img-src) και μια λίστα με πηγές χωρισμένες με κενό. Το πρόγραμμα περιήγησης επιτρέπει έναν πόρο αν ταιριάζει με τουλάχιστον μία από τις πηγές της λίστας. Ό,τι δεν ταιριάζει μπλοκάρεται, ή σε report-only απλώς καταγράφεται.

'self' σημαίνει «η ίδια προέλευση (origin) με τη σελίδα». Origin είναι ο συνδυασμός πρωτοκόλλου, host και θύρας. Για τη σελίδα https://www.example.gr/, το 'self' επιτρέπει οτιδήποτε από https://www.example.gr. Δεν επιτρέπει το https://example.gr χωρίς www, ούτε το https://cdn.example.gr, ούτε το http://www.example.gr, γιατί άλλος host ή άλλο πρωτόκολλο σημαίνει άλλο origin. Οι υποτομείς λοιπόν πρέπει να προστεθούν ρητά.

'none' σημαίνει «καμία πηγή». Η οδηγία απαγορεύει τα πάντα και δεν συνδυάζεται με άλλες πηγές στην ίδια γραμμή.

data: είναι πηγή τύπου scheme (σχήματος). Επιτρέπει πόρους ενσωματωμένους απευθείας μέσα στο URL ως δεδομένα, π.χ. data:image/png;base64,iVBORw0... ή data:image/svg+xml,.... Πολλά templates και βιβλιοθήκες εικονιδίων βάζουν έτσι μικρές εικόνες ή γραμματοσειρές μέσα στο CSS.

https: είναι επίσης scheme και σημαίνει «οποιοσδήποτε host, αρκεί να είναι μέσω HTTPS».

'unsafe-inline' επιτρέπει inline κώδικα: μπλοκ <style>/<script> μέσα στο HTML και attributes όπως style="..." ή onclick="...". Το «unsafe» στο όνομα είναι προειδοποίηση.

Μια λεπτομέρεια που μπερδεύει συχνά αφορά τα εισαγωγικά. Οι λέξεις-κλειδιά ('self', 'none', 'unsafe-inline', 'strict-dynamic', 'nonce-…', 'sha256-…') γράφονται με μονά εισαγωγικά. Τα schemes (data:, https:) και οι hosts (https://www.youtube-nocookie.com) γράφονται χωρίς. Αν γράψετε self χωρίς εισαγωγικά, το πρόγραμμα περιήγησης το διαβάζει ως hostname με όνομα «self» και η οδηγία δεν κάνει αυτό που περιμένετε.

Επόμενο βήμα

  1. Συλλέξτε παραβιάσεις. Περιηγηθείτε σε κάθε τύπο σελίδας με ανοιχτά τα εργαλεία προγραμματιστή και σημειώστε τις προειδοποιήσεις CSP στην κονσόλα.
  2. Επιτρέψτε ό,τι είναι νόμιμο. Αντί να αφήσουμε γενικά https: , Εσείς προσθέστε κάθε αξιόπιστη πηγή στη σωστή οδηγία, για παράδειγμα https://www.googletagmanager.com στα script-src και connect-src για το Google Analytics, ή https://www.youtube-nocookie.com στο frame-src για ενσωματωμένα βίντεο. Να είστε συγκεκριμένοι: πλήρες hostname, όχι wildcard.
  3. Διορθώστε ό,τι δεν θα έπρεπε να είναι inline. Inline χειριστές onclick και μπλοκ <script> επικολλημένα σε άρθρα θα μπλοκαριστούν. Μεταφέρετέ τα σε κανονικά αρχεία assets ή σε επεκτάσεις εφόσον εσείς έχετε φτιάξει το template ή τα components σας. Αν βασίζεστε βέβαια σε κώδικα εμπορικό δυστυχώς δεν θα μπορείτε να κάνετε πολλά, οποτε θα πρέπει να επικοινωνήσετε με τον κατασκευαστή τους και να τον ενημερώσετε σχετικά. Είναι εύκολη διόρθωση για αυτούς και ωφελεί όλους τους πελάτες τους. Αν πάλι η επικοινωνία με τον κατασκευαστή δεν ειναι εφικτή, τότε αναγκαστικά θα πρέπει να χαλαρώσετε την πολιτική με το να προσθέσετε 'unsafe-inline'. Υπάρχει όμως μια σημαντική παγίδα: όσο είναι ενεργό το nonce (ή υπάρχουν hashes) στο script-src, οι browsers αγνοούν το 'unsafe-inline'. Για να λειτουργήσει πρέπει να απενεργοποιήσετε το nonce και τα script hashes, οπότε χάνετε και αυτά.
  4. Απενεργοποίηση Report Only. Εφόσον μετα από έλεγχο σε όλο τον ιστότοπο, διαπιστώσετε πως δεν υπάρχουν αναφορές σε προβλήματα, απενεργοποιήστε το report-only για να λειτουργήσει και πραγματικά η CSP. Σημείωση: Μετά από κάθε αναβάθμιση σε κάτι, είναι απαραίτητος ο επανέλεγχος διότι αν κάποιο component προσθέσει/αλλάξει κάτι, ίσως να μην λειτουργεί αν η πολιτική σας είναι αυστηρά δηλωμένη με συγκεκριμένα scripts κλπ.
  5. Εξετάστε το backend. Αν θέλετε CSP και στη διαχείριση, επαναλάβετε τη διαδικασία με client Administrator και δοκιμάστε επεξεργαστές, διαχείριση πολυμέσων και τις οθόνες διαχείρισης κάθε εγκατεστημένης επέκτασης. Εδώ βεβαια επειδή μπορεί μια λάθος κίνηση να σας κλειδώσει από το διαχειριστικό, κρατήστε την οδηγία για απενεργοποίηση του πρόσθετου από τον πίνακα #__extensions (element = httpheaders, enabled = 0).

Παράδειγμα παραβιάσεων CSP

Σύνοψίζοντας λοιπον...

Οι κεφαλίδες ασφαλείας δεν αντικαθιστούν τις τακτικές ενημερώσεις, τα αντίγραφα ασφαλείας και τις αξιόπιστες επεκτάσεις, αλλά προσθέτουν ένα ακόμη επίπεδο προστασίας. Ακόμη κι αν κάτι ξεφύγει, ο browser του επισκέπτη δεν θα εκτελέσει ό,τι δεν έχετε εγκρίνει.

Το πρόσθετο System - HTTP Headers σας δίνει αυτή τη δυνατότητα χωρίς να αγγίξετε αρχεία του διακομιστή, αρκεί να προχωρήσετε βήμα προς βήμα και να κάτετε τις σωστές ρυθμίσεις. Ξεκινήστε από τις βασικές κεφαλίδες και ενεργοποιήστε το HSTS μόνο όταν το HTTPS σας είναι σταθερό. Αφήστε το CSP σε λειτουργία «Αναφορά-Μόνο» όσο χρειάζεται, ώστε να εντοπίσετε κάθε παραβίαση πριν την επιβάλετε. Η δουλειά όμως δεν τελειώνει με την πρώτη ρύθμιση.

Κάθε νέα επέκταση, ενημέρωση template ή υπηρεσία τρίτων, όπως analytics, βίντεο ή πύλη πληρωμών, μπορεί να χρειαστεί μια νέα εξαίρεση. Γι' αυτό καλό είναι να ανοίγετε την κονσόλα του browser μετά από κάθε σημαντική αλλαγή. Με λίγη υπομονή στην αρχή, ο ιστότοπός σας θα είναι σημαντικά πιο ανθεκτικός σε επιθέσεις, χωρίς να χάσει τίποτα από τη λειτουργικότητά του.

Συντομεύσεις
Πρόσφατα Tutorials
Αναρτήσεις στο Blog

Το όνομα Joomla!™ και το λογότυπο χρησιμοποιούνται στις Ηνωμένες Πολιτείες και σε άλλες χώρες μετά από περιορισμένη άδεια της Open Source Matters.
Το joomla.gr δεν σχετίζεται με, ούτε υποστηρίζεται από, την Open Source Matters ή το Joomla!™ Project.
The Joomla!™ name and logo are used in the United States and other countries under limited license from Open Source Matters. This site, joomla.gr is not associated with, nor endorsed by, Open Source Matters or the Joomla!™ Project.

Joomla.gr footer Logo

Δημιουργήθηκε με χρήση του Joomla! CMS

Κατασκευή - Συντήρηση - Φιλοξενία
Onscreen Web Services  &  Easylogic &  REDTIE Digital

Στείλτε μας email ή ακολουθήστε μας