masterthesis/CA-DOC-Inhalt.tex
2018-09-13 11:36:16 +02:00

217 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} erstellt.
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 ausstellen kann.
In diesem Dokument wird die Einrichtung und der Betrieb der CA beschrieben.
Weiterhin sind Anleitungen für Benutzer und Serveradministratoren des VPN-Dienstes enthalten, in denen die Beantragung von Client- und Server-Zertifikaten bei der CA beschrieben wird.
Die in diesem Dokument beschriebene Konfiguration der CA wurde im Rahmen der Masterarbeit konzipiert.
Entscheidungen, die zu der hier beschriebenen Konfiguration geführt haben können in der Masterarbeit nachvollzogen werden.
\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.