Το προφίλ μας στο Google Plus
7

Ο Apache στο Raspberry Pi, με έγκυρο πιστοποιητικό

Μεταξύ των αναρίθμητων πρότζεκτ που μπορούμε να υλοποιήσουμε γύρω από το Raspberry Pi, πολλά απαιτούν την παρουσία web server. Στο παρόν άρθρο εγκαθιστούμε τον Apache, ενώ αμέσως μετά δείχνουμε και πώς αποκτούμε δωρεάν πιστοποιητικό για το site που σερβίρει.

Ναι, ακόμη και για το site που φιλοξενείται στο Raspberry Pi μας στο σπίτι, είναι πράγματι δυνατόν να πάρουμε ένα έγκυρο πιστοποιητικό από το Let’s Encrypt κι έτσι όλοι οι επισκέπτες να απολαμβάνουν έμπιστες κι ασφαλείς συνδέσεις HTTPS. Πριν ξεκινήσουμε με την όλη διαδικασία φροντίζουμε ώστε να έχουμε:

  • Ένα Raspberry Pi, κατά προτίμηση το 3 model B, με το Raspbian εγκατεστημένο και ρυθμισμένο. Περισσότερα επ’ αυτού μπορείτε να διαβάσετε σ’ αυτό το άρθρο. Αντί για το Raspbian μπορείτε βεβαίως να χρησιμοποιείτε κάποια άλλη διανομή Linux. Να σημειώσουμε ότι η παρουσίασή μας δεν ισχύει μόνο για το Raspbian, υπόψιν όμως ότι ενέργειες όπως είναι η εγκατάσταση πακέτων ή η διαχείριση υπηρεσιών ίσως γίνονται με διαφορετικό τρόπο σε άλλες διανομές. Ανάλογη παρατήρηση οφείλουμε να κάνουμε και για τις θέσεις των configuration files.
  • Static IP mapping στον router μπροστά από το Raspberry Pi (στο εξής RasPi), ώστε η συσκευή να παίρνει πάντοτε την ίδια διεύθυνση IP. Αν ο router δεν υποστηρίζει static IP mapping, ρυθμίζουμε το Raspbian ώστε αντί να ζητάει διεύθυνση IP από τον όποιο DHCP server να χρησιμοποιεί πάντοτε το ίδιο IP. Φυσικά, το εν λόγω IP θα πρέπει να έχει νόημα για το LAN εντός του οποίου βρίσκεται το RasPi και να μην είναι ένα από εκείνα που αυτόματα μοιράζει ο DHCP server.
  • Κανόνες port forwarding στον router, ώστε όποιος επιχειρεί σύνδεση σε κάποιο από τα ports 80/TCP και 443/TCP στο WAN interface του router, να ανακατευθύνεται στο αντίστοιχο port του network interface του RasPi. Πιο συγκεκριμένα, αναφερόμαστε σ’ εκείνο το network interface του RasPi που βλέπει απευθείας το LAN interface του router. Στο Raspberry Pi 3 των δοκιμών μας, για παράδειγμα, από τα δύο network interfaces που διαθέτει εκείνο που βλέπει απευθείας το LAN interface του router είναι το ενσύρματο (κι όχι το ασύρματο). Εναλλακτικά, αντί για κανόνες port forwarding μπορούμε να βάλουμε το RasPi στο DMZ του router. Σε κάθε περίπτωση, το firewall του router ή/και του RasPi οφείλουμε να το έχουμε έτσι ρυθμισμένο, ώστε ειδικά στους clients από το Internet να επιτρέπεται πρόσβαση *μόνο* σε ένα σαφώς ορισμένο σύνολο υπηρεσιών. Το RasPi μας δεν είναι στο DMZ, το firewall του router είναι ενεργοποιημένο και, χάρη σε τρεις κανόνες port forwarding, για τους clients από το Internet γίνονται ανακατευθύνσεις *μόνο* προς τα ports των υπηρεσιών SSH, HTTP και HTTPS του RasPi. Στο ίδιο το RasPi δεν υπάρχει firewall ενεργοποιημένο, αφού δεν ανησυχούμε για τους χρήστες του τοπικού δικτύου.
  • Το δικό μας domain name και πρόσβαση στον name server που το φιλοξενεί. Στον name server πρέπει να υπάρχει ένα A record για το domain ή κάποιο subdomain του, το οποίο θα δείχνει στο δημόσιο IP του router μπροστά από το RasPi (περισσότερα για το DNS και τους name servers μπορείτε να διαβάσετε εδώ). Βεβαίως, επειδή το IP αυτό μάλλον δεν θα είναι στατικό και θ’ αλλάζει, οφείλουμε να φροντίσουμε για έναν μηχανισμό που θα ενημερώνει αυτόματα το A record. Εμείς έχουμε στην κατοχή μας το domain colder.xyz, το οποίο εξυπηρετείται από τον name server μιας εγκατάστασης του Mail-in-a-Box. Για τις ανάγκες του παρόντος άρθρου, στον name server προσθέσαμε ένα A record το οποίο στο subdomain nue.colder.xyz αντιστοιχίζει το δημόσιο IP που παίρνει ο router μας από τον ISP. Στο δε Raspbian υπάρχει ένα cronjob που κάθε μισή ώρα ενημερώνει κατάλληλα το A record του name server. Αλλά δείτε τα screenshots που ακολουθούν, διαβάστε και τις αντίστοιχες περιγραφές.

