Οδηγός δημιουργίας VPN: Ασφαλής απομακρυσμένη εργασία στην εποχή του κορωνοϊού
Τα μέτρα περιορισμού για την αντιμετώπιση του COVID-19 έχουν φέρει πολλές μικρές επιχειρήσεις αντιμέτωπες με την πρόκληση της απομακρυσμένης εργασίας (remote work). Μέσα σε μια πρωτόγνωρη κατάσταση, καλούνται να συνεχίσουν τη δραστηριότητα τους επικοινωνώντας μέσω Skype, Zoom, Webex, Google Meet κ.α. και αξιοποιώντας online εργαλεία οργάνωσης όπως Trello, Jira ή Asana. Παράλληλα όμως, πρέπει να μη ξεχνούν και το θέμα της ασφάλειας.
Για να προστατέψει τις επικοινωνίες και τα συστήματα της μια επιχείρηση θα πρέπει να επιτρέπει την είσοδο αποκλειστικά στους υπαλλήλους της, αφήνοντας εκτός όλους τους υπόλοιπους. Αυτό, μπορεί να το καταφέρει με το VPN! Στη συνέχεια λοιπόν, θα εξηγήσουμε τι είναι και πώς μπορεί μια επιχείρηση να δημιουργήσει μια βασική VPN υπηρεσία χρησιμοποιώντας αποκλειστικά και μόνο ελεύθερο λογισμικό.
Τι είναι VPN
Φαντάσου μια εικονική γέφυρα η οποία συνδέει το χρήστη (υπάλληλο) με την εταιρεία (σύστημα), την οποία για να περάσει κάποιος χρειάζεται username και password ενώ ταυτόχρονα η επικοινωνία είναι κωδικοποιημένη. Αυτό το δίκτυο ονομάζεται και VPN (Virtual Private NetWork).
Τα περισσότερα οικιακά δίκτυα, που αποτελούν πλέον το χώρο εργασία μας, δεν υποστηρίζουν στατική IP (αλλάζει διαρκώς) οπότε η εκάστοτε επιχείρηση δεν μπορεί να επιτρέψει ή να εξαιρέσει κάποια συγκεκριμένη IP ή δίκτυο από το firewall της. Αυτό έχει σαν αποτέλεσμα μεγάλες εκπτώσεις στην ασφάλεια, με στόχο κάποιος να μπορέσει να εργαστεί απομακρυσμένα.
VPN βήμα-βήμα
Αν έχεις τεχνικές γνώσεις, ο συγκεκριμένος οδηγός θα σε βοηθήσει να στήσεις ένα μικρό VPN server με στατική IP ώστε κάθε εργαζόμενος της επιχείρησής σου να αρχίσει να εργάζεται απομακρυσμένα με όσο το δυνατόν μεγαλύτερη ασφάλεια.
Τα συστατικά για ένα VPN είναι ένας client, ένας διακομιστής και ένα domain.
Για VPN επιλέξαμε το strongSwan IKEv2 διότι o client του είναι πλέον άμεσα υποστηριζόμενος από windows και MacOS ενώ υπάρχει και εγκαθίσταται εύκολα στις linux διανομές.
Για διακομιστή, αρχικά χρειαζόμαστε ένα μικρό VPS όπως το NASH με Centos 8, και τέλος ένα domain ή subdomain. Το domain ή subdomain μας κάνει τα πράγματα πιο εύκολα διότι μπορούμε να ενεργοποιήσουμε Let’s Encrypt και να αποφύγουμε την έκδοση και υπογραφή πιστοποιητικών από εμάς τους ίδιους.
Ας πάρουμε τα πράγματα όμως με την σειρά,
Προαπαιτούμενα:
- VPS με Centos 8
- Root δικαιώματα
- Domain ή subdomain με Α record στην IP του VPS
Βήματα:
- Εγκατάσταση strongSwan IKEv2
- Έκδοση πιστοποιητικών
- Ρύθμιση strongswan
- Ρύθμιση NAT Firewall
- Ρύθμιση Port Portwarding
- Αυτόματη ανανέωση πιστοποιητικών
Εγκατάσταση strongSwan IKEv2
Αρχικά εγκαθιστούμε το epel repo που περιέχει το πακέτο του strongswan και στην συνέχεια το ίδιο το strongswan πακέτο
dnf install epel-release dnf install strongswan
Δημιουργία πιστοποιητικών
Για την έκδοση των πιστοποιητικών, εφόσον μας ανήκει κάποιο domain ή subdomain θα χρησιμοποιήσουμε το Let’s encrypt, σε αντίθετη περίπτωση θα πρέπει να εκδώσουμε και υπογράψουμε εμείς οι ίδιοι τα πιστοποιητικά και να εγκαταστήσουμε στην συνέχεια το CA πιστοποιητικό στον τοπικό μας υπολογιστή.
wget https://dl.eff.org/certbot-auto -O /usr/local/bin/certbot-auto chmod +x /usr/local/bin/certbot-auto
Ρυθμίζουμε το firewall να δέχεται http και https συνδέσεις ώστε να μπορεί να επαληθεύσει το Let’s encrypt το domain ή subdomain.
firewall-cmd --add-service=http --permanent firewall-cmd --add-service=https --permanent firewall-cmd --reload
Εκδίδουμε το πιστοποιητικό όπου για το παράδειγμα μας το domain είναι ikev2.mydomain.tld
certbot-auto certonly --rsa-key-size 2048 --standalone --agree-tos --no-eff-email --email [email protected] -d ikev2.mydomain.tld
Στην συνέχεια αντιγράφουμε τα πιστοποιητικά στους αντίστοιχους φακέλους του strongswan
cp /etc/letsencrypt/live/ikev2.mydomain.tld/fullchain.pem /etc/strongswan/ipsec.d/certs/ cp /etc/letsencrypt/live/ikev2.mydomain.tld/privkey.pem /etc/strongswan/ipsec.d/private/ cp /etc/letsencrypt/live/ikev2.mydomain.tld/chain.pem /etc/strongswan/ipsec.d/cacerts/
Ρύθμιση strongswan
Αρχικά, κρατάμε αντίγραφο των default ρυθμίσεων του service
cd /etc/strongswan/ mv ipsec.conf ipsec.conf.bak
Στην συνέχεια ανοίγουμε το άδειο πλέον αρχείο ipsec.conf
vim ipsec.conf
και αντιγράφουμε μέσα τα παρακάτω
config setup charondebug="ike 1, knl 1, cfg 0" uniqueids=no #define new ipsec connection conn my-vpn auto=add compress=no type=tunnel keyexchange=ikev2 ike=aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes256-aes128-sha256-sha1-modp2048-modp4096-modp1024,aes256-sha1-modp1024,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16-aes256gcm12-aes128gcm16-aes128gcm12-sha256-sha1-modp2048-modp4096-modp1024,3des-sha1-modp1024! esp=aes128-aes256-sha1-sha256-modp2048-modp4096-modp1024,aes128-sha1,aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes128gcm12-aes128gcm16-aes256gcm12-aes256gcm16-modp2048-modp4096-modp1024,aes128gcm16,aes128gcm16-ecp256,aes256-sha1,aes256-sha256,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16,aes256gcm16-ecp384,3des-sha1! fragmentation=yes forceencaps=yes dpdaction=clear dpddelay=300s rekey=no left=%any [email protected] # ← Προσοχή εδώ να μπει το domain leftcert=fullchain.pem leftsendcert=always leftsubnet=0.0.0.0/0 right=%any rightid=%any rightauth=eap-mschapv2 rightsourceip=10.255.250.0/24 rightdns=1.1.1.1,8.8.8.8 rightsendcert=never eap_identity=%identity
Στην συνέχεια ανοίγουμε το αρχείο ipsec.secrets και προσθέτουμε τις παρακάτω γραμμές με τους χρήστες που θέλουμε.
: RSA "privkey.pem" user1 : EAP "password1" user2 : EAP “password2”
Η επιλογή της διατήρησης των χρηστών σε text αρχείο τοπικά κάνει τα πράγματα απλά και γρήγορα. Το strongSwan όμως έχει επιπλέον plugins για σύνδεση με radius και mysql τα οποία μπορούν να χρησιμοποιηθούν για την σύνδεση της υπηρεσίας με κεντρικοποιημένα συστήματα διαχείρισης χρηστών.
Ενεργοποιούμε το service στο boot και το ξεκινάμε ώστε να πάρει τις παραπάνω ρυθμίσεις
systemctl enable strongswan systemctl restart strongswan
Ρύθμιση NAT Firewall
Ενεργοποιούμε το nat και ρυθμίζουμε αντίστοιχα το firewall
firewall-cmd --zone=public --permanent --add-rich-rule='rule protocol value="esp" accept' firewall-cmd --zone=public --permanent --add-rich-rule='rule protocol value="ah" accept' firewall-cmd --zone=public --permanent --add-port=500/udp firewall-cmd --zone=public --permanent --add-port=4500/udp firewall-cmd --zone=public --permanent --add-service="ipsec" firewall-cmd --zone=public --permanent --add-masquerade firewall-cmd --reload
Ρύθμιση Port Portwarding
Ενεργοποιούμε το port forward στον πυρήνα προσθέτοντας στο αρχείο /etc/sysctl.conf τις παρακάτω γραμμές,
net.ipv4.ip_forward = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0
Στην συνέχεια τρέχουμε την παρακάτω εντολή για να περάσουν στην πυρήνα η αλλαγές.
sysctl -p
Και επανεκκινούμε το service
systemctl restart strongswan
Όλα πλέον είναι έτοιμα και το service μας τρέχει με δυνατότητα να δεχτεί συνδέσεις. Μπορούμε να το επαληθεύσουμε τρέχοντας αρχικά,
systemctl status strongswan
Και στην συνέχεια
dnf install net-tools netstat -plntu
Όπου περιμένουμε να δούμε ανοιχτές τις udp πόρτες 68, 4500 και 500.
Αυτόματη ανανέωση πιστοποιητικών
Επειδή τα Let’s Encrypt πιστοποιητικά λήγουν κάθε 3 μήνες, θα δημιουργήσουμε ένα cron job ώστε να γίνεται αυτόματα η ανανέωση και ότι απαιτείται για να ενημερωθεί το service.
Οπότε ανοίγουμε το αρχείο /etc/crontab και προσθέτουμε την παρακάτω γραμμή,
* */12 * * * /usr/local/bin/certbot-auto renew --post-hook "/usr/local/bin/renew.sh" --quiet
Στην συνέχεια δημιουργούμε το αρχείο /usr/local/bin/renew.sh και προσθέτουμε τα παρακάτω,
#!/bin/bash cp -f /etc/letsencrypt/live/ikev2.mydomain.tld/fullchain.pem /etc/strongswan/ipsec.d/certs/ cp -f /etc/letsencrypt/live/ikev2.mydomain.tld/privkey.pem /etc/strongswan/ipsec.d/private/ cp -f /etc/letsencrypt/live/ikev2.mydomain.tld/chain.pem /etc/strongswan/ipsec.d/cacerts/ systemctl restart strongswan
Τέλος κάνουμε εκτελέσιμο το αρχείο ώστε να μπορεί να το τρέξει ο cron
chmod +x /usr/local/bin/renew.sh
Λίγα λόγια
Η δημιουργία ενός VPN είναι πολύ σημαντική εάν η επιχείρησή σου πλέον δουλεύει και επικοινωνεί εξ’ αποστάσεως. Ελπίζουμε ο παραπάνω οδηγός να ήταν κατατοπιστικός και να σε βοηθήσει. Στο site του ΣΕΠΕ μπορείς να βρεις περισσότερα για τη δωρεάν παροχή υπηρεσιών για την εύρυθμη υποστήριξη της επαγγελματικής & κοινωνικής δραστηριότητας, για τον αποτελεσματικό περιορισμό της πανδημίας.
H πηγή είναι από την αγαπημένη μας Tophost όπου φιλοξενούμε αρκετά domain names.