
Assistant de durcissement Systemd - Miroir de https://github.com/desbma/shh

Durcissement automatique des services systemd guidé par le profilage strace.
SHH peut générer un ensemble optimal d'options de durcissement pour chacun de vos services, afin d'élever le niveau de sécurité de votre système sans craindre des erreurs aléatoires en production causées par un sandboxing trop restrictif.
Strace doit être installé et son exécutable accessible dans PATH. Une version de Strace >= 6.6 est actuellement requise.
Vous avez besoin d'un environnement de compilation Rust, par exemple via rustup.
Exécutez dans le dépôt courant :
cargo build --release
install -Dm 755 -t /usr/local/bin target/release/shh
crates.iosudo cargo install --root /usr/local systemd-hardening-helper
Consultez les versions GitHub pour les paquets Debian construits pour chaque version taguée.
Les utilisateurs d'Arch Linux peuvent installer le paquet AUR shh.
Les utilisateurs de Nixos/Nix peuvent installer le dernier paquet depuis la branche instable.
Pour durcir une unité système nommée SERVICE.service :
shh service start-profile SERVICE. Le service sera redémarré avec le profilage strace.shh service finish-profile SERVICE -a. Le service sera redémarré avec une configuration durcie construite à partir du profilage d'exécution précédent, afin de lui permettre de fonctionner en toute sécurité comme observé pendant la période de profilage, et de refuser d'autres actions système dangereuses.Exécutez shh -h pour la référence complète de la ligne de commande, ou ajoutez -h à une sous-commande pour obtenir de l'aide.
[!WARNING] Les options de durcissement générées par
shhne sont par construction pas portables entre différents systèmes. Elles dépendent de nombreux facteurs et peuvent casser le service si l'un d'entre eux change :
- le chemin de code couvert pendant le profilage
- la version du noyau Linux
- la libc utilisée
- la version de systemd
Réutiliser les options générées par
shhsur un système avec un environnement différent (par exemple une distribution Linux différente) risque très probablement de casser le service.
Si vous souhaitez exécuter un test rapide pour voir quelles options seraient générées, vous pouvez utiliser shh run -- COMMANDE.
Le répertoire courant et la variable d'environnement PATH influencent tous deux l'exécution du programme ; réinitialisez-les d'abord :
$ cd /
export PATH=/usr/local/bin:/usr/bin:/bin
Ensuite, pour voir quelles options seraient générées pour un appel curl https://www.example.com :
$ shh run -- curl https://www.example.com
...
-------- Début des options de service suggérées --------
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
-------- Fin des options de service suggérées --------
Ou pour sandboxer autant que possible :
$ shh run --mode aggressive --filesystem-whitelisting --network-firewalling -- curl https://www.example.com -o /dev/null
...
-------- Début des options de service suggérées --------
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
-------- Fin des options de service suggérées --------