Σημείωση. Αν δεν έχετε το δικό σας domain ή δεν είναι δυνατή η αυτόματη ενημέρωση των A records του name server, στραφείτε προς κάποια (δωρεάν) υπηρεσία dynamic DNS. Μια από τις επιλογές σας είναι η σχετική υπηρεσία του Duck DNS.

Όψη του web panel που διαθέτει η εγκατάσταση του Mail-in-a-Box μας, την οποία συντηρούμε σε VPS της Digital Ocean. Ο name server εξυπηρετεί περισσότερα από ένα domains, μεταξύ αυτών και το colder.xyz. Παρατηρήστε το A record για το subdomain nue.colder.xyz, το οποίο δείχνει προς το δημόσιο IP του router μπροστά από το RasPi.

Όψη του web panel που διαθέτει η εγκατάσταση του Mail-in-a-Box μας, την οποία συντηρούμε σε VPS της Digital Ocean. Ο name server εξυπηρετεί περισσότερα από ένα domains, μεταξύ αυτών και το colder.xyz. Παρατηρήστε το A record για το subdomain nue.colder.xyz, το οποίο δείχνει προς το δημόσιο IP του router μπροστά από το RasPi.

Το συγκεκριμένο cronjob του RasPi κάθε μισή ώρα ενημερώνει κατάλληλα το A record για το subdomain nue.colder.xyz, ώστε πάντοτε να εμπεριέχει τη δημόσια δυναμική διεύθυνση IP που παίρνει ο router μας από τον ISP.

Το συγκεκριμένο cronjob του RasPi κάθε μισή ώρα ενημερώνει κατάλληλα το A record για το subdomain nue.colder.xyz, ώστε πάντοτε να εμπεριέχει τη δημόσια δυναμική διεύθυνση IP που παίρνει ο router μας από τον ISP.

Εγκατάσταση Apache
Συνδεόμαστε μέσω SSH στο RasPi κι αρχικά φροντίζουμε ώστε οι πληροφορίες περί των αποθετηρίων να είναι επικαιροποιημένες:

pi@nordostbahnhof:~ $ sudo apt-get update

Ακολούθως εγκαθιστούμε τον Apache:

pi@nordostbahnhof:~ $ sudo apt-get -y install apache2

Όπως εύκολα διαπιστώνουμε, αμέσως μετά την εγκατάστασή του ο web server είναι ενεργοποιημένος:

pi@nordostbahnhof:~ $ sudo systemctl -l status apache2
● apache2.service - LSB: Apache2 web server
   Loaded: loaded (/etc/init.d/apache2)
  Drop-In: /lib/systemd/system/apache2.service.d
           └─forking.conf
   Active: active (running) since Sat 2016-12-24 08:03:02 CET; 1min 21s ago
   CGroup: /system.slice/apache2.service
           ├─18621 /usr/sbin/apache2 -k start
           ├─18624 /usr/sbin/apache2 -k start
           └─18625 /usr/sbin/apache2 -k start

