vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / networking / envoy.nix
blob876c05755936ed99d8145743b952a778a55a8892
1 { config, lib, pkgs, ... }:
2 let
3   cfg = config.services.envoy;
4   format = pkgs.formats.json { };
5   conf = format.generate "envoy.json" cfg.settings;
6   validateConfig = required: file:
7     pkgs.runCommand "validate-envoy-conf" { } ''
8       ${cfg.package}/bin/envoy --log-level error --mode validate -c "${file}" ${lib.optionalString (!required) "|| true"}
9       cp "${file}" "$out"
10     '';
14   options.services.envoy = {
15     enable = lib.mkEnableOption "Envoy reverse proxy";
17     package = lib.mkPackageOption pkgs "envoy" { };
19     requireValidConfig = lib.mkOption {
20       type = lib.types.bool;
21       default = true;
22       description = ''
23         Whether a failure during config validation at build time is fatal.
24         When the config can't be checked during build time, for example when it includes
25         other files, disable this option.
26       '';
27     };
29     settings = lib.mkOption {
30       type = format.type;
31       default = { };
32       example = lib.literalExpression ''
33         {
34           admin = {
35             access_log_path = "/dev/null";
36             address = {
37               socket_address = {
38                 protocol = "TCP";
39                 address = "127.0.0.1";
40                 port_value = 9901;
41               };
42             };
43           };
44           static_resources = {
45             listeners = [];
46             clusters = [];
47           };
48         }
49       '';
50       description = ''
51         Specify the configuration for Envoy in Nix.
52       '';
53     };
54   };
56   config = lib.mkIf cfg.enable {
57     environment.systemPackages = [ cfg.package ];
58     systemd.services.envoy = {
59       description = "Envoy reverse proxy";
60       after = [ "network-online.target" ];
61       requires = [ "network-online.target" ];
62       wantedBy = [ "multi-user.target" ];
63       serviceConfig = {
64         ExecStart = "${cfg.package}/bin/envoy -c ${validateConfig cfg.requireValidConfig conf}";
65         CacheDirectory = [ "envoy" ];
66         LogsDirectory = [ "envoy" ];
67         Restart = "no";
68         # Hardening
69         AmbientCapabilities = [ "CAP_NET_BIND_SERVICE" ];
70         CapabilityBoundingSet = [ "CAP_NET_BIND_SERVICE" ];
71         DeviceAllow = [ "" ];
72         DevicePolicy = "closed";
73         DynamicUser = true;
74         LockPersonality = true;
75         MemoryDenyWriteExecute = false; # at least wasmr needs WX permission
76         PrivateDevices = true;
77         PrivateUsers = false; # breaks CAP_NET_BIND_SERVICE
78         ProcSubset = "pid";
79         ProtectClock = true;
80         ProtectControlGroups = true;
81         ProtectHome = true;
82         ProtectHostname = true;
83         ProtectKernelLogs = true;
84         ProtectKernelModules = true;
85         ProtectKernelTunables = true;
86         ProtectProc = "ptraceable";
87         ProtectSystem = "strict";
88         RestrictAddressFamilies = [ "AF_UNIX" "AF_INET" "AF_INET6" "AF_NETLINK" "AF_XDP" ];
89         RestrictNamespaces = true;
90         RestrictRealtime = true;
91         SystemCallArchitectures = "native";
92         SystemCallErrorNumber = "EPERM";
93         SystemCallFilter = [ "@system-service" "~@privileged" "~@resources" ];
94         UMask = "0066";
95       };
96     };
97   };