OPNSense ist ein Fork der bekannten OpenSource Firewall PFSense, mir persönlich gefällt OPNSense besser, die GUI ist aufgeräumter, es gibt eine REST-Api und die wichtigsten PlugIns sind ebenfalls verfügbar.
Da für OPNSense ein Plugin für HAProxy und auch für Let’s Encrypt existiert, habe ich angefangen diese Kombination in Verbindung mit Exchange 2016 zu testen. OPNSense kann also direkt ein kostenloses Zertifikat von Let’s Encrypt anfordern und kümmert sich dann auch selbstständig um die Erneuerung.
Kostenlose Firewall und kostenlose Zertifikate, hört sich doch gut an. Hier ein erster Test.
Umgebung
Meine Testumgebung ist wie folgt aufgebaut:
Der Internetzugang wird über eine Fritzbox hergestellt. OPNsense stellt die Internetverbindung über die Fritzbox her. Der Exchange Server befindet sich “hinter” der OPNsense VM, hier findet also ein doppeltes NAT statt. Hier die Auflistung der IP-Adressen:
WAN IP Fritzbox | 80.153.231.160 |
LAN IP Fritzbox | 192.168.10.1 |
WAN IP OPNSense | 192.168.10.107 |
LAN IP OPNSense | 172.16.14.1 |
IP Exchange | 172.16.14.9 |
Vorbereitung
Nach der Installation und der Einbindung in mein Netzwerk habe ich zuerst einmal den Port für den Verwaltungswebsite geändert. Die Verwaltungsoberfläche hört in der Standardkonfiguration auf Port 443 (https). Port 443 möchte ich aber für Exchange nutzen. Ich habe mich hier für Port 4444 entschieden.
Danach werden die erforderlichen Plugins nachinstalliert. Das Plugin “os-acme-client” ist das Plugin für Let’s Encrypt, “os-haproxy” übernimmt die Veröffentlichung von Exchange. Da es sich in meiner Umgebung um eine VM auf ESXI handelt, habe ich auch die VMware Tools installiert:
Neben der entsprechenden Netzwerkkonfiguration waren das schon alle Vorbereitungen.
Firewall
Nachdem OPNsense in mein Netzwerk integriert wurde, habe ich zunächst zwei Firewall Regeln erstellt, die http und https Verkehr auf dem WAN Port zulassen:
Für die beiden Regeln wird als Schnittstelle jeweils “WAN” und als Protokoll “TCP” ausgewählt. Als Zielportbereich wird für eine Regel “HTTP” und für die zweite Regel “HTTPS” ausgewählt.
Nach dem Anlegen der beiden Regeln sieht es dann so aus:
Eine Regel für HTTP und eine Regel für HTTPS. Somit wird schon einmal Traffic von extern erlaubt. Weiter geht es mit HAProxy.
HAProxy
Weiter geht es mit der grundlegenden Konfiguration von HAProxy für Exchange 2016. In den HAProxy Einstellungen wird zunächst der Exchange Server als Real Server angelegt:
Ich habe des Exchange Server wie folgt angelegt, die Option “Überprüfen Sie das SSL-Zertifikat” habe ich abgeschaltet, da Exchange ein selbst signiertes Zertifikat verwendet:
Sobald der Server angelegt wurde, kann ein BackEnd erstellt werden:
Für das Backend werden die folgenden Einstellungen getätigt:
Jetzt wird eine ACL angelegt, für diesen Test mache ich es mit einfach und erstelle nur eine ACL:
Die folgenden Einstellungen gelten für die ACL:
Nachdem die ACL angelegt wurde, wird eine “Aktion” erstellt:
Für die Aktion wird folgendes konfiguriert:
Zum Schluss wird das Frontend angelegt:
Für das FrontEnd werden die folgenden Einstellungen verwendet. Die IP-Adresse 192.168.10.107 ist dabei die WAN IP Adresse der OPNsense Firewall (NAT hinter Fritzbox) plus den HTTPS-Port (443). In diesem Fall also 192.168.10.107:443
Dan noch ein Zertifikat von Let’s Encrypt existiert, verwende ich zunächst das Standard Zertifikat für die Web GUI. So lässt sich die Konfiguration schon einmal testen. Des weiteren wird auch die “X-Forwarded-For-Kopfzeile” aktiviert:
In den erweiterten Einstellungen des Frontend sind diese Einstellungen definiert;
Danach kann HAProxy aktiviert werden:
Falls HAProxy schon aktiviert war, dann am besten einmal neu starten.
Jetzt funktioniert schon einmal OWA, aber da noch kein gültiges Zertifikat vorliegt kommt es natürlich zu Zertifikatswarnungen:
Jetzt kann das Let’s Encrypt Plugin konfiguriert werden.
Let’s Encrypt
Let’s Encrypt bietet die Möglichkeit die Integration über das “Staging Enviroment” zu testen. Für offiziell gültige Zertifikate hat Let’s Encrypt Limitierungen eingebaut, so können zum Beispiel nicht beliebig viele Zertifikate ausgestellt werden. Für Tests bietet es sich also an mit dem Staging Enviroment zu starten und erst auf das “Production Enviroment” umzustellen wenn alles funktioniert.
In diesem Fall wird auch zunächst das Staging Enviroment genutzt:
Sobald das PlugIn aktiviert wurde, kann der Account angelegt werden:
Für den Account wird nur eine E-Mail Adresse benötigt:
Jetzt kann die Überprüfungsmethode konfiguriert werden:
Als Überprüfungsmethode habe ich HTTP-01 belassen, außerdem musste ich in meiner Umgebung die WAN IP explizit angegeben, da sonst keine Verbindung aufgebaut werden konnte. Als FrontEnd wird das zuvor erstellte “Exchange_2016_Frontend” ausgewählt:
Hinweis: Das Exchange 2016 Frontend wurde nur auf Port 443 (HTTPS) konfiguriert, Let’s Encrypt prüft die Domain mit der Validierungsmethode HTTP-01 allerdings auf Port 80 (HTTP), daher habe ich einen zusätzliches FrontEnd auf Port 80 (HTTP) für Let’s Encrypt erstellt:
Für das Let’s Encrypt Frontend wird ebenfalls die IP des WAN Interfaces angegeben, dies mal allerdings mit Port 80. Als Standard Backend wird “acme_challende_backend” ausgewählt, welches durch das Plugin erstellt wurde. Gleiches gilt auch für die Aktion “redirect_acme_challanges”:
Zurück zum Let’s Encrypt Plugin, hier kann jetzt das Zertifikat konfiguriert werden:
Mein Exchange Server ist hört auf die Namen mail.frankysweb.de für alle Webservices (ActiveSync, Outlook Anywhere, EWS, etc) und autodiscover.frankysweb.de für Autodiscover. Daher gebe ich die folgenden Werte für das Zertifikat an:
Nachdem das Zertifikat konfiguriert wurde, steht es im Status “Pending”, daher kann jetzt das Zertifikat ausgewählt und der Button “Zertifikate jetzt ausstellen oder erneuern” geklickt werden:
Nach kurzer Zeit ist dann unter “Last Acme Status” der Wer “OK” zu sehen:
Jetzt ist das Test-Zertifikat, welches vom Let’s Encrypt Staging Environment ausgestellt wurde, in der Zertifikatsübersicht zu sehen. Ausgestellt wurde es von der da “Fake LE Intermediate X1”:
Um nun an ein gültiges Zertifikat zu kommen, kann nun die Let’s Encrypt Umgebung auf “Production Environment” umgestellt werden:
Nachdem das “Production Environment” ausgewählt wurde, muss noch das Zertifikat erneut ausgestellt werden:
In der Übersicht der Zertifikate ist nun das gültige Zertifikat zu sehen, welches von der CA “Let’s Encrypt Authority X3” ausgestellt wurde:
Zum Schluss muss das Zertifikat nur noch dem Exchange Frontend zugewiesen werden:
In den Einstellungen zum Frontend kann jetzt das gültige Zertifikat ausgewählt werden:
Nun erscheinen auch keine Zertifikatswarnungen mehr:
Fazit
Die Konfiguration ist etwas aufwändiger als zunächst gedacht. Während ich diesen Artikel erstellt habe, wurde zwischenzeitlich ein Update für die Plugins HAProxy und Let’s Encrypt veröffentlicht, daher habe ich zwischenzeitlich wieder von vorne angefangen, um es mit der aktuellen Version zu testen.
Diese Konfiguration funktioniert zwar, ist aber alles andere als perfekt. Ich muss mich noch einmal eingehenden mit den ACLs und Aktionen vertraut machen um eine vernünftige Konfiguration zu erstellen. Für einen ersten Test, ist es aber ganz vielversprechend.