OpenVPN Server auf Amazon Linux installieren


Amazon Web Services werden immer beliebter. Vor allem internationale Startups setzen gern auf EC2-Instanzen um ihre Infrastruktur zu hosten. Will man allerdings nicht die per Default für die ganze Welt offene SSH-Konfiguration von EC2 nutzen, sollte man sich einen OpenVPN Gateway erstellen, über den man auf die einzelnen Server seines EC2-Netzwerks zugreifen kann.

Die Netzwerk-Einstellungen

Ein gutes EC2-Setup beginnt immer mit den Netzwerk-Einstellungen. Ich nutze dabei üblicherweise folgende Vorgehensweise.

1. Eine neue VPC erstellen. Das ist im Prinzip ein privates Subnet, in dem man dann seine Instanzen hosten kann.
2. Für jede Verfügbarkeitszone ein eigenes Subnet in diesem VPC einrichten. Auf diese Weise kann man die einzelnen Zonen via Security Groups besser trennen.
3. Eine Security-Group einrichten, die Zugriffe aus der IP-Range des VPC erlaubt. Diese wird später verwendet um dem Gateway zugeordnet zu werden.

Das Basis-Setup des Gateways

Welchen Instanz-Typ man für den Gateway verwendet, ist relativ egal. Je nach Anzahl der User, die VPN-Zugänge nutzen sollen, sollte man aber entsprechende Netzwerkleistung einplanen. Wird das VPN nur von einigen wenigen Systemadministratoren genutzt, reicht aber auch eine Micro-Instanz, da OpenVPN keine großen RAM-Ansprüche hat. Im Schlimmsten Fall, d.h. wenn das VPN zu langsam ist, kann man ja die Instanz bei Bedarf noch vergrössern. Dazu stoppt man sie, wählt einen neuen Instanz-Typ und startet sie wieder.

Natürlich sollte man darauf achten, dass alle Software aktuell ist. Das ist mit YUM einfach zu erreichen. Man wird üblicherweise beim Login via SSH auch darauf hingewiesen, dass neue Pakete für ein Update bereitstehen.

yum -y update

Ausserdem empfehle ich den User ‚ec2-user‘, der ohne Passwort Befehle via sudo ausführen kann, durch einen neuen User zu ersetzen. Diesen neuen User packt man in die Gruppe ‚wheel‘ und aktiviert folgende Zeile in der /etc/sudoers:

%wheel	ALL=(ALL)	ALL

Damit kann der User nach Eingabe seines eigenen Passworts sudo-Befehle ausführen. Hat man überprüft, dass man sich via SSH mit diesem User einloggen kann (Achtung: per Default ist ein Login mit Passwort nicht möglich, weswegen der User einen public key in seiner ~/.ssh/authorized_keys haben muss), kann man den User ‚ec2-user‘ entfernen.

OpenVPN einrichten

Nun geht es an’s eigentliche Setup. Zuerst einmal benötigen wir git und OpenVPN:

yum install openvpn git

Um die CA-Verwaltung einfach machen zu können, sollten wir Easy-RSA nutzen:

git clone https://github.com/OpenVPN/easy-rsa /tmp/easy-rsa
cp -r /tmp/easy-rsa/easyrsa3 /etc/openvpn/easy-rsa

Damit wir nicht die komplette Config neu stellen müssen, kopieren wir uns eine Default-Konfiguration an die richtige Stelle:

cp /usr/share/doc/openvpn-2.3.12/sample/sample-config-files/server.conf /etc/openvpn/

Easy-RSA benötigt immer wieder bestimmte Werte um Zertifikate zu erstellen. Damit wir sie nicht immer manuell eingeben müssen, können wir sie in einer vars-Datei ablegen:

cat > /etc/openvpn/easy-rsa/vars << "EOF"
export KEY_COUNTRY="DE"
export KEY_PROVINCE="Berlin"
export KEY_CITY="Berlin"
export KEY_ORG="Bitmuncher"
export KEY_EMAIL="bitmuncher@mailbox.org"
export KEY_CN=sysadmin.bitmuncher.de
export KEY_NAME=sysadmin
export KEY_OU=sysadmin
EOF