Dec 24 08:03:01 nordostbahnhof apache2[18598]: Starting web server: apache2AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Dec 24 08:03:02 nordostbahnhof apache2[18598]: .
Dec 24 08:03:02 nordostbahnhof systemd[1]: Started LSB: Apache2 web server.

Υπάρχουν κάποια παράπονα περί FQDN (fully qualified domain name) τα οποία μπορούμε να αγνοήσουμε επιδεικτικά — αν και μάλλον είναι ήδη αργά γι’ αυτό :/ Από έναν οποιονδήποτε web browser επισκεπτόμαστε τη διεύθυνση της μορφής http://στατικόεσωτερικό_IPτουRasPi ή της μορφής http://το(sub)domain_μας. Παράδειγμα: Το στατικό IP του δικού μας RasPi είναι το 192.168.178.31 και το subdomain μας είναι το nue.colder.xyz, επομένως από τον web browser πηγαίνουμε σε ένα από τα http://192.168.178.31, http://nue.colder.xyz (φυσικά, καλό είναι να τσεκάρουμε και τις δύο διευθύνσεις). Σε κάθε περίπτωση, αν όλα έχουν πάει καλά με τον Apache θα δούμε την προκαθορισμένη του σελίδα, με πληροφορίες που τον αφορούν.

Η σελίδα καλωσορίσματος του Apache, αμέσως μετά την εγκατάστασή του στο RasPi μας. Παρατηρήστε ότι επισκεφτήκαμε το σχετικό site με χρήση του subdomain μας, δηλαδή όπως ακριβώς θα έκανε ένας οποιοσδήποτε χρήστης του Internet.

Η σελίδα καλωσορίσματος του Apache, αμέσως μετά την εγκατάστασή του στο RasPi μας. Παρατηρήστε ότι επισκεφτήκαμε το σχετικό site με χρήση του subdomain μας, δηλαδή όπως ακριβώς θα έκανε ένας οποιοσδήποτε χρήστης του Internet.

Εγκατάσταση Let’s Encrypt client
Ο προαναφερθείς client δεν υπάρχει στα repositories του Raspbian και γι’ αυτό θα τον εγκαταστήσουμε κλωνοποιώντας το σχετικό πρότζεκτ από το GitHub. Για τη συνέχεια βολεύει να εργαστούμε από το λογαριασμό του root:

pi@nordostbahnhof:~ $ sudo su
root@nordostbahnhof:~# cd

Για την κλωνοποίηση χρειαζόμαστε το git:

root@nordostbahnhof:~# apt-get -y install git

Ο προσωπικός κατάλογος του root είναι ένα καλό σημείο για την κλωνοποίηση του Let’s Encrypt client:

root@nordostbahnhof:~# git clone https://github.com/letsencrypt/letsencrypt
Cloning into 'letsencrypt'...
remote: Counting objects: 42706, done.
remote: Compressing objects: 100% (167/167), done.
remote: Total 42706 (delta 85), reused 4 (delta 4), pack-reused 42529
Receiving objects: 100% (42706/42706), 12.16 MiB | 2.67 MiB/s, done.
Resolving deltas: 100% (30440/30440), done.
Checking connectivity... done.

Ωραία, είμαστε τώρα έτοιμοι να αιτηθούμε πιστοποιητικό για το domain ή/και για τα subdomain μας.

Λήψη πιστοποιητικού
Προηγουμένως δημιουργήθηκε ο κατάλογος ονόματι letsencrypt. Μεταβαίνουμε σ’ αυτόν…

root@nordostbahnhof:~# cd letsencrypt

…κι εγκαθιστούμε ένα ωραιότατο πιστοποιητικό για τον Apache πληκτρολογώντας κάτι σαν το ακόλουθο:

root@nordostbahnhof:~/letsencrypt# ./letsencrypt-auto --apache -d nue.colder.xyz -m subZraw@colder.xyz --redirect --agree-tos

