Οδηγός δημιουργίας VPN: Ασφαλής απομακρυσμένη εργασία στην εποχή του κορωνοϊού

24 Μαρτίου 2020, από

Τα μέτρα περιορισμού για την αντιμετώπιση του 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 του ΣΕΠΕ μπορείς να βρεις περισσότερα για τη δωρεάν παροχή υπηρεσιών για την εύρυθμη υποστήριξη της επαγγελματικής & κοινωνικής δραστηριότητας, για τον αποτελεσματικό περιορισμό της πανδημίας.

Σου άρεσε αυτό το blog post;

Τότε σίγουρα θα λατρέψεις τα επόμενα! Συμπλήρωσε το email σου για να μη χάσεις ούτε ένα.;

Κάνε δωρεάν την εγγραφή σου και στο εξής θα λαμβάνεις ενημερώσεις για τα νέα post του Τοp.Host Blog. Οποιαδήποτε στιγμή θελήσεις μπορείς να αφαιρέσεις το email σου από τη λίστα παραληπτών. Μάθε περισσότερα στην Πολιτική Απορρήτου.

Μπες στη συζήτηση

Πες μας τη γνώμη σου!