Der Betrieb eines Nextcloud Servers mit einem Let's Encrypt Zertifikat und HAProxy ist auf der OPNsense Firewall schön übersichtlich dargestellt und es sind nur folgende Schritte nötig, um das Ziel dieses 2. Teils zu erreichen:
Dennoch: Diese Ausbaustufe ist zwar nun für den öffentlichen Betrieb geeignet, muss aber regelmäßig nun aktualisiert und gepflegt werden. Nichts ist schlimmer als eine veraltete und damit angreifbare Installation.
Letzte Aktualisierung:
Damit sieht das Setup so aus:
┌─────────────────────────────┐
│ TrueNAS │
│ 192.168.178.100 │
┌──────────────────────┐ │ ┌─────────────────────────┐ │
│ OPNsense │ │ │ Nextcloud │ │
│ 192.168.178.1 │ │ │ 192.168.178.102 │ │
│ │ │ │ │ │
WAN: 0.0.0.0:80 ─┼─► acme.sh:80 │ │ │ postgresql13-server │ │
│ │ │ │ ▲ │ │
│ │ │ │ │ │ │
│ │ │ │ nextcloud (php) │ │
│ │ │ │ ▲ │ │
│ │ │ │ │ │ │
WAN: 0.0.0.0:443 ─┼─► HAProxy:443 ───────┼───── LAN: 0.0.0.0:80 ──┼─┼─► nginx │ │
│ │ │ └─────────────────────────┘ │
└──────────────────────┘ └─────────────────────────────┘
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, dass 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 unter "Services - ACME Client" 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: NEXTCLOUDHOSTNAME
Challenge Type: HTTP-01
HTTP Service: OPNsense Web Service (automatic port forward)
Interface: WAN
Unter "Services / ACME Client / Automations" wird ein neuer Eintrag erstellt.
Name: Restart HAProxy
Run Command: Restart HAProxy
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: EXTERNERHOSTNAME
ACME Account: ACCOUNTNAME (aus Accounts)
Challenge Type: NEXTCLOUDHOSTNAME (aus Challenge Types)
Key Length: ec-384
Automations: Restart HAProxy
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 entgegen, verschlüsselt die Verbindung und leitet diese dann an den interen Nextcloud Server auf Port 80 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 auf Port 443 bereitgestellt werden können. Unterschieden wird über den aufgerufenen externen Hostnamen. Damit ist es möglicht das z.B https://nextcloud.domain.de an Nextcloud und https://domain.de zur eigentlichen Webseite geleitet wird, obwohl beide eigentlich Port 443 auf der gleiche externen IP Adresse benötigen.
Aufgabenstellung des HAProxy ist hier:
Der Prozess ist: Public Service (EXTERNERHOSTNAME:443) ─► Condition ─► Rule ─► Pool ─► NEXTCLOUDHOSTNAME:3000
Um nun eine Weiterleitung der EXTERNERHOSTNAME auf den interen Nextcloud zu erhalten, sind nur wenige Schritte unter "Services - HAProxy" notwendig: Im ersten Schritt definieren wir unter "Services / HAProxy / Settings" in der Lasche "Real Servers" einen Server. Dies geschieht wieder jeweils durch Betätigung der "+"-Schaltfläche.
Enable HAProxy: YES
Beginnen wir mit dem "Nextcloud"-Service, dieser erhält die folgenden Einträge:
Name: server_NEXTCLOUDHOSTNAME
Description: IP Adresse des lokalen Nextcloud Servers
Type: static
FQDN or IP: NEXTCLOUDIP
Port: 80
Im zweiten Schritt erstellen wir die "Backend Pools", dies erledigen wir unter "Services / HAProxy / Settings" in der Lasche "Virtual Services" den Eintrag "Backend Pools".
Name: pool_NEXTCLOUDHOSTNAME
Description: Pool an lokalen Vaultwarden Server (hier gibts nur einen)
Servers: server_NEXTCLOUDHOSTNAME
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: nextcloud host check
Description: Prüfung ob der **EXTERNERHOSTNAME** aufgerufen wurde
Condition type: Host matches
Path Regex: EXTERNERHOSTNAME
Diese Bedingungen werden durch eine 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: vault host rule
Description: Externer Zugriff auf **EXTERNERHOSTNAME** an den richten Server (im Pool) weiterleiten
Select conditions: nextcloud host check
Execute function: Use specified Backend Pool
Use backend pool: pool_NEXTCLOUDHOSTNAME
Abschließend erstellen wir einen "Public Services" unter "Services / HAProxy / Settings" in der Lasche "Virtual Services" den Eintrag "Public Services"
Name: service_https
Description: Server auf Port 443 der alle externen Anfragen entgegenimmt
Listen Addresses: 0.0.0.0:443
Default Backend Pool: none
Certificates: EXTERNERHOSTNAME (ACME Client)
Default certificate: EXTERNERHOSTNAME (ACME Client)
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: vault deny admin rule, vault host rule
Mit "Apply" wird die Konfiguration geschrieben und der HAProxy Dienst gestartet.
Bitte daran denken den Port 443 in der Firewall zu erlauben.
Damit ist nun von außen der Zugriff auf den Nextcloud eingerichtet und erlaubt.
Bitte folgendes Testen:
Voilá