summaryrefslogtreecommitdiff
path: root/roles/nginx
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2023-10-01 20:28:56 +0200
committerChristian Pointner <equinox@spreadspace.org>2023-10-01 20:28:56 +0200
commit30eff2fb90b93e30b51f98662fbc3bda5e9131d4 (patch)
tree630611d07f8cca3b8dd37394ecc7fce60631ce09 /roles/nginx
parentadd test for apu running openwrt (diff)
add role for nginx-sso
Diffstat (limited to 'roles/nginx')
-rw-r--r--roles/nginx/auth/sso/backend/defaults/main.yml37
-rw-r--r--roles/nginx/auth/sso/backend/handlers/main.yml12
-rw-r--r--roles/nginx/auth/sso/backend/tasks/main.yml37
-rw-r--r--roles/nginx/auth/sso/backend/templates/nginx-sso@.service.j231
-rw-r--r--roles/nginx/auth/sso/base/defaults/main.yml7
-rw-r--r--roles/nginx/auth/sso/base/tasks/main.yml6
-rw-r--r--roles/nginx/auth/sso/base/templates/nginx.snippet.j223
7 files changed, 153 insertions, 0 deletions
diff --git a/roles/nginx/auth/sso/backend/defaults/main.yml b/roles/nginx/auth/sso/backend/defaults/main.yml
new file mode 100644
index 00000000..d1928f77
--- /dev/null
+++ b/roles/nginx/auth/sso/backend/defaults/main.yml
@@ -0,0 +1,37 @@
+---
+# nginx_sso_backend_configs:
+# example:
+# login:
+# title: "example.com - Login"
+# default_method: "simple"
+# hide_mfa_field: true
+# names:
+# simple: "Username / Password"
+# cookie:
+# domain: ".example.com"
+# authentication_key: "very-very-secret"
+# prefix: nginx-sso-example
+# secure: yes
+# expire: 3600
+# listen:
+# addr: "0.0.0.0"
+# port: 8082
+# audit_log:
+# targets:
+# - fd://stdout
+# events: ['access_denied', 'login_success', 'login_failure', 'logout', 'validate']
+# headers: ['x-origin-uri']
+# trusted_ip_headers: ["X-Forwarded-For", "RemoteAddr", "X-Real-IP"]
+# acl:
+# rule_sets:
+# - rules:
+# - field: "x-host"
+# regexp: ".*"
+# allow: ["@_authenticated"]
+# providers:
+# simple:
+# enable_basic_auth: false
+# users:
+# admin: "{{ 'admin' | password_hash('bcrypt', ('admin@example.com/nginx-sso' | bcrypt_salt)) }}"
+# groups:
+# admins: ["admin"]
diff --git a/roles/nginx/auth/sso/backend/handlers/main.yml b/roles/nginx/auth/sso/backend/handlers/main.yml
new file mode 100644
index 00000000..2209c7bf
--- /dev/null
+++ b/roles/nginx/auth/sso/backend/handlers/main.yml
@@ -0,0 +1,12 @@
+---
+- name: restart nginx-sso
+ loop: "{{ nginx_sso_backend_configs | list }}"
+ service:
+ name: "nginx-sso@{{ item }}.service"
+ state: restarted
+
+- name: reload nginx-sso
+ loop: "{{ nginx_sso_backend_configs | list }}"
+ service:
+ name: "nginx-sso@{{ item }}.service"
+ state: reloaded
diff --git a/roles/nginx/auth/sso/backend/tasks/main.yml b/roles/nginx/auth/sso/backend/tasks/main.yml
new file mode 100644
index 00000000..4d555d69
--- /dev/null
+++ b/roles/nginx/auth/sso/backend/tasks/main.yml
@@ -0,0 +1,37 @@
+---
+- name: install nginx-sso package
+ apt:
+ name: nginx-sso
+ state: present
+
+- name: create configuration directory
+ file:
+ path: /etc/nginx/auth/sso
+ state: directory
+
+- name: generate configuration file
+ loop: "{{ nginx_sso_backend_configs | dict2items }}"
+ loop_control:
+ label: "{{ item.key }}"
+ copy:
+ content: |
+ # ansible generated
+
+ {{ item.value | to_nice_yaml }}
+ dest: "/etc/nginx/auth/sso/{{ item.key }}.yml"
+ mode: 0400
+ notify: reload nginx-sso
+
+- name: generate systemd service unit
+ template:
+ src: nginx-sso@.service.j2
+ dest: /etc/systemd/system/nginx-sso@.service
+ notify: restart nginx-sso
+
+- name: make sure nginx-sso services are enabled and started
+ loop: "{{ nginx_sso_backend_configs | list }}"
+ systemd:
+ name: "nginx-sso@{{ item }}.service"
+ daemon_reload: yes
+ state: started
+ enabled: yes
diff --git a/roles/nginx/auth/sso/backend/templates/nginx-sso@.service.j2 b/roles/nginx/auth/sso/backend/templates/nginx-sso@.service.j2
new file mode 100644
index 00000000..e2464f6f
--- /dev/null
+++ b/roles/nginx/auth/sso/backend/templates/nginx-sso@.service.j2
@@ -0,0 +1,31 @@
+[Unit]
+Description=Nginx SSO authentication daemon (%I)
+
+[Service]
+Restart=on-failure
+ExecStart=/usr/bin/nginx-sso --config /etc/nginx/auth/sso/%i.yml --frontend-dir /usr/share/nginx-sso/frontend
+ExecReload=/bin/kill -HUP $MAINPID
+
+# systemd hardening-options
+AmbientCapabilities=
+CapabilityBoundingSet=
+DeviceAllow=/dev/null rw
+DevicePolicy=strict
+LockPersonality=true
+MemoryDenyWriteExecute=true
+NoNewPrivileges=true
+PrivateDevices=true
+PrivateTmp=true
+PrivateUsers=true
+ProtectControlGroups=true
+ProtectHome=true
+ProtectKernelModules=true
+ProtectKernelTunables=true
+ProtectSystem=full
+RemoveIPC=true
+RestrictNamespaces=true
+RestrictRealtime=true
+SystemCallArchitectures=native
+
+[Install]
+WantedBy=multi-user.target
diff --git a/roles/nginx/auth/sso/base/defaults/main.yml b/roles/nginx/auth/sso/base/defaults/main.yml
new file mode 100644
index 00000000..4e5d9d4b
--- /dev/null
+++ b/roles/nginx/auth/sso/base/defaults/main.yml
@@ -0,0 +1,7 @@
+---
+# nginx_sso_backends:
+# example:
+# auth_url: http://127.0.0.1:8082
+# base_url: https://login.example.com
+# foo:
+# base_url: https://login.foo.bar
diff --git a/roles/nginx/auth/sso/base/tasks/main.yml b/roles/nginx/auth/sso/base/tasks/main.yml
new file mode 100644
index 00000000..dbae0bd4
--- /dev/null
+++ b/roles/nginx/auth/sso/base/tasks/main.yml
@@ -0,0 +1,6 @@
+---
+- name: generate nginx snippets
+ loop: "{{ nginx_sso_backends | dict2items }}"
+ template:
+ src: nginx.snippet.j2
+ dest: "/etc/nginx/snippets/sso-{{ item.key }}.conf"
diff --git a/roles/nginx/auth/sso/base/templates/nginx.snippet.j2 b/roles/nginx/auth/sso/base/templates/nginx.snippet.j2
new file mode 100644
index 00000000..f8558d59
--- /dev/null
+++ b/roles/nginx/auth/sso/base/templates/nginx.snippet.j2
@@ -0,0 +1,23 @@
+auth_request /sso-auth;
+error_page 401 = @error401;
+
+location /sso-auth {
+ internal;
+
+ proxy_pass {{ item.value.auth_url | default(item.value.base_url + '/auth') }};
+ proxy_pass_request_body off;
+ proxy_set_header Content-Length "";
+ proxy_set_header X-Origin-URI $request_uri;
+ proxy_set_header X-Host $http_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;
+}
+
+location /sso-logout {
+ return 302 {{ item.value.base_url }}/logout?go=$scheme://$http_host/;
+}
+
+location @error401 {
+ return 302 {{ item.value.base_url }}/login?go=$scheme://$http_host$request_uri;
+}