216 lines
11 KiB
TeX
216 lines
11 KiB
TeX
\chapter{Vorwort}
|
|
Dieses Dokument wurde im Rahmen der Masterarbeit \enquote{Konzeption und Umsetzung eines IPv6-VPN für die Abteilung Informatik} erzeugt.
|
|
Im Rahmen der Masterarbeit wird beschrieben, wie ein IP6-VPN-Dienst auf Basis von OpenVPN konzipiert und eingerichtet wird.
|
|
|
|
Für den Betrieb dieses Dienst wird eine Zertifizierungsstelle (\textit{Certificate Authority, kurz CA}) benötigt, die für Benutzer und den Serverbetreiber SSL-Zertifikate ausstellt.
|
|
In diesem Dokument wird beschrieben, wie die CA aufgebaut und konfiguriert wird.
|
|
Weiterhin sind Anleitungen für die Benutzer und die Serveradministratoren des VPN-Dienst enthalten, mit deren Hilfe Zertifikate bei der CA beantragt werden können.
|
|
Für die CA ist eine Anleitung enthalten, anhand derer Zertifikate für eingereichte Zertifikatsanträge ausgestellt werden können.
|
|
\todo{Improve this section}
|
|
|
|
|
|
\chapter{Einrichtung der CA}
|
|
Bevor durch die CA Zertifikate ausgestellt werden könnnen, muss sie erst einmal aufgebaut werden.
|
|
Dies geschieht auf Basis von EasyRSA, welches von den OpenVPN-Entwicklern zur Verfügung gestellt wird.
|
|
|
|
Aktuelle Versionen von EasyRSA sind unter \url{https://github.com/OpenVPN/easy-rsa/releases} zu finden.
|
|
Neben den auf \texttt{github.com} zur Verfügung stehenden Releases werden auch GPG-Signaturen angeboten, über welche die Releases authentisiert werden können.
|
|
Im oben erwähnten Repository sind unterhalb von \texttt{./release-keys/README.md}\footnote{\url{https://github.com/OpenVPN/easy-rsa/tree/master/release-keys}} passende GPG-Schlüssel aufgeführt.
|
|
|
|
\begin{lstlisting}
|
|
# Aktuelles Release v3.0.4 beschaffen
|
|
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/ \
|
|
EasyRSA-3.0.4.tgz
|
|
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/ \
|
|
EasyRSA-3.0.4.tgz.sig
|
|
|
|
# Aktuell gültige(n) GPG-Schlüssel für die Signaturprüfung beschaffen
|
|
gpg --recv-keys 6F4056821152F03B6B24F2FCF8489F839D7367F3
|
|
|
|
# Signatur der heruntergeladenen Datei überprüfen
|
|
gpg --verify EasyRSA-3.0.4.tgz.sig EasyRSA-3.0.4.tgz
|
|
\end{lstlisting}
|
|
|
|
Nach der erfolgreichen Authentisierung des heruntergeladenen Archivs kann dieses nun entpackt und verwendet werden.
|
|
\begin{lstlisting}
|
|
tar xzf EasyRSA-3.0.4.tgz
|
|
cd EasyRSA-3.0.4
|
|
\end{lstlisting}
|
|
|
|
|
|
\section{Konfiguration der CA}
|
|
Im nächsten Schritt wird auf Basis der Datei \texttt{vars.example} die Konfigurationsdatei \texttt{vars} erzeugt und anschließend bearbeitet.
|
|
\begin{lstlisting}
|
|
cp vars.example vars
|
|
vim vars
|
|
\end{lstlisting}
|
|
|
|
In der Konfigurationsdatei werden folgende Einstellungen auskommentiert und angepasst:
|
|
\begin{lstlisting}
|
|
# Die volle Organisationsstruktur in Zertifikate aufnehmen
|
|
set_var EASYRSA_DN "org"
|
|
|
|
# Standardwerte für alle Zertifikatsanträge
|
|
set_var EASYRSA_REQ_COUNTRY "DE"
|
|
set_var EASYRSA_REQ_PROVINCE "Niedersachsen"
|
|
set_var EASYRSA_REQ_CITY "Hannover"
|
|
set_var EASYRSA_REQ_ORG "Hochschule Hannover"
|
|
set_var EASYRSA_REQ_EMAIL "F4-I-IT-Team@hs-hannover.de"
|
|
set_var EASYRSA_REQ_OU "Abteilung Informatik"
|
|
|
|
# Alle Zertifikate sollen den RSA-Algorithmus mit 4096 Bit Schlüssellänge verwenden
|
|
set_var EASYRSA_KEY_SIZE 4096
|
|
set_var EASYRSA_ALGO rsa
|
|
|
|
# Das Wurzelzertifikat soll etwa 10 Jahre gültig sein
|
|
set_var EASYRSA_CA_EXPIRE 3650
|
|
|
|
# Ausgestellte Zertifikate sollen etwa ein halbes Jahr gültig sein
|
|
set_var EASYRSA_CERT_EXPIRE 180
|
|
|
|
# Eine erzeugte CRL soll etwa ein halbes Jahr gültig sein
|
|
set_var EASYRSA_CRL_DAYS 180
|
|
\end{lstlisting}
|
|
Sind alle Änderungen durchgeführt worden, ist die Konfiguration der CA damit vollständig abgeschlossen.
|
|
TODO: Erklärung der Parameter.
|
|
CRL - Certificate Revocation List
|
|
|
|
\section{Initialisierung der CA}
|
|
Als nächstes muss die Verzeichnisstruktur der CA initialisiert werden und das Wurzelzertifikat erzeugt werden.
|
|
|
|
\begin{lstlisting}
|
|
# Verzeichnisstruktur initialisieren
|
|
./easyrsa init-pki
|
|
|
|
# CA-Zertifikat erzeugen
|
|
./easyrsa build-ca
|
|
\end{lstlisting}
|
|
Besteht der begründete Wunsch, den privaten Schlüssel der CA \textbf{nicht} mit einem Passwort zu schützen, so kann das Argument \texttt{nopass} an den \texttt{build-ca}-Befehl angehängt werden.
|
|
Sollte der private Schlüssel in die Hände eines Angreifers gelangen, so kann dieser beliebige Zertifikate durch die CA ausstellen.
|
|
Der Schutz des privaten Schlüssels der CA durch ein Passwort wird aus diesem Grund ausdrücklich empfohlen!
|
|
|
|
|
|
\section{Bereitstellung der CA-Konfiguration für Benutzer}
|
|
Damit Benutzer korrekte Zertifikatsanträge erzeugen können, muss ihnen die Datei \texttt{vars} zur Verfügung gestellt werden.
|
|
Um Kompatibilitätsprobleme durch die Verwendung von verschiedenen EasyRSA-Versionen auszuschließen, wird empfohlen für Benutzer ein passendes Paket zusammenzustellen.
|
|
|
|
Als Basis wird jeweils das \texttt{*.zip}-Release empfohlen, da dieses für Windows-Benutzer notwendige Programme wie \texttt{awk} und \texttt{sed} bereits enthält.
|
|
\begin{lstlisting}
|
|
# Aktuelles Release v3.0.4 beschaffen
|
|
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/ \
|
|
EasyRSA-3.0.4.zip
|
|
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/ \
|
|
EasyRSA-3.0.4.zip.sig
|
|
|
|
# Aktuell gültige(n) GPG-Schlüssel für die Signaturprüfung beschaffen
|
|
gpg --recv-keys 6F4056821152F03B6B24F2FCF8489F839D7367F3
|
|
|
|
# Signatur der heruntergeladenen Datei überprüfen
|
|
gpg --verify EasyRSA-3.0.4.zip.sig EasyRSA-3.0.4.zip
|
|
\end{lstlisting}
|
|
|
|
Anschließend kann die konfigurierte \texttt{vars}-Datei der CA zum ZIP-Archiv hinzugefügt werden und anschließend den Benutzern zur Verfügung gestellt werden.
|
|
\begin{lstlisting}
|
|
# Temporäres Verzeichnis erzeugen
|
|
TD=`mktemp -d`
|
|
|
|
# EasyRSA in temporäres Verzeichnis entpacken
|
|
unzip EasyRSA-3.0.4.zip -d $TD
|
|
|
|
# Vars-Datei hinzufügen
|
|
cp /path/to/CA/vars $TD/EasyRSA-3.0.4/
|
|
|
|
# Ergebnis in neue Zip-Datei einpacken
|
|
cd $TD
|
|
zip -r VPN-EasyRSA.zip EasyRSA-3.0.4
|
|
|
|
# Neue Zip-Datei an sicheren Ort verschieben
|
|
cd -
|
|
cp $TD/VPN-EasyRSA.zip .
|
|
|
|
# Temporäres Verzeichnis löschen
|
|
rm -rf $TD
|
|
\end{lstlisting}
|
|
|
|
|
|
\chapter{Beantragen von Zertifikaten}
|
|
Um ein Zertifikat von der CA zu beantragen, wird das bereits vorkonfigurierte EasyRSA-Paket benötigt, welches durch das IT-Team der Abteilung Informatik bereitgestellt wird.
|
|
Dieses kann nun an einem beliebigen Ort entpackt werden.
|
|
Eine lauffähige Installation von OpenSSL, welches auch als Abhängigkeit von OpenVPN benötigt wird, wird ebenfalls vorausgesetzt.
|
|
|
|
\paragraph{Hinweis für Windows-Benutzer}
|
|
Gegebenenfalls muss der Pfad zu OpenSSL in der Datei \texttt{vars} von EasyRSA hinterlegt werden.
|
|
Unter Windows kann auf das durch OpenVPN installierte OpenSSL zurückgegriffen werden\footnote{Mehr dazu unter \url{https://github.com/OpenVPN/easy-rsa/blob/v3.0.4/distro/windows/README-Windows.txt}}.
|
|
Die folgenden Zeile zeigt beispielhaft die Verwendung des durch OpenVPN installierten OpenSSL-Programms:
|
|
\begin{lstlisting}
|
|
set_var EASYRSA_OPENSSL "C:/Program Files/OpenVPN/bin/openssl.exe"
|
|
\end{lstlisting}
|
|
|
|
Anschließend öffnet man ein Terminal und kann den Befehl \texttt{./easyrsa} verwenden, um einen Zertifikatsantrag zu erzeugen.
|
|
Unter Windows kann eine passende Konsole über die Datei \texttt{EasyRSA-Start.bat} aufgerufen werden.
|
|
\begin{lstlisting}
|
|
./easyrsa gen-crl entityName nopass
|
|
\end{lstlisting}
|
|
Für die Beantragung eines Clientzertifikats muss der Platzhalter \texttt{entityName} durch den hochschulweiten Benutzernamen des Benutzers ersetzt werden, für den das Zertifikat beantragt werden soll.
|
|
Für die Beantragung eines Serverzertifikats muss der Platzhalter \texttt{entityName} durch den vollqualifizierten Domainnamen des Servers (zum Beispiel \texttt{aither.inform.hs-hannover.de}) ersetzt werden, für den das Zertifikat beantragt werden soll.
|
|
Durch das Anhängen des Arguments \texttt{nopass} den Passwortschutz für den privaten Schlüssel zu deaktivieren.
|
|
|
|
Die erzeugte \texttt{*.csr}-Datei muss dann an die CA übergeben werden, um ein gültiges Zertifikat zu erhalten.
|
|
|
|
\chapter{Ausstellen von Zertifikaten}
|
|
Hat ein Benutzer einen Zertifikatsantrag erzeugt, so kann auf dessen Basis nun ein gültiges Zertifikat durch die CA erzeugt werden.
|
|
Hierfür muss der Zertifikatsantrag zunächst aus der vom Benutzer eingereichten Datei importiert werden, und unter einem geeigneten Namen abgelegt werden.
|
|
|
|
\begin{lstlisting}
|
|
./easyrsa import-req /tmp/example.req entityName
|
|
\end{lstlisting}
|
|
Abhängig von dem Typ des beantragten Zertifikats muss der Platzhalter \texttt{entityName} gewählt werden.
|
|
Der \texttt{entityName} wird auch verwendet um ausgestellte Zertifikate zu widerrufen.
|
|
|
|
Für die Beantragung eines Clientzertifikats muss der Platzhalter \texttt{entityName} durch den hochschulweiten Benutzernamen des Benutzers ersetzt werden, für den das Zertifikat beantragt werden soll.
|
|
Für die Beantragung eines Serverzertifikats muss der Platzhalter \texttt{entityName} durch den vollqualifizierten Domainnamen des Servers (zum Beispiel \texttt{aither.inform.hs-hannover.de}) ersetzt werden, für den das Zertifikat beantragt werden soll.
|
|
|
|
Hinweis: Falls bereits ein gültiges Zertifikat mit dem selben \texttt{CN} existiert, ist es notwendig dieses vorher zurückzurufen, da sonst kein neues Zertifikat ausgestellt werden kann.
|
|
Ist der private Schlüssel der CA mit einem Passwort geschützt, so wird bei diesem Schritt danach verlangt.
|
|
\begin{lstlisting}
|
|
./easyrsa revoke entityName
|
|
\end{lstlisting}
|
|
|
|
Nun kann der importierte Zertifikatsantrag als Client- oder Serverzertifikat signiert werden.
|
|
Ist der private Schlüssel der CA mit einem Passwort geschützt, so wird bei diesem Schritt danach verlangt.
|
|
\begin{lstlisting}
|
|
# Request signieren mit Client-Rolle
|
|
./easyrsa sign-req client username
|
|
|
|
# Request signieren mit Server-Rolle
|
|
./easyrsa sign-req server aither.inform.hs-hannover.de
|
|
\end{lstlisting}
|
|
|
|
Hinweis: Die Gültigkeitsdauer kann in nach Ermessen der CA-Betreiber in begründeten Einzelfällen (z.B. für Serverzertifikate) höher gesetzt werden.
|
|
Eine maximale Laufzeit von 730 Tagen (etwa 2 Jahren) wird empfohlen.
|
|
In diesem Beispiel wird ein Serverzertifikat mit einer Laufzeit von 730 Tagen ausgestellt.
|
|
\begin{lstlisting}
|
|
EASYRSA_CERT_EXPIRE=730 ./easyrsa sign-req server aither.inform.hs-hannover.de
|
|
\end{lstlisting}
|
|
|
|
|
|
\chapter{Erzeugen der CRL}
|
|
Der VPN-Server verwendet die von der CA ausgestellte CRL zur Überprüfung von Clientzertifikaten.
|
|
In der Konfigurationsdatei des OpenVPN-Servers wird die CRL-Datei durch \texttt{verify-crl /path/to/crl.pem} angegeben.
|
|
|
|
Somit können durch die CA widerrufene Zertifikate nicht mehr zur Anmeldung am VPN-Dienst benutzt werden.
|
|
Die folgenden Befehle können zum Generieren der CRL verwendet werden:
|
|
\begin{lstlisting}
|
|
# Datenbank aktualisieren (regeneriert index.attrs.txt oder so TODO)
|
|
./easyrsa update-db
|
|
|
|
# CRL erzeugen
|
|
./easyrsa gen-crl
|
|
\end{lstlisting}
|
|
Ist der private Schlüssel der CA mit einem Passwort geschützt, so wird bei diesem Schritt danach verlangt.
|
|
|
|
\textbf{Achtung:} Der VPN-Server lehnt eine ungültige CRL-Datei ab und verweigert dann den Dienst.
|
|
Deshalb sollte die CRL durch die CA regelmäßig erneuert werden und auf den VPN-Server übertragen werden.
|
|
Anschließend sollte der VPN-Dienst via \texttt{systemctl reload ...} neu geladen werden.
|
|
Eine Automatisierung dieses Vorgangs wird empfohlen.
|