Fortigate Konfiguration als Web-Server Reverse Proxy
Im folgenden Beitrag möchte ich eine Fortigate als HTTPS-Reverse-Proxy für meinen HTTP-Web-Server am DMZ-Interface konfigurieren (HTTPS/HTTP Reverse Proxy). Ausgangsbasis für die Konfiguration ist FortiOS 6.0 und der Web-Server soll mit folgenden Einstellungen abgesichert werden:
- SSL/TLS-Version: ausschließlich TLS 1.2 ist erlaubt (erst möglich ab FortiOS 5.4)
- Cipher Groups: ausschließlich 2 sichere Cipher Groups sind erlaubt
- HSTS (HTTP Strict Transport Security): aktiviert
- SSL-Offloading: Client <-> Fortigate (half) – Fortigate zu Server ist unverschlüsselt, daher kein SSL
Virtual Server erstellen und absichern
Im ersten Schritt wird der Virtual Server erstellt und mit den oben definierten Einstellungen gehärtet.
config firewall vip edit <vServer-Name> set name <vServer-Name> set comment "vServer HTTPS -> HTTP Reverse Proxy" set type server-load-balance set server-type https set extinf wan1 set extip <vServer-IP> set extport 443 set ldb-method static set persistence none set ssl-mode half set ssl-certificate <Certificate-Name> config realservers edit 1 set ip <Internal-Webserver-IP> set port 80 set status active next end # TLS 1.2 erzwingen set ssl-max-version tls-1.2 set ssl-min-version tls-1.2 # sichere Ciphers konfigurieren set ssl-server-algorithm custom config ssl-server-cipher-suites edit 1 set cipher TLS-ECDHE-ECDSA-WITH-CHACHA20-POLY1305-SHA256 next edit 2 set cipher TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384 next end set ssl-dh-bits 2048 set ssl-client-renegotiation secure set ssl-client-fallback enable # HSTS konfigurieren; verfügbar ab FortiOS 5.6 set ssl-hsts enable set ssl-hsts-age 31536000 set ssl-hsts-include-subdomains enable next end
Hinweis zur <vServer-IP>
:
Die Angabe entspricht entweder einer einzelnen öffentlichen IP-Adresse am WAN Interface der Fortigate bei statischer IP-Adressvergabe oder 0.0.0.0 bei dynamischer IP-Adressvergabe z.B. PPPoE Anschlüssen .
Firewall Policy
Als Nächstes ist eine Inbound Firewall Policy für den Virtual Server zu konfigurieren. Im folgenden Beispiel konfiguriere ich die Minimal-Einstellungen. UTM Features wie IPS, AV, etc. könnten (und sollten) natürlich zusätzlich konfiguriert werden, sofern die UTM-Features lizenziert sind.
config firewall policy edit <n> set srvintf wan1 set srcaddr all set dstintf dmz set dstaddr <vServer-Name> set schedule always set service HTTP next end
Prüfen der Konfiguration
config firewall vip edit <vServer-Name> get next end
Exkurs: HTTPS/HTTPS Reverse Proxy
Im Regelfall sollte natürlich auch die Kommunikation von der Fortigate zum Backend-Server verschlüsselt sein. Hier die geänderten/hinzugefügten Konfigurationszeilen für Full-SSL-Offloading. Wichtig ist, dass dem Zertifikat des Backend-Servers auf der Fortigate vertraut wird, da das im Virtual Server angegebene Zertifikat nur für die Kommunikation zum Client präsentiert wird und nicht zur Kommunikation zum Backend-Server. Ist das Zertifikat des Backend-Servers z.B. von einer internen PKI signiert, muss das CA Zertifikat auf der Fortigate in den Local CA Certificates (System->Certificates) vorhanden sein, damit eine verschlüsselte Kommunikation erfolgen kann.
config firewall vip edit <vServer-Name> set ssl-mode full config realservers edit 1 set port 443 next end set ssl-server-max-version tls-1.2 set ssl-server-min-version tls-1.2 next end config firewall policy edit <n> set service HTTPS next end
Einschränkungen
Leider gibt es auch einige Funktionen, die mit der FortiGate allein nicht funktionieren und den Einsatz einer FortiWeb erforderlich machen.
Die größte Einschränkung, die für einen Reverse Proxy jedoch eigentlich recht wichtig sein kann, ist die Authentifizierung. Es funktioniert aktuell nicht, dass die FortiGate die Authentifizierung übernimmt, d.h. trotz Reverse Proxy muss der Webservice die Authentifizierung übernehmen und trotz Reverse Proxy werden daher erst mal alle Anfragen an den Webservice weitergeleitet. Möchte man eine Authentifizierung an der Fortigate, muss man auf ein SSL-VPN Web-Portal ausweichen.
Ist es immer noch so, dass die FortiGate die Authentifizierung nicht übernehmen kann ? Bzw. ist das Modell oder OS abhängig ?
Hallo Ralf. Zumindest mit meiner Fortigate 61 mit FortiOS 6.2 ist es immer noch so. Dafür möchte Fortinet sein Produkt FortiWeb eingesetzt sehen. Gruß. Andreas
Warum sollte die FortiGate die Authentifizierung nicht übernehmen können?
In Authentification Rules einfach ein Scheme und eine Rule anlegen, einer Gruppe zuweisen und der Proxy policy als Destination eine User Gruppe mitgeben.
Hallo Alex
Danke für deinen Kommentar. Also ich hab’s einfach nicht direkt an der Fortigate hinbekommen.
Ich möchte z.B. einen Webserver hinter der Fortigate betreiben und habe dazu die Konfiguration wie oben beschrieben angelegt. Als Anmeldung möchte ich eine Basic Authentication Anmeldemaske erhalten.
Folgendes habe ich ausprobiert:
Policy & Objects -> Authentication Rules -> New Authentication Scheme
Policy & Objects -> Authentication Rules -> New Authentication Rule
Danach habe ich eine Gruppe mit Usern des LDAP-Servers angelegt und der Policy in den Source Parameter hinzugefügt.
Leider bewirkt das nichts. Die Verbindung wird ohne Anmeldung aufgebaut.
Vielleicht kannst du ja kurz detaillierter schreiben wie das geht oder wo mein Fehler liegt. Wo definiert man, welches Authentication Scheme und welche Rule überhaupt verwendet wird?
Gruß
Andreas
Naja, mit einem Reverse Proxy im eigentlichen Sinne hat das nix zu tun, das ist schlicht ein DNAT mit Port Forwarding, bei dem die Cyphers und TLS Versionen vorgegeben werden. Leider ist in der Policy auch kein IPS Profil verlinkt, insofern gibt es keinerlei Schutz gegen DDoS o.ä. Vulnerabilities. Eine Authentifizierung kann nicht gehen, da hierfür der lokale Proxy als Authentication Source dienen müsste, das tut er aber nur für die „Forward“ (Explizit) Proxy Funktion.
Hallo Sven
Danke für deinen Kommentar. Bisschen mehr Möglichkeiten als DNAT hat man hier schon, aber richtig, das ist kein vollwertiger Reverse Proxy, dafür gibt’s ja die FortiWeb Appliances. Bzgl. IPS Profil: natürlich kann man eins in die Policy einbinden, ich hab das nur hier nicht gemacht, weil das nicht das Thema ist. Aber geht natürlich.
Gruß
Andreas