Wireguard: Private-Key mit GPG verschlüsselt speichern

Um sich mit einem Wireguard-VPN zu verbinden, wird der eigene private Schlüssel (Private-Key) benötigt. Die Private-Key-Datei ist normalerweise im Konfigurationsvereichnis von Wireguard abgespeichert (siehe auch Wireguard unter Ubuntu einrichten). Aus Sicherheitsgründen sollte die Datei nur Schreibrechte für Root bzw. den Administrator des Systems haben, weil der Private-Key unverschlüsselt gespeichert ist.

Alternativ besteht mithilfe von wg-quick und GPG auch die Möglichkeit den Private-Key verschlüsselt zu speichern. Wie das funktioniert, zeigt dieser Beitrag.

Folgende Software wurde verwendet:
  • Ubuntu v20.04 LTS
  • Wireguard v1.0.20200513
  • GPG (GnuPG) v.2.2.19

Private-Key mit GPG verschlüsseln

Für dieses Beispiel wird angenommen, dass sich der unverschlüsselte Private-Key im Verzeichnis /etc/wireguard in der Datei client.private-key befindet. Der Private-Key soll nun mit dem eigenen GPG-Schlüssel verschlüsselt im eigenen Home-Verzeichnis gespeichert werden. Hierzu dient folgender Befehl:

gpg --output ~/client.private-key.gpg --encrypt --recipient kontakt@codingblatt.de <(sudo cat /etc/wireguard/client.private-key)
Terminal / Konsole

Den Empfänger (--recipient) müsst ihr anpassen. Hier müsst ihr euren Namen bzw. eure E-Mail-Adresse, die mit eurem GPG-Public-Key assoziiert ist, angeben. Der Private-Key von Wireguard wird dann mit eurem GPG-Public-Key verschlüsselt. Entschlüsseln lässt sich die erzeugte Datei client.private-key.gpg dann nur noch mit eurem GPG-Private-Key.

Wireguard-Konfiguration anpassen

Jetzt müssen wir noch die Wireguard-Konfigurationsdatei anpassen. In meinem Fall handelt es sich dabei um my-vpn.conf in /etc/wireguard. Aktuell sieht die Datei bei mir wie folgt aus:

[Interface]
Address = 192.168.9.2/24
ListenPort = 55556
PrivateKey = [Private-Key]

[...]
/etc/wireguard/my-vpn.conf

Die Zeile mit dem PrivateKey benötigen wir nicht mehr. Stattdessen nutzen wir einen von wg-quick unterstützten Hook namens PostUp. Hierdurch können wir ein Command angeben, welches nach dem Start des Wireguard-Interface ausgeführt wird. Außerdem machen wir uns Folgendes zu Nutze:

wg set: [...] Both private-key and preshared-key must be files, because command line arguments are not considered private on most systems but if you are using bash(1), you may safely pass in a string by specifying as private-key or preshared-key the expression: <(echo PRIVATEKEYSTRING).

Die Konfigurationsdatei wird nun wie folgt angepasst:

[Interface]
Address = 192.168.9.2/24
ListenPort = 55556
PostUp = wg set %i private-key <(su sl -c "gpg --decrypt ~/client.private-key.gpg")

[...]
/etc/wireguard/my-vpn.conf

Den Benutzer für su müsst ihr um euren eigenen Benutzer abändern.

Wireguard-VPN neustarten

Das einzige was noch fehlt, ist das Wireguard-VPN-Interface neuzustarten:

sudo wg-quick down my-vpn
sudo wg-quick up my-vpn
Terminal / Konsole

Ihr solltet nun aufgefordert werden eure GPG-Passphrase einzugeben. Durch die korrekte Eingabe der Passphrase wird der Wireguard-Private-Key entschlüsselt. Anschließend könnt ihr euer Wireguard-VPN ganz normal verwenden.

Fazit

Mit GPG kann bei Bedarf der Private-Key eines Wireguard-VPNs ohne großen Aufwand verschlüsselt gespeichert werden. Alternative Möglichkeiten sind z.B. der Einsatz des Passwort-Managers pass, oder die Speicherung des Private-Keys auf einem Hardware-Security-Token (YubiKey, NitroKey etc.).

Feedback

Für Feedback zum Beitrag, seien es Fragen, Korrigierungen und/oder Anregungen, könnt ihr mir gerne eine Nachricht per E-Mail oder Mastodon schreiben (siehe Kontakt).