Με την παράμετρο -d ορίζουμε το domain ή το subdomain για το οποίο αιτούμαστε πιστοποιητικό. Αν ζητάμε πιστοποιητικό που να καλύπτει ένα domain κι ένα ή περισσότερα subdomains του, απλά χρησιμοποιούμε την παράμετρο -d περισσότερες από μία φορές. Για παράδειγμα, αν θέλαμε πιστοποιητικό που να καλύπτει το site του περιοδικού, τότε θα γράφαμε:

root@nordostbahnhof:~/letsencrypt# ./letsencrypt-auto --apache -d deltahacker.gr -d www.deltahacker.gr -m talk2us@deltahacker.gr --redirect --agree-tos

Παρατηρήστε την παράμετρο -m, η οποία δέχεται μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου. Σ’ αυτή τη διεύθυνση αποστέλλονται emails με έγκαιρες ειδοποιήσεις από το Let’s Encrypt πρότζεκτ, κάθε φορά που ένα πιστοποιητικό μας πρόκειται να λήξει.

Ιδιαίτερα χρήσιμη, εξάλλου, είναι η επιλογή –redirect. Όταν τη συμπεριλαμβάνουμε στην εντολή αίτησης πιστοποιητικού, τα αρχεία ρυθμίσεων του Apache τροποποιούνται καταλλήλως ώστε ασχέτως αν οι επισκέπτες πληκτρολογούν http://domain.tld ή https://domain.tld, πάντα να χρησιμοποιούν την ασφαλή σύνδεση HTTPS.

Αφού λοιπόν πληκτρολογήσουμε την κατάλληλη εντολή, οι διαδικασίες αίτησης πιστοποιητικού, ελέγχου ιδιοκτησιακού καθεστώτος του αντίστοιχου domain, εγκατάστασης πιστοποιητικού κι ενημέρωσης του Apache, προχωρούν κι ολοκληρώνονται αυτόματα. Δείτε τα screenshots που ακολουθούν.

Στο σκριπτάκι letsencrypt-auto δώσαμε την παράμετρο --apache κι ο client ξέρει πώς να τροποποιεί τα configuration files του εν λόγω web server, οπότε δεν χρειάζεται καμία επέμβαση από μέρους μας. Μεταξύ των άλλων εργασιών που επιτελούνται αυτόματα είναι κι ο έλεγχος ιδιοκτησίας του domain name. Την πρόοδο των εργασιών την παρακολουθούμε μέσα από ένα απλό αλλά επεξηγηματικό ncurses interface.

Στο σκριπτάκι letsencrypt-auto δώσαμε την παράμετρο –apache κι ο client ξέρει πώς να τροποποιεί τα configuration files του εν λόγω web server, οπότε δεν χρειάζεται καμία επέμβαση από μέρους μας. Μεταξύ των άλλων εργασιών που επιτελούνται αυτόματα είναι κι ο έλεγχος ιδιοκτησίας του domain name. Την πρόοδο των εργασιών την παρακολουθούμε μέσα από ένα απλό αλλά επεξηγηματικό ncurses interface.

Η εγκατάσταση του πιστοποιητικού ολοκληρώθηκε επιτυχώς για το nue.colder.xyz! Παροτρυνόμαστε να πάμε μια βόλτα από το https://ssllabs.com για μια σειρά από ελέγχους ασφαλείας. Θα το κάνουμε, αλλά σε λίγο.

Η εγκατάσταση του πιστοποιητικού ολοκληρώθηκε επιτυχώς για το nue.colder.xyz! Παροτρυνόμαστε να πάμε μια βόλτα από το https://ssllabs.com για μια σειρά από ελέγχους ασφαλείας. Θα το κάνουμε, αλλά σε λίγο.

Στις πληροφορίες που επιστρέφει το letsencrypt-auto συμπεριλαμβάνεται και σύντομη οδηγία για την ανανέωση του πιστοποιητικού, αφού εξ ορισμού έχει χρόνο ισχύος τριών μηνών μόνο. Σε λίγο θα φτιάξουμε ένα νέο cronjob ώστε η ανανέωση να γίνεται έγκαιρα κι αυτόματα, κι έτσι το πιστοποιητικό του site μας να είναι *πάντοτε* έγκυρο.

