Dieser Artikel wird geraden neu geschrieben. WORK IN PROGRESS!
OPNsense ist mit dem ACME CLient Plugin (os-acme-client) in der Lage Let's Encrypt Zertifikate zu erstellen und auch automatisch zu erneuern. Der riesen Vorteil ist, das wir eine zentrale Zertifikatsverwaltung haben, nicht mühselig auf den internen Zielsystemen jeweils eine eigene Verwaltung benötigen und keine NAT oder anderen Firewall Einstellungen vornehmen müssen.
Um ein Zertifikat für die eigene Domain zu erhalten sind nur wenige Schritte notwendig. Hierfür wechseln wir in den Bereich "Services / ACME Client / Settings" der OPNsense und setzen folgende Haken:
Enable Plugin: JA
Auto Renewal: JA
Hierdurch wird das Plugin aktiviert und die automatische Erneuerung der Zertifikate festgelegt.
Danach wechseln wir in den Bereich "Services / ACME Client / Accounts" und erstellen mit dem "+"-Zeichen einen neuen Account.
Enabled: JA
Name: ACCOUNTNAME
E-Mail Address: EMAILADRRESSE
ACME CA: Let's Encrypt [default]
Der Account muss einmalig registiert werden. Ganz Rechts gibt es dazu den Knopf "Register Account". Bei Erfolg wird der Account dann bei Status mit "OK (registered)" gekennzeichnet.
Im Anschluss legen wir fest, wie die Überprüfung (Challenge) stattfinden soll. Dies geschieht im Bereich "Services / ACME Client / Challenge Types". Auch hier erzeugen wir durch Betätigung des "+"-Zeichens eine neue Challenge mit den folgenden Einstellungen:
Enabled: JA
Name: VAULTHOSTNAME
Challenge Type: HTTP-01
HTTP Service: OPNsense Web Service (automatic port forward)
Interface: WAN
Im letzten Schritt geht es an die Erstellung des Zertifikates. Hierfür wechseln wir nach "Services / ACME Client / Certificates" und erstellen erneut einen neuen Eintrag durch das "+"-Zeichen. Im Feld "ACME Account" wählen wir den soeben erstellen Account aus, in dem Feld "Challange Type" die erstellte Challange. Die übrigen Einstellungen wählen wir wie folgt:
Enabled: JA
Common Name: MATRIXHOSTNAME
ACME Account: ACCOUNTNAME (aus Accounts)
Challenge Type: VAULTHOSTNAME (aus Challenge Types)
Key Length: ec-384
Damit sind alle Einstellungen vorgenommen und das Zertifikat kann ganz Rechts mit dem Knopf "Issue or renew certificate" erstellt werden. Bei Erfolg (das dauert ein paar Minuten) wird das Zertifikat bei "Last ACME Status" mit "OK" gekennzeichnet.
Fertig! Die Erneuerung des Zertifikates erfolgt nun gemäß den Einstellungen alle 90 Tage vollautomatisch.
HAProxy nimmt von außen die Aufrufe für den Port 443 und 8448 entgegen, verschlüsselt die Verbindung und leitet diese dann an den interen Matrix Server weiter. Das schöne ist, das auch hier die Verwaltung wieder zentral stattfindet, die Zertifikate ohne Aufwand von Let's Encrypt genutzt und mehrere Dienste gleichzeitig bereitgestellt werden können. Dieser übernimmt vereinfacht gesprochen die Weiterleitung der eingehenden Verbindungen (z.B. Aufruf https://matrix.domain.de) an das Jail bzw. dem Element oder Synapse Service.
Aufgabenstellung des HAProxy ist hier:
Um nun eine Weiterleitung der MATRIXHOSTNAME auf den interen Matris Server zu erhalten, sind nur wenige Schritte unter "Services - HAProxy" notwendig:
Enable HAProxy: YES
Im ersten Schritt definieren wir unter "Services / HAProxy / Settings" in der Lasche "Real Servers" zwei Server. Dies geschieht wieder jeweils durch Betätigung der "+"-Schaltfläche. Diese Einträge verweisen auf die beiden unterschiedlichen Ports unsere Matrix Installation.
Name: element_MATRIXHOSTNAME
Description: IP Adresse des lokalen Matrix Servers auf Port 80
Type: static
FQDN or IP: MATRIXIP
Port: 80"
Name: synapse_MATRIXHOSTNAME
Description: IP Adresse des lokalen Matrix Servers auf Port 8008
Type: static
FQDN or IP: MATRIXIP
Port: 8008
Danach sollten unter den "Real Servers" zwei Einträge zu sehen sein. Wichtig, auch hier wieder nach dem Anlegen der beiden Server die "Apply"-Schaltfläche betätigen!
Im zweiten Schritt erstellen wir die "Backend Pools", dies erledigen wir unter "Services / HAProxy / Settings" in der Lasche "Virtual Services" den Eintrag "Backend Pools". Hier erstellen wir ebenfalls durch die "+"-Schaltfläche zwei Backend Pools (einen für Element und einen für Synapse). Einstellungen des Element-Pools:
Name: poolelement_MATRIXHOSTNAME
Description: Pool an lokalen Element Servers (hier gibts nur einen)
Servers: element_MATRIXHOSTNAME
Unter "Servers" wählen wir den zuvor erstellten Server "element_MATRIXHOSTNAME" aus!
Einstellungen des Synapse-Pools:
Name: poolsynapse_MATRIXHOSTNAME
Description: Pool an lokalen Element Servers (hier gibts nur einen)
Servers: synapse_MATRIXHOSTNAME
Unter "Servers" wählen wir den zuvor erstellten Server "synapse_MATRIXHOSTNAME" aus! Wichtig, auch hier wieder nach dem Anlegen der beiden Backend Pools die "Apply"-Schaltfläche betätigen!
Nun hinterlegen wir das Regelwerk, welche bestimmen, welche eingehenden Verbindungen an welchen Service weitergeleitet werden. Hierfür wählen wir unter "Services / HAProxy / Settings" in der Lasche "Rules & Checks" den Eintrag "Conditions" aus und erstellen zwei Bedingungen:
Name: synapse-path
Description: Prüfung ob /_matrix aufgerufen wurde
Condition type: Path starts with
Path Prefix: /_matrix
Name: matrix-path
Description: Prüfung ob /_synapse/client aufgerufen wurde
Condition type: Path starts with
Path Prefix: /_synapse/client
Diese Bedingungen werden durch einer Regel überprüft. Regeln erzeugen wir wie folgt unter "Services / HAProxy / Settings" in der Lasche "Rules & Checks" im Eintrag "Rules" durch die Schaltfläche "+":
Name: synapse
Description: Zugriffe auf synapse leiten
Select conditions: synapse-path, matrix-path
Logical operator for conditions: OR
Execute function: Use specific Backend Pool
Use backend pool: poolsynapse_MATRIXHOSTNAME
Wichtig, auch hier wieder nach dem Anlegen die "Apply"-Schaltfläche betätigen!
Abschließend erstellen wir zwei "Public Services" unter "Services / HAProxy / Settings" in der Lasche "Virtual Services" den Eintrag "Public Services"
Name: element_MATRIXHOSTNAME
Description: Server auf Port 443 der alle externen Anfragen entgegenimmt
Listen Addresses: 0.0.0.0:443
Default Backend Pool: none
Certificates: MATRIXHOSTNAME (ACME Client)
Default certificate: MATRIXHOSTNAME (ACME Client Zertifikat auswählen)
Cipher List: ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
Cipher Suites: TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
Enable HSTS: YES
HSTS includeSubDomains: YES
Select Rules: synapse
Name: synapse_MATRIXHOSTNAME
Description: Server auf Port 8448 der alle externen Anfragen für Synapse entgegenimmt
Listen Addresses: 0.0.0.0:8448
Default Backend Pool: poolsynapse_MATRIXHOSTNAME
Certificates: MATRIXHOSTNAME (ACME Client)
Default certificate: MATRIXHOSTNAME (ACME Client Zertifikat auswählen)
Cipher List: ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
Cipher Suites: TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
Enable HSTS: YES
HSTS includeSubDomains: YES
Select Rules:
Zum Schluss noch ein "Apply" und fertig ist die Installation!
Damit ist nun von außen der Zugriff auf den Matrix Server eingerichtet und erlaubt.
Mit dem Matrix Federation Tester, kann das gesamte Setup überprüft werden.
Als Servername sollte MATRIXDOMAIN genutzt werden, nicht MATRIXHOSTNAME.