second commit
This commit is contained in:
5
ansible/roles/nginx_proxy/handlers/main.yml
Normal file
5
ansible/roles/nginx_proxy/handlers/main.yml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- name: reload nginx
|
||||
ansible.builtin.service:
|
||||
name: nginx
|
||||
state: reloaded
|
||||
45
ansible/roles/nginx_proxy/tasks/main.yml
Normal file
45
ansible/roles/nginx_proxy/tasks/main.yml
Normal file
@ -0,0 +1,45 @@
|
||||
---
|
||||
# nginx als vorgelagerter Reverse Proxy (Konzept 7.2/7.2a/9). Nur inkludiert
|
||||
# wenn enable_nginx_proxy: true.
|
||||
|
||||
- name: nginx installieren
|
||||
ansible.builtin.apt:
|
||||
name: nginx
|
||||
state: present
|
||||
update_cache: true
|
||||
|
||||
- name: Default-vHost entfernen
|
||||
ansible.builtin.file:
|
||||
path: /etc/nginx/sites-enabled/default
|
||||
state: absent
|
||||
|
||||
- name: Proxy-Header-Snippet ausrollen (import)
|
||||
ansible.builtin.import_tasks: snippets.yml
|
||||
|
||||
- name: Jumphost-vHost-Konfiguration ausrollen
|
||||
ansible.builtin.template:
|
||||
src: jumphost.conf.j2
|
||||
dest: /etc/nginx/sites-available/jumphost.conf
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0644"
|
||||
notify: reload nginx
|
||||
|
||||
- name: vHost aktivieren
|
||||
ansible.builtin.file:
|
||||
src: /etc/nginx/sites-available/jumphost.conf
|
||||
dest: /etc/nginx/sites-enabled/jumphost.conf
|
||||
state: link
|
||||
notify: reload nginx
|
||||
|
||||
- name: Zugriff des nginx-Users auf den App-Unix-Socket sicherstellen
|
||||
ansible.builtin.user:
|
||||
name: www-data
|
||||
groups: "{{ jumphost_app_group }}"
|
||||
append: true
|
||||
|
||||
- name: nginx aktivieren und starten
|
||||
ansible.builtin.service:
|
||||
name: nginx
|
||||
state: started
|
||||
enabled: true
|
||||
20
ansible/roles/nginx_proxy/tasks/snippets.yml
Normal file
20
ansible/roles/nginx_proxy/tasks/snippets.yml
Normal file
@ -0,0 +1,20 @@
|
||||
---
|
||||
# Wird von tasks/main.yml importiert (siehe include_tasks unten ergaenzen,
|
||||
# falls Snippet-Datei separat gepflegt werden soll). Der Einfachheit halber
|
||||
# hier als eigenstaendiger Task-Block gehalten.
|
||||
- name: Snippet-Verzeichnis anlegen
|
||||
ansible.builtin.file:
|
||||
path: /etc/nginx/snippets
|
||||
state: directory
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0755"
|
||||
|
||||
- name: Proxy-Header-Snippet ausrollen
|
||||
ansible.builtin.template:
|
||||
src: jumphost_proxy_headers.conf.j2
|
||||
dest: /etc/nginx/snippets/jumphost_proxy_headers.conf
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0644"
|
||||
notify: reload nginx
|
||||
63
ansible/roles/nginx_proxy/templates/jumphost.conf.j2
Normal file
63
ansible/roles/nginx_proxy/templates/jumphost.conf.j2
Normal file
@ -0,0 +1,63 @@
|
||||
# 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 %}
|
||||
|
||||
limit_req_zone $binary_remote_addr zone=jumphost_login:10m rate=10r/m;
|
||||
|
||||
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; }
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
{% if tls_mode == 'external_reverse_proxy' %}
|
||||
# Vom externen Proxy gesetzte Header werden dank set_real_ip_from oben
|
||||
# vertrauensvoll uebernommen statt hier ueberschrieben zu werden.
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
|
||||
{% else %}
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
{% endif %}
|
||||
Reference in New Issue
Block a user