Στις πληροφορίες που επιστρέφει το letsencrypt-auto συμπεριλαμβάνεται και σύντομη οδηγία για την ανανέωση του πιστοποιητικού, αφού εξ ορισμού έχει χρόνο ισχύος τριών μηνών μόνο. Σε λίγο θα φτιάξουμε ένα νέο cronjob ώστε η ανανέωση να γίνεται έγκαιρα κι αυτόματα, κι έτσι το πιστοποιητικό του site μας να είναι πάντοτε έγκυρο.

Απαραίτητοι έλεγχοι
Η διαδικασία έως τώρα ήταν τόσο απλή, σε βαθμό που κάποιοι πιθανώς να σκεφτούν ότι κάτι δεν πήγε καλά. Κι όμως, ο Apache έχει πλέον το έγκυρο πιστοποιητικό του και για να βεβαιωθούμε αρκεί να πάμε στον web browser της προτίμησής μας και να επισκεφτούμε το site.

Στη μπάρα διευθύνσεων του web browser πληκτρολογούμε τη διεύθυνση https://nue.colder.xyz (https, όχι απλά http). Η προκαθορισμένη σελίδα του Apache εμφανίζεται και με κλικ πάνω στο εικονίδιο με το λουκέτο παίρνουμε πληροφορίες για το πιστοποιητικό του site. Όλα δείχνουν καλά -- και είναι καλά!

Στη μπάρα διευθύνσεων του web browser πληκτρολογούμε τη διεύθυνση https://nue.colder.xyz (https, όχι απλά http). Η προκαθορισμένη σελίδα του Apache εμφανίζεται και με κλικ πάνω στο εικονίδιο με το λουκέτο παίρνουμε πληροφορίες για το πιστοποιητικό του site. Όλα δείχνουν καλά — και είναι καλά!

Πριν λίγο, όταν ολοκληρώθηκε η διαδικασία εγκατάστασης του πιστοποιητικού, ο client του Let’s Encrypt μάς πρότεινε να πάμε στη διεύθυνση

https://www.ssllabs.com/ssltest/analyze.html?d=nue.colder.xyz&latest

ώστε να διεξαχθούν μια σειρά από δοκιμές αναφορικά με την ποιότητα των συνδέσεων SSL (HTTPS) που υποστηρίζει ο web server του nue.colder.xyz. Έχει έρθει η στιγμή να κάνουμε κι αυτές τις δοκιμές και, περιττό να σημειώσουμε, ότι στη θέση του nue.colder.xyz εσείς θα βάλετε το domain name (ή το subdomain) σας.

Οι έλεγχοι του SSL server (ο Apache μας!) διαρκούν μερικά λεπτά και μετά παίρνουμε μια αξιολόγηση για την ποιότητα των συνδέσεων HTTPS που υποστηρίζει ο διακομιστής. Η τελική βαθμολογία διαμορφώνεται από δεκάδες παραμέτρους κι όπως βλέπετε πήραμε ένα ωραιότατο 'A'. Αν όλα έχουν πάει καλά, αυτή τη βαθμολογία *τουλάχιστον* θα πρέπει να δείτε και για τον δικό σας SSL server. Υπόψιν ότι υπάρχει και καλύτερη βαθμολογία (A+). Το πώς μπορούμε να την κερδίσουμε ξεφεύγει από τους σκοπούς του παρόντος.

Οι έλεγχοι του SSL server (ο Apache μας!) διαρκούν μερικά λεπτά και μετά παίρνουμε μια αξιολόγηση για την ποιότητα των συνδέσεων HTTPS που υποστηρίζει ο διακομιστής. Η τελική βαθμολογία διαμορφώνεται από δεκάδες παραμέτρους κι όπως βλέπετε πήραμε ένα ωραιότατο “A”. Αν όλα έχουν πάει καλά, αυτή τη βαθμολογία τουλάχιστον θα πρέπει να δείτε και για τον δικό σας SSL server. Υπόψιν ότι υπάρχει και καλύτερη βαθμολογία (A+). Το πώς μπορούμε να την κερδίσουμε ξεφεύγει από τους σκοπούς του παρόντος.

