Der nächste Schritt ist die Grundlage für den sicheren Betrieb eines VPN und liegt dank openVPN ganz in Deiner Verantwortung; die Schlüsselerstellung.
Die Schlüssel werden mit dem Programm easy-rsa erstellt; – bevor wir damit loslegen – noch ein bisschen Paranoia gefällig?
Ein ordentlicher Schlüssel befindet sich in einer sogenannten ChainOfTrust, KetteDesVertrauens. Das heisst vereinfacht gesagt, jeder erstellte Schlüssel wird von einer CA als vertrauenswürdig signiert.
CA = Certificate Authority
Wenn Server und Client diese Signatur haben, können beide mit Sicherheit der jeweils anderen Seite vertrauen. Ohne die CA lassen sich keine Schlüssel mehr erstellen. Die CA selber ist am Verschlüsselungsprozess nicht beteiligt, bestätigt nur die Echtheit der Schlüssel.
Installiert man nun easy-rsa, ( was durchaus geht ), auf gateway, werden alle Zertifikate auch auf gateway sein. Würde gateway aus irgendeinem Grund kompromittiert, wäre sofort auch die ganze Kette entsichert.
Ohne zu übertreiben wäre der ordentliche Weg, diese easy-rsa Installation und die Aufgabe der Schlüsselerstellung auf einer eigenen Maschine durchzuführen. Wer jetzt meint, ja spinnt der denn völlig? Nein, aber das ist Deine Entscheidung. Es geht ganz ohne Probleme alles auf gateway und ist, solange gateway sauber ist, genauso sicher. Auch hier geht es wieder ums Prinzip und ich will es der Vollständigkeithalber halt gesagt haben.
Wer firm mit VM ist, macht sich jetzt einfach eine virtuelle Maschine dafür, bitte verschlüsselt. Es ist natürlich ebenso machbar, nach dem Schlüsselprozedere alles auf einen verschlüsselten USB-stick zu ziehen oder sonst irgendwie kreativ an die Sicherheit zu denken.
Jetzt wieder den Plan rausholen: Welche Geräte sollen von unterwegs ins Heimnetz kommen? Heisst: Wieviele Schlüssel brauchen wir?
Und gleich für später: Welche Systeme sind dabei? Laptop/System? Smartphone/System?
keyVM: ~ #wie gesagt, auch gateway geht…apt-get update
wann haben wir das letztemal die Liste aktualisiert? ist apt-get update vor install schon zur Gewohnheit geworden? Man möchte schliesslich keine veraltete Version installieren.
keyVM: ~ #apt install easy-rsa
keyVM: ~ #cd /usr/share/easy-rsa
keyVM: /usr/share/easy-rsa #
Allerspätestens jetzt haben wir parallel die HowTo Seite von openVPN geöffnet: HIER geht es direkt zum Abschnitt easy-rsa
Sehr schnell kann man entdecken warum der ganze Kram als so kompliziert verschrien ist. Selten bekommt man eine 1zu1 Anleitung – meistens darf man woanders weitersuchen, weil es so nicht klappt. Diese HowTo-Seiten sind statisch, während sich die Soft weiterentwickelt – der Eine rennt dem Anderen ständig hinterher. Auch diese Seite hier beschreibt DEBIAN 10 mit easy-rsa JETZT. Wie sieht es in einem Jahr aus?
Ok, also das angezeigte BLA init-config geht nicht. Warum?
Ein Blick in den Ordner /usr/share/easy-rsa kann helfen:
keyVM: /usr/share/easy-rsa #l
insgesamt 72 -rwxr-xr-x 1 root root 48730 Feb 8 2019 easyrsa -rw-r--r-- 1 root root 4651 Feb 8 2019 openssl-easyrsa.cnf -rw-r--r-- 1 root root 8576 Feb 8 2019 vars.example drwxr-xr-x 2 root root 4096 Nov 10 14:37 x509-types
Super, da steht ja auch nix mit initdings, aber easyrsa ist ausführbar (grün)
probieren wir das doch mal aus…
keyVM: /usr/share/easy-rsa #./easy-rsa
Easy-RSA 3 usage and overview USAGE: easyrsa [options] COMMAND [command-options] A list of commands is shown below. To get detailed usage and help for a command, run: ./easyrsa help COMMAND For a listing of options that can be supplied before the command, use: ./easyrsa help options Here is the list of commands available with a short syntax reminder. Use the 'help' command above to get full usage details. init-pki
Sofort sehen wir den Unterschied: die Anleitung schreibt über easy-rsa 2 – wir sind bei Version 3.
Aber sagte ich schon, Linux ist arg geschwätzig? Einen Befehl zu geben der Optionen braucht und diese wegzulassen, führt fast immer zu Ansagen wie dieser. Nun denn:
keyVM: /usr/share/easy-rsa #./easy-rsa init-pki
init-pki complete; you may now create a CA or requests. Your newly created PKI dir is: /usr/share/easy-rsa/pki
Cool, bevor wir das machen, wollen wir aber noch eine vars Datei auf unsere Bedingungen abrichten:
keyVM: /usr/share/easy-rsa #nano vars.example
# Organizational fields (used with 'org' mode and ignored in 'cn_only' mode.) # These are the default values for fields which will be placed in the # certificate. Don't leave any of these fields blank, although interactively # you may omit any specific field by typing the "." symbol (not valid for # email.) set_var EASYRSA_REQ_COUNTRY "DE" set_var EASYRSA_REQ_PROVINCE "BUNDESLAND" set_var EASYRSA_REQ_CITY "STADT" set_var EASYRSA_REQ_ORG "FIRMA-kann-leer-bleiben" set_var EASYRSA_REQ_EMAIL "[email protected]" set_var EASYRSA_REQ_OU "auch-egal" Das würde reichen um uns das andauernde eintippen dieser Werte zu ersparen, ein Blick weiter unten lohnt noch hier: # In how many days should the root CA key expire? 10 Jahre? Das ist der Chefschlüssel #set_var EASYRSA_CA_EXPIRE 3650 3 Jahre? Das sind unsere Gebrauchsschlüssel # In how many days should certificates expire? #set_var EASYRSA_CERT_EXPIRE 1080 # How many days until the next CRL publish date? Note that the CRL can still be # parsed after this timeframe passes. It is only used for an expected next # publication date. # How many days before its expiration date a certificate is allowed to be # renewed? #set_var EASYRSA_CERT_RENEW 30 #set_var EASYRSA_CRL_DAYS 180
Das speichern wir jetzt als vars !!
Dateiname zum Speichern: vars ^G Hilfe M-D DOS-Format M-A Anhängen M-B Sicherungsdatei ^C Abbrechen Datei unter einem ANDEREN NAMEN speichern? J Ja N Nein ^C Abbrechen
Damit wären wir jetzt bereit für eine Schlüsselrunde.
Schlüssel werden immer im Paar erstellt, privat und öffentlich, ferner noch Dateien die wir nicht brauchen.
Wir starten mit der CA, dem Chefsignateur. Sind wir wie besprochen auf einer verschlüsselten virtuellen Maschine, wird diese CA diese virtuelle Maschine nie verlassen. Ohne Zugang zu dieser CA lassen sich keine neuen Schlüssel für unser VPN erstellen!
Entsprechend den Änderungen in easy-rsa 3 sind auch die anderen Befehle auf openVPN HowTo zu hinterfragen.
easy-rsa 3 erzählt aktuelles:
keyVM: /usr/share/easy-rsa #./easyrsa build-ca nopass
Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019 Enter New CA Key Passphrase:Ich sag mal so: auf einer eigenen verschlüsselten!! VM kann man darauf locker verzichten, auf gateway würde ich hier auf jeden Fall ein Passwort empfehlen! Es muss dann aber auch gut sein und !!! vor allen Dingen sicher aufbewahrt werden. Mit sicher meine ich jetzt vor allem: wenn Du es wieder brauchst, solltest Du es auch wiederfinden... willst du ein Passwort vergeben, lass im Befehl "nopass" weg Re-Enter New CA Key Passphrase:Passwort wiederholen und enter Common Name (eg: your user, host, or server name) [Easy-RSA CA]: Jetzt kommen Fragen zum Zertifikat, in [Easy-RSA CA] eckigen Klammern stehen jetzt die Vorgabewerte die mit einem einfachen enter vergeben werden. Ein "Common Name" darf nur einmal vergeben werden und darf gerne bezeichnend sein, also z.B. gateway-CA. Einfach eintragen und [Easy-RSA CA] wird überschrieben, könnte ja sein, wir erstellen hier nochmal Schlüssel für was anderes. CA creation complete and you may now import and sign cert requests. Your new CA certificate file for publishing is at: /usr/share/easy-rsa/pki/ca.crt
Damit ist die CA erstellt, „for publishing“ zeigt uns schonmal auf – ca.crt brauchen wir später auf dem openVPN-Server. Der ca.key ist geheim und verlässt die keyVM nie!
Wie auch immer, im zweiten HowTo erzählen die uns jetzt was von; erstelle auf Server, erstelle auf Client, – alles Quatsch ( oder besser: ich hab das neue Konzept von Version 3 noch nicht drauf ) aber egal, das alte war für diesen Zweck völlig ok und wir erstellen alles auf einer Maschine und signieren es auch dort:
./easy-rsa -h gibt uns alle Infos, eine man Page gibt es leider nicht.
keyVM: /usr/share/easy-rsa #./easyrsa build-server-full gateway nopass
Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019 Generating a RSA private key .....................................................................................+++++ ................................................................................................................+++++ writing new private key to '/usr/share/easy-rsa/pki/private/gateway.key.9Xz5RLrqzA' ----- Using configuration from /usr/share/easy-rsa/pki/safessl-easyrsa.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :ASN.1 12:'gateway' Certificate is to be certified until Oct 25 15:56:10 2022 GMT (1080 days) Write out database with 1 new entries Data Base Updated das sieht gut aus, hier ist ein "nopass" wichtig, da der Server automatisch nach einem reboot starten soll. Ein Passwort ist da nicht gut;-) Jetzt signieren wir das Serverzertifikat mit der CA:
keyVM: /usr/share/easy-rsa #./easyrsa sign-req server gateway
Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019 You are about to sign the following certificate. Please check over the details shown below for accuracy. Note that this request has not been cryptographically verified. Please be sure it came from a trusted source or that you have verified the request checksum with the sender. Request subject, to be signed as a server certificate for 1080 days: subject= commonName = gateway Type the word 'yes' to continue, or any other input to abort. Confirm request details: yes Using configuration from /usr/share/easy-rsa/pki/safessl-easyrsa.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :ASN.1 12:'gateway' Certificate is to be certified until Oct 25 15:57:57 2022 GMT (1080 days) Write out database with 1 new entries Data Base Updated Certificate created at: /usr/share/easy-rsa/pki/issued/gateway.crt
Damit haben wir ein signiertes Zertifikat für unseren Server, das brauchen wir nur einmal. Jetzt die Clients, Laptop und Smartphone. ( Du machst jetzt soviele, daß alle Geräte ein eigenes bekommen können, plus noch 3 in Reserve, z.B. res1, res2, res3. Die bleiben auch auf der VM, bis Du sie brauchst.
Aha? Wofür?
Bestes Beispiel: Smartphone verloren oder geklaut. Smartphoneschlüssel wird gesperrt, res1 ausgepackt. RatzFatz.
Die nächste Entscheidung ist: Bekommt das Smartphone und der Laptopschlüssel ein Passwort?
Punkt 3.A im zweiten HowTo sagt es klar und deutlich…Deine Entscheidung!
Nicht empfohlen, solange kein automatischer Start benötigt wird.
Ausserdem sind Schlüssel ohne Passwort einfach kopierbar. In der Dropbox haben sie also NICHTS zu suchen und per What’sApp verschickt man sowas auch NIEMALS.
Fitzeln wir das auf:
Ein Client kann durchaus automatisch starten müssen. Nehmen wir Client Büro1 und Client Büro2 und Server irgendwo im Rechenzentrum X. Beide Clients sitzen auf einem gateway wie hier und sind dauerhaft mit dem Server verbunden. Klar, da ist ein Passwort nicht angebracht.
Das Smartphone hat keine vernünftige Sperre, verschlüsselt ist es schon garnicht. Das Muster kann jeder Depp anhand des Schmierfilms auf dem Display nachziehen. – Passwort hört sich gut an!
Der Laptop hat ein gutes Passwort, mindestens die Systemplatte ist verschlüsselt, ausserdem hüte ich das Ding wie meinen Augapfel.
– Deine Entscheidung, Du verstehst was ich meine…..
Ich mach jetzt zwei Schlüssel ohne:
keyVM: /usr/share/easy-rsa #./easyrsa build-client-full laptop nopass
keyVM: /usr/share/easy-rsa #./easyrsa build-client-full smartphone nopass
und damit es klar ist:
keyVM: /usr/share/easy-rsa #./easyrsa build-client-full res1 nopass
alles signieren:
keyVM: /usr/share/easy-rsa #./easyrsa sign-req client laptop
keyVM: /usr/share/easy-rsa #./easyrsa sign-req client smartphone
keyVM: /usr/share/easy-rsa #./easyrsa sign-req client res1
Und wir haben 3 für drei Jahre gültige Schlüsselpaare. Fehlt noch der Diffie-Hellmann. Bitte?
Zwei Mathematiker, haben einen feinen Kryptokram zum Schlüsselaustausch erfunden. Damit wird mithilfe der öffentlichen Schlüssel ein sicherer Kanal aufgebaut um den für diese Sitzung geheimen symmetrischen Schlüssel auszutauschen.
Brauchen wir:
keyVM: /usr/share/easy-rsa #./easyrsa gen-dh
Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019 Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time ...........................+.....................................................................................+.......................................................................................................+.........................................................................................................................................................................................................................................................................................................+.+........+.............................................................................+..................................+.............................................................+.......................................+.............................+..............................................................................................................................................................................+...............................................................+..........................................................................+....+.................+..........+...............................................................................................................................................................................................................................+............................................................................................................................+......................................................+............................................................................................................................................+...................................................................................................................................++*++*++*++* DH parameters of size 2048 created at /usr/share/easy-rsa/pki/dh.pem
Hier sag ich immer gerne, das ist ein kleiner Benchmark, je schneller das geht, desto besser der Rechner. Ein alter C64 braucht dafür ne Woche!
So, was noch? Die TA, machen wir später auf dem gateway. Mit easy-rsa sind wir hier fertig, wir müssen nur die Schlüssel noch an die entsprechenden Stellen schieben. Da das nur theoretisch sinnvoll ist, noch wissen wir ja nicht wo die hin müssen, machen wir uns auf unserem „sicheren“ Verwaltungsrechner ein Verzeichnis openvpn und lagern dort alles zwischen.
Hatten wir scp schon?
scp = sourcecopy
scp kopiert Daten über das SSH Protokoll von Maschine A nach Maschine B, die Syntax ist:
scp -r (für ganze Verzeichnise) -P [Port] (wenn ssh nicht auf 22 lauscht) Quelle/Pfad/Datei Ziel/Pfad
Da ich stark annehme, daß Du auch der keyVM Deinen öffentlichen Schlüssel id_rsa.pub in seine authorized_keys eingetragen hast, geht das ohne Passwort jetzt mit:
ich@meinPC: ~ #mkdir openvpn
ich@meinPC: ~ #scp -r root@keyVM:/usr/share/easy-rsa/pki/dh.pem ~/openvpn
ich@meinPC: ~ #scp -r root@keyVM:/usr/share/easy-rsa/pki/ca.crt ~/openvpn
Easy-rsa hat uns bei der Schlüsselerstellung mitgeteilt wo die neuen Schlüssel liegen, wir brauchen jeweils den privaten (.key) (geheim) und den öffentlichen (.crt). ca.key darf/soll die Maschine aber nicht verlassen, also müssen wir entweder:
die Schlüssel in /usr/share/easy-rsa/pki/private einzeln kopieren, oder
ca.key vor dem kopieren in „Sicherheit“ bringen.
keyVM: /usr/share/easy-rsa/pki/ # mv private/ca.key ./
ich@meinPC: ~ #scp -r root@keyVM:/usr/share/easy-rsa/pki/private ~/openvpn
keyVM: /usr/share/easy-rsa/pki/ # mv ca.key private/
ich@meinPC: ~ #scp -r root@keyVM:/usr/share/easy-rsa/pki/issued ~/openvpn
Damit liegen alle Schlüssel auf unserem Verwaltungsrechner unter ~/openvpn und wir können keyVM runterfahren und ein Backup davon machen und sicher lagern.
next > openVPN – Der Server