grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / security / polkit.nix
blobeb783179af553aa73d509b1fcb90d620f9ed6dde
1 { config, lib, pkgs, ... }:
2 let
4   cfg = config.security.polkit;
6 in
10   options = {
12     security.polkit.enable = lib.mkEnableOption "polkit";
14     security.polkit.package = lib.mkPackageOption pkgs "polkit" { };
16     security.polkit.debug = lib.mkEnableOption "debug logs from polkit. This is required in order to see log messages from rule definitions";
18     security.polkit.extraConfig = lib.mkOption {
19       type = lib.types.lines;
20       default = "";
21       example =
22         ''
23           /* Log authorization checks. */
24           polkit.addRule(function(action, subject) {
25             // Make sure to set { security.polkit.debug = true; } in configuration.nix
26             polkit.log("user " +  subject.user + " is attempting action " + action.id + " from PID " + subject.pid);
27           });
29           /* Allow any local user to do anything (dangerous!). */
30           polkit.addRule(function(action, subject) {
31             if (subject.local) return "yes";
32           });
33         '';
34       description =
35         ''
36           Any polkit rules to be added to config (in JavaScript ;-). See:
37           <https://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html#polkit-rules>
38         '';
39     };
41     security.polkit.adminIdentities = lib.mkOption {
42       type = lib.types.listOf lib.types.str;
43       default = [ "unix-group:wheel" ];
44       example = [ "unix-user:alice" "unix-group:admin" ];
45       description =
46         ''
47           Specifies which users are considered “administrators”, for those
48           actions that require the user to authenticate as an
49           administrator (i.e. have an `auth_admin`
50           value).  By default, this is all users in the `wheel` group.
51         '';
52     };
54   };
57   config = lib.mkIf cfg.enable {
59     environment.systemPackages = [ cfg.package.bin cfg.package.out ];
61     systemd.packages = [ cfg.package.out ];
63     systemd.services.polkit.serviceConfig.ExecStart = [
64       ""
65       "${cfg.package.out}/lib/polkit-1/polkitd ${lib.optionalString (!cfg.debug) "--no-debug"}"
66     ];
68     systemd.services.polkit.restartTriggers = [ config.system.path ];
69     systemd.services.polkit.stopIfChanged = false;
71     # The polkit daemon reads action/rule files
72     environment.pathsToLink = [ "/share/polkit-1" ];
74     # PolKit rules for NixOS.
75     environment.etc."polkit-1/rules.d/10-nixos.rules".text =
76       ''
77         polkit.addAdminRule(function(action, subject) {
78           return [${lib.concatStringsSep ", " (map (i: "\"${i}\"") cfg.adminIdentities)}];
79         });
81         ${cfg.extraConfig}
82       ''; #TODO: validation on compilation (at least against typos)
84     services.dbus.packages = [ cfg.package.out ];
86     security.pam.services.polkit-1 = {};
88     security.wrappers = {
89       pkexec =
90         { setuid = true;
91           owner = "root";
92           group = "root";
93           source = "${cfg.package.bin}/bin/pkexec";
94         };
95       polkit-agent-helper-1 =
96         { setuid = true;
97           owner = "root";
98           group = "root";
99           source = "${cfg.package.out}/lib/polkit-1/polkit-agent-helper-1";
100         };
101     };
103     systemd.tmpfiles.rules = [
104       # Probably no more needed, clean up
105       "R /var/lib/polkit-1"
106       "R /var/lib/PolicyKit"
107     ];
109     users.users.polkituser = {
110       description = "PolKit daemon";
111       uid = config.ids.uids.polkituser;
112       group = "polkituser";
113     };
115     users.groups.polkituser = {};
116   };