Αυτόματη ανανέωση πιστοποιητικού
Τα πιστοποιητικά που εκδίδει το Let’s Encrypt διαρκούν για τρεις μήνες. Από εκεί και πέρα, αν δεν έχουμε φροντίσει για την ανανέωση του δικού μας, οι επισκέπτες του site βλέπουν τη γνωστή, ανησυχητική προειδοποίηση περί ληγμένου πιστοποιητικού. Ευτυχώς η ανανέωσή τους υποστηρίζεται από τον Let’s Encrypt client, οπότε μπορούμε να φτιάξουμε ένα cronjob για τον root που θα φροντίζει γι’ αυτή τη δουλειά αυτόματα. Από το λογαριασμό του root, λοιπόν, πληκτρολογούμε

root@nordostbahnhof:~/letsencrypt# crontab -e

και προσθέτουμε μια νέα εργασία για τον cron daemon. Δείτε τη δική μας:

15 4 * * 5 /root/letsencrypt/letsencrypt-auto renew >> /var/log/letsencrypt/ltenc-renew.log

Κάθε Παρασκευή στις 04:15 το πρωί καλείται το letsencrypt-auto με την εντολή renew. Αν και μόνον αν το πιστοποιητικό μας πλησιάζει στη λήξη του, τότε ανανεώνεται αυτόματα. Αν κάτι δεν πάει καλά και χρειαστεί να δούμε τι συνέβη με την απόπειρα ανανέωσης, θα ανοίξουμε το αρχείο /var/log/letsencrypt/ltenc-renew.log. Και μια τελευταία σημείωση: Καλό είναι να βάλετε διαφορετική μέρα και ώρα στο cronjob σας, ώστε να μην ενοχλούμε όλοι μαζί τους servers του Let´s Encrypt. Ας τους ενοχλούμε κατά υποομάδες και πιο τυχαία, δηλαδή :)

Τα cronjobs που είναι σε ισχύ για τον χρήστη root, στο Raspbian. Με το δεύτερο φροντίζουμε για την έγκαιρη ανανέωση του πιστοποιητικού που έχουμε πάρει από το Let's Encrypt.

Τα cronjobs που είναι σε ισχύ για τον χρήστη root, στο Raspbian. Με το δεύτερο φροντίζουμε για την έγκαιρη ανανέωση του πιστοποιητικού που έχουμε πάρει από το Let’s Encrypt.

7 Responses to “Ο Apache στο Raspberry Pi, με έγκυρο πιστοποιητικό”

  1. bshark | 26/12/2016 at 15:54

    Με λίγα λόγια, ως ελαφρώς άσχετος με ασφάλεια και πρωτοκολλα, μας δίνεται η δυνατότητα δωρέαν https
    στον web server και το url του domain μας ?

  2. Gonik | 28/01/2017 at 22:33

    Στην περίπτωσή μου, το Let’s Encrypt απέτυχε να εγκατασταθεί. Πιστεύω λόγω του γεγονότος ότι έχω το domain στο CloudFlare.

    Η λύση ήταν να χρησιμοποιήσω το certbot απευθείας:
    ——-
    ./certbot-auto certonly –webroot –webroot-path /var/www/html/ –renew-by-default –email onoma@domain.com –text –agree-tos -d subdomain.domain.com
    ——-
    και μετά να ανεβάσω manually to pem certificate στο cloudflare.

    • Gonik | 29/01/2017 at 21:45

      Άκυρο το παραπάνω σχόλιο. Απλά έπρεπε να απενεργοποιήσω το passthrough μέσω των server της CloudFlare (και να θέσω το Crypto σε Full), και το παραπάνω δουλεύει άψογα…

      Μετά από τόσα χρόνια αυτό το RTFM ακόμα να το μάθω ώρες ώρες :P

  3. ToPnt | 05/02/2017 at 01:09

    Κάνοντας τα ίδια σε ένα ubuntu 16.04 server μηχάνημα και κάνοντας το test που υποδεικνύεις, μου βγάζει : Α-
    Και από κάτω :
    The server does not support Forward Secrecy with the reference browsers. Grade reduced to A-. MORE INFO » https://blog.qualys.com/ssllabs/2013/06/25/ssl-labs-deploying-forward-secrecy
    Γιατί; :/

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων