70 lines
2.6 KiB
Django/Jinja
70 lines
2.6 KiB
Django/Jinja
# 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; }
|
|
}
|