
Systemd Hardening Helper - Mirror of https://github.com/desbma/shh

Automatische systemd-Diensthärtung, geleitet durch strace-Profiling.
SHH kann für jeden deiner Dienste einen optimalen Satz an Härtungsoptionen erzeugen, sodass du das Sicherheitsniveau deines Systems erhöhen kannst, ohne dich über zufällige Fehler in der Produktion zu sorgen, die durch zu restriktives Sandboxing verursacht werden.
Offizielles Repository - Mirror-Repository
Strace muss installiert und seine ausführbare Datei über PATH erreichbar sein. Derzeit ist Strace-Version >= 6.6 erforderlich.
Du benötigst eine Rust-Build-Umgebung, zum Beispiel von rustup.
Führe im aktuellen Repository aus:
cargo build --release
install -Dm 755 -t /usr/local/bin target/release/shh
crates.iosudo cargo install --root /usr/local systemd-hardening-helper
Siehe GitHub-Releases für Debian-Pakete, die für jede getaggte Version erstellt wurden.
Arch-Linux-Benutzer können das shh-AUR-Paket installieren.
NixOS/Nix-Benutzer können das neueste Paket aus dem unstable-Zweig installieren.
Um eine Systemeinheit namens SERVICE.service zu härten:
shh service start-profile SERVICE. Der Dienst wird mit Strace-Profiling neu gestartet.shh service finish-profile SERVICE -a aus. Der Dienst wird mit einer gehärteten Konfiguration neu gestartet, die aus dem vorherigen Laufzeit-Profiling erstellt wurde, damit er sicher so laufen kann, wie während des Profiling-Zeitraums beobachtet, und um andere gefährliche Systemaktionen zu verweigern.Führe shh -h für die vollständige Befehlszeilenreferenz aus, oder hänge -h an einen Unterbefehl an, um Hilfe zu erhalten.
[!WARNING] Die von
shherzeugten Härtungsoptionen sind konstruktionsbedingt nicht zwischen verschiedenen Systemen portierbar. Sie hängen von vielen Faktoren ab und können den Dienst beschädigen, wenn sich einer davon ändert:
- der während des Profilings abgedeckte Codepfad
- die Linux-Kernel-Version
- die verwendete libc
- die systemd-Version
Die Wiederverwendung von durch
shherzeugten Optionen auf einem System mit einer anderen Umgebung (d. h. einer anderen Linux-Distribution) wird den Dienst sehr wahrscheinlich beschädigen.
Wenn du einen schnellen Test durchführen möchtest, um zu sehen, welche Optionen erzeugt würden, kannst du shh run -- COMMAND verwenden.
Das aktuelle Verzeichnis und die Umgebungsvariable PATH beeinflussen beide die Programmausführung; setze diese zuerst zurück:
$ cd /
export PATH=/usr/local/bin:/usr/bin:/bin
Um zu sehen, welche Optionen für einen curl https://www.example.com-Aufruf erzeugt würden:
$ shh run -- curl https://www.example.com
...
-------- Start of suggested service options --------
ProtectSystem=strict
ProtectHome=true
PrivateTmp=disconnected
PrivateDevices=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectKernelLogs=true
ProtectControlGroups=true
ProtectProc=ptraceable
LockPersonality=true
RestrictRealtime=true
ProtectClock=true
MemoryDenyWriteExecute=true
RestrictAddressFamilies=AF_INET AF_INET6 AF_NETLINK AF_UNIX
SocketBindDeny=ipv4:tcp
SocketBindDeny=ipv4:udp
SocketBindDeny=ipv6:tcp
SocketBindDeny=ipv6:udp
CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_BPF CAP_CHOWN CAP_MKNOD CAP_NET_RAW CAP_PERFMON CAP_SYS_BOOT CAP_SYS_CHROOT CAP_SYS_MODULE CAP_SYS_NICE CAP_SYS_PACCT CAP_SYS_PTRACE CAP_SYS_TIME CAP_SYSLOG CAP_WAKE_ALARM
SystemCallFilter=~@aio:EPERM @chown:EPERM @clock:EPERM @cpu-emulation:EPERM @debug:EPERM @ipc:EPERM @keyring:EPERM @memlock:EPERM @module:EPERM @mount:EPERM @obsolete:EPERM @pkey:EPERM @privileged:EPERM @raw-io:EPERM @reboot:EPERM @resources:EPERM @sandbox:EPERM @setuid:EPERM @swap:EPERM @sync:EPERM @timer:EPERM
-------- End of suggested service options --------
Oder um so weit wie möglich zu sandboxen:
$ shh run --mode aggressive --filesystem-whitelisting --network-firewalling -- curl https://www.example.com -o /dev/null
...
-------- Start of suggested service options --------
ProtectSystem=strict
ProtectHome=true
PrivateTmp=disconnected
PrivateDevices=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectKernelLogs=true
ProtectControlGroups=true
ProtectProc=ptraceable
LockPersonality=true
RestrictRealtime=true
ProtectClock=true
MemoryDenyWriteExecute=true
SystemCallArchitectures=native
ReadOnlyPaths=-/
ReadWritePaths=-/dev
InaccessiblePaths=-/boot -/home -/lost+found -/media -/mnt -/opt -/root -/srv -/sys -/tmp -/var
TemporaryFileSystem=/usr:ro
BindReadOnlyPaths=-/usr/bin -/usr/lib -/usr/lib64 -/usr/local -/usr/share
NoExecPaths=-/
ExecPaths=-/usr/bin/curl -/usr/lib/x86_64-linux-gnu
RestrictAddressFamilies=AF_INET AF_INET6 AF_NETLINK AF_UNIX
SocketBindDeny=ipv4:tcp
SocketBindDeny=ipv4:udp
SocketBindDeny=ipv6:tcp
SocketBindDeny=ipv6:udp
IPAddressDeny=any
IPAddressAllow=[redacted]
CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_BPF CAP_CHOWN CAP_MKNOD CAP_NET_RAW CAP_PERFMON CAP_SYS_BOOT CAP_SYS_CHROOT CAP_SYS_MODULE CAP_SYS_NICE CAP_SYS_PACCT CAP_SYS_PTRACE CAP_SYS_TIME CAP_SYSLOG CAP_WAKE_ALARM
SystemCallFilter=~@aio:EPERM @chown:EPERM @clock:EPERM @cpu-emulation:EPERM @debug:EPERM @ipc:EPERM @keyring:EPERM @memlock:EPERM @module:EPERM @mount:EPERM @obsolete:EPERM @pkey:EPERM @privileged:EPERM @raw-io:EPERM @reboot:EPERM @resources:EPERM @sandbox:EPERM @setuid:EPERM @swap:EPERM @sync:EPERM @timer:EPERM
-------- End of suggested service options --------