# Jumphost Reverse-Proxy-Konfiguration (Konzept 6.6/7.2a/9). # tls_mode = {{ tls_mode }} {% if tls_mode == 'external_reverse_proxy' %} # Nur der vorgelagerte externe Reverse Proxy darf X-Forwarded-For/-Proto # setzen -- sonst waere das Audit-Log-Feld client_ip faelschbar (Konzept 7.2a). set_real_ip_from {{ external_reverse_proxy_cidr }}; real_ip_header X-Forwarded-For; real_ip_recursive on; {% endif %} # E8 (Umsetzungsauftrag Teil E): jumphost_login_rate_limit ist ein # group_vars-Wert (siehe ansible/inventory/group_vars/all.yml), keine # feste Konstante -- muss zusammen mit app.config.settings. # login_rate_limit_* und der fail2ban-Schwelle (ansible/roles/fail2ban) # als bewusste Betriebsentscheidung festgelegt werden (IP-basiertes # Limit, betrifft alle Benutzer hinter derselben NAT-Adresse gemeinsam). limit_req_zone $binary_remote_addr zone=jumphost_login:10m rate={{ jumphost_login_rate_limit }}; server { {% if tls_mode == 'external_reverse_proxy' and internal_hop_plaintext_accepted %} # Bewusste, dokumentierte Ausnahme (Konzept 7.2a): Klartext-HTTP auf der # Strecke externer Proxy -> Jumphost, nur zulaessig in einem eigenen, # zugriffskontrollierten Netzsegment. listen 443; {% else %} listen 443 ssl; ssl_certificate /etc/jumphost/tls/server.crt; ssl_certificate_key /etc/jumphost/tls/server.key; ssl_protocols TLSv1.3; ssl_session_cache shared:jumphost_ssl:10m; {% endif %} server_name {{ acme_domain | default('_') }}; add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always; add_header X-Frame-Options "DENY" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer" always; client_max_body_size 210m; # etwas ueber MAX_UPLOAD_BYTES der App (Konzept 6.6) location /auth/login { limit_req zone=jumphost_login burst=5 nodelay; proxy_pass http://unix:{{ jumphost_listen_uds }}:; include /etc/nginx/snippets/jumphost_proxy_headers.conf; } location /ws/ { proxy_pass http://unix:{{ jumphost_listen_uds }}:; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 3600s; include /etc/nginx/snippets/jumphost_proxy_headers.conf; } location / { proxy_pass http://unix:{{ jumphost_listen_uds }}:; include /etc/nginx/snippets/jumphost_proxy_headers.conf; } } server { listen 80; server_name {{ acme_domain | default('_') }}; location /.well-known/acme-challenge/ { root /var/www/html; } location / { return 301 https://$host$request_uri; } }