lint-staged: 15.2.10 -> 15.2.11 (#364089)
[NixPkgs.git] / nixos / modules / services / security / tang.nix
blob3d65a5cf6ead453efedd41de8419e17d4028330d
2   config,
3   lib,
4   pkgs,
5   ...
6 }:
7 with lib;
8 let
9   cfg = config.services.tang;
12   options.services.tang = {
13     enable = mkEnableOption "tang";
15     package = mkOption {
16       type = types.package;
17       default = pkgs.tang;
18       defaultText = literalExpression "pkgs.tang";
19       description = "The tang package to use.";
20     };
22     listenStream = mkOption {
23       type = with types; listOf str;
24       default = [ "7654" ];
25       example = [
26         "198.168.100.1:7654"
27         "[2001:db8::1]:7654"
28         "7654"
29       ];
30       description = ''
31         Addresses and/or ports on which tang should listen.
32         For detailed syntax see ListenStream in {manpage}`systemd.socket(5)`.
33       '';
34     };
36     ipAddressAllow = mkOption {
37       example = [ "192.168.1.0/24" ];
38       type = types.listOf types.str;
39       description = ''
40         Whitelist a list of address prefixes.
41         Preferably, internal addresses should be used.
42       '';
43     };
45   };
46   config = mkIf cfg.enable {
47     environment.systemPackages = [ cfg.package ];
49     systemd.services."tangd@" = {
50       description = "Tang server";
51       path = [ cfg.package ];
52       serviceConfig = {
53         StandardInput = "socket";
54         StandardOutput = "socket";
55         StandardError = "journal";
56         DynamicUser = true;
57         StateDirectory = "tang";
58         RuntimeDirectory = "tang";
59         StateDirectoryMode = "700";
60         UMask = "0077";
61         CapabilityBoundingSet = [ "" ];
62         ExecStart = "${cfg.package}/libexec/tangd %S/tang";
63         LockPersonality = true;
64         MemoryDenyWriteExecute = true;
65         NoNewPrivileges = true;
66         DeviceAllow = [ "/dev/stdin" ];
67         RestrictAddressFamilies = [ "AF_UNIX" ];
68         DevicePolicy = "strict";
69         PrivateDevices = true;
70         PrivateTmp = true;
71         PrivateUsers = true;
72         ProcSubset = "pid";
73         ProtectClock = true;
74         ProtectControlGroups = true;
75         ProtectHome = true;
76         ProtectHostname = true;
77         ProtectKernelLogs = true;
78         ProtectKernelModules = true;
79         ProtectKernelTunables = true;
80         ProtectProc = "invisible";
81         ProtectSystem = "strict";
82         RestrictNamespaces = true;
83         RestrictRealtime = true;
84         RestrictSUIDSGID = true;
85         SystemCallArchitectures = "native";
86         SystemCallFilter = [
87           "@system-service"
88           "~@privileged"
89           "~@resources"
90         ];
91         IPAddressDeny = "any";
92         IPAddressAllow = cfg.ipAddressAllow;
93       };
94     };
96     systemd.sockets.tangd = {
97       description = "Tang server";
98       wantedBy = [ "sockets.target" ];
99       socketConfig = {
100         ListenStream = cfg.listenStream;
101         Accept = "yes";
102         IPAddressDeny = "any";
103         IPAddressAllow = cfg.ipAddressAllow;
104       };
105     };
106   };
107   meta.maintainers = with lib.maintainers; [
108     jfroche
109     julienmalka
110   ];