From 30eff2fb90b93e30b51f98662fbc3bda5e9131d4 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sun, 1 Oct 2023 20:28:56 +0200 Subject: add role for nginx-sso --- roles/nginx/auth/sso/backend/defaults/main.yml | 37 ++++++++++++++++++++++ roles/nginx/auth/sso/backend/handlers/main.yml | 12 +++++++ roles/nginx/auth/sso/backend/tasks/main.yml | 37 ++++++++++++++++++++++ .../sso/backend/templates/nginx-sso@.service.j2 | 31 ++++++++++++++++++ roles/nginx/auth/sso/base/defaults/main.yml | 7 ++++ roles/nginx/auth/sso/base/tasks/main.yml | 6 ++++ .../nginx/auth/sso/base/templates/nginx.snippet.j2 | 23 ++++++++++++++ 7 files changed, 153 insertions(+) create mode 100644 roles/nginx/auth/sso/backend/defaults/main.yml create mode 100644 roles/nginx/auth/sso/backend/handlers/main.yml create mode 100644 roles/nginx/auth/sso/backend/tasks/main.yml create mode 100644 roles/nginx/auth/sso/backend/templates/nginx-sso@.service.j2 create mode 100644 roles/nginx/auth/sso/base/defaults/main.yml create mode 100644 roles/nginx/auth/sso/base/tasks/main.yml create mode 100644 roles/nginx/auth/sso/base/templates/nginx.snippet.j2 (limited to 'roles/nginx') 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; +} -- cgit v1.2.3