
Systemd Hardening Helper - Espelho de https://github.com/desbma/shh

Endurecimento automático de serviços systemd guiado por perfilamento strace.
O SHH pode gerar um conjunto ideal de opções de endurecimento para cada um dos seus serviços, permitindo que você aumente o nível de segurança do seu sistema sem se preocupar com erros aleatórios em produção causados por sandboxing excessivamente restritivo.
Repositório oficial - Repositório espelho
O Strace precisa estar instalado e seu executável acessível no PATH. Atualmente, é necessária a versão >= 6.6 do Strace.
Você precisa de um ambiente de compilação Rust, por exemplo a partir do rustup.
Execute no repositório atual:
cargo build --release
install -Dm 755 -t /usr/local/bin target/release/shh
crates.iosudo cargo install --root /usr/local systemd-hardening-helper
Consulte GitHub releases para pacotes Debian compilados para cada versão marcada.
Usuários de Arch Linux podem instalar o pacote shh no AUR.
Usuários de Nixos/Nix podem instalar o pacote mais recente a partir do ramo instável.
Para endurecer uma unit do sistema chamada SERVICE.service:
shh service start-profile SERVICE. O serviço será reiniciado com perfilamento strace.shh service finish-profile SERVICE -a. O serviço será reiniciado com uma configuração endurecida construída a partir do perfilamento anterior em tempo de execução, para permitir que ele seja executado com segurança conforme observado durante o período de perfilamento, e para negar outras ações perigosas do sistema.Execute shh -h para a referência completa da linha de comando, ou acrescente -h a um subcomando para obter ajuda.
[!WARNING] As opções de endurecimento geradas pelo
shhsão, por construção, não portáveis entre diferentes sistemas. Elas dependem de muitos fatores e podem quebrar o serviço se qualquer um deles mudar:
- o caminho de código coberto durante o perfilamento
- a versão do kernel Linux
- a libc utilizada
- a versão do systemd
Reutilizar opções geradas pelo
shhem um sistema com um ambiente diferente (ou seja, distribuição Linux diferente) muito provavelmente quebrará o serviço.
Se você quiser executar um teste rápido para ver quais opções seriam geradas, pode usar shh run -- COMMAND.
O diretório atual e a variável de ambiente PATH influenciam a execução do programa; redefina-os primeiro:
$ cd /
export PATH=/usr/local/bin:/usr/bin:/bin
Em seguida, para ver quais opções seriam geradas para uma invocação de curl https://www.example.com:
$ 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 --------
Ou para aplicar sandbox ao máximo:
$ 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 --------