Proxy Nginx
Die Anwendung raum]für[raum arbeitet mit einer BaseURL. Dies bedeutet für die Proxykonfiguration das interne- und externe-Zugriffe über denselben FQDN erfolgen müssen (im nachfolgenden Beispiel raumbuchung.domain.tld).
Die Site des Anwendungsservers (im Beispiel IIS mit SSO via Kerberos (NTLM wird nicht unterstützt!)) muss via IP und Port erreichbar sein. Der NGINX-Proxy unterstützt kein Virtual-Hosting (SNI)1.
Allgemeine Voraussetzungen:
- Das Computerkonto des Webservers enthält im AD unter Attributen den FQDN der Anwendung als HTTP-ServicePrincipal 2
- Der Authentifizierungsanbieter des IIS-Webservers (Verzeichnis SSO) ist auf "Negotiate:Kerberos" eingerichtet 3
- Firewall Protokoll-Regel
Port 443 Kommunikation zwischen Proxy-Server (DMZ) und Anwendungsserver (internes Server-Netzwerk) muss erlaubt sein - Proxy-Server Zertifikat
öffentliches, vertrauenswürdiges SSL-Zertifikat und Intermediate-Zertifikat sowie Schlüssel (.cert und .key) für FQDN (raumbuchung.domain.tld) muss auf dem Proxy-Server vorhanden sein.
Die Voraussetzungen für den öffentlichen (Internet) Zugriff sind:
- DNS A-Record
Routing des FQDN (raumbuchung.domain.tld) zu einer freien, öffentlich erreichbaren IP des Unternehmens - Firewall SNAT-Regel
Anfragen auf der IP und Port 443 werden in der Firewall an den Proxy-Server innerhalb der DMZ weitergeleitet
Die Voraussetzungen für den internen (Intranet/VPN) Zugriff sind:
- DNS A-Record
Routing des FQDN (raumbuchung.domain.tld) zur internen IP des Proxy-Servers innerhalb der DMZ
Die Voraussetzungen für den raum]für[raum Anwendungsserver sind:
- Microsoft IIS
Die Bindung der raum]für[raum IIS Site MUSS beim nginX Reverse Proxy- OHNE HTTP Host Header Eintrag1 und
- OHNE SNI1 konfiguriert werden
NGINX-Konfiguration / Stream
upstream http_request {
# NGINX-Proxy unterstützt kein VirtualHosting
# die IIS Site muss ohne SNI und Hostnamen konfiguriert sein und via IP und Port erreichbar sein!
server P-DES-IIS-SERVERS:443;
}
server {
listen 443 ssl http2;
server_name raumbuchung.domain.tld;
# Die Angabe der Client_Max_Body_Size ist für Uploads innerhalb von raum]für[raum erforderlich
client_max_body_size 512M;
ssl_certificate /etc/ssl/certs/raumbuchung.domain.tld.crt;
ssl_certificate_key /etc/ssl/certs/raumbuchung.domain.tld.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# Server-Logfiles
# -----------------------------------------------------------------
# Access-Log:
access_log /var/log/nginx/access.log;
# Error-Log / Produktiv-Betrieb
#error_log /var/log/nginx/error.log error;
# Error-Log Debugging-Betrieb
error_log /var/log/nginx/error.log debug;
location / {
proxy_pass https://http_request;
proxy_buffering off;
proxy_http_version 1.1;
proxy_request_buffering off;
proxy_set_header Connection "Keep-Alive";
proxy_set_header Host raumbuchung.domain.tld;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
}
}
korrektes Verhalten:
https://raumbuchung.domain.tld | |||
Funktionalität | Bemerkung | ||
SSO via Browser | Intranet (Firmennetz/VPN) | ||
SSO via Browser | Internet | Da in diesem Fall keine Verbindung des Clients zum DomainController besteht, kann kein Kerberos-Ticket erstellt/zugewiesen werden.4 | |
Webformular via Browser | Intranet (Firmennetz/VPN) | ||
Webformular via Browser | Internet | ||
APP (iOS/Android) | Intranet (Firmennetz/VPN) | ||
APP (iOS/Android) | Internet |
NGINX-Konfiguration / ProxyPass
server {
listen 443 ssl http2;
server_name raumbuchung.domain.tld;
# Die Angabe der Client_Max_Body_Size ist für Uploads innerhalb von raum]für[raum erforderlich
client_max_body_size 512M;
# Bei dem Zertifikat muss es sich um eine PEM-Datei handeln (bestehend aus Zertifikat und Intermediate-Zertifikat)
ssl_certificate /etc/ssl/certs/raumbuchung.domain.tld.crt;
ssl_certificate_key /etc/ssl/certs/raumbuchung.domain.tld.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# Server-Logfiles
# -----------------------------------------------------------------
# Access-Log:
access_log /var/log/nginx/access.log;
# Error-Log / Produktiv-Betrieb
#error_log /var/log/nginx/error.log error;
# Error-Log Debugging-Betrieb
error_log /var/log/nginx/error.log debug;
location / {
# NGINX-Proxy unterstützt kein VirtualHosting
# die IIS Site muss ohne SNI und Hostnamen konfiguriert sein und via IP und Port erreichbar sein!
proxy_pass https://IP-DES-IIS-SERVERS;
proxy_ssl_verify off;
proxy_buffering off;
proxy_http_version 1.1;
proxy_request_buffering off;
proxy_set_header Connection "Keep-Alive";
proxy_set_header Host raumbuchung.domain.tld;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
}
}
korrektes Verhalten:
https://raumbuchung.domain.tld | |||
Funktionalität | Bemerkung | ||
SSO via Browser | Intranet (Firmennetz/VPN) | ||
SSO via Browser | Internet | Da in diesem Fall keine Verbindung des Clients zum DomainController besteht, kann kein Kerberos-Ticket erstellt/zugewiesen werden.4 | |
Webformular via Browser | Intranet (Firmennetz/VPN) | ||
Webformular via Browser | Internet | ||
APP (iOS/Android) | Intranet (Firmennetz/VPN) | ||
APP (iOS/Android) | Internet |
Anmerkungen/Detailbeschreibungen
Anmerkung | Beschreibung | Screenshot |
---|---|---|
1 | Der NGINX-Proxy unterstützt kein Virtual-Hosting (SNI) | |
2 | Das Computerkonto des Webservers enthält im AD unter Attributen den FQDN der Anwendung als HTTP-ServicePrincipal | |
3 | Der Authentifizierungsanbieter des IIS-Webservers (Verzeichnis SSO) ist auf "Negotiate:Kerberos" eingerichtet | |
ggf. muss hierfür der "UseKernelMode" auf "false" gestellt werden. | ||
4 | Kerberos Authentifizierungsweg |
Anmerkung
Konfigurationsänderungen an den Proxy-Einstellungen erfordern einen Neustart des IIS-Webservers. Restart von Application-Pool und/oder Site führen u.U. zu Fehlverhalten (Kerberos-Ticket-Validierung)
Tickets am Client können mittels "klist" angesehen und via "klist purge" gelöscht werden.