SSO and Identities (Kanidm)
Kanidm 🡕 is the network’s identity provider: a
single identity unlocks all services (SSO). The idm service runs on
the HCS (and, optionally, as a replica in each zone).
Identities and groups
Section titled “Identities and groups”Accounts and groups are provisioned in Kanidm from etc/config.yaml:
users: alice: profile: "nix-admin" groups: ["idm-admins", "idm-devs", "global"]- Groups control access to services.
- Two special groups:
idm-admins(administration),idm-devs(development).
Connect a service (OIDC)
Section titled “Connect a service (OIDC)”OIDC-compatible services are linked to SSO automatically: Kanidm provisions an OAuth2 client per service, and its secret is managed by sops. Nothing to configure manually.
Protecting a service without OIDC
Section titled “Protecting a service without OIDC”A service without its own authentication (homepage, static site) is protected by placing a Kanidm login screen in front of it (oauth2-proxy + Caddy). For the homepage, a setting on the gateway host (usr/machines/<gateway>/) :
darkone.service.homepage.protect = true; # requires a Kanidm session| Option | Default | Effect |
|---|---|---|
protect | true | Homepage reserved for Kanidm users (users group) |
Multi-zone replication
Section titled “Multi-zone replication”The mode is inferred from where idm is declared:
idmon the HCS only → single instance, no replication.idmon a gateway without HCS → standalone instance in the zone.idmon the HCS and gateways → replication: the HCS provides, each gateway is a read-only replica.
Administration
Section titled “Administration”Administration is done via the command line on the HCS:
just enter hcskanidm person credential create-reset-token <login> --name idm_adminSee Create a user account and Reset a password.
Updating Kanidm
Section titled “Updating Kanidm”Kanidm only maintains a single version at a time : a version reaches its
end-of-life 30 days after the release of the next one, and only an upgrade
from one version to the next is supported. DNF therefore pins the package
explicitly, in dnf/modules/service/idm.nix :
services.kanidm.package = pkgs.kanidm_1_11.withSecretProvisioning;The evaluation warns as soon as the pinned version is deprecated :
kanidm 1.10 is deprecated and will reach end-of-life on 2026-08-31After this date, nixpkgs marks the version as unmaintained and the evaluation fails. The upgrade must therefore be planned before the deadline.
-
Compatibility check, on the HCS, before touching the version :
Fenêtre de terminal just enter hcssudo kanidmd domain upgrade-check -c /etc/kanidm/server.tomlRead-only operation. Each item must come out as
PASS; aFAILmust be fixed before going any further. -
Cold copy of the database, the only really reliable rollback :
Fenêtre de terminal sudo systemctl stop kanidmsudo install -d -o kanidm -g kanidm /var/lib/kanidm/pre-upgradesudo cp -a /var/lib/kanidm/kanidm.db* /var/lib/kanidm/pre-upgrade/sudo kanidmd database backup /var/lib/kanidm/pre-upgrade/dump.json -c /etc/kanidm/server.tomlsudo chown -R kanidm:kanidm /var/lib/kanidmsudo systemctl start kanidmCopy the journal, not just the database. SQLite does not always merge its write journal when closing : a
kanidm.db-walof several MB commonly survives the service stop. Copyingkanidm.dbalone would leave the latest transactions aside. The*takes the.db,.db-waland.db-shmtriplet, which is only valid taken together.The final
chownis not optional : the two previous commands run as root and would otherwise leave files the service can no longer write. -
Move the pin to the next version, one at a time, then deploy the HCS.
-
Check the service and the database consistency :
Fenêtre de terminal systemctl status kanidmsudo kanidmd database verify -c /etc/kanidm/server.tomlFinish with a real OIDC login on a network service.
In case of failure : put the pin back on the previous version, restore the
.bak file in place of kanidm.db (service stopped), redeploy.