Δημιουργία VPN Server - Debian 8

Στον παρακάτω οδηγό θα δημιουργήσουμε βήμα - βήμα ένα ασφαλές VPN Server βασισμένο σε Debian 8 λειτουργικό.

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

Ανάλυση Δυνατοτήτων

Το openvpn που θα χρησιμοποιήσουμε, στην ελεύθερη έκδοσή του επιτρέπει μέχρι δύο χρήστες να λειτουργούν ταυτόχρονα και οι ρυθμίσεις του δεν μπορούν να γίνουν από κάποιο γραφικό περιβάλλον (gui).

Επίσης το openvpn δεν έχει ακόμα τη δυνατότητα να χρησιμοποιεί ταυτόχρονα ipv4 και ipv6, οπότε στο παρακάτω παράδειγμα απενεργοποιούμε εντελώς το ipv6.

Ενημέρωση Συστήματος

Αρχικά ενημερώνουμε το σύστημά μας ώστε να έχει τα τελευταία διαθέσιμα πακέτα και προγράμματα:

apt-get update && apt-get upgrade  
Ενεργοποίηση IPV4 Forward

Η ενεργοποίηση ipv4-forwarding στον πυρήνα, ανοίγουμε το nano /etc/sysctl.conf

net.ipv4.ip_forward=1  

και ενεργοποιούμε τις αλλαγές:

sysctl -p  
Απενεργοποίηση IPV6

Καθώς το openvpn δεν μπορεί να χρησιμοποιήσει παράλληλα ipv4 και ipv6, όπως ήδη αναφέραμε, το καλύτερο είναι να απενεργοποιήσουμε εντελώς το ipv6.

Για να το πετύχουμε αυτό θα πρέπει να ανοίξουμε το αρχείο /etc/sysctl.d/99-sysctl.conf και να προσθέσουμε στο τέλος

# Disable IPV6
net.ipv6.conf.all.disable_ipv6 = 1  
net.ipv6.conf.default.disable_ipv6 = 1  
net.ipv6.conf.lo.disable_ipv6 = 1  
net.ipv6.conf.eth0.disable_ipv6 = 1  

Ενεργοποιούμε τις παραπάνω επιλογές

sysctl -p  

Επίσης ανοίγουμε το αρχείο /etc/hosts και κάνουμε mute την παρακάτω γραμμή

#::1     localhost ip6-localhost ip6-loopback
Εγκατάσταση και ρύθμιση OpenVPN

Αρχικά προχωράμε με την εγκατάσταση του openvpn

apt-get install openvpn  

Δημιουργούμε το αρχείο ρυθμίσεων του openvpn με ονομασία server.conf από το έτοιμο template

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf  

Με τη βοήθεια του make-cadir δημιουργούμε τους απαραίτητους φακέλους που θα φιλοξενούν τα κλειδιά μας και επιλέγουμε τον φάκελο αυτό ως τοποθεσία των επόμενων εντολών μας

make-cadir /etc/openvpn/easy-rsa && cd /etc/openvpn/easy-rsa/  

Σε περίπτωση που η εντολή make-cadir δεν υπάρχει στο σύστημα θα πρέπει να εγκαταστήσουμε το πακέτο easy-rsa με την παρακάτω εντολή

apt-get install easy-rsa  

Δημιουργούμε ένα symblink του openssl-1.0.0.cnf στο openssl.cnf

ln -s openssl-1.0.0.cnf openssl.cnf  

Ο φάκελος /etc/openvpn/easy-rsa/keys έχει δικαιώματα 0700 που είναι ασφαλή για να αποθηκεύσουμε τα κλειδιά μας, οπότε και τον χρησιμοποιούμε αναλόγως στις ρυθμίσεις server.conf όπως παρακάτω

# Any X509 key management system can be used.
# OpenVPN can also use a PKCS #12 formatted key file
# (see "pkcs12" directive in man page).
ca /etc/openvpn/easy-rsa/keys/ca.crt  
cert /etc/openvpn/easy-rsa/keys/server.crt  
key /etc/openvpn/easy-rsa/keys/server.key  # This file should be kept secret

# Diffie hellman parameters.
# Generate your own with:
#   openssl dhparam -out dh1024.pem 1024
# Substitute 2048 for 1024 if you are using
# 2048 bit keys.
dh /etc/openvpn/dh4096.pem  

Το αρχείο vars στο /etc/openvpn/easy-rsa διατηρεί πληροφορίες σχετικά με τα πιστοποιητικά μας, οι οποίες χρησιμοποιούνται από τα υπόλοιπα scripts. Οπότε ανοίγουμε το /etc/openvpn/easy-rsa/vars και αλλάζουμε αναλόγως

# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="GR"  
export KEY_PROVINCE="AT"  
export KEY_CITY="Athens"  
export KEY_ORG="Your Organization"  
export KEY_EMAIL="me@myhost.mydomain"  
export KEY_OU="IT"  

Στο παραπάνω πεδίο KEY_ORG βάζουμε το όνομα της εταιρείας μας ή ότι άλλο θέλουμε

Τέλος από τον φάκελο /etc/openvpn/easy-rsa ορίζουμε ως πηγή το vars script

cd /etc/openvpn/easy-rsa && source ./vars  

η παραπάνω εντολή θα μας επιστέψει μήνυμα

NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys  

Σύμφωνα με τις παραπάνω υποδείξεις προχωράμε σε εκτέλεση του clean-all

./clean-all
Δημιουργία Diffie-Hellman PEM

Συνεχίζουμε δημιουργώντας το απαραίτητο Diffie-Hellman κλειδί. Σύμφωνα με την ονομασία /etc/openvpn/dh*.pem όπου το * ορίζει πόσους χαρακτήρες θα περιέχει το κλειδί μας. Η προεπιλεγμένη τιμή είναι 2048 αλλά εμείς θα δημιουργήσουμε με μεγαλύτερη ασφάλεια κλειδί μεγέθους 4096

openssl dhparam 4096 > /etc/openvpn/dh4096.pem  

Σημείωση: Η παραπάνω εντολή θα χρειαστεί αρκετή ώρα να εκτελεστεί μιας και το κλειδί μας είναι αρκετά μεγάλο. Ευκαιρία λοιπόν να φτιάξουμε καφεδάκι ή να φάμε κάτι.

Αύξηση Ασφάλειας (hardening)

Το openvpn λειτουργεί με 2 κανάλια ροής μεταξύ του server και του client, το Control Channel και το Data Channel. Ο client συνδέεται ανοίγοντας αρχικά μία σύνδεση TLS στο control channel, στο οποίο γίνεται η ανταλλαγή στοιχείων πρόσβασης προκειμένου να προχωρήσει το openvpn στη δημιουργία του data καναλιού. To data κανάλι είναι η κρυπτογραφημένη διασωλήνωση (pipe) μέσω της οποίας περνάει όλη η κίνηση δεδομένων μεταξύ server και client.

Προχωράμε λοιπόν με αλλαγές στο server.conf προκειμένου να αυξήσουμε την κρυπτογράφηση και στα δύο προαναφερόμενα κανάλια και παράλληλα να περιορίσουμε τα δικαιώματα του openvpn.

Ενεργοποίηση ταυτοποίησης της υπογραφής HMAC σε όλα τα TLS πακέτα μεταξύ του server και των συνδεδεμένων clients. Πακέτα χωρίς την υπογραφή αυτή θα απορρίπτονται. Αφαιρέσετε το ; στην αρχή της γραμμής ώστε να ενεργοποιηθεί.

# For extra security beyond that provided
# by SSL/TLS, create an "HMAC firewall"
# to help block DoS attacks and UDP port flooding.
#
# Generate with:
#   openvpn --genkey --secret ta.key
#
# The server and each client must have
# a copy of this key.
# The second parameter should be '0'
# on the server and '1' on the clients.
tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0 # This file is secret  

Στη συνέχεια δημιουργούμε το κλειδί ta.key με την παρακάτω εντολή

openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/ta.key  

Επόμενο βήμα η δημιουργία χρήστη του συστήματος με περιορισμένα δικαιώματα, ο οποίος θα εκτελεί το openvpn.

adduser --system --shell /usr/sbin/nologin --no-create-home openvpn_server  

θα λάβουμε μήνυμα όπως παρακάτω

