Webproxy mit nginx für HTTP und X.509 Zertifikate: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(14 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
= Webproxy mit Nginx für HTTP und X.509-Zertifikate =
+
=== Das Template ===
==Rocky Template klonen==
+
;Wir nehmen das rocky-template
netz: DMZ
+
=== Netzkonfiguration Reverse Proxy-Server (DMZ) ===
name: revproxy.it2XX.int
 
ip: 10.88.2XX.41
 
gw: 10.88.2XX.1
 
nameserver: 10.88.2XX.21
 
  
 +
{| class="wikitable" style="background-color: #f2f2f2;"
 +
! Parameter !! Wert !! Erläuterung
 +
|-
 +
| '''Netzwerk (NIC)''' || DMZ || Interface-Zuweisung in VirtualBox
 +
|-
 +
| '''IP''' || 10.88.2XX.41 || Statische IP
 +
|-
 +
| '''CIDR''' || 24 || Classless Inter-Domain Routing Präfixlänge
 +
|-
 +
| '''GW''' || 10.88.2XX.1 || GATEWAY
 +
|-
 +
| '''NS''' || 10.88.2XX.21 || Resolver
 +
|-
 +
| '''FQDN''' || revproxy.it2XX.int || Fully Qualified Domain Name
 +
|-
 +
| '''SHORT''' || revproxy || Short Name
 +
|-
 +
| '''DOM''' || it2XX.int|| Domain Name
 +
|}
 +
;Anpassen des Templates
 +
Mit '''debian-setup.sh''' oder mit '''rocky-setup.sh'''
 +
;Eintragen auf dem Host unter '''~/.ssh/config'''
  
 
== Einführung ==
 
== Einführung ==
 
* Nginx kann als Reverse Proxy für HTTP- und HTTPS-Dienste verwendet werden.
 
* Nginx kann als Reverse Proxy für HTTP- und HTTPS-Dienste verwendet werden.
 
* X.509-Zertifikate ermöglichen die TLS-Verschlüsselung für sichere Verbindungen.
 
* X.509-Zertifikate ermöglichen die TLS-Verschlüsselung für sichere Verbindungen.
* Der Proxy kann Anfragen an interne Webserver weiterleiten und dabei SSL/TLS offloaden.
+
* Der Proxy terminiert TLS zum Client und leitet Anfragen an interne Webserver weiter.
  
 
== Installation von Nginx ==
 
== Installation von Nginx ==
=== RHEL/RockeCentOS ===
+
;Nginx installieren
Nginx-Repository hinzufügen und installieren:
+
* dnf install nginx
* sudo dnf install nginx
+
;Dienst starten und aktivieren
Dienst starten und aktivieren:
+
* systemctl enable --now nginx
* sudo systemctl start nginx
 
* sudo systemctl enable nginx
 
  
== Grundlegende Proxy-Konfiguration ==
+
== Firewall konfigurieren ==
 +
;HTTPS (Port 443) freigeben
 +
* firewall-cmd --permanent --add-service=https
 +
;HTTP (Port 80) freigeben – z. B. für Weiterleitungen
 +
* firewall-cmd --permanent --add-service=http
 +
;Firewall neu laden
 +
* firewall-cmd --reload
 +
;Aktive Regeln anzeigen
 +
* firewall-cmd --list-all
  
== TLS/SSL mit X.509-Zertifikaten ==
+
== Zertifikat erstellen ==
 
*[[Zertifikat erstellen 5105|Zertifikat erstellen]]
 
*[[Zertifikat erstellen 5105|Zertifikat erstellen]]
 +
;Ergebnis
 +
/etc/ssl/own.crt
 +
/etc/ssl/own.key
 +
 +
== Eine Webseite vorab um zu testen ob unser System soweit geht ==
 +
*cat /etc/nginx/conf.d/revproxy.int.conf
 
<pre>
 
<pre>
 
server {
 
server {
 
     listen 443 ssl;
 
     listen 443 ssl;
     server_name rev.it2XX.int;
+
    listen [::]:443 ssl;
 +
 
 +
     server_name revproxy.it2XX.int;
 +
 
 +
    root /usr/share/nginx/html;
 +
    index index.html index.htm;
  
 
     ssl_certificate /etc/ssl/own.crt;
 
     ssl_certificate /etc/ssl/own.crt;
Zeile 34: Zeile 69:
  
 
     location / {
 
     location / {
         proxy_pass https://mail.it2XX.int;
+
         try_files $uri $uri/ =404;
        proxy_set_header Host $host;
 
        proxy_set_header X-Real-IP $remote_addr;
 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
 
     }
 
     }
 
}
 
}
 
</pre>
 
</pre>
* Nginx neu laden:
+
;Konfiguration prüfen
* sudo systemctl reload nginx
+
* nginx -t
 +
;Neu starten
 +
* systemctl restart nginx
 +
;Testen
 +
* curl -k https://revproxy.it2XX.int
  
<!---
+
== Proxy-Konfiguration mit TLS ==
== Zugriffsbeschränkung nach IP ==
+
*cat /etc/nginx/conf.d/revproxy.int.conf
* Nur bestimmten IPs Zugriff gewähren:
 
 
<pre>
 
<pre>
location / {
+
server {
     allow 192.168.1.100;
+
     listen 443 ssl;
     deny all;
+
     listen [::]:443 ssl;
    proxy_pass http://backend.local;
 
}
 
</pre>
 
  
== Load Balancing mit Nginx ==
+
     server_name revproxy.it2XX.int;
* Mehrere Backend-Server verteilen:
 
<pre>
 
upstream backend_servers {
 
     server backend1.local;
 
    server backend2.local;
 
}
 
  
server {
+
     ssl_certificate /etc/ssl/own.crt;
     listen 80;
+
     ssl_certificate_key /etc/ssl/own.key;
     server_name loadbalancer.example.com;
 
  
 
     location / {
 
     location / {
         proxy_pass http://backend_servers;
+
         proxy_pass http://mail-gw.it2XX.int:11334;
 +
        proxy_ssl_server_name on;
 
         proxy_set_header Host $host;
 
         proxy_set_header Host $host;
 
         proxy_set_header X-Real-IP $remote_addr;
 
         proxy_set_header X-Real-IP $remote_addr;
 
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 +
        proxy_set_header X-Forwarded-Proto $scheme;
 
     }
 
     }
 
}
 
}
 
</pre>
 
</pre>
 +
;Nginx neu laden
 +
* systemctl reload nginx
  
== Aufgaben ==
+
=== Bei Problemen ===
* Richte einen Reverse Proxy für einen internen Dienst ein.
+
*ausearch -m avc -ts recent
* Konfiguriere TLS mit einem selbstsignierten Zertifikat.
+
<pre>
* Implementiere eine Zugriffsbeschränkung nach IP-Adresse.
+
----
* Setze Load Balancing zwischen mehreren Backend-Servern um.
+
time->Thu Mar 26 15:50:59 2026
 +
type=PROCTITLE msg=audit(1774536659.561:435): proctitle=6E67696E783A20776F726B65722070726F63657373
 +
type=SYSCALL msg=audit(1774536659.561:435): arch=c000003e syscall=42 success=no exit=-13 a0=d a1=5578211d9fb8 a2=10 a3=7ffcb154f60c items=0 ppid=33457 pid=33458 auid=4294967295 uid=985 gid=984 euid=985 suid=985 fsuid=985 egid=984 sgid=984 fsgid=984 tty=(none) ses=4294967295 comm="nginx" exe="/usr/sbin/nginx" subj=system_u:system_r:httpd_t:s0 key=(null)
 +
type=AVC msg=audit(1774536659.561:435): avc:  denied  { name_connect } for  pid=33458 comm="nginx" dest=443 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:http_port_t:s0 tclass=tcp_socket permissive=0
 +
</pre>
 +
;SELinux verbietet nginx ausgehende Verbindungen zum Backend
 +
;Nginx Netzwerk-Zugriff dauerhaft freischalten
 +
* setsebool -P httpd_can_network_connect 1
 +
;Prüfen
 +
* getsebool httpd_can_network_connect
  
 
== Fazit ==
 
== Fazit ==
 
* Nginx ist ein leistungsfähiger Webproxy für HTTP und HTTPS.
 
* Nginx ist ein leistungsfähiger Webproxy für HTTP und HTTPS.
 
* TLS-Zertifikate bieten Sicherheit und Vertrauenswürdigkeit.
 
* TLS-Zertifikate bieten Sicherheit und Vertrauenswürdigkeit.
* Load Balancing und Zugriffsbeschränkungen erhöhen die Skalierbarkeit und Sicherheit.
+
* SELinux-Booleans steuern, ob der Proxy Verbindungen zum Backend aufbauen darf.

Aktuelle Version vom 12. Juni 2026, 07:10 Uhr

Das Template

Wir nehmen das rocky-template

Netzkonfiguration Reverse Proxy-Server (DMZ)

Parameter Wert Erläuterung
Netzwerk (NIC) DMZ Interface-Zuweisung in VirtualBox
IP 10.88.2XX.41 Statische IP
CIDR 24 Classless Inter-Domain Routing Präfixlänge
GW 10.88.2XX.1 GATEWAY
NS 10.88.2XX.21 Resolver
FQDN revproxy.it2XX.int Fully Qualified Domain Name
SHORT revproxy Short Name
DOM it2XX.int Domain Name
Anpassen des Templates

Mit debian-setup.sh oder mit rocky-setup.sh

Eintragen auf dem Host unter ~/.ssh/config

Einführung

  • Nginx kann als Reverse Proxy für HTTP- und HTTPS-Dienste verwendet werden.
  • X.509-Zertifikate ermöglichen die TLS-Verschlüsselung für sichere Verbindungen.
  • Der Proxy terminiert TLS zum Client und leitet Anfragen an interne Webserver weiter.

Installation von Nginx

Nginx installieren
  • dnf install nginx
Dienst starten und aktivieren
  • systemctl enable --now nginx

Firewall konfigurieren

HTTPS (Port 443) freigeben
  • firewall-cmd --permanent --add-service=https
HTTP (Port 80) freigeben – z. B. für Weiterleitungen
  • firewall-cmd --permanent --add-service=http
Firewall neu laden
  • firewall-cmd --reload
Aktive Regeln anzeigen
  • firewall-cmd --list-all

Zertifikat erstellen

Ergebnis
/etc/ssl/own.crt
/etc/ssl/own.key

Eine Webseite vorab um zu testen ob unser System soweit geht

  • cat /etc/nginx/conf.d/revproxy.int.conf
server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name revproxy.it2XX.int;

    root /usr/share/nginx/html;
    index index.html index.htm;

    ssl_certificate /etc/ssl/own.crt;
    ssl_certificate_key /etc/ssl/own.key;

    location / {
        try_files $uri $uri/ =404;
    }
}
Konfiguration prüfen
  • nginx -t
