AizuDemy

Tutorial Systemd Sandboxing: Amankan Service Linux VPS dari Threat RCE

Tutorial Systemd Sandboxing: Amankan Service Linux VPS dari Threat RCE
๐ŸŽง
Dengarkan Artikel Ini
Suara AI Otomatis โ€ข 4 mnt baca baca
โšก TL;DR

Poin Kunci Artikel Ini:

  • Vektor Serangan RCE & Limitasi Keamanan POSIX TradisionalRemote Code Execution (RCE) kerentanan fatal service backend.
  • Penyerang eksekusi perintah arbitrer dalam konteks pengguna aplikasi (Node.js, Python, Go, PHP-FPM, Java).
  • Model keamanan standar Linux andalkan POSIX Discretionary Access Control (DAC) berbasis user dan group.
๐Ÿ“‹ Daftar Isi Materi Tutup โ–ด

1. Vektor Serangan RCE & Limitasi Keamanan POSIX Tradisional

Remote Code Execution (RCE) kerentanan fatal service backend. Penyerang eksekusi perintah arbitrer dalam konteks pengguna aplikasi (Node.js, Python, Go, PHP-FPM, Java). Model keamanan standar Linux andalkan POSIX Discretionary Access Control (DAC) berbasis user dan group. Model DAC tidak dirancang isolasi proses komprehensif.

Kelemahan mendasar izin POSIX standar:

  • Akses Baca Global: User aplikasi tetap bisa membaca /etc/passwd, /etc/resolv.conf, /tmp, /var/tmp, dan file konfigurasi aplikasi lain tanpa proteksi chmod 700.
  • Eksekusi System Binaries: Penyerang sukses spawn shell dapat mengeksekusi /usr/bin/curl, /usr/bin/nc, /usr/bin/python3, atau /bin/bash untuk reconnaissance dan lateral movement.
  • Eskalasi Hak Akses via SUID: Binaries dengan bit SUID aktif (seperti versi sudo, pkexec, atau newgrp bermasalah) dimanfaatkan untuk eskalasi ke root.
  • Persistensi File System: Penyerang menulis malware di /tmp atau /var/tmp. File bertahan meski service aplikasi di-restart.
  • Eksplorasi Jaringan Raw Socket: Service aplikasi bisa membuat socket jaringan ke IP privat internal (metadata service cloud 169.254.169.254) atau melakukan port scanning.
  • Inspeksi Memori via Ptrace: Process milik user sama bisa mengintip memori process lain via ptrace(). Secret key dan token database bocor.

Membuat user dedicated (useradd -r -s /bin/false appuser) tidak menghentikan eksekusi binary sistem atau akses filesystem global. Service butuh isolasi level kernel. Systemd menyediakan fitur sandboxing native berbasis Linux Namespaces (CLONE_NEWNS, CLONE_NEWPID, CLONE_NEWNET), Seccomp-BPF filter, Control Groups (cgroups v2), dan POSIX Capabilities tanpa overhead virtualisasi Docker container.

2. Arsitektur Sandbox Systemd & Direktif Keamanan Kernel

Isolasi service dilakukan lewat direktif keamanan file unit systemd (/etc/systemd/system/nama-service.service).

A. DynamicUser=yes

Mengalokasikan UID/GID sementara dari rentang transient 61184โ€“65519 saat service start. Service stop, UID/GID dihapus. Tidak ada record permanen di /etc/passwd atau /etc/group. Menghentikan kepemilikan file permanen oleh penyerang.

B. ProtectSystem=strict

Memasang seluruh filesystem (/) sebagai Read-Only mount namespace untuk service. Direktori /usr, /etc, /boot, dan /lib terkunci total. Service tidak bisa mengubah binary atau konfigurasi sistem.

C. ProtectHome=yes

Mount direktori /home, /root, dan /run/user sebagai tmpfs kosong tanpa akses bagi service. Mencegah kebocoran SSH key, file konfigurasi personal, dan token credentials user host.

D. PrivateTmp=yes

Isolasi /tmp dan /var/tmp. Service mendapat mount namespace /tmp privat terpisah dari host dan service lain. Ketika service mati, isi /tmp privat terhapus total otomatis.