Nun können wir unsere CA erstellen:

cd /etc/openvpn/easy-rsa
./easyrsa init-pki
./easyrsa build-ca
./easyrsa gen-dh

Und wir brauchen natürlich ein Server-Zertifikat:

./easyrsa build-server-full sysadmin nopass
cp pki/ca.crt pki/dh.pem pki/issued/sysadmin.crt pki/private/sysadmin.key /etc/openvpn/

Damit das Routing in unsere Subnetze problemlos funktioniert, müssen wir noch IP-Forwarding aktivieren.

echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p

Und wir wollen, dass OpenVPN beim Booten automatisch startet:

chkconfig openvpn on

Abschliessend muss noch die Server-Konfiguration angepasst werden. Folgende Werte sollten darin stehen.

ca ca.crt
cert sysadmin.crt
key sysadmin.key
dh dh.pem
user nobody
group nobody
push "route 172.10.0.0 255.255.0.0"

Die Routing-Einstellungen müssen natürlich an die IP-Range des VPC angepasst werden.

Und schon können wir unsere Server starten:

service openvpn restart

Benutzer anlegen

Natürlich bringt so ein VPN-Server wenig, wenn kein User-Zertifikat existiert, mit dem sich ein User verbinden kann. Um ein solches zu generieren, nutzen wir wieder Easy-RSA:

cd /etc/openvpn/easy-rsa
./easyrsa build-client-full <username> nopass
cd /root/client-configs
./make_config.sh <username>

Das hier verwendete Skript make_config.sh hat folgenden Inhalt:

#!/bin/bash

# First argument: Client identifier

KEY_DIR=/etc/openvpn/easy-rsa/pki/private/
OUTPUT_DIR=/root/client-configs/files
BASE_CONFIG=/root/client-configs/base.conf

cat ${BASE_CONFIG} \
    <(echo -e '<ca>') \
    /etc/openvpn/easy-rsa/pki/ca.crt \
    <(echo -e '</ca>\n<cert>') \
    /etc/openvpn/easy-rsa/pki/issued/${1}.crt \
    <(echo -e '</cert>\n<key>') \
    /etc/openvpn/easy-rsa/pki/private/${1}.key \
    <(echo -e '</key>\n') \
    > ${OUTPUT_DIR}/${1}.ovpn

Wie zu sehen ist, verwendet es eine Datei namens base.conf, die so aussieht:

client
dev tun
proto udp
remote <public IP des VPN servers> 1194
;remote-random
resolv-retry infinite
nobind
;user nobody
;group nobody
persist-key
persist-tun
remote-cert-tls server
comp-lzo
verb 3
mode server
tls-server

An diese werden unten dann die notwendigen Zertifikatsdateien angehängt. Als Output erhalten wir eine fertige Client-Konfiguration, die wir einfach dem User übergeben können. Auf einem Mac mit Tunnelblick kann man diese einfach auf das Tunnelblick-Icon in der Menüleiste droppen und schon ist alles fertig konfiguriert.

Entfernen von Usern

Manchmal will man natürlich auch User löschen. Das ist dank Easy-RSA auch denkbar einfach.

cd /etc/openvpn/easy-rsa
./easyrsa revoke <username>
./easyrsa gen-crl

So einfach kann also ein OpenVPN-Server eingerichtet werden. Zur Absicherung seiner Infrastruktur, sollte man die paar Minuten für das Setup wirklich investieren.

Übrigens: Der gleiche Ablauf funktioniert auch unter CentOS, wenn EPEL aktiviert ist. Ausserdem muss man dort darauf achten, dass die Beispiel-Konfiguration für die server.conf ein paar andere Cipher enthält, die man dann auch in der base.conf für die Clients eintragen muss. Und man muss explicit-exit-notify auf 0 setzen, da es sonst zu Fehlern beim Starten des Servers kommt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.