
Systemd 강화 도우미 - https://github.com/desbma/shh의 미러

strace 프로파일링을 기반으로 한 자동 systemd 서비스 하드닝.
SHH는 각 서비스에 대한 최적의 하드닝 옵션 집합을 생성하므로, 너무 제한적인 샌드박싱으로 인해 프로덕션에서 발생하는 임의의 오류를 걱정하지 않고 시스템의 보안 수준을 높일 수 있습니다.
Strace가 설치되어 있어야 하며 해당 실행 파일이 PATH에 있어야 합니다. 현재 Strace 버전 >= 6.6이 필요합니다.
Rust 빌드 환경이 필요합니다(예: rustup).
현재 저장소에서 실행하세요:
cargo build --release
install -Dm 755 -t /usr/local/bin target/release/shh
crates.io에서sudo cargo install --root /usr/local systemd-hardening-helper
각 태그된 버전으로 빌드된 Debian 패키지는 GitHub releases에서 확인하세요.
Arch Linux 사용자는 shh AUR 패키지를 설치할 수 있습니다.
NixOS/Nix 사용자는 unstable 브랜치에서 최신 패키지를 설치할 수 있습니다.
SERVICE.service라는 시스템 유닛을 하드닝하려면:
shh service start-profile SERVICE. 서비스가 strace 프로파일링과 함께 다시 시작됩니다.shh service finish-profile SERVICE -a를 실행하세요. 서비스는 이전 런타임 프로파일링을 기반으로 구축된 하드닝 구성으로 다시 시작되며, 프로파일링 기간 동안 관찰된 대로 안전하게 실행되고 다른 위험한 시스템 동작은 거부됩니다.전체 명령줄 참조는 shh -h를 실행하거나, 하위 명령에 -h를 붙여 도움말을 볼 수 있습니다.
[!WARNING]
shh가 생성하는 하드닝 옵션은 구조상 서로 다른 시스템 간에 이식할 수 없습니다. 옵션은 여러 요인에 의존하며, 그중 하나라도 변경되면 서비스가 깨질 수 있습니다:
- 프로파일링 중 실행된 코드 경로
- Linux 커널 버전
- 사용 중인 libc
- systemd 버전
환경이 다른 시스템(즉, 다른 Linux 배포판)에서
shh로 생성된 옵션을 재사용하면 서비스가 손상될 가능성이 매우 높습니다.
생성될 옵션을 빠르게 확인하려면 shh run -- COMMAND를 사용할 수 있습니다.
현재 디렉터리와 PATH 환경 변수는 모두 프로그램 실행에 영향을 주므로, 먼저 초기화하세요:
$ cd /
export PATH=/usr/local/bin:/usr/bin:/bin
그런 다음 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 --------
또는 최대한 샌드박싱하려면:
$ 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 --------