E. NoNewPrivileges=yes

Aktifkan bit PR_SET_NO_NEW_PRIVS via syscall prctl(). Mencegah child process service memperoleh hak akses tambahan via binary SUID/SGID seperti sudo, gpasswd, atau su.

F. CapabilityBoundingSet=

Membatasi POSIX Capabilities (hak istimewa root yang dipecah). Mengosongkan nilai direktif (CapabilityBoundingSet=) mencabut seluruh akses superuser seperti CAP_SYS_ADMIN, CAP_NET_ADMIN, CAP_SYS_PTRACE, dan CAP_NET_RAW.

G. SystemCallFilter=

Filter syscall berbasis Seccomp-BPF. Memblokir pemanggilan kernel berbahaya seperti manipulasi clock, reboot, swap, atau ptrace. Sintaks ~@privileged memblokir grup syscall yang butuh hak superuser.

H. MemoryDenyWriteExecute=yes

Memblokir alokasi pemetaan memori yang dapat ditulis sekaligus dieksekusi (W^X violation) via mmap() atau mprotect(). Mencegah eksekusi shellcode RAM hasil serangan buffer overflow.

I. RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX

Membatasi keluarga socket jaringan. Melarang pembuatan raw sockets (AF_PACKET) untuk packet sniffing dan socket pesan kernel (AF_NETLINK).

J. RestrictNamespaces=yes & RestrictRealtime=yes

RestrictNamespaces=yes melarang service membuat namespace baru via unshare() atau clone() untuk bypass isolasi. RestrictRealtime=yes memblokir penjadwalan realtime kernel untuk mencegah CPU starvation DoS.

K. Proteksi Kernel Tambahan

  • ProtectKernelTunables=yes: Mount /proc/sys, /sys, /proc/sysrq-trigger sebagai Read-Only.
  • ProtectKernelModules=yes: Blokir explicit module loading via init_module() dan finit_module().
  • ProtectControlGroups=yes: Mount hirarki /sys/fs/cgroup sebagai Read-Only.
  • ProtectClock=yes: Mencegah perubahan jam sistem via clock_settime().
  • ProtectHostname=yes: Mencegah perubahan hostname sistem via sethostname().
  • LockPersonality=yes: Mencegah perubahan execution domain kernel via personality().

Contoh Konfigurasi Unit File Production-Ready

File: /etc/systemd/system/node-api.service

[Unit]
Description=Backend Node.js API Service
After=network.target

[Service]
Type=exec
WorkingDirectory=/opt/node-api
ExecStart=/usr/bin/node /opt/node-api/index.js
Restart=always

# Isolasi Identitas Process
DynamicUser=yes

# Isolasi Mount & Filesystem
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
ReadWritePaths=/var/log/node-api
RuntimeDirectory=node-api
StateDirectory=node-api
LogsDirectory=node-api
CacheDirectory=node-api

# Restriksi Hak Akses & Subprocess
NoNewPrivileges=yes
CapabilityBoundingSet=
MemoryDenyWriteExecute=yes
LockPersonality=yes

# Proteksi Struktur Kernel
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
ProtectClock=yes
ProtectHostname=yes
RestrictRealtime=yes
RestrictNamespaces=yes

# Network & Syscall Filtering (Seccomp)
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
SystemCallFilter=@system-service
SystemCallFilter=~@privileged @resources @clock @mount @reboot @swap
SystemCallErrorNumber=EPERM

[Install]
WantedBy=multi-user.target

3. Uji Penetrasi Sandbox & Diagnostic Error Syscall

Pengujian penetrasi memastikan isolasi sandbox berfungsi penuh dan tidak merusak fungsi legitimasi aplikasi.

Peringatan Keamanan: Lakukan prosedur pengujian ini di lingkungan staging atau VPS uji sebelum menerapkan perubahan pada server produksi.

  1. Muat ulang konfigurasi systemd daemon dan jalankan ulang service aplikasi:
    systemctl daemon-reload
    systemctl restart node-api.service
    {"title": "Tutorial Systemd Sandboxing: Amankan Service Linux VPS dari Threat RCE

๐Ÿ“– Artikel Terkait