
Systemd Hardening Helper - https://github.com/desbma/shh のミラー

strace プロファイリングに基づく systemd サービスの自動ハードニング。
SHH は各サービスの最適なハードニングオプション一式を生成できるため、過度に制限の厳しいサンドボックス化によって本番環境で発生する予期しないエラーを心配することなく、システムのセキュリティレベルを引き上げることができます。
Strace をインストールし、その実行ファイルが PATH から参照できる必要があります。現在、Strace バージョン >= 6.6 が必要です。
たとえば rustup など、Rust のビルド環境が必要です。
現在のリポジトリ内で以下を実行します:
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 --------