Neu starten
  • systemctl restart nginx
Testen

Proxy-Konfiguration mit TLS

  • cat /etc/nginx/conf.d/revproxy.int.conf
server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name revproxy.it2XX.int;

    ssl_certificate /etc/ssl/own.crt;
    ssl_certificate_key /etc/ssl/own.key;

    location / {
        proxy_pass http://mail-gw.it2XX.int:11334;
        proxy_ssl_server_name on;
        proxy_set_header Host $host;
        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;
    }
}
Nginx neu laden
  • systemctl reload nginx

Bei Problemen

  • ausearch -m avc -ts recent
----
time->Thu Mar 26 15:50:59 2026
type=PROCTITLE msg=audit(1774536659.561:435): proctitle=6E67696E783A20776F726B65722070726F63657373
type=SYSCALL msg=audit(1774536659.561:435): arch=c000003e syscall=42 success=no exit=-13 a0=d a1=5578211d9fb8 a2=10 a3=7ffcb154f60c items=0 ppid=33457 pid=33458 auid=4294967295 uid=985 gid=984 euid=985 suid=985 fsuid=985 egid=984 sgid=984 fsgid=984 tty=(none) ses=4294967295 comm="nginx" exe="/usr/sbin/nginx" subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1774536659.561:435): avc:  denied  { name_connect } for  pid=33458 comm="nginx" dest=443 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:http_port_t:s0 tclass=tcp_socket permissive=0
SELinux verbietet nginx ausgehende Verbindungen zum Backend
Nginx Netzwerk-Zugriff dauerhaft freischalten
  • setsebool -P httpd_can_network_connect 1
Prüfen
  • getsebool httpd_can_network_connect

Fazit

  • Nginx ist ein leistungsfähiger Webproxy für HTTP und HTTPS.
  • TLS-Zertifikate bieten Sicherheit und Vertrauenswürdigkeit.
  • SELinux-Booleans steuern, ob der Proxy Verbindungen zum Backend aufbauen darf.