diff --git a/nix/host-modules/swarm-grafana.nix b/nix/host-modules/swarm-grafana.nix index bbc68473..81ec4374 100644 --- a/nix/host-modules/swarm-grafana.nix +++ b/nix/host-modules/swarm-grafana.nix @@ -701,10 +701,17 @@ in # whole host fails to build. The unit below generates it. security.secret_key = "$__file{${secretKeyPath}}"; - # No local password path at all when SSO is configured. This - # is not tidiness: Grafana ships an `admin`/`admin` account, - # and this vhost is on the public gateway. - auth.disable_login_form = ssoLocal; + # No local password path, ever. This is not tidiness: Grafana + # ships an `admin`/`admin` account and this vhost is on the + # public gateway, so SSO is the only way in — not merely the + # preferred one. + # + # Deliberately NOT `ssoLocal`: whether a password box sits on a + # public login page cannot depend on which host happens to run + # authelia. The OIDC block below is still gated on locality; + # making that follow the same swarm-wide question is a larger + # change tracked on its own. + auth.disable_login_form = true; } // lib.optionalAttrs ssoLocal { "auth.generic_oauth" = { diff --git a/nix/module-eval.nix b/nix/module-eval.nix index 839365b0..74b04cc9 100644 --- a/nix/module-eval.nix +++ b/nix/module-eval.nix @@ -655,6 +655,16 @@ let rule: lib.hasInfix "/run/test-grafana-sock" rule ) grafanaOldPath.systemd.tmpfiles.rules; } + { + # This fixture enables grafana and NOT authelia, which is the shape the + # login form used to stay enabled in: the toggle read "both services are + # on this host" rather than "grafana requires SSO". Grafana ships an + # `admin`/`admin` account and its vhost is on the public gateway, so a + # password box there is a way in whatever the topology. + name = "grafana disables its local login form even where authelia is not on this host"; + ok = + grafanaOldPath.containers.swarm-grafana.config.services.grafana.settings.auth.disable_login_form; + } { # Reads the daemon's rendered unit, not the options: the queue address # arrives as an env var whose whole attrset is guarded on `natsUrl`, and