diff --git a/machines/gerd.nix b/machines/gerd.nix index 0794a8b..8347e5f 100644 --- a/machines/gerd.nix +++ b/machines/gerd.nix @@ -6,13 +6,15 @@ ./../shared/applications/server/nginx.nix ./../shared/applications/state/ssh.nix - ./gerd/services/lldap.nix - ./gerd/services/authelia.nix ./gerd/services/fricloud-website.nix + ./gerd/services/lldap.nix + ./gerd/services/authelia ./gerd/services/forgejo ./gerd/services/teeworlds.nix ./gerd/services/murmur.nix ./gerd/services/hedgedoc.nix + + # ./gerd/services/owncast.nix ]; networking.hostName = "gerd"; diff --git a/machines/gerd/services/authelia/authelia-nginx.nix b/machines/gerd/services/authelia/authelia-nginx.nix new file mode 100644 index 0000000..6c3e6b3 --- /dev/null +++ b/machines/gerd/services/authelia/authelia-nginx.nix @@ -0,0 +1,81 @@ +{ pkgs, ... }: + +# most is taken from this discussion https://www.reddit.com/r/NixOS/comments/15trmac/how_would_you_do_a_nginx_snippets_in_nixos/ +# with the following gist https://gist.github.com/aswan89/ee554406c39eb2eeb3126f73f74ab61c +let + AUTHELIA_HOST = "http://localhost:9091"; + + autheliaLocation = pkgs.writeText "authelia-location.conf" '' + ## Essential Proxy Configuration + internal; + proxy_pass ${AUTHELIA_HOST}/api/verify; + ## Headers + ## The headers starting with X-* are required. + proxy_set_header X-Original-URL $scheme://$http_host$request_uri; + proxy_set_header X-Original-Method $request_method; + proxy_set_header X-Forwarded-Method $request_method; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $http_host; + proxy_set_header X-Forwarded-Uri $request_uri; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header Content-Length ""; + proxy_set_header Connection ""; + ## Basic Proxy Configuration + proxy_pass_request_body off; + proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; # Timeout if the real server is dead + proxy_redirect http:// $scheme://; + proxy_http_version 1.1; + proxy_cache_bypass $cookie_session; + proxy_no_cache $cookie_session; + proxy_buffers 4 32k; + client_body_buffer_size 128k; + ## Advanced Proxy Configuration + send_timeout 5m; + proxy_read_timeout 240; + proxy_send_timeout 240; + proxy_connect_timeout 240; + ''; + autheliaRequest = pkgs.writeText "authelia-authrequest.conf" '' + ### goes inside a location block to make the request to authelia + ## Send a subrequest to Authelia to verify if the user is authenticated and has permission to access the resource. + auth_request /authelia; + ## Set the $target_url variable based on the original request. + ## Comment this line if you're using nginx without the http_set_misc module. + #set_escape_uri $target_url $scheme://$http_host$request_uri; + ## Uncomment this line if you're using NGINX without the http_set_misc module. + set $target_url $scheme://$http_host$request_uri; + ## Save the upstream response headers from Authelia to variables. + auth_request_set $user $upstream_http_remote_user; + auth_request_set $groups $upstream_http_remote_groups; + auth_request_set $name $upstream_http_remote_name; + auth_request_set $email $upstream_http_remote_email; + ## Inject the response headers from the variables into the request made to the backend. + proxy_set_header Remote-User $user; + proxy_set_header Remote-Groups $groups; + proxy_set_header Remote-Name $name; + proxy_set_header Remote-Email $email; + ## If the subreqest returns 200 pass to the backend, if the subrequest returns 401 redirect to the portal. + error_page 401 =302 https://auth.fricloud.dk/?rd=$target_url; + ''; +in { + services.nginx.virtualHosts."test.fricloud.dk" = { + forceSSL = true; + enableACME = true; + + locations."/authelia" = { + recommendedProxySettings = false; + extraConfig = '' + include ${autheliaLocation}; + ''; + }; + locations."/" = { + root = pkgs.writeTextDir "index.html" '' + ACCESS GRANTED! + ''; + + extraConfig = '' + include ${autheliaRequest}; + ''; + }; + }; +} diff --git a/machines/gerd/services/authelia.nix b/machines/gerd/services/authelia/authelia.nix similarity index 95% rename from machines/gerd/services/authelia.nix rename to machines/gerd/services/authelia/authelia.nix index f88244a..2ecf884 100644 --- a/machines/gerd/services/authelia.nix +++ b/machines/gerd/services/authelia/authelia.nix @@ -21,8 +21,10 @@ in { # totp - disable for now, as it requires email server access_control.default_policy = "one_factor"; - default_2fa_method = "totp"; - totp.issuer = "auth.fricloud.dk"; + # totp.disable = true; + # webauthn.disable = true; + # default_2fa_method = "totp"; + # totp.issuer = "auth.fricloud.dk"; storage.local.path = "${autheliaStateDir}/authelia.sqlite3"; notifier.filesystem.filename = "${autheliaStateDir}/authelia_notifier.txt"; diff --git a/machines/gerd/services/authelia/default.nix b/machines/gerd/services/authelia/default.nix new file mode 100644 index 0000000..eaf3b4f --- /dev/null +++ b/machines/gerd/services/authelia/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./authelia.nix + # ./authelia-nginx.nix + ]; +}