lib.packagesFromDirectoryRecursive: Improved documentation (#359898)
[NixPkgs.git] / nixos / modules / services / web-apps / dex.nix
blob45e16603373d1630c7bbe846491fde365dee5053
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
6   cfg = config.services.dex;
7   fixClient = client: if client ? secretFile then ((builtins.removeAttrs client [ "secretFile" ]) // { secret = client.secretFile; }) else client;
8   filteredSettings = mapAttrs (n: v: if n == "staticClients" then (builtins.map fixClient v) else v) cfg.settings;
9   secretFiles = flatten (builtins.map (c: optional (c ? secretFile) c.secretFile) (cfg.settings.staticClients or []));
11   settingsFormat = pkgs.formats.yaml {};
12   configFile = settingsFormat.generate "config.yaml" filteredSettings;
14   startPreScript = pkgs.writeShellScript "dex-start-pre"
15     (concatStringsSep "\n" (map (file: ''
16       replace-secret '${file}' '${file}' /run/dex/config.yaml
17     '')
18     secretFiles));
21   options.services.dex = {
22     enable = mkEnableOption "the OpenID Connect and OAuth2 identity provider";
24     environmentFile = mkOption {
25       type = types.nullOr types.path;
26       default = null;
27       description = ''
28         Environment file (see `systemd.exec(5)`
29         "EnvironmentFile=" section for the syntax) to define variables for dex.
30         This option can be used to safely include secret keys into the dex configuration.
31       '';
32     };
34     settings = mkOption {
35       type = settingsFormat.type;
36       default = {};
37       example = literalExpression ''
38         {
39           # External url
40           issuer = "http://127.0.0.1:5556/dex";
41           storage = {
42             type = "postgres";
43             config.host = "/var/run/postgres";
44           };
45           web = {
46             http = "127.0.0.1:5556";
47           };
48           enablePasswordDB = true;
49           staticClients = [
50             {
51               id = "oidcclient";
52               name = "Client";
53               redirectURIs = [ "https://example.com/callback" ];
54               secretFile = "/etc/dex/oidcclient"; # The content of `secretFile` will be written into to the config as `secret`.
55             }
56           ];
57         }
58       '';
59       description = ''
60         The available options can be found in
61         [the example configuration](https://github.com/dexidp/dex/blob/v${pkgs.dex-oidc.version}/config.yaml.dist).
63         It's also possible to refer to environment variables (defined in [services.dex.environmentFile](#opt-services.dex.environmentFile))
64         using the syntax `$VARIABLE_NAME`.
65       '';
66     };
67   };
69   config = mkIf cfg.enable {
70     systemd.services.dex = {
71       description = "dex identity provider";
72       wantedBy = [ "multi-user.target" ];
73       after = [ "networking.target" ] ++ (optional (cfg.settings.storage.type == "postgres") "postgresql.service");
74       path = with pkgs; [ replace-secret ];
75       serviceConfig = {
76         ExecStart = "${pkgs.dex-oidc}/bin/dex serve /run/dex/config.yaml";
77         ExecStartPre = [
78           "${pkgs.coreutils}/bin/install -m 600 ${configFile} /run/dex/config.yaml"
79           "+${startPreScript}"
80         ];
82         RuntimeDirectory = "dex";
83         BindReadOnlyPaths = [
84           "/nix/store"
85           "-/etc/dex"
86           "-/etc/hosts"
87           "-/etc/localtime"
88           "-/etc/nsswitch.conf"
89           "-/etc/resolv.conf"
90           "-/etc/ssl/certs/ca-certificates.crt"
91         ];
92         BindPaths = optional (cfg.settings.storage.type == "postgres") "/var/run/postgresql";
93         # ProtectClock= adds DeviceAllow=char-rtc r
94         DeviceAllow = "";
95         DynamicUser = true;
96         LockPersonality = true;
97         MemoryDenyWriteExecute = true;
98         NoNewPrivileges = true;
99         PrivateDevices = true;
100         PrivateMounts = true;
101         # Port needs to be exposed to the host network
102         #PrivateNetwork = true;
103         PrivateTmp = true;
104         PrivateUsers = true;
105         ProcSubset = "pid";
106         ProtectClock = true;
107         ProtectHome = true;
108         ProtectHostname = true;
109         ProtectSystem = "strict";
110         ProtectControlGroups = true;
111         ProtectKernelLogs = true;
112         ProtectKernelModules = true;
113         ProtectKernelTunables = true;
114         ProtectProc = "invisible";
115         RestrictAddressFamilies = [ "AF_INET" "AF_INET6" "AF_UNIX" ];
116         RestrictNamespaces = true;
117         RestrictRealtime = true;
118         RestrictSUIDSGID = true;
119         SystemCallArchitectures = "native";
120         SystemCallFilter = [ "@system-service" "~@privileged @setuid @keyring" ];
121         UMask = "0066";
122       } // optionalAttrs (cfg.environmentFile != null) {
123         EnvironmentFile = cfg.environmentFile;
124       };
125     };
126   };
128   # uses attributes of the linked package
129   meta.buildDocsInSandbox = false;