Merge pull request #133098 from erdnaxe/nitter-hardening

nixos/nitter: systemd unit hardening

Changed files
+34 -2
nixos
modules
services
misc
tests
pkgs
servers
nitter
+25
nixos/modules/services/misc/nitter.nix
···
AmbientCapabilities = lib.mkIf (cfg.server.port < 1024) [ "CAP_NET_BIND_SERVICE" ];
Restart = "on-failure";
RestartSec = "5s";
+
# Hardening
+
CapabilityBoundingSet = if (cfg.server.port < 1024) then [ "CAP_NET_BIND_SERVICE" ] else [ "" ];
+
DeviceAllow = [ "" ];
+
LockPersonality = true;
+
MemoryDenyWriteExecute = true;
+
PrivateDevices = true;
+
# A private user cannot have process capabilities on the host's user
+
# namespace and thus CAP_NET_BIND_SERVICE has no effect.
+
PrivateUsers = (cfg.server.port >= 1024);
+
ProcSubset = "pid";
+
ProtectClock = true;
+
ProtectControlGroups = true;
+
ProtectHome = true;
+
ProtectHostname = true;
+
ProtectKernelLogs = true;
+
ProtectKernelModules = true;
+
ProtectKernelTunables = true;
+
ProtectProc = "invisible";
+
RestrictAddressFamilies = [ "AF_INET" "AF_INET6" ];
+
RestrictNamespaces = true;
+
RestrictRealtime = true;
+
RestrictSUIDSGID = true;
+
SystemCallArchitectures = "native";
+
SystemCallFilter = [ "@system-service" "~@privileged" "~@resources" ];
+
UMask = "0077";
};
};
+4 -2
nixos/tests/nitter.nix
···
nodes.machine = {
services.nitter.enable = true;
+
# Test CAP_NET_BIND_SERVICE
+
services.nitter.server.port = 80;
};
testScript = ''
machine.wait_for_unit("nitter.service")
-
machine.wait_for_open_port("8080")
-
machine.succeed("curl --fail http://localhost:8080/")
+
machine.wait_for_open_port("80")
+
machine.succeed("curl --fail http://localhost:80/")
'';
})
+5
pkgs/servers/nitter/default.nix
···
{ lib
, stdenv
+
, nixosTests
, fetchFromGitHub
, nim
, libsass
···
cp -r public $out/share/nitter/public
runHook postInstall
'';
+
+
passthru.tests = {
+
inherit (nixosTests) nitter;
+
};
meta = with lib; {
description = "Alternative Twitter front-end";