Adding system user `openvpn_server' (UID 106) ...  
Adding new user `openvpn_server' (UID 106) with group `nogroup' ...  
Not creating home directory `/home/openvpn_server'.  

Για να λειτουργήσει σωστά ο παραπάνω χρήστης, επιστρέφουμε στο αρχείο ρυθμίσεων /etc/openvpn/server.conf ενεργοποιώντας τις γραμμές user & group

# It's a good idea to reduce the OpenVPN
# daemon's privileges after initialization.
#
# You can uncomment this out on
# non-Windows systems.
user openvpn_server  
group nogroup  

Προχωράμε με την ενεργοποίηση κρυπτογράφησης AES-256-CBC, η οποία είναι μία από τις πιο ασφαλής επιλογές μας

echo 'cipher AES-256-CBC' >> /etc/openvpn/server.conf  

Αλλαγή του τρόπου πιστοποίησης για το data κανάλι μας από SHA-1 σε SHA-512

echo 'auth SHA512' >> /etc/openvpn/server.conf  

Eπιτρέπουμε στο contol κανάλι μας να κάνει χρήση μόνο ασφαλών cipher suites

echo 'tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA' >> /etc/openvpn/server.conf  

Ρυθμίζουμε το openvpn μας να κάνει χρήση των OpenDNS Server, ανοίγοντας πάλι το /etc/openvpn/server.conf και αλλάζοντας

# Certain Windows-specific network settings
# can be pushed to clients, such as DNS
# or WINS server addresses.  CAVEAT:
# http://openvpn.net/faq.html#dhcpcaveats
# The addresses below refer to the public
# DNS servers provided by opendns.com.
push "dhcp-option DNS 208.67.222.222"  
push "dhcp-option DNS 208.67.220.220"  

Ενεργοποιούμε redirect της κίνησης από το openvpn επίσης από το /etc/openvpn/server.conf

# If enabled, this directive will configure
# all clients to redirect their default
# network gateway through the VPN, causing
# all IP traffic such as web browsing and
# and DNS lookups to go through the VPN
# (The OpenVPN server machine may need to NAT
# or bridge the TUN/TAP interface to the internet
# in order for this to work properly).
push "redirect-gateway def1 bypass-dhcp"  
Δημιουργία κλειδιών server

Δημιουργία ca (Certificate Authority), στο common name δίνουμε το hostname του μηχανήματός μας και στην ερώτηση κωδικού πατάμε enter

cd /etc/openvpn/easy-rsa  
./build-ca

Στη συνέχεια δημιουργούμε το private key του server

./build-key-server server

και εδώ πατάμε enter στον κωδικό και στις δύο ερωτήσεις σχετικά με certificate requests certified απαντάμε yes

Δημιουργία κλειδιών χρήστη

Κάθε χρήστης πρέπει να έχει δικά του κλειδιά και κατά συνέπεια κάθε ονομασία κλειδιών πρέπει να είναι μοναδική. Το βήμα αυτό μπορείτε να το επαναλάβετε ανά πάσα στιγμή προκειμένου να προσθέσετε νέο χρήστη

cd /etc/openvpn/easy-rsa && source ./vars && ./build-key client1  

Αλλάζουμε το client1 σε ένα μοναδικό όνομα για κάθε χρήστη

Ρυθμίσεις χρήστη

Κάθε χρήστης πρέπει να έχει ένα αρχείο ρυθμίσεων. Αυτό είναι παρόμοιο οπότε είναι καλή πρακτική να έχουμε ένα client.ovpn έτοιμο για νέους χρήστες

Αρχικά αντιγράφουμε από το template client.conf

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client.ovpn  

Αλλάζουμε την γραμμή remote στο /etc/openvpn/easy-rsa/keys/client.ovpn ώστε να αντιστοιχεί με την ip του server μας

# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.

remote 192.0.2.0 1194  

Επίσης σε υπολογιστές που ΔΕΝ έχουν Windows επιλέγουμε την εκτέλεση ως nobody

# Downgrade privileges after initialization (non-Windows only)
user nobody  
group nogroup  

Αλλάζουμε την τοποθεσία που βρίσκονται τα κλειδιά

# SSL/TLS parms.
# See the server config file for more
# description.  It's best to use
# a separate .crt/.key file pair
# for each client.  A single ca
# file can be used for all clients.
ca /path/to/ca.crt  
cert /path/to/client1.crt  
key /path/to/client1.key  

Αλλάζουμε και την τοποθεσία που βρίσκεται το κλειδί ta.key

tls-auth /path/to/ta.key 1  

Τέλος προσθέτουμε τις επιλογές κρυπτογράφησης, όπως κάναμε και στον server, προσθέτοντας τις παρακάτω γραμμές στο τέλος του αρχείου

cipher AES-256-CBC  
auth SHA512  
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA  

Τέλος πακετάρουμε τις παρακάτω ρυθμίσεις

  • /etc/openvpn/easy-rsa/keys/ca.crt
  • /etc/openvpn/easy-rsa/keys/client1.crt
  • /etc/openvpn/easy-rsa/keys/client1.key
  • /etc/openvpn/easy-rsa/keys/client.ovpn
  • /etc/openvpn/easy-rsa/keys/ta.key

με την εντολή

tar -C /etc/openvpn/easy-rsa/keys -cvzf /etc/openvpn/client1.tar.gz {ca.crt,client1.crt,client1.key,client.ovpn,ta.key}  
Αρχική εκκίνηση του OpenVPN

Για να ενεργοποιήσουμε το openvpn μας εκτελούμε

systemctl enable openvpn.service && systemctl start openvpn.service  
Εντοπισμός προβλήματος

Προκειμένου να εντοπίσουμε τυχών πρόβλημα εκτελούμε

systemctl status openvpn*.service  

Αν όλα λειτουργούν σωστά θα πρέπει να μας επιστρέφει τα παρακάτω

● openvpn.service - OpenVPN service
   Loaded: loaded (/lib/systemd/system/openvpn.service; enabled)
  Active: active (exited) since Tue 2015-10-13 20:55:13 UTC; 14min ago
 Process: 5698 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 5698 (code=exited, status=0/SUCCESS)  
  CGroup: /system.slice/openvpn.service

Oct 13 20:55:13 localhost systemd[1]: Stopping OpenVPN service...  
Oct 13 20:55:13 localhost systemd[1]: Starting OpenVPN service...  
Oct 13 20:55:13 localhost systemd[1]: Started OpenVPN service.

● openvpn@server.service - OpenVPN connection to server
   Loaded: loaded (/lib/systemd/system/openvpn@.service; disabled)
   Active: active (running) since Tue 2015-10-13 20:55:13 UTC; 14min ago
 Process: 5709 ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --config /etc/openvpn/%i.conf (code=exited, status=0/SUCCESS)
Main PID: 5725 (openvpn)  
  CGroup: /system.slice/system-openvpn.slice/openvpn@server.service
       └─5725 /usr/sbin/openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --cd /etc/openvpn --config ...

Τέλος με την εντολή journalctl -f | grep vpn μπορούμε να δούμε πρόσφατα logs από το openvpn

Εγκατάσταση Firewall (CSF)

Τελευταίο βήμα είναι να προστατέψουμε το openvpn server μας, γι' αυτό προχωράμε στην εγκατάσταση του Firewall.

Έχουμε επιλέξει το CSF καθώς είναι πιο εύκολο στις ρυθμίσεις του από την iptables και ταυτόχρονα πιο δυναμικό.

Αρχικά εγκαθιστούμε τα απαραίτητα προγράμματα

apt-get install dnsutils libwww-perl  

Προχωράμε με την εγκατάσταση του CSF

cd /usr/src  
wget https://download.configserver.com/csf.tgz  
tar -xzf csf.tgz  
cd csf  
sh install.sh  
Ρύθμιση CSF Firewall

Οι ρυθμίσεις του firewall που πρέπει να γίνουν, αρχικά ανοίγουμε το αρχείο /etc/csf/csfpre.sh, το οποίο πρέπει να είναι κενό και συμπληρώνουμε

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT  
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT  
iptables -A FORWARD -j REJECT  
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE  
iptables -t nat -A POSTROUTING -j SNAT --to-source <openvpn_server_ip>  

Με τους παραπάνω κανόνες επιτρέπουμε κίνηση από το openvpn και όλους τους πελάτες μας προς το internet. Στο πεδίο θα πρέπει να βάλετε την ip του openvpn server σας.

Συνεχίζουμε με τις βασικές ρυθμίσεις του csf που βρίσκονται στο /etc/csf/csf.conf

Απενεργοποιούμε το test mode

TESTING = "0"  

Κλείνουμε τα εισερχόμενα tcp ports αφήνοντας μόνο το ssh και το openvpn

# Allow incoming TCP ports
TCP_IN = "22,1194"  

Κλείνουμε τα εξερχόμενα tcp ports αφήνοντας μόνο ssh, openvpn, http και https

# Allow outgoing TCP ports
TCP_OUT = "22,80,443,1194"  

Κλείνουμε τα εισερχόμενα udp ports αφήνοντας μόνο το openvpn

# Allow incoming UDP ports
UDP_IN = "1194"  

Κλείνουμε τα εξερχόμενα udp ports αφήνοντας μόνο το openvpn

# Allow outgoing UDP ports
# To allow outgoing traceroute add 33434:33523 to this list
UDP_OUT = "53,1194"  

Απενεργοποιούμε το ipv6

IPV6 = "0"  

Με τις παραπάνω αλλαγές έχουμε ολοκληρώσει τις ρυθμίσεις του τείχους προστασίας μας. Το κάνουμε μία επανεκκίνηση ώστε να πάρει τις αλλαγές με την παρακάτω εντολή

csf -r  

Τέλος μπορούμε να διαβάσουμε τους κανόνες που ενεργοποίησε το CSF με την εντολή

iptables -L